duler.production.min.js * * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */(function($){function _e(_t,Dt){var At=_t.length;_t.push(Dt);e:for(;0>>1,Qt=_t[Yt];if(0>>1;Ytrt(er,At))Xtrt(or,er)?(_t[Yt]=or,_t[Xt]=At,Yt=Xt):(_t[Yt]=er,_t[Wt]=At,Yt=Wt);else if(Xtrt(or,At))_t[Yt]=or,_t[Xt]=At,Yt=Xt;else break e}}return Dt}function rt(_t,Dt){var At=_t.sortIndex-Dt.sortIndex;return At!==0?At:_t.id-Dt.id}if(typeof performance=="object"&&typeof performance.now=="function"){var nt=performance;$.unstable_now=function(){return nt.now()}}else{var at=Date,ot=at.now();$.unstable_now=function(){return at.now()-ot}}var it=[],ft=[],st=1,lt=null,ut=3,ct=!1,gt=!1,mt=!1,ht=typeof setTimeout=="function"?setTimeout:null,pt=typeof clearTimeout=="function"?clearTimeout:null,dt=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function yt(_t){for(var Dt=et(ft);Dt!==null;){if(Dt.callback===null)tt(ft);else if(Dt.startTime<=_t)tt(ft),Dt.sortIndex=Dt.expirationTime,_e(it,Dt);else break;Dt=et(ft)}}function vt(_t){if(mt=!1,yt(_t),!gt)if(et(it)!==null)gt=!0,Gt(bt);else{var Dt=et(ft);Dt!==null&&Zt(vt,Dt.startTime-_t)}}function bt(_t,Dt){gt=!1,mt&&(mt=!1,pt(Et),Et=-1),ct=!0;var At=ut;try{for(yt(Dt),lt=et(it);lt!==null&&(!(lt.expirationTime>Dt)||_t&&!jt());){var Yt=lt.callback;if(typeof Yt=="function"){lt.callback=null,ut=lt.priorityLevel;var Qt=Yt(lt.expirationTime<=Dt);Dt=$.unstable_now(),typeof Qt=="function"?lt.callback=Qt:lt===et(it)&&tt(it),yt(Dt)}else tt(it);lt=et(it)}if(lt!==null)var nr=!0;else{var Wt=et(ft);Wt!==null&&Zt(vt,Wt.startTime-Dt),nr=!1}return nr}finally{lt=null,ut=At,ct=!1}}var xt=!1,wt=null,Et=-1,Lt=5,St=-1;function jt(){return!($.unstable_now()-St_t||125<_t?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):Lt=0<_t?Math.floor(1e3/_t):5},$.unstable_getCurrentPriorityLevel=function(){return ut},$.unstable_getFirstCallbackNode=function(){return et(it)},$.unstable_next=function(_t){switch(ut){case 1:case 2:case 3:var Dt=3;break;default:Dt=ut}var At=ut;ut=Dt;try{return _t()}finally{ut=At}},$.unstable_pauseExecution=function(){},$.unstable_requestPaint=function(){},$.unstable_runWithPriority=function(_t,Dt){switch(_t){case 1:case 2:case 3:case 4:case 5:break;default:_t=3}var At=ut;ut=_t;try{return Dt()}finally{ut=At}},$.unstable_scheduleCallback=function(_t,Dt,At){var Yt=$.unstable_now();switch(typeof At=="object"&&At!==null?(At=At.delay,At=typeof At=="number"&&0Yt?(_t.sortIndex=At,_e(ft,_t),et(it)===null&&_t===et(ft)&&(mt?(pt(Et),Et=-1):mt=!0,Zt(vt,At-Yt))):(_t.sortIndex=Qt,_e(it,_t),gt||ct||(gt=!0,Gt(bt))),_t},$.unstable_shouldYield=jt,$.unstable_wrapCallback=function(_t){var Dt=ut;return function(){var At=ut;ut=Dt;try{return _t.apply(this,arguments)}finally{ut=At}}}})(scheduler_production_min);scheduler.exports=scheduler_production_min;var schedulerExports=scheduler.exports;/** * @license React * react-dom.production.min.js * * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */var aa=reactExports,ca=schedulerExports;function p$3($){for(var _e="https://reactjs.org/docs/error-decoder.html?invariant="+$,et=1;et"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),ja=Object.prototype.hasOwnProperty,ka=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,la={},ma={};function oa($){return ja.call(ma,$)?!0:ja.call(la,$)?!1:ka.test($)?ma[$]=!0:(la[$]=!0,!1)}function pa($,_e,et,tt){if(et!==null&&et.type===0)return!1;switch(typeof _e){case"function":case"symbol":return!0;case"boolean":return tt?!1:et!==null?!et.acceptsBooleans:($=$.toLowerCase().slice(0,5),$!=="data-"&&$!=="aria-");default:return!1}}function qa($,_e,et,tt){if(_e===null||typeof _e>"u"||pa($,_e,et,tt))return!0;if(tt)return!1;if(et!==null)switch(et.type){case 3:return!_e;case 4:return _e===!1;case 5:return isNaN(_e);case 6:return isNaN(_e)||1>_e}return!1}function v$3($,_e,et,tt,rt,nt,at){this.acceptsBooleans=_e===2||_e===3||_e===4,this.attributeName=tt,this.attributeNamespace=rt,this.mustUseProperty=et,this.propertyName=$,this.type=_e,this.sanitizeURL=nt,this.removeEmptyString=at}var z$2={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function($){z$2[$]=new v$3($,0,!1,$,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function($){var _e=$[0];z$2[_e]=new v$3(_e,1,!1,$[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function($){z$2[$]=new v$3($,2,!1,$.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function($){z$2[$]=new v$3($,2,!1,$,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function($){z$2[$]=new v$3($,3,!1,$.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function($){z$2[$]=new v$3($,3,!0,$,null,!1,!1)});["capture","download"].forEach(function($){z$2[$]=new v$3($,4,!1,$,null,!1,!1)});["cols","rows","size","span"].forEach(function($){z$2[$]=new v$3($,6,!1,$,null,!1,!1)});["rowSpan","start"].forEach(function($){z$2[$]=new v$3($,5,!1,$.toLowerCase(),null,!1,!1)});var ra=/[\-:]([a-z])/g;function sa($){return $[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function($){var _e=$.replace(ra,sa);z$2[_e]=new v$3(_e,1,!1,$,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function($){var _e=$.replace(ra,sa);z$2[_e]=new v$3(_e,1,!1,$,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function($){var _e=$.replace(ra,sa);z$2[_e]=new v$3(_e,1,!1,$,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function($){z$2[$]=new v$3($,1,!1,$.toLowerCase(),null,!1,!1)});z$2.xlinkHref=new v$3("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function($){z$2[$]=new v$3($,1,!1,$.toLowerCase(),null,!0,!0)});function ta($,_e,et,tt){var rt=z$2.hasOwnProperty(_e)?z$2[_e]:null;(rt!==null?rt.type!==0:tt||!(2<_e.length)||_e[0]!=="o"&&_e[0]!=="O"||_e[1]!=="n"&&_e[1]!=="N")&&(qa(_e,et,rt,tt)&&(et=null),tt||rt===null?oa(_e)&&(et===null?$.removeAttribute(_e):$.setAttribute(_e,""+et)):rt.mustUseProperty?$[rt.propertyName]=et===null?rt.type===3?!1:"":et:(_e=rt.attributeName,tt=rt.attributeNamespace,et===null?$.removeAttribute(_e):(rt=rt.type,et=rt===3||rt===4&&et===!0?"":""+et,tt?$.setAttributeNS(tt,_e,et):$.setAttribute(_e,et))))}var ua=aa.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,va=Symbol.for("react.element"),wa=Symbol.for("react.portal"),ya=Symbol.for("react.fragment"),za=Symbol.for("react.strict_mode"),Aa=Symbol.for("react.profiler"),Ba=Symbol.for("react.provider"),Ca=Symbol.for("react.context"),Da=Symbol.for("react.forward_ref"),Ea=Symbol.for("react.suspense"),Fa=Symbol.for("react.suspense_list"),Ga=Symbol.for("react.memo"),Ha=Symbol.for("react.lazy"),Ia=Symbol.for("react.offscreen"),Ja=Symbol.iterator;function Ka($){return $===null||typeof $!="object"?null:($=Ja&&$[Ja]||$["@@iterator"],typeof $=="function"?$:null)}var A$2=Object.assign,La;function Ma($){if(La===void 0)try{throw Error()}catch(et){var _e=et.stack.trim().match(/\n( *(at )?)/);La=_e&&_e[1]||""}return` `+La+$}var Na=!1;function Oa($,_e){if(!$||Na)return"";Na=!0;var et=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(_e)if(_e=function(){throw Error()},Object.defineProperty(_e.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(_e,[])}catch(ft){var tt=ft}Reflect.construct($,[],_e)}else{try{_e.call()}catch(ft){tt=ft}$.call(_e.prototype)}else{try{throw Error()}catch(ft){tt=ft}$()}}catch(ft){if(ft&&tt&&typeof ft.stack=="string"){for(var rt=ft.stack.split(` `),nt=tt.stack.split(` `),at=rt.length-1,ot=nt.length-1;1<=at&&0<=ot&&rt[at]!==nt[ot];)ot--;for(;1<=at&&0<=ot;at--,ot--)if(rt[at]!==nt[ot]){if(at!==1||ot!==1)do if(at--,ot--,0>ot||rt[at]!==nt[ot]){var it=` `+rt[at].replace(" at new "," at ");return $.displayName&&it.includes("")&&(it=it.replace("",$.displayName)),it}while(1<=at&&0<=ot);break}}}finally{Na=!1,Error.prepareStackTrace=et}return($=$?$.displayName||$.name:"")?Ma($):""}function Pa($){switch($.tag){case 5:return Ma($.type);case 16:return Ma("Lazy");case 13:return Ma("Suspense");case 19:return Ma("SuspenseList");case 0:case 2:case 15:return $=Oa($.type,!1),$;case 11:return $=Oa($.type.render,!1),$;case 1:return $=Oa($.type,!0),$;default:return""}}function Qa($){if($==null)return null;if(typeof $=="function")return $.displayName||$.name||null;if(typeof $=="string")return $;switch($){case ya:return"Fragment";case wa:return"Portal";case Aa:return"Profiler";case za:return"StrictMode";case Ea:return"Suspense";case Fa:return"SuspenseList"}if(typeof $=="object")switch($.$$typeof){case Ca:return($.displayName||"Context")+".Consumer";case Ba:return($._context.displayName||"Context")+".Provider";case Da:var _e=$.render;return $=$.displayName,$||($=_e.displayName||_e.name||"",$=$!==""?"ForwardRef("+$+")":"ForwardRef"),$;case Ga:return _e=$.displayName||null,_e!==null?_e:Qa($.type)||"Memo";case Ha:_e=$._payload,$=$._init;try{return Qa($(_e))}catch{}}return null}function Ra($){var _e=$.type;switch($.tag){case 24:return"Cache";case 9:return(_e.displayName||"Context")+".Consumer";case 10:return(_e._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return $=_e.render,$=$.displayName||$.name||"",_e.displayName||($!==""?"ForwardRef("+$+")":"ForwardRef");case 7:return"Fragment";case 5:return _e;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return Qa(_e);case 8:return _e===za?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof _e=="function")return _e.displayName||_e.name||null;if(typeof _e=="string")return _e}return null}function Sa($){switch(typeof $){case"boolean":case"number":case"string":case"undefined":return $;case"object":return $;default:return""}}function Ta($){var _e=$.type;return($=$.nodeName)&&$.toLowerCase()==="input"&&(_e==="checkbox"||_e==="radio")}function Ua($){var _e=Ta($)?"checked":"value",et=Object.getOwnPropertyDescriptor($.constructor.prototype,_e),tt=""+$[_e];if(!$.hasOwnProperty(_e)&&typeof et<"u"&&typeof et.get=="function"&&typeof et.set=="function"){var rt=et.get,nt=et.set;return Object.defineProperty($,_e,{configurable:!0,get:function(){return rt.call(this)},set:function(at){tt=""+at,nt.call(this,at)}}),Object.defineProperty($,_e,{enumerable:et.enumerable}),{getValue:function(){return tt},setValue:function(at){tt=""+at},stopTracking:function(){$._valueTracker=null,delete $[_e]}}}}function Va($){$._valueTracker||($._valueTracker=Ua($))}function Wa($){if(!$)return!1;var _e=$._valueTracker;if(!_e)return!0;var et=_e.getValue(),tt="";return $&&(tt=Ta($)?$.checked?"true":"false":$.value),$=tt,$!==et?(_e.setValue($),!0):!1}function Xa($){if($=$||(typeof document<"u"?document:void 0),typeof $>"u")return null;try{return $.activeElement||$.body}catch{return $.body}}function Ya($,_e){var et=_e.checked;return A$2({},_e,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:et??$._wrapperState.initialChecked})}function Za($,_e){var et=_e.defaultValue==null?"":_e.defaultValue,tt=_e.checked!=null?_e.checked:_e.defaultChecked;et=Sa(_e.value!=null?_e.value:et),$._wrapperState={initialChecked:tt,initialValue:et,controlled:_e.type==="checkbox"||_e.type==="radio"?_e.checked!=null:_e.value!=null}}function ab($,_e){_e=_e.checked,_e!=null&&ta($,"checked",_e,!1)}function bb($,_e){ab($,_e);var et=Sa(_e.value),tt=_e.type;if(et!=null)tt==="number"?(et===0&&$.value===""||$.value!=et)&&($.value=""+et):$.value!==""+et&&($.value=""+et);else if(tt==="submit"||tt==="reset"){$.removeAttribute("value");return}_e.hasOwnProperty("value")?cb($,_e.type,et):_e.hasOwnProperty("defaultValue")&&cb($,_e.type,Sa(_e.defaultValue)),_e.checked==null&&_e.defaultChecked!=null&&($.defaultChecked=!!_e.defaultChecked)}function db($,_e,et){if(_e.hasOwnProperty("value")||_e.hasOwnProperty("defaultValue")){var tt=_e.type;if(!(tt!=="submit"&&tt!=="reset"||_e.value!==void 0&&_e.value!==null))return;_e=""+$._wrapperState.initialValue,et||_e===$.value||($.value=_e),$.defaultValue=_e}et=$.name,et!==""&&($.name=""),$.defaultChecked=!!$._wrapperState.initialChecked,et!==""&&($.name=et)}function cb($,_e,et){(_e!=="number"||Xa($.ownerDocument)!==$)&&(et==null?$.defaultValue=""+$._wrapperState.initialValue:$.defaultValue!==""+et&&($.defaultValue=""+et))}var eb=Array.isArray;function fb($,_e,et,tt){if($=$.options,_e){_e={};for(var rt=0;rt"+_e.valueOf().toString()+"",_e=mb.firstChild;$.firstChild;)$.removeChild($.firstChild);for(;_e.firstChild;)$.appendChild(_e.firstChild)}});function ob($,_e){if(_e){var et=$.firstChild;if(et&&et===$.lastChild&&et.nodeType===3){et.nodeValue=_e;return}}$.textContent=_e}var pb={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},qb=["Webkit","ms","Moz","O"];Object.keys(pb).forEach(function($){qb.forEach(function(_e){_e=_e+$.charAt(0).toUpperCase()+$.substring(1),pb[_e]=pb[$]})});function rb($,_e,et){return _e==null||typeof _e=="boolean"||_e===""?"":et||typeof _e!="number"||_e===0||pb.hasOwnProperty($)&&pb[$]?(""+_e).trim():_e+"px"}function sb($,_e){$=$.style;for(var et in _e)if(_e.hasOwnProperty(et)){var tt=et.indexOf("--")===0,rt=rb(et,_e[et],tt);et==="float"&&(et="cssFloat"),tt?$.setProperty(et,rt):$[et]=rt}}var tb=A$2({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function ub($,_e){if(_e){if(tb[$]&&(_e.children!=null||_e.dangerouslySetInnerHTML!=null))throw Error(p$3(137,$));if(_e.dangerouslySetInnerHTML!=null){if(_e.children!=null)throw Error(p$3(60));if(typeof _e.dangerouslySetInnerHTML!="object"||!("__html"in _e.dangerouslySetInnerHTML))throw Error(p$3(61))}if(_e.style!=null&&typeof _e.style!="object")throw Error(p$3(62))}}function vb($,_e){if($.indexOf("-")===-1)return typeof _e.is=="string";switch($){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var wb=null;function xb($){return $=$.target||$.srcElement||window,$.correspondingUseElement&&($=$.correspondingUseElement),$.nodeType===3?$.parentNode:$}var yb=null,zb=null,Ab=null;function Bb($){if($=Cb($)){if(typeof yb!="function")throw Error(p$3(280));var _e=$.stateNode;_e&&(_e=Db(_e),yb($.stateNode,$.type,_e))}}function Eb($){zb?Ab?Ab.push($):Ab=[$]:zb=$}function Fb(){if(zb){var $=zb,_e=Ab;if(Ab=zb=null,Bb($),_e)for($=0;$<_e.length;$++)Bb(_e[$])}}function Gb($,_e){return $(_e)}function Hb(){}var Ib=!1;function Jb($,_e,et){if(Ib)return $(_e,et);Ib=!0;try{return Gb($,_e,et)}finally{Ib=!1,(zb!==null||Ab!==null)&&(Hb(),Fb())}}function Kb($,_e){var et=$.stateNode;if(et===null)return null;var tt=Db(et);if(tt===null)return null;et=tt[_e];e:switch(_e){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(tt=!tt.disabled)||($=$.type,tt=!($==="button"||$==="input"||$==="select"||$==="textarea")),$=!tt;break e;default:$=!1}if($)return null;if(et&&typeof et!="function")throw Error(p$3(231,_e,typeof et));return et}var Lb=!1;if(ia)try{var Mb={};Object.defineProperty(Mb,"passive",{get:function(){Lb=!0}}),window.addEventListener("test",Mb,Mb),window.removeEventListener("test",Mb,Mb)}catch{Lb=!1}function Nb($,_e,et,tt,rt,nt,at,ot,it){var ft=Array.prototype.slice.call(arguments,3);try{_e.apply(et,ft)}catch(st){this.onError(st)}}var Ob=!1,Pb=null,Qb=!1,Rb=null,Sb={onError:function($){Ob=!0,Pb=$}};function Tb($,_e,et,tt,rt,nt,at,ot,it){Ob=!1,Pb=null,Nb.apply(Sb,arguments)}function Ub($,_e,et,tt,rt,nt,at,ot,it){if(Tb.apply(this,arguments),Ob){if(Ob){var ft=Pb;Ob=!1,Pb=null}else throw Error(p$3(198));Qb||(Qb=!0,Rb=ft)}}function Vb($){var _e=$,et=$;if($.alternate)for(;_e.return;)_e=_e.return;else{$=_e;do _e=$,_e.flags&4098&&(et=_e.return),$=_e.return;while($)}return _e.tag===3?et:null}function Wb($){if($.tag===13){var _e=$.memoizedState;if(_e===null&&($=$.alternate,$!==null&&(_e=$.memoizedState)),_e!==null)return _e.dehydrated}return null}function Xb($){if(Vb($)!==$)throw Error(p$3(188))}function Yb($){var _e=$.alternate;if(!_e){if(_e=Vb($),_e===null)throw Error(p$3(188));return _e!==$?null:$}for(var et=$,tt=_e;;){var rt=et.return;if(rt===null)break;var nt=rt.alternate;if(nt===null){if(tt=rt.return,tt!==null){et=tt;continue}break}if(rt.child===nt.child){for(nt=rt.child;nt;){if(nt===et)return Xb(rt),$;if(nt===tt)return Xb(rt),_e;nt=nt.sibling}throw Error(p$3(188))}if(et.return!==tt.return)et=rt,tt=nt;else{for(var at=!1,ot=rt.child;ot;){if(ot===et){at=!0,et=rt,tt=nt;break}if(ot===tt){at=!0,tt=rt,et=nt;break}ot=ot.sibling}if(!at){for(ot=nt.child;ot;){if(ot===et){at=!0,et=nt,tt=rt;break}if(ot===tt){at=!0,tt=nt,et=rt;break}ot=ot.sibling}if(!at)throw Error(p$3(189))}}if(et.alternate!==tt)throw Error(p$3(190))}if(et.tag!==3)throw Error(p$3(188));return et.stateNode.current===et?$:_e}function Zb($){return $=Yb($),$!==null?$b($):null}function $b($){if($.tag===5||$.tag===6)return $;for($=$.child;$!==null;){var _e=$b($);if(_e!==null)return _e;$=$.sibling}return null}var ac=ca.unstable_scheduleCallback,bc=ca.unstable_cancelCallback,cc=ca.unstable_shouldYield,dc=ca.unstable_requestPaint,B$1=ca.unstable_now,ec=ca.unstable_getCurrentPriorityLevel,fc=ca.unstable_ImmediatePriority,gc=ca.unstable_UserBlockingPriority,hc=ca.unstable_NormalPriority,ic=ca.unstable_LowPriority,jc=ca.unstable_IdlePriority,kc=null,lc=null;function mc($){if(lc&&typeof lc.onCommitFiberRoot=="function")try{lc.onCommitFiberRoot(kc,$,void 0,($.current.flags&128)===128)}catch{}}var oc=Math.clz32?Math.clz32:nc,pc=Math.log,qc=Math.LN2;function nc($){return $>>>=0,$===0?32:31-(pc($)/qc|0)|0}var rc=64,sc=4194304;function tc($){switch($&-$){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return $&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return $&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return $}}function uc($,_e){var et=$.pendingLanes;if(et===0)return 0;var tt=0,rt=$.suspendedLanes,nt=$.pingedLanes,at=et&268435455;if(at!==0){var ot=at&~rt;ot!==0?tt=tc(ot):(nt&=at,nt!==0&&(tt=tc(nt)))}else at=et&~rt,at!==0?tt=tc(at):nt!==0&&(tt=tc(nt));if(tt===0)return 0;if(_e!==0&&_e!==tt&&!(_e&rt)&&(rt=tt&-tt,nt=_e&-_e,rt>=nt||rt===16&&(nt&4194240)!==0))return _e;if(tt&4&&(tt|=et&16),_e=$.entangledLanes,_e!==0)for($=$.entanglements,_e&=tt;0<_e;)et=31-oc(_e),rt=1<et;et++)_e.push($);return _e}function Ac($,_e,et){$.pendingLanes|=_e,_e!==536870912&&($.suspendedLanes=0,$.pingedLanes=0),$=$.eventTimes,_e=31-oc(_e),$[_e]=et}function Bc($,_e){var et=$.pendingLanes&~_e;$.pendingLanes=_e,$.suspendedLanes=0,$.pingedLanes=0,$.expiredLanes&=_e,$.mutableReadLanes&=_e,$.entangledLanes&=_e,_e=$.entanglements;var tt=$.eventTimes;for($=$.expirationTimes;0=be),ee=String.fromCharCode(32),fe=!1;function ge($,_e){switch($){case"keyup":return $d.indexOf(_e.keyCode)!==-1;case"keydown":return _e.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function he($){return $=$.detail,typeof $=="object"&&"data"in $?$.data:null}var ie=!1;function je($,_e){switch($){case"compositionend":return he(_e);case"keypress":return _e.which!==32?null:(fe=!0,ee);case"textInput":return $=_e.data,$===ee&&fe?null:$;default:return null}}function ke($,_e){if(ie)return $==="compositionend"||!ae&&ge($,_e)?($=nd(),md=ld=kd=null,ie=!1,$):null;switch($){case"paste":return null;case"keypress":if(!(_e.ctrlKey||_e.altKey||_e.metaKey)||_e.ctrlKey&&_e.altKey){if(_e.char&&1<_e.char.length)return _e.char;if(_e.which)return String.fromCharCode(_e.which)}return null;case"compositionend":return de&&_e.locale!=="ko"?null:_e.data;default:return null}}var le={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function me($){var _e=$&&$.nodeName&&$.nodeName.toLowerCase();return _e==="input"?!!le[$.type]:_e==="textarea"}function ne($,_e,et,tt){Eb(tt),_e=oe(_e,"onChange"),0<_e.length&&(et=new td("onChange","change",null,et,tt),$.push({event:et,listeners:_e}))}var pe=null,qe=null;function re$1($){se($,0)}function te($){var _e=ue($);if(Wa(_e))return $}function ve($,_e){if($==="change")return _e}var we=!1;if(ia){var xe;if(ia){var ye="oninput"in document;if(!ye){var ze=document.createElement("div");ze.setAttribute("oninput","return;"),ye=typeof ze.oninput=="function"}xe=ye}else xe=!1;we=xe&&(!document.documentMode||9=_e)return{node:et,offset:_e-$};$=tt}e:{for(;et;){if(et.nextSibling){et=et.nextSibling;break e}et=et.parentNode}et=void 0}et=Je(et)}}function Le($,_e){return $&&_e?$===_e?!0:$&&$.nodeType===3?!1:_e&&_e.nodeType===3?Le($,_e.parentNode):"contains"in $?$.contains(_e):$.compareDocumentPosition?!!($.compareDocumentPosition(_e)&16):!1:!1}function Me(){for(var $=window,_e=Xa();_e instanceof $.HTMLIFrameElement;){try{var et=typeof _e.contentWindow.location.href=="string"}catch{et=!1}if(et)$=_e.contentWindow;else break;_e=Xa($.document)}return _e}function Ne($){var _e=$&&$.nodeName&&$.nodeName.toLowerCase();return _e&&(_e==="input"&&($.type==="text"||$.type==="search"||$.type==="tel"||$.type==="url"||$.type==="password")||_e==="textarea"||$.contentEditable==="true")}function Oe($){var _e=Me(),et=$.focusedElem,tt=$.selectionRange;if(_e!==et&&et&&et.ownerDocument&&Le(et.ownerDocument.documentElement,et)){if(tt!==null&&Ne(et)){if(_e=tt.start,$=tt.end,$===void 0&&($=_e),"selectionStart"in et)et.selectionStart=_e,et.selectionEnd=Math.min($,et.value.length);else if($=(_e=et.ownerDocument||document)&&_e.defaultView||window,$.getSelection){$=$.getSelection();var rt=et.textContent.length,nt=Math.min(tt.start,rt);tt=tt.end===void 0?nt:Math.min(tt.end,rt),!$.extend&&nt>tt&&(rt=tt,tt=nt,nt=rt),rt=Ke(et,nt);var at=Ke(et,tt);rt&&at&&($.rangeCount!==1||$.anchorNode!==rt.node||$.anchorOffset!==rt.offset||$.focusNode!==at.node||$.focusOffset!==at.offset)&&(_e=_e.createRange(),_e.setStart(rt.node,rt.offset),$.removeAllRanges(),nt>tt?($.addRange(_e),$.extend(at.node,at.offset)):(_e.setEnd(at.node,at.offset),$.addRange(_e)))}}for(_e=[],$=et;$=$.parentNode;)$.nodeType===1&&_e.push({element:$,left:$.scrollLeft,top:$.scrollTop});for(typeof et.focus=="function"&&et.focus(),et=0;et<_e.length;et++)$=_e[et],$.element.scrollLeft=$.left,$.element.scrollTop=$.top}}var Pe=ia&&"documentMode"in document&&11>=document.documentMode,Qe=null,Re=null,Se=null,Te=!1;function Ue($,_e,et){var tt=et.window===et?et.document:et.nodeType===9?et:et.ownerDocument;Te||Qe==null||Qe!==Xa(tt)||(tt=Qe,"selectionStart"in tt&&Ne(tt)?tt={start:tt.selectionStart,end:tt.selectionEnd}:(tt=(tt.ownerDocument&&tt.ownerDocument.defaultView||window).getSelection(),tt={anchorNode:tt.anchorNode,anchorOffset:tt.anchorOffset,focusNode:tt.focusNode,focusOffset:tt.focusOffset}),Se&&Ie(Se,tt)||(Se=tt,tt=oe(Re,"onSelect"),0Tf||($.current=Sf[Tf],Sf[Tf]=null,Tf--)}function G$1($,_e){Tf++,Sf[Tf]=$.current,$.current=_e}var Vf={},H$1=Uf(Vf),Wf=Uf(!1),Xf=Vf;function Yf($,_e){var et=$.type.contextTypes;if(!et)return Vf;var tt=$.stateNode;if(tt&&tt.__reactInternalMemoizedUnmaskedChildContext===_e)return tt.__reactInternalMemoizedMaskedChildContext;var rt={},nt;for(nt in et)rt[nt]=_e[nt];return tt&&($=$.stateNode,$.__reactInternalMemoizedUnmaskedChildContext=_e,$.__reactInternalMemoizedMaskedChildContext=rt),rt}function Zf($){return $=$.childContextTypes,$!=null}function $f(){E$1(Wf),E$1(H$1)}function ag($,_e,et){if(H$1.current!==Vf)throw Error(p$3(168));G$1(H$1,_e),G$1(Wf,et)}function bg($,_e,et){var tt=$.stateNode;if(_e=_e.childContextTypes,typeof tt.getChildContext!="function")return et;tt=tt.getChildContext();for(var rt in tt)if(!(rt in _e))throw Error(p$3(108,Ra($)||"Unknown",rt));return A$2({},et,tt)}function cg($){return $=($=$.stateNode)&&$.__reactInternalMemoizedMergedChildContext||Vf,Xf=H$1.current,G$1(H$1,$),G$1(Wf,Wf.current),!0}function dg($,_e,et){var tt=$.stateNode;if(!tt)throw Error(p$3(169));et?($=bg($,_e,Xf),tt.__reactInternalMemoizedMergedChildContext=$,E$1(Wf),E$1(H$1),G$1(H$1,$)):E$1(Wf),G$1(Wf,et)}var eg=null,fg=!1,gg=!1;function hg($){eg===null?eg=[$]:eg.push($)}function ig($){fg=!0,hg($)}function jg(){if(!gg&&eg!==null){gg=!0;var $=0,_e=C;try{var et=eg;for(C=1;$>=at,rt-=at,rg=1<<32-oc(_e)+rt|et<Et?(Lt=wt,wt=null):Lt=wt.sibling;var St=ut(pt,wt,yt[Et],vt);if(St===null){wt===null&&(wt=Lt);break}$&&wt&&St.alternate===null&&_e(pt,wt),dt=nt(St,dt,Et),xt===null?bt=St:xt.sibling=St,xt=St,wt=Lt}if(Et===yt.length)return et(pt,wt),I$1&&tg(pt,Et),bt;if(wt===null){for(;EtEt?(Lt=wt,wt=null):Lt=wt.sibling;var jt=ut(pt,wt,St.value,vt);if(jt===null){wt===null&&(wt=Lt);break}$&&wt&&jt.alternate===null&&_e(pt,wt),dt=nt(jt,dt,Et),xt===null?bt=jt:xt.sibling=jt,xt=jt,wt=Lt}if(St.done)return et(pt,wt),I$1&&tg(pt,Et),bt;if(wt===null){for(;!St.done;Et++,St=yt.next())St=lt(pt,St.value,vt),St!==null&&(dt=nt(St,dt,Et),xt===null?bt=St:xt.sibling=St,xt=St);return I$1&&tg(pt,Et),bt}for(wt=tt(pt,wt);!St.done;Et++,St=yt.next())St=ct(wt,pt,Et,St.value,vt),St!==null&&($&&St.alternate!==null&&wt.delete(St.key===null?Et:St.key),dt=nt(St,dt,Et),xt===null?bt=St:xt.sibling=St,xt=St);return $&&wt.forEach(function(Nt){return _e(pt,Nt)}),I$1&&tg(pt,Et),bt}function ht(pt,dt,yt,vt){if(typeof yt=="object"&&yt!==null&&yt.type===ya&&yt.key===null&&(yt=yt.props.children),typeof yt=="object"&&yt!==null){switch(yt.$$typeof){case va:e:{for(var bt=yt.key,xt=dt;xt!==null;){if(xt.key===bt){if(bt=yt.type,bt===ya){if(xt.tag===7){et(pt,xt.sibling),dt=rt(xt,yt.props.children),dt.return=pt,pt=dt;break e}}else if(xt.elementType===bt||typeof bt=="object"&&bt!==null&&bt.$$typeof===Ha&&Ng(bt)===xt.type){et(pt,xt.sibling),dt=rt(xt,yt.props),dt.ref=Lg(pt,xt,yt),dt.return=pt,pt=dt;break e}et(pt,xt);break}else _e(pt,xt);xt=xt.sibling}yt.type===ya?(dt=Tg(yt.props.children,pt.mode,vt,yt.key),dt.return=pt,pt=dt):(vt=Rg(yt.type,yt.key,yt.props,null,pt.mode,vt),vt.ref=Lg(pt,dt,yt),vt.return=pt,pt=vt)}return at(pt);case wa:e:{for(xt=yt.key;dt!==null;){if(dt.key===xt)if(dt.tag===4&&dt.stateNode.containerInfo===yt.containerInfo&&dt.stateNode.implementation===yt.implementation){et(pt,dt.sibling),dt=rt(dt,yt.children||[]),dt.return=pt,pt=dt;break e}else{et(pt,dt);break}else _e(pt,dt);dt=dt.sibling}dt=Sg(yt,pt.mode,vt),dt.return=pt,pt=dt}return at(pt);case Ha:return xt=yt._init,ht(pt,dt,xt(yt._payload),vt)}if(eb(yt))return gt(pt,dt,yt,vt);if(Ka(yt))return mt(pt,dt,yt,vt);Mg(pt,yt)}return typeof yt=="string"&&yt!==""||typeof yt=="number"?(yt=""+yt,dt!==null&&dt.tag===6?(et(pt,dt.sibling),dt=rt(dt,yt),dt.return=pt,pt=dt):(et(pt,dt),dt=Qg(yt,pt.mode,vt),dt.return=pt,pt=dt),at(pt)):et(pt,dt)}return ht}var Ug=Og(!0),Vg=Og(!1),Wg=Uf(null),Xg=null,Yg=null,Zg=null;function $g(){Zg=Yg=Xg=null}function ah($){var _e=Wg.current;E$1(Wg),$._currentValue=_e}function bh($,_e,et){for(;$!==null;){var tt=$.alternate;if(($.childLanes&_e)!==_e?($.childLanes|=_e,tt!==null&&(tt.childLanes|=_e)):tt!==null&&(tt.childLanes&_e)!==_e&&(tt.childLanes|=_e),$===et)break;$=$.return}}function ch($,_e){Xg=$,Zg=Yg=null,$=$.dependencies,$!==null&&$.firstContext!==null&&($.lanes&_e&&(dh=!0),$.firstContext=null)}function eh($){var _e=$._currentValue;if(Zg!==$)if($={context:$,memoizedValue:_e,next:null},Yg===null){if(Xg===null)throw Error(p$3(308));Yg=$,Xg.dependencies={lanes:0,firstContext:$}}else Yg=Yg.next=$;return _e}var fh=null;function gh($){fh===null?fh=[$]:fh.push($)}function hh($,_e,et,tt){var rt=_e.interleaved;return rt===null?(et.next=et,gh(_e)):(et.next=rt.next,rt.next=et),_e.interleaved=et,ih($,tt)}function ih($,_e){$.lanes|=_e;var et=$.alternate;for(et!==null&&(et.lanes|=_e),et=$,$=$.return;$!==null;)$.childLanes|=_e,et=$.alternate,et!==null&&(et.childLanes|=_e),et=$,$=$.return;return et.tag===3?et.stateNode:null}var jh=!1;function kh($){$.updateQueue={baseState:$.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function lh($,_e){$=$.updateQueue,_e.updateQueue===$&&(_e.updateQueue={baseState:$.baseState,firstBaseUpdate:$.firstBaseUpdate,lastBaseUpdate:$.lastBaseUpdate,shared:$.shared,effects:$.effects})}function mh($,_e){return{eventTime:$,lane:_e,tag:0,payload:null,callback:null,next:null}}function nh($,_e,et){var tt=$.updateQueue;if(tt===null)return null;if(tt=tt.shared,K&2){var rt=tt.pending;return rt===null?_e.next=_e:(_e.next=rt.next,rt.next=_e),tt.pending=_e,ih($,et)}return rt=tt.interleaved,rt===null?(_e.next=_e,gh(tt)):(_e.next=rt.next,rt.next=_e),tt.interleaved=_e,ih($,et)}function oh($,_e,et){if(_e=_e.updateQueue,_e!==null&&(_e=_e.shared,(et&4194240)!==0)){var tt=_e.lanes;tt&=$.pendingLanes,et|=tt,_e.lanes=et,Cc($,et)}}function ph($,_e){var et=$.updateQueue,tt=$.alternate;if(tt!==null&&(tt=tt.updateQueue,et===tt)){var rt=null,nt=null;if(et=et.firstBaseUpdate,et!==null){do{var at={eventTime:et.eventTime,lane:et.lane,tag:et.tag,payload:et.payload,callback:et.callback,next:null};nt===null?rt=nt=at:nt=nt.next=at,et=et.next}while(et!==null);nt===null?rt=nt=_e:nt=nt.next=_e}else rt=nt=_e;et={baseState:tt.baseState,firstBaseUpdate:rt,lastBaseUpdate:nt,shared:tt.shared,effects:tt.effects},$.updateQueue=et;return}$=et.lastBaseUpdate,$===null?et.firstBaseUpdate=_e:$.next=_e,et.lastBaseUpdate=_e}function qh($,_e,et,tt){var rt=$.updateQueue;jh=!1;var nt=rt.firstBaseUpdate,at=rt.lastBaseUpdate,ot=rt.shared.pending;if(ot!==null){rt.shared.pending=null;var it=ot,ft=it.next;it.next=null,at===null?nt=ft:at.next=ft,at=it;var st=$.alternate;st!==null&&(st=st.updateQueue,ot=st.lastBaseUpdate,ot!==at&&(ot===null?st.firstBaseUpdate=ft:ot.next=ft,st.lastBaseUpdate=it))}if(nt!==null){var lt=rt.baseState;at=0,st=ft=it=null,ot=nt;do{var ut=ot.lane,ct=ot.eventTime;if((tt&ut)===ut){st!==null&&(st=st.next={eventTime:ct,lane:0,tag:ot.tag,payload:ot.payload,callback:ot.callback,next:null});e:{var gt=$,mt=ot;switch(ut=_e,ct=et,mt.tag){case 1:if(gt=mt.payload,typeof gt=="function"){lt=gt.call(ct,lt,ut);break e}lt=gt;break e;case 3:gt.flags=gt.flags&-65537|128;case 0:if(gt=mt.payload,ut=typeof gt=="function"?gt.call(ct,lt,ut):gt,ut==null)break e;lt=A$2({},lt,ut);break e;case 2:jh=!0}}ot.callback!==null&&ot.lane!==0&&($.flags|=64,ut=rt.effects,ut===null?rt.effects=[ot]:ut.push(ot))}else ct={eventTime:ct,lane:ut,tag:ot.tag,payload:ot.payload,callback:ot.callback,next:null},st===null?(ft=st=ct,it=lt):st=st.next=ct,at|=ut;if(ot=ot.next,ot===null){if(ot=rt.shared.pending,ot===null)break;ut=ot,ot=ut.next,ut.next=null,rt.lastBaseUpdate=ut,rt.shared.pending=null}}while(1);if(st===null&&(it=lt),rt.baseState=it,rt.firstBaseUpdate=ft,rt.lastBaseUpdate=st,_e=rt.shared.interleaved,_e!==null){rt=_e;do at|=rt.lane,rt=rt.next;while(rt!==_e)}else nt===null&&(rt.shared.lanes=0);rh|=at,$.lanes=at,$.memoizedState=lt}}function sh($,_e,et){if($=_e.effects,_e.effects=null,$!==null)for(_e=0;_e<$.length;_e++){var tt=$[_e],rt=tt.callback;if(rt!==null){if(tt.callback=null,tt=et,typeof rt!="function")throw Error(p$3(191,rt));rt.call(tt)}}}var th={},uh=Uf(th),vh=Uf(th),wh=Uf(th);function xh($){if($===th)throw Error(p$3(174));return $}function yh($,_e){switch(G$1(wh,_e),G$1(vh,$),G$1(uh,th),$=_e.nodeType,$){case 9:case 11:_e=(_e=_e.documentElement)?_e.namespaceURI:lb(null,"");break;default:$=$===8?_e.parentNode:_e,_e=$.namespaceURI||null,$=$.tagName,_e=lb(_e,$)}E$1(uh),G$1(uh,_e)}function zh(){E$1(uh),E$1(vh),E$1(wh)}function Ah($){xh(wh.current);var _e=xh(uh.current),et=lb(_e,$.type);_e!==et&&(G$1(vh,$),G$1(uh,et))}function Bh($){vh.current===$&&(E$1(uh),E$1(vh))}var L$1=Uf(0);function Ch($){for(var _e=$;_e!==null;){if(_e.tag===13){var et=_e.memoizedState;if(et!==null&&(et=et.dehydrated,et===null||et.data==="$?"||et.data==="$!"))return _e}else if(_e.tag===19&&_e.memoizedProps.revealOrder!==void 0){if(_e.flags&128)return _e}else if(_e.child!==null){_e.child.return=_e,_e=_e.child;continue}if(_e===$)break;for(;_e.sibling===null;){if(_e.return===null||_e.return===$)return null;_e=_e.return}_e.sibling.return=_e.return,_e=_e.sibling}return null}var Dh=[];function Eh(){for(var $=0;$et?et:4,$(!0);var tt=Gh.transition;Gh.transition={};try{$(!1),_e()}finally{C=et,Gh.transition=tt}}function wi(){return Uh().memoizedState}function xi($,_e,et){var tt=yi($);if(et={lane:tt,action:et,hasEagerState:!1,eagerState:null,next:null},zi($))Ai(_e,et);else if(et=hh($,_e,et,tt),et!==null){var rt=R$1();gi(et,$,tt,rt),Bi(et,_e,tt)}}function ii($,_e,et){var tt=yi($),rt={lane:tt,action:et,hasEagerState:!1,eagerState:null,next:null};if(zi($))Ai(_e,rt);else{var nt=$.alternate;if($.lanes===0&&(nt===null||nt.lanes===0)&&(nt=_e.lastRenderedReducer,nt!==null))try{var at=_e.lastRenderedState,ot=nt(at,et);if(rt.hasEagerState=!0,rt.eagerState=ot,He(ot,at)){var it=_e.interleaved;it===null?(rt.next=rt,gh(_e)):(rt.next=it.next,it.next=rt),_e.interleaved=rt;return}}catch{}finally{}et=hh($,_e,rt,tt),et!==null&&(rt=R$1(),gi(et,$,tt,rt),Bi(et,_e,tt))}}function zi($){var _e=$.alternate;return $===M$1||_e!==null&&_e===M$1}function Ai($,_e){Jh=Ih=!0;var et=$.pending;et===null?_e.next=_e:(_e.next=et.next,et.next=_e),$.pending=_e}function Bi($,_e,et){if(et&4194240){var tt=_e.lanes;tt&=$.pendingLanes,et|=tt,_e.lanes=et,Cc($,et)}}var Rh={readContext:eh,useCallback:P$1,useContext:P$1,useEffect:P$1,useImperativeHandle:P$1,useInsertionEffect:P$1,useLayoutEffect:P$1,useMemo:P$1,useReducer:P$1,useRef:P$1,useState:P$1,useDebugValue:P$1,useDeferredValue:P$1,useTransition:P$1,useMutableSource:P$1,useSyncExternalStore:P$1,useId:P$1,unstable_isNewReconciler:!1},Oh={readContext:eh,useCallback:function($,_e){return Th().memoizedState=[$,_e===void 0?null:_e],$},useContext:eh,useEffect:mi,useImperativeHandle:function($,_e,et){return et=et!=null?et.concat([$]):null,ki(4194308,4,pi.bind(null,_e,$),et)},useLayoutEffect:function($,_e){return ki(4194308,4,$,_e)},useInsertionEffect:function($,_e){return ki(4,2,$,_e)},useMemo:function($,_e){var et=Th();return _e=_e===void 0?null:_e,$=$(),et.memoizedState=[$,_e],$},useReducer:function($,_e,et){var tt=Th();return _e=et!==void 0?et(_e):_e,tt.memoizedState=tt.baseState=_e,$={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:$,lastRenderedState:_e},tt.queue=$,$=$.dispatch=xi.bind(null,M$1,$),[tt.memoizedState,$]},useRef:function($){var _e=Th();return $={current:$},_e.memoizedState=$},useState:hi,useDebugValue:ri,useDeferredValue:function($){return Th().memoizedState=$},useTransition:function(){var $=hi(!1),_e=$[0];return $=vi.bind(null,$[1]),Th().memoizedState=$,[_e,$]},useMutableSource:function(){},useSyncExternalStore:function($,_e,et){var tt=M$1,rt=Th();if(I$1){if(et===void 0)throw Error(p$3(407));et=et()}else{if(et=_e(),Q$1===null)throw Error(p$3(349));Hh&30||di(tt,_e,et)}rt.memoizedState=et;var nt={value:et,getSnapshot:_e};return rt.queue=nt,mi(ai.bind(null,tt,nt,$),[$]),tt.flags|=2048,bi(9,ci.bind(null,tt,nt,et,_e),void 0,null),et},useId:function(){var $=Th(),_e=Q$1.identifierPrefix;if(I$1){var et=sg,tt=rg;et=(tt&~(1<<32-oc(tt)-1)).toString(32)+et,_e=":"+_e+"R"+et,et=Kh++,0<\/script>",$=$.removeChild($.firstChild)):typeof tt.is=="string"?$=at.createElement(et,{is:tt.is}):($=at.createElement(et),et==="select"&&(at=$,tt.multiple?at.multiple=!0:tt.size&&(at.size=tt.size))):$=at.createElementNS($,et),$[Of]=_e,$[Pf]=tt,zj($,_e,!1,!1),_e.stateNode=$;e:{switch(at=vb(et,tt),et){case"dialog":D$1("cancel",$),D$1("close",$),rt=tt;break;case"iframe":case"object":case"embed":D$1("load",$),rt=tt;break;case"video":case"audio":for(rt=0;rtGj&&(_e.flags|=128,tt=!0,Dj(nt,!1),_e.lanes=4194304)}else{if(!tt)if($=Ch(at),$!==null){if(_e.flags|=128,tt=!0,et=$.updateQueue,et!==null&&(_e.updateQueue=et,_e.flags|=4),Dj(nt,!0),nt.tail===null&&nt.tailMode==="hidden"&&!at.alternate&&!I$1)return S$1(_e),null}else 2*B$1()-nt.renderingStartTime>Gj&&et!==1073741824&&(_e.flags|=128,tt=!0,Dj(nt,!1),_e.lanes=4194304);nt.isBackwards?(at.sibling=_e.child,_e.child=at):(et=nt.last,et!==null?et.sibling=at:_e.child=at,nt.last=at)}return nt.tail!==null?(_e=nt.tail,nt.rendering=_e,nt.tail=_e.sibling,nt.renderingStartTime=B$1(),_e.sibling=null,et=L$1.current,G$1(L$1,tt?et&1|2:et&1),_e):(S$1(_e),null);case 22:case 23:return Hj(),tt=_e.memoizedState!==null,$!==null&&$.memoizedState!==null!==tt&&(_e.flags|=8192),tt&&_e.mode&1?fj&1073741824&&(S$1(_e),_e.subtreeFlags&6&&(_e.flags|=8192)):S$1(_e),null;case 24:return null;case 25:return null}throw Error(p$3(156,_e.tag))}function Ij($,_e){switch(wg(_e),_e.tag){case 1:return Zf(_e.type)&&$f(),$=_e.flags,$&65536?(_e.flags=$&-65537|128,_e):null;case 3:return zh(),E$1(Wf),E$1(H$1),Eh(),$=_e.flags,$&65536&&!($&128)?(_e.flags=$&-65537|128,_e):null;case 5:return Bh(_e),null;case 13:if(E$1(L$1),$=_e.memoizedState,$!==null&&$.dehydrated!==null){if(_e.alternate===null)throw Error(p$3(340));Ig()}return $=_e.flags,$&65536?(_e.flags=$&-65537|128,_e):null;case 19:return E$1(L$1),null;case 4:return zh(),null;case 10:return ah(_e.type._context),null;case 22:case 23:return Hj(),null;case 24:return null;default:return null}}var Jj=!1,U$1=!1,Kj=typeof WeakSet=="function"?WeakSet:Set,V=null;function Lj($,_e){var et=$.ref;if(et!==null)if(typeof et=="function")try{et(null)}catch(tt){W$1($,_e,tt)}else et.current=null}function Mj($,_e,et){try{et()}catch(tt){W$1($,_e,tt)}}var Nj=!1;function Oj($,_e){if(Cf=dd,$=Me(),Ne($)){if("selectionStart"in $)var et={start:$.selectionStart,end:$.selectionEnd};else e:{et=(et=$.ownerDocument)&&et.defaultView||window;var tt=et.getSelection&&et.getSelection();if(tt&&tt.rangeCount!==0){et=tt.anchorNode;var rt=tt.anchorOffset,nt=tt.focusNode;tt=tt.focusOffset;try{et.nodeType,nt.nodeType}catch{et=null;break e}var at=0,ot=-1,it=-1,ft=0,st=0,lt=$,ut=null;t:for(;;){for(var ct;lt!==et||rt!==0&<.nodeType!==3||(ot=at+rt),lt!==nt||tt!==0&<.nodeType!==3||(it=at+tt),lt.nodeType===3&&(at+=lt.nodeValue.length),(ct=lt.firstChild)!==null;)ut=lt,lt=ct;for(;;){if(lt===$)break t;if(ut===et&&++ft===rt&&(ot=at),ut===nt&&++st===tt&&(it=at),(ct=lt.nextSibling)!==null)break;lt=ut,ut=lt.parentNode}lt=ct}et=ot===-1||it===-1?null:{start:ot,end:it}}else et=null}et=et||{start:0,end:0}}else et=null;for(Df={focusedElem:$,selectionRange:et},dd=!1,V=_e;V!==null;)if(_e=V,$=_e.child,(_e.subtreeFlags&1028)!==0&&$!==null)$.return=_e,V=$;else for(;V!==null;){_e=V;try{var gt=_e.alternate;if(_e.flags&1024)switch(_e.tag){case 0:case 11:case 15:break;case 1:if(gt!==null){var mt=gt.memoizedProps,ht=gt.memoizedState,pt=_e.stateNode,dt=pt.getSnapshotBeforeUpdate(_e.elementType===_e.type?mt:Ci(_e.type,mt),ht);pt.__reactInternalSnapshotBeforeUpdate=dt}break;case 3:var yt=_e.stateNode.containerInfo;yt.nodeType===1?yt.textContent="":yt.nodeType===9&&yt.documentElement&&yt.removeChild(yt.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(p$3(163))}}catch(vt){W$1(_e,_e.return,vt)}if($=_e.sibling,$!==null){$.return=_e.return,V=$;break}V=_e.return}return gt=Nj,Nj=!1,gt}function Pj($,_e,et){var tt=_e.updateQueue;if(tt=tt!==null?tt.lastEffect:null,tt!==null){var rt=tt=tt.next;do{if((rt.tag&$)===$){var nt=rt.destroy;rt.destroy=void 0,nt!==void 0&&Mj(_e,et,nt)}rt=rt.next}while(rt!==tt)}}function Qj($,_e){if(_e=_e.updateQueue,_e=_e!==null?_e.lastEffect:null,_e!==null){var et=_e=_e.next;do{if((et.tag&$)===$){var tt=et.create;et.destroy=tt()}et=et.next}while(et!==_e)}}function Rj($){var _e=$.ref;if(_e!==null){var et=$.stateNode;switch($.tag){case 5:$=et;break;default:$=et}typeof _e=="function"?_e($):_e.current=$}}function Sj($){var _e=$.alternate;_e!==null&&($.alternate=null,Sj(_e)),$.child=null,$.deletions=null,$.sibling=null,$.tag===5&&(_e=$.stateNode,_e!==null&&(delete _e[Of],delete _e[Pf],delete _e[of],delete _e[Qf],delete _e[Rf])),$.stateNode=null,$.return=null,$.dependencies=null,$.memoizedProps=null,$.memoizedState=null,$.pendingProps=null,$.stateNode=null,$.updateQueue=null}function Tj($){return $.tag===5||$.tag===3||$.tag===4}function Uj($){e:for(;;){for(;$.sibling===null;){if($.return===null||Tj($.return))return null;$=$.return}for($.sibling.return=$.return,$=$.sibling;$.tag!==5&&$.tag!==6&&$.tag!==18;){if($.flags&2||$.child===null||$.tag===4)continue e;$.child.return=$,$=$.child}if(!($.flags&2))return $.stateNode}}function Vj($,_e,et){var tt=$.tag;if(tt===5||tt===6)$=$.stateNode,_e?et.nodeType===8?et.parentNode.insertBefore($,_e):et.insertBefore($,_e):(et.nodeType===8?(_e=et.parentNode,_e.insertBefore($,et)):(_e=et,_e.appendChild($)),et=et._reactRootContainer,et!=null||_e.onclick!==null||(_e.onclick=Bf));else if(tt!==4&&($=$.child,$!==null))for(Vj($,_e,et),$=$.sibling;$!==null;)Vj($,_e,et),$=$.sibling}function Wj($,_e,et){var tt=$.tag;if(tt===5||tt===6)$=$.stateNode,_e?et.insertBefore($,_e):et.appendChild($);else if(tt!==4&&($=$.child,$!==null))for(Wj($,_e,et),$=$.sibling;$!==null;)Wj($,_e,et),$=$.sibling}var X$1=null,Xj=!1;function Yj($,_e,et){for(et=et.child;et!==null;)Zj($,_e,et),et=et.sibling}function Zj($,_e,et){if(lc&&typeof lc.onCommitFiberUnmount=="function")try{lc.onCommitFiberUnmount(kc,et)}catch{}switch(et.tag){case 5:U$1||Lj(et,_e);case 6:var tt=X$1,rt=Xj;X$1=null,Yj($,_e,et),X$1=tt,Xj=rt,X$1!==null&&(Xj?($=X$1,et=et.stateNode,$.nodeType===8?$.parentNode.removeChild(et):$.removeChild(et)):X$1.removeChild(et.stateNode));break;case 18:X$1!==null&&(Xj?($=X$1,et=et.stateNode,$.nodeType===8?Kf($.parentNode,et):$.nodeType===1&&Kf($,et),bd($)):Kf(X$1,et.stateNode));break;case 4:tt=X$1,rt=Xj,X$1=et.stateNode.containerInfo,Xj=!0,Yj($,_e,et),X$1=tt,Xj=rt;break;case 0:case 11:case 14:case 15:if(!U$1&&(tt=et.updateQueue,tt!==null&&(tt=tt.lastEffect,tt!==null))){rt=tt=tt.next;do{var nt=rt,at=nt.destroy;nt=nt.tag,at!==void 0&&(nt&2||nt&4)&&Mj(et,_e,at),rt=rt.next}while(rt!==tt)}Yj($,_e,et);break;case 1:if(!U$1&&(Lj(et,_e),tt=et.stateNode,typeof tt.componentWillUnmount=="function"))try{tt.props=et.memoizedProps,tt.state=et.memoizedState,tt.componentWillUnmount()}catch(ot){W$1(et,_e,ot)}Yj($,_e,et);break;case 21:Yj($,_e,et);break;case 22:et.mode&1?(U$1=(tt=U$1)||et.memoizedState!==null,Yj($,_e,et),U$1=tt):Yj($,_e,et);break;default:Yj($,_e,et)}}function ak($){var _e=$.updateQueue;if(_e!==null){$.updateQueue=null;var et=$.stateNode;et===null&&(et=$.stateNode=new Kj),_e.forEach(function(tt){var rt=bk.bind(null,$,tt);et.has(tt)||(et.add(tt),tt.then(rt,rt))})}}function ck($,_e){var et=_e.deletions;if(et!==null)for(var tt=0;ttrt&&(rt=at),tt&=~nt}if(tt=rt,tt=B$1()-tt,tt=(120>tt?120:480>tt?480:1080>tt?1080:1920>tt?1920:3e3>tt?3e3:4320>tt?4320:1960*lk(tt/1960))-tt,10$?16:$,wk===null)var tt=!1;else{if($=wk,wk=null,xk=0,K&6)throw Error(p$3(331));var rt=K;for(K|=4,V=$.current;V!==null;){var nt=V,at=nt.child;if(V.flags&16){var ot=nt.deletions;if(ot!==null){for(var it=0;itB$1()-fk?Kk($,0):rk|=et),Dk($,_e)}function Yk($,_e){_e===0&&($.mode&1?(_e=sc,sc<<=1,!(sc&130023424)&&(sc=4194304)):_e=1);var et=R$1();$=ih($,_e),$!==null&&(Ac($,_e,et),Dk($,et))}function uj($){var _e=$.memoizedState,et=0;_e!==null&&(et=_e.retryLane),Yk($,et)}function bk($,_e){var et=0;switch($.tag){case 13:var tt=$.stateNode,rt=$.memoizedState;rt!==null&&(et=rt.retryLane);break;case 19:tt=$.stateNode;break;default:throw Error(p$3(314))}tt!==null&&tt.delete(_e),Yk($,et)}var Vk;Vk=function($,_e,et){if($!==null)if($.memoizedProps!==_e.pendingProps||Wf.current)dh=!0;else{if(!($.lanes&et)&&!(_e.flags&128))return dh=!1,yj($,_e,et);dh=!!($.flags&131072)}else dh=!1,I$1&&_e.flags&1048576&&ug(_e,ng,_e.index);switch(_e.lanes=0,_e.tag){case 2:var tt=_e.type;ij($,_e),$=_e.pendingProps;var rt=Yf(_e,H$1.current);ch(_e,et),rt=Nh(null,_e,tt,$,rt,et);var nt=Sh();return _e.flags|=1,typeof rt=="object"&&rt!==null&&typeof rt.render=="function"&&rt.$$typeof===void 0?(_e.tag=1,_e.memoizedState=null,_e.updateQueue=null,Zf(tt)?(nt=!0,cg(_e)):nt=!1,_e.memoizedState=rt.state!==null&&rt.state!==void 0?rt.state:null,kh(_e),rt.updater=Ei,_e.stateNode=rt,rt._reactInternals=_e,Ii(_e,tt,$,et),_e=jj(null,_e,tt,!0,nt,et)):(_e.tag=0,I$1&&nt&&vg(_e),Xi(null,_e,rt,et),_e=_e.child),_e;case 16:tt=_e.elementType;e:{switch(ij($,_e),$=_e.pendingProps,rt=tt._init,tt=rt(tt._payload),_e.type=tt,rt=_e.tag=Zk(tt),$=Ci(tt,$),rt){case 0:_e=cj(null,_e,tt,$,et);break e;case 1:_e=hj(null,_e,tt,$,et);break e;case 11:_e=Yi(null,_e,tt,$,et);break e;case 14:_e=$i(null,_e,tt,Ci(tt.type,$),et);break e}throw Error(p$3(306,tt,""))}return _e;case 0:return tt=_e.type,rt=_e.pendingProps,rt=_e.elementType===tt?rt:Ci(tt,rt),cj($,_e,tt,rt,et);case 1:return tt=_e.type,rt=_e.pendingProps,rt=_e.elementType===tt?rt:Ci(tt,rt),hj($,_e,tt,rt,et);case 3:e:{if(kj(_e),$===null)throw Error(p$3(387));tt=_e.pendingProps,nt=_e.memoizedState,rt=nt.element,lh($,_e),qh(_e,tt,null,et);var at=_e.memoizedState;if(tt=at.element,nt.isDehydrated)if(nt={element:tt,isDehydrated:!1,cache:at.cache,pendingSuspenseBoundaries:at.pendingSuspenseBoundaries,transitions:at.transitions},_e.updateQueue.baseState=nt,_e.memoizedState=nt,_e.flags&256){rt=Ji(Error(p$3(423)),_e),_e=lj($,_e,tt,et,rt);break e}else if(tt!==rt){rt=Ji(Error(p$3(424)),_e),_e=lj($,_e,tt,et,rt);break e}else for(yg=Lf(_e.stateNode.containerInfo.firstChild),xg=_e,I$1=!0,zg=null,et=Vg(_e,null,tt,et),_e.child=et;et;)et.flags=et.flags&-3|4096,et=et.sibling;else{if(Ig(),tt===rt){_e=Zi($,_e,et);break e}Xi($,_e,tt,et)}_e=_e.child}return _e;case 5:return Ah(_e),$===null&&Eg(_e),tt=_e.type,rt=_e.pendingProps,nt=$!==null?$.memoizedProps:null,at=rt.children,Ef(tt,rt)?at=null:nt!==null&&Ef(tt,nt)&&(_e.flags|=32),gj($,_e),Xi($,_e,at,et),_e.child;case 6:return $===null&&Eg(_e),null;case 13:return oj($,_e,et);case 4:return yh(_e,_e.stateNode.containerInfo),tt=_e.pendingProps,$===null?_e.child=Ug(_e,null,tt,et):Xi($,_e,tt,et),_e.child;case 11:return tt=_e.type,rt=_e.pendingProps,rt=_e.elementType===tt?rt:Ci(tt,rt),Yi($,_e,tt,rt,et);case 7:return Xi($,_e,_e.pendingProps,et),_e.child;case 8:return Xi($,_e,_e.pendingProps.children,et),_e.child;case 12:return Xi($,_e,_e.pendingProps.children,et),_e.child;case 10:e:{if(tt=_e.type._context,rt=_e.pendingProps,nt=_e.memoizedProps,at=rt.value,G$1(Wg,tt._currentValue),tt._currentValue=at,nt!==null)if(He(nt.value,at)){if(nt.children===rt.children&&!Wf.current){_e=Zi($,_e,et);break e}}else for(nt=_e.child,nt!==null&&(nt.return=_e);nt!==null;){var ot=nt.dependencies;if(ot!==null){at=nt.child;for(var it=ot.firstContext;it!==null;){if(it.context===tt){if(nt.tag===1){it=mh(-1,et&-et),it.tag=2;var ft=nt.updateQueue;if(ft!==null){ft=ft.shared;var st=ft.pending;st===null?it.next=it:(it.next=st.next,st.next=it),ft.pending=it}}nt.lanes|=et,it=nt.alternate,it!==null&&(it.lanes|=et),bh(nt.return,et,_e),ot.lanes|=et;break}it=it.next}}else if(nt.tag===10)at=nt.type===_e.type?null:nt.child;else if(nt.tag===18){if(at=nt.return,at===null)throw Error(p$3(341));at.lanes|=et,ot=at.alternate,ot!==null&&(ot.lanes|=et),bh(at,et,_e),at=nt.sibling}else at=nt.child;if(at!==null)at.return=nt;else for(at=nt;at!==null;){if(at===_e){at=null;break}if(nt=at.sibling,nt!==null){nt.return=at.return,at=nt;break}at=at.return}nt=at}Xi($,_e,rt.children,et),_e=_e.child}return _e;case 9:return rt=_e.type,tt=_e.pendingProps.children,ch(_e,et),rt=eh(rt),tt=tt(rt),_e.flags|=1,Xi($,_e,tt,et),_e.child;case 14:return tt=_e.type,rt=Ci(tt,_e.pendingProps),rt=Ci(tt.type,rt),$i($,_e,tt,rt,et);case 15:return bj($,_e,_e.type,_e.pendingProps,et);case 17:return tt=_e.type,rt=_e.pendingProps,rt=_e.elementType===tt?rt:Ci(tt,rt),ij($,_e),_e.tag=1,Zf(tt)?($=!0,cg(_e)):$=!1,ch(_e,et),Gi(_e,tt,rt),Ii(_e,tt,rt,et),jj(null,_e,tt,!0,$,et);case 19:return xj($,_e,et);case 22:return dj($,_e,et)}throw Error(p$3(156,_e.tag))};function Fk($,_e){return ac($,_e)}function $k($,_e,et,tt){this.tag=$,this.key=et,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=_e,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=tt,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Bg($,_e,et,tt){return new $k($,_e,et,tt)}function aj($){return $=$.prototype,!(!$||!$.isReactComponent)}function Zk($){if(typeof $=="function")return aj($)?1:0;if($!=null){if($=$.$$typeof,$===Da)return 11;if($===Ga)return 14}return 2}function Pg($,_e){var et=$.alternate;return et===null?(et=Bg($.tag,_e,$.key,$.mode),et.elementType=$.elementType,et.type=$.type,et.stateNode=$.stateNode,et.alternate=$,$.alternate=et):(et.pendingProps=_e,et.type=$.type,et.flags=0,et.subtreeFlags=0,et.deletions=null),et.flags=$.flags&14680064,et.childLanes=$.childLanes,et.lanes=$.lanes,et.child=$.child,et.memoizedProps=$.memoizedProps,et.memoizedState=$.memoizedState,et.updateQueue=$.updateQueue,_e=$.dependencies,et.dependencies=_e===null?null:{lanes:_e.lanes,firstContext:_e.firstContext},et.sibling=$.sibling,et.index=$.index,et.ref=$.ref,et}function Rg($,_e,et,tt,rt,nt){var at=2;if(tt=$,typeof $=="function")aj($)&&(at=1);else if(typeof $=="string")at=5;else e:switch($){case ya:return Tg(et.children,rt,nt,_e);case za:at=8,rt|=8;break;case Aa:return $=Bg(12,et,_e,rt|2),$.elementType=Aa,$.lanes=nt,$;case Ea:return $=Bg(13,et,_e,rt),$.elementType=Ea,$.lanes=nt,$;case Fa:return $=Bg(19,et,_e,rt),$.elementType=Fa,$.lanes=nt,$;case Ia:return pj(et,rt,nt,_e);default:if(typeof $=="object"&&$!==null)switch($.$$typeof){case Ba:at=10;break e;case Ca:at=9;break e;case Da:at=11;break e;case Ga:at=14;break e;case Ha:at=16,tt=null;break e}throw Error(p$3(130,$==null?$:typeof $,""))}return _e=Bg(at,et,_e,rt),_e.elementType=$,_e.type=tt,_e.lanes=nt,_e}function Tg($,_e,et,tt){return $=Bg(7,$,tt,_e),$.lanes=et,$}function pj($,_e,et,tt){return $=Bg(22,$,tt,_e),$.elementType=Ia,$.lanes=et,$.stateNode={isHidden:!1},$}function Qg($,_e,et){return $=Bg(6,$,null,_e),$.lanes=et,$}function Sg($,_e,et){return _e=Bg(4,$.children!==null?$.children:[],$.key,_e),_e.lanes=et,_e.stateNode={containerInfo:$.containerInfo,pendingChildren:null,implementation:$.implementation},_e}function al($,_e,et,tt,rt){this.tag=_e,this.containerInfo=$,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=zc(0),this.expirationTimes=zc(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=zc(0),this.identifierPrefix=tt,this.onRecoverableError=rt,this.mutableSourceEagerHydrationData=null}function bl($,_e,et,tt,rt,nt,at,ot,it){return $=new al($,_e,et,ot,it),_e===1?(_e=1,nt===!0&&(_e|=8)):_e=0,nt=Bg(3,null,null,_e),$.current=nt,nt.stateNode=$,nt.memoizedState={element:tt,isDehydrated:et,cache:null,transitions:null,pendingSuspenseBoundaries:null},kh(nt),$}function cl($,_e,et){var tt=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE)}catch($){console.error($)}}checkDCE(),reactDom.exports=reactDom_production_min;var reactDomExports=reactDom.exports,m$3=reactDomExports;client.createRoot=m$3.createRoot,client.hydrateRoot=m$3.hydrateRoot;var shim$3={exports:{}},useSyncExternalStoreShim_production={};/** * @license React * use-sync-external-store-shim.production.js * * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */var React$1=reactExports;function is$2($,_e){return $===_e&&($!==0||1/$===1/_e)||$!==$&&_e!==_e}var objectIs$1=typeof Object.is=="function"?Object.is:is$2,useState$1=React$1.useState,useEffect$2=React$1.useEffect,useLayoutEffect$1=React$1.useLayoutEffect,useDebugValue$2=React$1.useDebugValue;function useSyncExternalStore$2$1($,_e){var et=_e(),tt=useState$1({inst:{value:et,getSnapshot:_e}}),rt=tt[0].inst,nt=tt[1];return useLayoutEffect$1(function(){rt.value=et,rt.getSnapshot=_e,checkIfSnapshotChanged$1(rt)&&nt({inst:rt})},[$,et,_e]),useEffect$2(function(){return checkIfSnapshotChanged$1(rt)&&nt({inst:rt}),$(function(){checkIfSnapshotChanged$1(rt)&&nt({inst:rt})})},[$]),useDebugValue$2(et),et}function checkIfSnapshotChanged$1($){var _e=$.getSnapshot;$=$.value;try{var et=_e();return!objectIs$1($,et)}catch{return!0}}function useSyncExternalStore$1$1($,_e){return _e()}var shim$2=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?useSyncExternalStore$1$1:useSyncExternalStore$2$1;useSyncExternalStoreShim_production.useSyncExternalStore=React$1.useSyncExternalStore!==void 0?React$1.useSyncExternalStore:shim$2;shim$3.exports=useSyncExternalStoreShim_production;var shimExports=shim$3.exports,withSelector={exports:{}},withSelector_production={};/** * @license React * use-sync-external-store-shim/with-selector.production.js * * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */var React=reactExports,shim$1=shimExports;function is$1($,_e){return $===_e&&($!==0||1/$===1/_e)||$!==$&&_e!==_e}var objectIs=typeof Object.is=="function"?Object.is:is$1,useSyncExternalStore$3=shim$1.useSyncExternalStore,useRef=React.useRef,useEffect$1=React.useEffect,useMemo=React.useMemo,useDebugValue$1=React.useDebugValue;withSelector_production.useSyncExternalStoreWithSelector=function($,_e,et,tt,rt){var nt=useRef(null);if(nt.current===null){var at={hasValue:!1,value:null};nt.current=at}else at=nt.current;nt=useMemo(function(){function it(ct){if(!ft){if(ft=!0,st=ct,ct=tt(ct),rt!==void 0&&at.hasValue){var gt=at.value;if(rt(gt,ct))return lt=gt}return lt=ct}if(gt=lt,objectIs(st,ct))return gt;var mt=tt(ct);return rt!==void 0&&rt(gt,mt)?(st=ct,gt):(st=ct,lt=mt)}var ft=!1,st,lt,ut=et===void 0?null:et;return[function(){return it(_e())},ut===null?void 0:function(){return it(ut())}]},[_e,et,tt,rt]);var ot=useSyncExternalStore$3($,nt[0],nt[1]);return useEffect$1(function(){at.hasValue=!0,at.value=ot},[ot]),useDebugValue$1(ot),ot};withSelector.exports=withSelector_production;var withSelectorExports=withSelector.exports;function defaultNoopBatch($){$()}let batch=defaultNoopBatch;const setBatch=$=>batch=$,getBatch=()=>batch,ReactReduxContext=reactExports.createContext(null);function useReduxContext(){return reactExports.useContext(ReactReduxContext)}const notInitialized=()=>{throw new Error("uSES not initialized!")};let useSyncExternalStoreWithSelector=notInitialized;const initializeUseSelector=$=>{useSyncExternalStoreWithSelector=$},refEquality=($,_e)=>$===_e;function createSelectorHook($=ReactReduxContext){const _e=$===ReactReduxContext?useReduxContext:()=>reactExports.useContext($);return function(tt,rt=refEquality){const{store:nt,subscription:at,getServerState:ot}=_e(),it=useSyncExternalStoreWithSelector(at.addNestedSub,nt.getState,ot||nt.getState,tt,rt);return reactExports.useDebugValue(it),it}}const useSelector=createSelectorHook();var reactIs$1={exports:{}},reactIs_production_min$1={};/** @license React v16.13.1 * react-is.production.min.js * * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */var b$2=typeof Symbol=="function"&&Symbol.for,c$2=b$2?Symbol.for("react.element"):60103,d$2=b$2?Symbol.for("react.portal"):60106,e$1=b$2?Symbol.for("react.fragment"):60107,f$2=b$2?Symbol.for("react.strict_mode"):60108,g$2=b$2?Symbol.for("react.profiler"):60114,h$2=b$2?Symbol.for("react.provider"):60109,k$2=b$2?Symbol.for("react.context"):60110,l$2=b$2?Symbol.for("react.async_mode"):60111,m$2=b$2?Symbol.for("react.concurrent_mode"):60111,n$2=b$2?Symbol.for("react.forward_ref"):60112,p$2=b$2?Symbol.for("react.suspense"):60113,q$2=b$2?Symbol.for("react.suspense_list"):60120,r$1=b$2?Symbol.for("react.memo"):60115,t$2=b$2?Symbol.for("react.lazy"):60116,v$2=b$2?Symbol.for("react.block"):60121,w$1=b$2?Symbol.for("react.fundamental"):60117,x$1=b$2?Symbol.for("react.responder"):60118,y$1=b$2?Symbol.for("react.scope"):60119;function z$1($){if(typeof $=="object"&&$!==null){var _e=$.$$typeof;switch(_e){case c$2:switch($=$.type,$){case l$2:case m$2:case e$1:case g$2:case f$2:case p$2:return $;default:switch($=$&&$.$$typeof,$){case k$2:case n$2:case t$2:case r$1:case h$2:return $;default:return _e}}case d$2:return _e}}}function A$1($){return z$1($)===m$2}reactIs_production_min$1.AsyncMode=l$2;reactIs_production_min$1.ConcurrentMode=m$2;reactIs_production_min$1.ContextConsumer=k$2;reactIs_production_min$1.ContextProvider=h$2;reactIs_production_min$1.Element=c$2;reactIs_production_min$1.ForwardRef=n$2;reactIs_production_min$1.Fragment=e$1;reactIs_production_min$1.Lazy=t$2;reactIs_production_min$1.Memo=r$1;reactIs_production_min$1.Portal=d$2;reactIs_production_min$1.Profiler=g$2;reactIs_production_min$1.StrictMode=f$2;reactIs_production_min$1.Suspense=p$2;reactIs_production_min$1.isAsyncMode=function($){return A$1($)||z$1($)===l$2};reactIs_production_min$1.isConcurrentMode=A$1;reactIs_production_min$1.isContextConsumer=function($){return z$1($)===k$2};reactIs_production_min$1.isContextProvider=function($){return z$1($)===h$2};reactIs_production_min$1.isElement=function($){return typeof $=="object"&&$!==null&&$.$$typeof===c$2};reactIs_production_min$1.isForwardRef=function($){return z$1($)===n$2};reactIs_production_min$1.isFragment=function($){return z$1($)===e$1};reactIs_production_min$1.isLazy=function($){return z$1($)===t$2};reactIs_production_min$1.isMemo=function($){return z$1($)===r$1};reactIs_production_min$1.isPortal=function($){return z$1($)===d$2};reactIs_production_min$1.isProfiler=function($){return z$1($)===g$2};reactIs_production_min$1.isStrictMode=function($){return z$1($)===f$2};reactIs_production_min$1.isSuspense=function($){return z$1($)===p$2};reactIs_production_min$1.isValidElementType=function($){return typeof $=="string"||typeof $=="function"||$===e$1||$===m$2||$===g$2||$===f$2||$===p$2||$===q$2||typeof $=="object"&&$!==null&&($.$$typeof===t$2||$.$$typeof===r$1||$.$$typeof===h$2||$.$$typeof===k$2||$.$$typeof===n$2||$.$$typeof===w$1||$.$$typeof===x$1||$.$$typeof===y$1||$.$$typeof===v$2)};reactIs_production_min$1.typeOf=z$1;reactIs$1.exports=reactIs_production_min$1;var reactIsExports=reactIs$1.exports,reactIs=reactIsExports,FORWARD_REF_STATICS={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},MEMO_STATICS={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},TYPE_STATICS={};TYPE_STATICS[reactIs.ForwardRef]=FORWARD_REF_STATICS;TYPE_STATICS[reactIs.Memo]=MEMO_STATICS;var reactIs_production_min={};/** * @license React * react-is.production.min.js * * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */var b$1=Symbol.for("react.element"),c$1=Symbol.for("react.portal"),d$1=Symbol.for("react.fragment"),e=Symbol.for("react.strict_mode"),f$1=Symbol.for("react.profiler"),g$1=Symbol.for("react.provider"),h$1=Symbol.for("react.context"),k$1=Symbol.for("react.server_context"),l$1=Symbol.for("react.forward_ref"),m$1=Symbol.for("react.suspense"),n$1=Symbol.for("react.suspense_list"),p$1=Symbol.for("react.memo"),q$1=Symbol.for("react.lazy"),t$1=Symbol.for("react.offscreen"),u$1;u$1=Symbol.for("react.module.reference");function v$1($){if(typeof $=="object"&&$!==null){var _e=$.$$typeof;switch(_e){case b$1:switch($=$.type,$){case d$1:case f$1:case e:case m$1:case n$1:return $;default:switch($=$&&$.$$typeof,$){case k$1:case h$1:case l$1:case q$1:case p$1:case g$1:return $;default:return _e}}case c$1:return _e}}}reactIs_production_min.ContextConsumer=h$1;reactIs_production_min.ContextProvider=g$1;reactIs_production_min.Element=b$1;reactIs_production_min.ForwardRef=l$1;reactIs_production_min.Fragment=d$1;reactIs_production_min.Lazy=q$1;reactIs_production_min.Memo=p$1;reactIs_production_min.Portal=c$1;reactIs_production_min.Profiler=f$1;reactIs_production_min.StrictMode=e;reactIs_production_min.Suspense=m$1;reactIs_production_min.SuspenseList=n$1;reactIs_production_min.isAsyncMode=function(){return!1};reactIs_production_min.isConcurrentMode=function(){return!1};reactIs_production_min.isContextConsumer=function($){return v$1($)===h$1};reactIs_production_min.isContextProvider=function($){return v$1($)===g$1};reactIs_production_min.isElement=function($){return typeof $=="object"&&$!==null&&$.$$typeof===b$1};reactIs_production_min.isForwardRef=function($){return v$1($)===l$1};reactIs_production_min.isFragment=function($){return v$1($)===d$1};reactIs_production_min.isLazy=function($){return v$1($)===q$1};reactIs_production_min.isMemo=function($){return v$1($)===p$1};reactIs_production_min.isPortal=function($){return v$1($)===c$1};reactIs_production_min.isProfiler=function($){return v$1($)===f$1};reactIs_production_min.isStrictMode=function($){return v$1($)===e};reactIs_production_min.isSuspense=function($){return v$1($)===m$1};reactIs_production_min.isSuspenseList=function($){return v$1($)===n$1};reactIs_production_min.isValidElementType=function($){return typeof $=="string"||typeof $=="function"||$===d$1||$===f$1||$===e||$===m$1||$===n$1||$===t$1||typeof $=="object"&&$!==null&&($.$$typeof===q$1||$.$$typeof===p$1||$.$$typeof===g$1||$.$$typeof===h$1||$.$$typeof===l$1||$.$$typeof===u$1||$.getModuleId!==void 0)};reactIs_production_min.typeOf=v$1;function createListenerCollection(){const $=getBatch();let _e=null,et=null;return{clear(){_e=null,et=null},notify(){$(()=>{let tt=_e;for(;tt;)tt.callback(),tt=tt.next})},get(){let tt=[],rt=_e;for(;rt;)tt.push(rt),rt=rt.next;return tt},subscribe(tt){let rt=!0,nt=et={callback:tt,next:null,prev:et};return nt.prev?nt.prev.next=nt:_e=nt,function(){!rt||_e===null||(rt=!1,nt.next?nt.next.prev=nt.prev:et=nt.prev,nt.prev?nt.prev.next=nt.next:_e=nt.next)}}}}const nullListeners={notify(){},get:()=>[]};function createSubscription($,_e){let et,tt=nullListeners;function rt(lt){return it(),tt.subscribe(lt)}function nt(){tt.notify()}function at(){st.onStateChange&&st.onStateChange()}function ot(){return!!et}function it(){et||(et=_e?_e.addNestedSub(at):$.subscribe(at),tt=createListenerCollection())}function ft(){et&&(et(),et=void 0,tt.clear(),tt=nullListeners)}const st={addNestedSub:rt,notifyNestedSubs:nt,handleChangeWrapper:at,isSubscribed:ot,trySubscribe:it,tryUnsubscribe:ft,getListeners:()=>tt};return st}const canUseDOM$1=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",useIsomorphicLayoutEffect$1=canUseDOM$1?reactExports.useLayoutEffect:reactExports.useEffect;function Provider$1({store:$,context:_e,children:et,serverState:tt}){const rt=reactExports.useMemo(()=>{const ot=createSubscription($);return{store:$,subscription:ot,getServerState:tt?()=>tt:void 0}},[$,tt]),nt=reactExports.useMemo(()=>$.getState(),[$]);useIsomorphicLayoutEffect$1(()=>{const{subscription:ot}=rt;return ot.onStateChange=ot.notifyNestedSubs,ot.trySubscribe(),nt!==$.getState()&&ot.notifyNestedSubs(),()=>{ot.tryUnsubscribe(),ot.onStateChange=void 0}},[rt,nt]);const at=_e||ReactReduxContext;return React$2.createElement(at.Provider,{value:rt},et)}function createStoreHook($=ReactReduxContext){const _e=$===ReactReduxContext?useReduxContext:()=>reactExports.useContext($);return function(){const{store:tt}=_e();return tt}}const useStore=createStoreHook();function createDispatchHook($=ReactReduxContext){const _e=$===ReactReduxContext?useStore:createStoreHook($);return function(){return _e().dispatch}}const useDispatch=createDispatchHook();initializeUseSelector(withSelectorExports.useSyncExternalStoreWithSelector);setBatch(reactDomExports.unstable_batchedUpdates);/** * @remix-run/router v1.5.0 * * Copyright (c) Remix Software Inc. * * This source code is licensed under the MIT license found in the * LICENSE.md file in the root directory of this source tree. * * @license MIT */function _extends$3(){return _extends$3=Object.assign?Object.assign.bind():function($){for(var _e=1;_est(ct,typeof ct=="string"?null:ct.state,gt===0?"default":void 0));let nt=it(et??rt.length-1),at=Action.Pop,ot=null;function it(ct){return Math.min(Math.max(ct,0),rt.length-1)}function ft(){return rt[nt]}function st(ct,gt,mt){gt===void 0&&(gt=null);let ht=createLocation$1(rt?ft().pathname:"/",ct,gt,mt);return warning$2(ht.pathname.charAt(0)==="/","relative pathnames are not supported in memory history: "+JSON.stringify(ct)),ht}function lt(ct){return typeof ct=="string"?ct:createPath(ct)}return{get index(){return nt},get action(){return at},get location(){return ft()},createHref:lt,createURL(ct){return new URL(lt(ct),"http://localhost")},encodeLocation(ct){let gt=typeof ct=="string"?parsePath(ct):ct;return{pathname:gt.pathname||"",search:gt.search||"",hash:gt.hash||""}},push(ct,gt){at=Action.Push;let mt=st(ct,gt);nt+=1,rt.splice(nt,rt.length,mt),tt&&ot&&ot({action:at,location:mt,delta:1})},replace(ct,gt){at=Action.Replace;let mt=st(ct,gt);rt[nt]=mt,tt&&ot&&ot({action:at,location:mt,delta:0})},go(ct){at=Action.Pop;let gt=it(nt+ct),mt=rt[gt];nt=gt,ot&&ot({action:at,location:mt,delta:ct})},listen(ct){return ot=ct,()=>{ot=null}}}}function invariant$2($,_e){if($===!1||$===null||typeof $>"u")throw new Error(_e)}function warning$2($,_e){if(!$){typeof console<"u"&&console.warn(_e);try{throw new Error(_e)}catch{}}}function createKey(){return Math.random().toString(36).substr(2,8)}function createLocation$1($,_e,et,tt){return et===void 0&&(et=null),_extends$3({pathname:typeof $=="string"?$:$.pathname,search:"",hash:""},typeof _e=="string"?parsePath(_e):_e,{state:et,key:_e&&_e.key||tt||createKey()})}function createPath($){let{pathname:_e="/",search:et="",hash:tt=""}=$;return et&&et!=="?"&&(_e+=et.charAt(0)==="?"?et:"?"+et),tt&&tt!=="#"&&(_e+=tt.charAt(0)==="#"?tt:"#"+tt),_e}function parsePath($){let _e={};if($){let et=$.indexOf("#");et>=0&&(_e.hash=$.substr(et),$=$.substr(0,et));let tt=$.indexOf("?");tt>=0&&(_e.search=$.substr(tt),$=$.substr(0,tt)),$&&(_e.pathname=$)}return _e}var ResultType;(function($){$.data="data",$.deferred="deferred",$.redirect="redirect",$.error="error"})(ResultType||(ResultType={}));const immutableRouteKeys=new Set(["lazy","caseSensitive","path","id","index","children"]);function isIndexRoute($){return $.index===!0}function convertRoutesToDataRoutes($,_e,et,tt){return et===void 0&&(et=[]),tt===void 0&&(tt={}),$.map((rt,nt)=>{let at=[...et,nt],ot=typeof rt.id=="string"?rt.id:at.join("-");if(invariant$2(rt.index!==!0||!rt.children,"Cannot specify children on an index route"),invariant$2(!tt[ot],'Found a route id collision on id "'+ot+`". Route id's must be globally unique within Data Router usages`),isIndexRoute(rt)){let it=_extends$3({},rt,{hasErrorBoundary:_e(rt),id:ot});return tt[ot]=it,it}else{let it=_extends$3({},rt,{id:ot,hasErrorBoundary:_e(rt),children:void 0});return tt[ot]=it,rt.children&&(it.children=convertRoutesToDataRoutes(rt.children,_e,at,tt)),it}})}function matchRoutes($,_e,et){et===void 0&&(et="/");let tt=typeof _e=="string"?parsePath(_e):_e,rt=stripBasename(tt.pathname||"/",et);if(rt==null)return null;let nt=flattenRoutes($);rankRouteBranches(nt);let at=null;for(let ot=0;at==null&&ot{let it={relativePath:ot===void 0?nt.path||"":ot,caseSensitive:nt.caseSensitive===!0,childrenIndex:at,route:nt};it.relativePath.startsWith("/")&&(invariant$2(it.relativePath.startsWith(tt),'Absolute route path "'+it.relativePath+'" nested under path '+('"'+tt+'" is not valid. An absolute child route path ')+"must start with the combined path of all its parent routes."),it.relativePath=it.relativePath.slice(tt.length));let ft=joinPaths([tt,it.relativePath]),st=et.concat(it);nt.children&&nt.children.length>0&&(invariant$2(nt.index!==!0,"Index routes must not have child routes. Please remove "+('all child routes from route path "'+ft+'".')),flattenRoutes(nt.children,_e,st,ft)),!(nt.path==null&&!nt.index)&&_e.push({path:ft,score:computeScore(ft,nt.index),routesMeta:st})};return $.forEach((nt,at)=>{var ot;if(nt.path===""||!((ot=nt.path)!=null&&ot.includes("?")))rt(nt,at);else for(let it of explodeOptionalSegments(nt.path))rt(nt,at,it)}),_e}function explodeOptionalSegments($){let _e=$.split("/");if(_e.length===0)return[];let[et,...tt]=_e,rt=et.endsWith("?"),nt=et.replace(/\?$/,"");if(tt.length===0)return rt?[nt,""]:[nt];let at=explodeOptionalSegments(tt.join("/")),ot=[];return ot.push(...at.map(it=>it===""?nt:[nt,it].join("/"))),rt&&ot.push(...at),ot.map(it=>$.startsWith("/")&&it===""?"/":it)}function rankRouteBranches($){$.sort((_e,et)=>_e.score!==et.score?et.score-_e.score:compareIndexes(_e.routesMeta.map(tt=>tt.childrenIndex),et.routesMeta.map(tt=>tt.childrenIndex)))}const paramRe=/^:\w+$/,dynamicSegmentValue=3,indexRouteValue=2,emptySegmentValue=1,staticSegmentValue=10,splatPenalty=-2,isSplat=$=>$==="*";function computeScore($,_e){let et=$.split("/"),tt=et.length;return et.some(isSplat)&&(tt+=splatPenalty),_e&&(tt+=indexRouteValue),et.filter(rt=>!isSplat(rt)).reduce((rt,nt)=>rt+(paramRe.test(nt)?dynamicSegmentValue:nt===""?emptySegmentValue:staticSegmentValue),tt)}function compareIndexes($,_e){return $.length===_e.length&&$.slice(0,-1).every((tt,rt)=>tt===_e[rt])?$[$.length-1]-_e[_e.length-1]:0}function matchRouteBranch($,_e){let{routesMeta:et}=$,tt={},rt="/",nt=[];for(let at=0;at{if(st==="*"){let ut=ot[lt]||"";at=nt.slice(0,nt.length-ut.length).replace(/(.)\/+$/,"$1")}return ft[st]=safelyDecodeURIComponent(ot[lt]||"",st),ft},{}),pathname:nt,pathnameBase:at,pattern:$}}function compilePath($,_e,et){_e===void 0&&(_e=!1),et===void 0&&(et=!0),warning$2($==="*"||!$.endsWith("*")||$.endsWith("/*"),'Route path "'+$+'" will be treated as if it were '+('"'+$.replace(/\*$/,"/*")+'" because the `*` character must ')+"always follow a `/` in the pattern. To get rid of this warning, "+('please change the route path to "'+$.replace(/\*$/,"/*")+'".'));let tt=[],rt="^"+$.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^$?{}|()[\]]/g,"\\$&").replace(/\/:(\w+)/g,(at,ot)=>(tt.push(ot),"/([^\\/]+)"));return $.endsWith("*")?(tt.push("*"),rt+=$==="*"||$==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):et?rt+="\\/*$":$!==""&&$!=="/"&&(rt+="(?:(?=\\/|$))"),[new RegExp(rt,_e?void 0:"i"),tt]}function safelyDecodeURI($){try{return decodeURI($)}catch(_e){return warning$2(!1,'The URL path "'+$+'" could not be decoded because it is is a malformed URL segment. This is probably due to a bad percent '+("encoding ("+_e+").")),$}}function safelyDecodeURIComponent($,_e){try{return decodeURIComponent($)}catch(et){return warning$2(!1,'The value for the URL param "'+_e+'" will not be decoded because'+(' the string "'+$+'" is a malformed URL segment. This is probably')+(" due to a bad percent encoding ("+et+").")),$}}function stripBasename($,_e){if(_e==="/")return $;if(!$.toLowerCase().startsWith(_e.toLowerCase()))return null;let et=_e.endsWith("/")?_e.length-1:_e.length,tt=$.charAt(et);return tt&&tt!=="/"?null:$.slice(et)||"/"}function resolvePath($,_e){_e===void 0&&(_e="/");let{pathname:et,search:tt="",hash:rt=""}=typeof $=="string"?parsePath($):$;return{pathname:et?et.startsWith("/")?et:resolvePathname(et,_e):_e,search:normalizeSearch(tt),hash:normalizeHash(rt)}}function resolvePathname($,_e){let et=_e.replace(/\/+$/,"").split("/");return $.split("/").forEach(rt=>{rt===".."?et.length>1&&et.pop():rt!=="."&&et.push(rt)}),et.length>1?et.join("/"):"/"}function getInvalidPathError($,_e,et,tt){return"Cannot include a '"+$+"' character in a manually specified "+("`to."+_e+"` field ["+JSON.stringify(tt)+"]. Please separate it out to the ")+("`to."+et+"` field. Alternatively you may provide the full path as ")+'a string in and the router will parse it for you.'}function getPathContributingMatches($){return $.filter((_e,et)=>et===0||_e.route.path&&_e.route.path.length>0)}function resolveTo($,_e,et,tt){tt===void 0&&(tt=!1);let rt;typeof $=="string"?rt=parsePath($):(rt=_extends$3({},$),invariant$2(!rt.pathname||!rt.pathname.includes("?"),getInvalidPathError("?","pathname","search",rt)),invariant$2(!rt.pathname||!rt.pathname.includes("#"),getInvalidPathError("#","pathname","hash",rt)),invariant$2(!rt.search||!rt.search.includes("#"),getInvalidPathError("#","search","hash",rt)));let nt=$===""||rt.pathname==="",at=nt?"/":rt.pathname,ot;if(tt||at==null)ot=et;else{let lt=_e.length-1;if(at.startsWith("..")){let ut=at.split("/");for(;ut[0]==="..";)ut.shift(),lt-=1;rt.pathname=ut.join("/")}ot=lt>=0?_e[lt]:"/"}let it=resolvePath(rt,ot),ft=at&&at!=="/"&&at.endsWith("/"),st=(nt||at===".")&&et.endsWith("/");return!it.pathname.endsWith("/")&&(ft||st)&&(it.pathname+="/"),it}const joinPaths=$=>$.join("/").replace(/\/\/+/g,"/"),normalizePathname=$=>$.replace(/\/+$/,"").replace(/^\/*/,"/"),normalizeSearch=$=>!$||$==="?"?"":$.startsWith("?")?$:"?"+$,normalizeHash=$=>!$||$==="#"?"":$.startsWith("#")?$:"#"+$;class ErrorResponse{constructor(_e,et,tt,rt){rt===void 0&&(rt=!1),this.status=_e,this.statusText=et||"",this.internal=rt,tt instanceof Error?(this.data=tt.toString(),this.error=tt):this.data=tt}}function isRouteErrorResponse($){return $!=null&&typeof $.status=="number"&&typeof $.statusText=="string"&&typeof $.internal=="boolean"&&"data"in $}const validMutationMethodsArr=["post","put","patch","delete"],validMutationMethods=new Set(validMutationMethodsArr),validRequestMethodsArr=["get",...validMutationMethodsArr],validRequestMethods=new Set(validRequestMethodsArr),redirectStatusCodes=new Set([301,302,303,307,308]),redirectPreserveMethodStatusCodes=new Set([307,308]),IDLE_NAVIGATION={state:"idle",location:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0},IDLE_FETCHER={state:"idle",data:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0},IDLE_BLOCKER={state:"unblocked",proceed:void 0,reset:void 0,location:void 0},ABSOLUTE_URL_REGEX=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,isBrowser=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",isServer=!isBrowser,defaultDetectErrorBoundary=$=>!!$.hasErrorBoundary;function createRouter($){invariant$2($.routes.length>0,"You must provide a non-empty routes array to createRouter");let _e=$.detectErrorBoundary||defaultDetectErrorBoundary,et={},tt=convertRoutesToDataRoutes($.routes,_e,void 0,et),rt,nt=_extends$3({v7_normalizeFormMethod:!1},$.future),at=null,ot=new Set,it=null,ft=null,st=null,lt=$.hydrationData!=null,ut=matchRoutes(tt,$.history.location,$.basename),ct=null;if(ut==null){let Mt=getInternalRouterError(404,{pathname:$.history.location.pathname}),{matches:Ct,route:It}=getShortCircuitMatches(tt);ut=Ct,ct={[It.id]:Mt}}let gt=!ut.some(Mt=>Mt.route.lazy)&&(!ut.some(Mt=>Mt.route.loader)||$.hydrationData!=null),mt,ht={historyAction:$.history.action,location:$.history.location,matches:ut,initialized:gt,navigation:IDLE_NAVIGATION,restoreScrollPosition:$.hydrationData!=null?!1:null,preventScrollReset:!1,revalidation:"idle",loaderData:$.hydrationData&&$.hydrationData.loaderData||{},actionData:$.hydrationData&&$.hydrationData.actionData||null,errors:$.hydrationData&&$.hydrationData.errors||ct,fetchers:new Map,blockers:new Map},pt=Action.Pop,dt=!1,yt,vt=!1,bt=!1,xt=[],wt=[],Et=new Map,Lt=0,St=-1,jt=new Map,Nt=new Set,Tt=new Map,Rt=new Map,Bt=new Map,Gt=!1;function Zt(){return at=$.history.listen(Mt=>{let{action:Ct,location:It,delta:Pt}=Mt;if(Gt){Gt=!1;return}warning$2(Bt.size===0||Pt!=null,"You are trying to use a blocker on a POP navigation to a location that was not created by @remix-run/router. This will fail silently in production. This can happen if you are navigating outside the router via `window.history.pushState`/`window.location.hash` instead of using router navigation APIs. This can also happen if you are using createHashRouter and the user manually changes the URL.");let $t=Sr({currentLocation:ht.location,nextLocation:It,historyAction:Ct});if($t&&Pt!=null){Gt=!0,$.history.go(Pt*-1),xr($t,{state:"blocked",location:It,proceed(){xr($t,{state:"proceeding",proceed:void 0,reset:void 0,location:It}),$.history.go(Pt)},reset(){cr($t),At({blockers:new Map(mt.state.blockers)})}});return}return Wt(Ct,It)}),ht.initialized||Wt(Action.Pop,ht.location),mt}function _t(){at&&at(),ot.clear(),yt&&yt.abort(),ht.fetchers.forEach((Mt,Ct)=>Lr(Ct)),ht.blockers.forEach((Mt,Ct)=>cr(Ct))}function Dt(Mt){return ot.add(Mt),()=>ot.delete(Mt)}function At(Mt){ht=_extends$3({},ht,Mt),ot.forEach(Ct=>Ct(ht))}function Yt(Mt,Ct){var It,Pt;let $t=ht.actionData!=null&&ht.navigation.formMethod!=null&&isMutationMethod(ht.navigation.formMethod)&&ht.navigation.state==="loading"&&((It=Mt.state)==null?void 0:It._isRedirect)!==!0,Ft;Ct.actionData?Object.keys(Ct.actionData).length>0?Ft=Ct.actionData:Ft=null:$t?Ft=ht.actionData:Ft=null;let Ut=Ct.loaderData?mergeLoaderData(ht.loaderData,Ct.loaderData,Ct.matches||[],Ct.errors):ht.loaderData;for(let[zt]of Bt)cr(zt);let Ht=dt===!0||ht.navigation.formMethod!=null&&isMutationMethod(ht.navigation.formMethod)&&((Pt=Mt.state)==null?void 0:Pt._isRedirect)!==!0;rt&&(tt=rt,rt=void 0),At(_extends$3({},Ct,{actionData:Ft,loaderData:Ut,historyAction:pt,location:Mt,initialized:!0,navigation:IDLE_NAVIGATION,revalidation:"idle",restoreScrollPosition:qt(Mt,Ct.matches||ht.matches),preventScrollReset:Ht,blockers:new Map(ht.blockers)})),vt||pt===Action.Pop||(pt===Action.Push?$.history.push(Mt,Mt.state):pt===Action.Replace&&$.history.replace(Mt,Mt.state)),pt=Action.Pop,dt=!1,vt=!1,bt=!1,xt=[],wt=[]}async function Qt(Mt,Ct){if(typeof Mt=="number"){$.history.go(Mt);return}let{path:It,submission:Pt,error:$t}=normalizeNavigateOptions(Mt,nt,Ct),Ft=ht.location,Ut=createLocation$1(ht.location,It,Ct&&Ct.state);Ut=_extends$3({},Ut,$.history.encodeLocation(Ut));let Ht=Ct&&Ct.replace!=null?Ct.replace:void 0,zt=Action.Push;Ht===!0?zt=Action.Replace:Ht===!1||Pt!=null&&isMutationMethod(Pt.formMethod)&&Pt.formAction===ht.location.pathname+ht.location.search&&(zt=Action.Replace);let Jt=Ct&&"preventScrollReset"in Ct?Ct.preventScrollReset===!0:void 0,Vt=Sr({currentLocation:Ft,nextLocation:Ut,historyAction:zt});if(Vt){xr(Vt,{state:"blocked",location:Ut,proceed(){xr(Vt,{state:"proceeding",proceed:void 0,reset:void 0,location:Ut}),Qt(Mt,Ct)},reset(){cr(Vt),At({blockers:new Map(ht.blockers)})}});return}return await Wt(zt,Ut,{submission:Pt,pendingError:$t,preventScrollReset:Jt,replace:Ct&&Ct.replace})}function nr(){if(vr(),At({revalidation:"loading"}),ht.navigation.state!=="submitting"){if(ht.navigation.state==="idle"){Wt(ht.historyAction,ht.location,{startUninterruptedRevalidation:!0});return}Wt(pt||ht.historyAction,ht.navigation.location,{overrideNavigation:ht.navigation})}}async function Wt(Mt,Ct,It){yt&&yt.abort(),yt=null,pt=Mt,vt=(It&&It.startUninterruptedRevalidation)===!0,Kt(ht.location,ht.matches),dt=(It&&It.preventScrollReset)===!0;let Pt=rt||tt,$t=It&&It.overrideNavigation,Ft=matchRoutes(Pt,Ct,$.basename);if(!Ft){let rr=getInternalRouterError(404,{pathname:Ct.pathname}),{matches:ar,route:gr}=getShortCircuitMatches(Pt);kt(),Yt(Ct,{matches:ar,loaderData:{},errors:{[gr.id]:rr}});return}if(isHashChangeOnly(ht.location,Ct)&&!(It&&It.submission&&isMutationMethod(It.submission.formMethod))){Yt(Ct,{matches:Ft});return}yt=new AbortController;let Ut=createClientSideRequest($.history,Ct,yt.signal,It&&It.submission),Ht,zt;if(It&&It.pendingError)zt={[findNearestBoundary(Ft).route.id]:It.pendingError};else if(It&&It.submission&&isMutationMethod(It.submission.formMethod)){let rr=await er(Ut,Ct,It.submission,Ft,{replace:It.replace});if(rr.shortCircuited)return;Ht=rr.pendingActionData,zt=rr.pendingActionError,$t=_extends$3({state:"loading",location:Ct},It.submission),Ut=new Request(Ut.url,{signal:Ut.signal})}let{shortCircuited:Jt,loaderData:Vt,errors:pr}=await Xt(Ut,Ct,Ft,$t,It&&It.submission,It&&It.fetcherSubmission,It&&It.replace,Ht,zt);Jt||(yt=null,Yt(Ct,_extends$3({matches:Ft},Ht?{actionData:Ht}:{},{loaderData:Vt,errors:pr})))}async function er(Mt,Ct,It,Pt,$t){vr();let Ft=_extends$3({state:"submitting",location:Ct},It);At({navigation:Ft});let Ut,Ht=getTargetMatch(Pt,Ct);if(!Ht.route.action&&!Ht.route.lazy)Ut={type:ResultType.error,error:getInternalRouterError(405,{method:Mt.method,pathname:Ct.pathname,routeId:Ht.route.id})};else if(Ut=await callLoaderOrAction("action",Mt,Ht,Pt,et,_e,mt.basename),Mt.signal.aborted)return{shortCircuited:!0};if(isRedirectResult(Ut)){let zt;return $t&&$t.replace!=null?zt=$t.replace:zt=Ut.location===ht.location.pathname+ht.location.search,await fr(ht,Ut,{submission:It,replace:zt}),{shortCircuited:!0}}if(isErrorResult(Ut)){let zt=findNearestBoundary(Pt,Ht.route.id);return($t&&$t.replace)!==!0&&(pt=Action.Push),{pendingActionData:{},pendingActionError:{[zt.route.id]:Ut.error}}}if(isDeferredResult(Ut))throw getInternalRouterError(400,{type:"defer-action"});return{pendingActionData:{[Ht.route.id]:Ut.data}}}async function Xt(Mt,Ct,It,Pt,$t,Ft,Ut,Ht,zt){let Jt=Pt;Jt||(Jt=_extends$3({state:"loading",location:Ct,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0},$t));let Vt=$t||Ft?$t||Ft:Jt.formMethod&&Jt.formAction&&Jt.formData&&Jt.formEncType?{formMethod:Jt.formMethod,formAction:Jt.formAction,formData:Jt.formData,formEncType:Jt.formEncType}:void 0,pr=rt||tt,[rr,ar]=getMatchesToLoad($.history,ht,It,Vt,Ct,bt,xt,wt,Tt,pr,$.basename,Ht,zt);if(kt(ir=>!(It&&It.some(mr=>mr.route.id===ir))||rr&&rr.some(mr=>mr.route.id===ir)),rr.length===0&&ar.length===0)return Yt(Ct,_extends$3({matches:It,loaderData:{},errors:zt||null},Ht?{actionData:Ht}:{})),{shortCircuited:!0};if(!vt){ar.forEach(mr=>{let jr=ht.fetchers.get(mr.key),Tr={state:"loading",data:jr&&jr.data,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0," _hasFetcherDoneAnything ":!0};ht.fetchers.set(mr.key,Tr)});let ir=Ht||ht.actionData;At(_extends$3({navigation:Jt},ir?Object.keys(ir).length===0?{actionData:null}:{actionData:ir}:{},ar.length>0?{fetchers:new Map(ht.fetchers)}:{}))}St=++Lt,ar.forEach(ir=>Et.set(ir.key,yt));let{results:gr,loaderResults:_r,fetcherResults:Nr}=await dr(ht.matches,It,rr,ar,Mt);if(Mt.signal.aborted)return{shortCircuited:!0};ar.forEach(ir=>Et.delete(ir.key));let kr=findRedirect(gr);if(kr)return await fr(ht,kr,{replace:Ut}),{shortCircuited:!0};let{loaderData:Ir,errors:Ar}=processLoaderData(ht,It,rr,_r,zt,ar,Nr,Rt);Rt.forEach((ir,mr)=>{ir.subscribe(jr=>{(jr||ir.done)&&Rt.delete(mr)})}),Cr();let Pr=wr(St);return _extends$3({loaderData:Ir,errors:Ar},Pr||ar.length>0?{fetchers:new Map(ht.fetchers)}:{})}function or(Mt){return ht.fetchers.get(Mt)||IDLE_FETCHER}function lr(Mt,Ct,It,Pt){if(isServer)throw new Error("router.fetch() was called during the server render, but it shouldn't be. You are likely calling a useFetcher() method in the body of your component. Try moving it to a useEffect or a callback.");Et.has(Mt)&&yr(Mt);let Ft=matchRoutes(rt||tt,It,$.basename);if(!Ft){Mr(Mt,Ct,getInternalRouterError(404,{pathname:It}));return}let{path:Ut,submission:Ht}=normalizeNavigateOptions(It,nt,Pt,!0),zt=getTargetMatch(Ft,Ut);if(dt=(Pt&&Pt.preventScrollReset)===!0,Ht&&isMutationMethod(Ht.formMethod)){hr(Mt,Ct,Ut,zt,Ft,Ht);return}Tt.set(Mt,{routeId:Ct,path:Ut}),Er(Mt,Ct,Ut,zt,Ft,Ht)}async function hr(Mt,Ct,It,Pt,$t,Ft){if(vr(),Tt.delete(Mt),!Pt.route.action&&!Pt.route.lazy){let br=getInternalRouterError(405,{method:Ft.formMethod,pathname:It,routeId:Ct});Mr(Mt,Ct,br);return}let Ut=ht.fetchers.get(Mt),Ht=_extends$3({state:"submitting"},Ft,{data:Ut&&Ut.data," _hasFetcherDoneAnything ":!0});ht.fetchers.set(Mt,Ht),At({fetchers:new Map(ht.fetchers)});let zt=new AbortController,Jt=createClientSideRequest($.history,It,zt.signal,Ft);Et.set(Mt,zt);let Vt=await callLoaderOrAction("action",Jt,Pt,$t,et,_e,mt.basename);if(Jt.signal.aborted){Et.get(Mt)===zt&&Et.delete(Mt);return}if(isRedirectResult(Vt)){Et.delete(Mt),Nt.add(Mt);let br=_extends$3({state:"loading"},Ft,{data:void 0," _hasFetcherDoneAnything ":!0});return ht.fetchers.set(Mt,br),At({fetchers:new Map(ht.fetchers)}),fr(ht,Vt,{submission:Ft,isFetchActionRedirect:!0})}if(isErrorResult(Vt)){Mr(Mt,Ct,Vt.error);return}if(isDeferredResult(Vt))throw getInternalRouterError(400,{type:"defer-action"});let pr=ht.navigation.location||ht.location,rr=createClientSideRequest($.history,pr,zt.signal),ar=rt||tt,gr=ht.navigation.state!=="idle"?matchRoutes(ar,ht.navigation.location,$.basename):ht.matches;invariant$2(gr,"Didn't find any matches after fetcher action");let _r=++Lt;jt.set(Mt,_r);let Nr=_extends$3({state:"loading",data:Vt.data},Ft,{" _hasFetcherDoneAnything ":!0});ht.fetchers.set(Mt,Nr);let[kr,Ir]=getMatchesToLoad($.history,ht,gr,Ft,pr,bt,xt,wt,Tt,ar,$.basename,{[Pt.route.id]:Vt.data},void 0);Ir.filter(br=>br.key!==Mt).forEach(br=>{let $r=br.key,Rr=ht.fetchers.get($r),Ur={state:"loading",data:Rr&&Rr.data,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0," _hasFetcherDoneAnything ":!0};ht.fetchers.set($r,Ur),Et.set($r,zt)}),At({fetchers:new Map(ht.fetchers)});let{results:Ar,loaderResults:Pr,fetcherResults:ir}=await dr(ht.matches,gr,kr,Ir,rr);if(zt.signal.aborted)return;jt.delete(Mt),Et.delete(Mt),Ir.forEach(br=>Et.delete(br.key));let mr=findRedirect(Ar);if(mr)return fr(ht,mr);let{loaderData:jr,errors:Tr}=processLoaderData(ht,ht.matches,kr,Pr,void 0,Ir,ir,Rt),Br={state:"idle",data:Vt.data,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0," _hasFetcherDoneAnything ":!0};ht.fetchers.set(Mt,Br);let Fr=wr(_r);ht.navigation.state==="loading"&&_r>St?(invariant$2(pt,"Expected pending action"),yt&&yt.abort(),Yt(ht.navigation.location,{matches:gr,loaderData:jr,errors:Tr,fetchers:new Map(ht.fetchers)})):(At(_extends$3({errors:Tr,loaderData:mergeLoaderData(ht.loaderData,jr,gr,Tr)},Fr?{fetchers:new Map(ht.fetchers)}:{})),bt=!1)}async function Er(Mt,Ct,It,Pt,$t,Ft){let Ut=ht.fetchers.get(Mt),Ht=_extends$3({state:"loading",formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0},Ft,{data:Ut&&Ut.data," _hasFetcherDoneAnything ":!0});ht.fetchers.set(Mt,Ht),At({fetchers:new Map(ht.fetchers)});let zt=new AbortController,Jt=createClientSideRequest($.history,It,zt.signal);Et.set(Mt,zt);let Vt=await callLoaderOrAction("loader",Jt,Pt,$t,et,_e,mt.basename);if(isDeferredResult(Vt)&&(Vt=await resolveDeferredData(Vt,Jt.signal,!0)||Vt),Et.get(Mt)===zt&&Et.delete(Mt),Jt.signal.aborted)return;if(isRedirectResult(Vt)){await fr(ht,Vt);return}if(isErrorResult(Vt)){let rr=findNearestBoundary(ht.matches,Ct);ht.fetchers.delete(Mt),At({fetchers:new Map(ht.fetchers),errors:{[rr.route.id]:Vt.error}});return}invariant$2(!isDeferredResult(Vt),"Unhandled fetcher deferred data");let pr={state:"idle",data:Vt.data,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0," _hasFetcherDoneAnything ":!0};ht.fetchers.set(Mt,pr),At({fetchers:new Map(ht.fetchers)})}async function fr(Mt,Ct,It){var Pt;let{submission:$t,replace:Ft,isFetchActionRedirect:Ut}=It===void 0?{}:It;Ct.revalidate&&(bt=!0);let Ht=createLocation$1(Mt.location,Ct.location,_extends$3({_isRedirect:!0},Ut?{_isFetchActionRedirect:!0}:{}));if(invariant$2(Ht,"Expected a location on the redirect navigation"),ABSOLUTE_URL_REGEX.test(Ct.location)&&isBrowser&&typeof((Pt=window)==null?void 0:Pt.location)<"u"){let ar=$.history.createURL(Ct.location),gr=stripBasename(ar.pathname,$.basename||"/")==null;if(window.location.origin!==ar.origin||gr){Ft?window.location.replace(Ct.location):window.location.assign(Ct.location);return}}yt=null;let zt=Ft===!0?Action.Replace:Action.Push,{formMethod:Jt,formAction:Vt,formEncType:pr,formData:rr}=Mt.navigation;!$t&&Jt&&Vt&&rr&&pr&&($t={formMethod:Jt,formAction:Vt,formEncType:pr,formData:rr}),redirectPreserveMethodStatusCodes.has(Ct.status)&&$t&&isMutationMethod($t.formMethod)?await Wt(zt,Ht,{submission:_extends$3({},$t,{formAction:Ct.location}),preventScrollReset:dt}):Ut?await Wt(zt,Ht,{overrideNavigation:{state:"loading",location:Ht,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0},fetcherSubmission:$t,preventScrollReset:dt}):await Wt(zt,Ht,{overrideNavigation:{state:"loading",location:Ht,formMethod:$t?$t.formMethod:void 0,formAction:$t?$t.formAction:void 0,formEncType:$t?$t.formEncType:void 0,formData:$t?$t.formData:void 0},preventScrollReset:dt})}async function dr(Mt,Ct,It,Pt,$t){let Ft=await Promise.all([...It.map(zt=>callLoaderOrAction("loader",$t,zt,Ct,et,_e,mt.basename)),...Pt.map(zt=>zt.matches&&zt.match?callLoaderOrAction("loader",createClientSideRequest($.history,zt.path,$t.signal),zt.match,zt.matches,et,_e,mt.basename):{type:ResultType.error,error:getInternalRouterError(404,{pathname:zt.path})})]),Ut=Ft.slice(0,It.length),Ht=Ft.slice(It.length);return await Promise.all([resolveDeferredResults(Mt,It,Ut,$t.signal,!1,ht.loaderData),resolveDeferredResults(Mt,Pt.map(zt=>zt.match),Ht,$t.signal,!0)]),{results:Ft,loaderResults:Ut,fetcherResults:Ht}}function vr(){bt=!0,xt.push(...kt()),Tt.forEach((Mt,Ct)=>{Et.has(Ct)&&(wt.push(Ct),yr(Ct))})}function Mr(Mt,Ct,It){let Pt=findNearestBoundary(ht.matches,Ct);Lr(Mt),At({errors:{[Pt.route.id]:It},fetchers:new Map(ht.fetchers)})}function Lr(Mt){Et.has(Mt)&&yr(Mt),Tt.delete(Mt),jt.delete(Mt),Nt.delete(Mt),ht.fetchers.delete(Mt)}function yr(Mt){let Ct=Et.get(Mt);invariant$2(Ct,"Expected fetch controller: "+Mt),Ct.abort(),Et.delete(Mt)}function ur(Mt){for(let Ct of Mt){let Pt={state:"idle",data:or(Ct).data,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0," _hasFetcherDoneAnything ":!0};ht.fetchers.set(Ct,Pt)}}function Cr(){let Mt=[];for(let Ct of Nt){let It=ht.fetchers.get(Ct);invariant$2(It,"Expected fetcher: "+Ct),It.state==="loading"&&(Nt.delete(Ct),Mt.push(Ct))}ur(Mt)}function wr(Mt){let Ct=[];for(let[It,Pt]of jt)if(Pt0}function sr(Mt,Ct){let It=ht.blockers.get(Mt)||IDLE_BLOCKER;return Bt.get(Mt)!==Ct&&Bt.set(Mt,Ct),It}function cr(Mt){ht.blockers.delete(Mt),Bt.delete(Mt)}function xr(Mt,Ct){let It=ht.blockers.get(Mt)||IDLE_BLOCKER;invariant$2(It.state==="unblocked"&&Ct.state==="blocked"||It.state==="blocked"&&Ct.state==="blocked"||It.state==="blocked"&&Ct.state==="proceeding"||It.state==="blocked"&&Ct.state==="unblocked"||It.state==="proceeding"&&Ct.state==="unblocked","Invalid blocker state transition: "+It.state+" -> "+Ct.state),ht.blockers.set(Mt,Ct),At({blockers:new Map(ht.blockers)})}function Sr(Mt){let{currentLocation:Ct,nextLocation:It,historyAction:Pt}=Mt;if(Bt.size===0)return;Bt.size>1&&warning$2(!1,"A router only supports one blocker at a time");let $t=Array.from(Bt.entries()),[Ft,Ut]=$t[$t.length-1],Ht=ht.blockers.get(Ft);if(!(Ht&&Ht.state==="proceeding")&&Ut({currentLocation:Ct,nextLocation:It,historyAction:Pt}))return Ft}function kt(Mt){let Ct=[];return Rt.forEach((It,Pt)=>{(!Mt||Mt(Pt))&&(It.cancel(),Ct.push(Pt),Rt.delete(Pt))}),Ct}function Ot(Mt,Ct,It){if(it=Mt,st=Ct,ft=It||(Pt=>Pt.key),!lt&&ht.navigation===IDLE_NAVIGATION){lt=!0;let Pt=qt(ht.location,ht.matches);Pt!=null&&At({restoreScrollPosition:Pt})}return()=>{it=null,st=null,ft=null}}function Kt(Mt,Ct){if(it&&ft&&st){let It=Ct.map($t=>createUseMatchesMatch($t,ht.loaderData)),Pt=ft(Mt,It)||Mt.key;it[Pt]=st()}}function qt(Mt,Ct){if(it&&ft&&st){let It=Ct.map(Ft=>createUseMatchesMatch(Ft,ht.loaderData)),Pt=ft(Mt,It)||Mt.key,$t=it[Pt];if(typeof $t=="number")return $t}return null}function tr(Mt){rt=Mt}return mt={get basename(){return $.basename},get state(){return ht},get routes(){return tt},initialize:Zt,subscribe:Dt,enableScrollRestoration:Ot,navigate:Qt,fetch:lr,revalidate:nr,createHref:Mt=>$.history.createHref(Mt),encodeLocation:Mt=>$.history.encodeLocation(Mt),getFetcher:or,deleteFetcher:Lr,dispose:_t,getBlocker:sr,deleteBlocker:cr,_internalFetchControllers:Et,_internalActiveDeferreds:Rt,_internalSetRoutes:tr},mt}function isSubmissionNavigation($){return $!=null&&"formData"in $}function normalizeNavigateOptions($,_e,et,tt){tt===void 0&&(tt=!1);let rt=typeof $=="string"?$:createPath($);if(!et||!isSubmissionNavigation(et))return{path:rt};if(et.formMethod&&!isValidMethod(et.formMethod))return{path:rt,error:getInternalRouterError(405,{method:et.formMethod})};let nt;if(et.formData){let it=et.formMethod||"get";if(nt={formMethod:_e.v7_normalizeFormMethod?it.toUpperCase():it.toLowerCase(),formAction:stripHashFromPath(rt),formEncType:et&&et.formEncType||"application/x-www-form-urlencoded",formData:et.formData},isMutationMethod(nt.formMethod))return{path:rt,submission:nt}}let at=parsePath(rt),ot=convertFormDataToSearchParams(et.formData);return tt&&at.search&&hasNakedIndexQuery(at.search)&&ot.append("index",""),at.search="?"+ot,{path:createPath(at),submission:nt}}function getLoaderMatchesUntilBoundary($,_e){let et=$;if(_e){let tt=$.findIndex(rt=>rt.route.id===_e);tt>=0&&(et=$.slice(0,tt))}return et}function getMatchesToLoad($,_e,et,tt,rt,nt,at,ot,it,ft,st,lt,ut){let ct=ut?Object.values(ut)[0]:lt?Object.values(lt)[0]:void 0,gt=$.createURL(_e.location),mt=$.createURL(rt),ht=nt||gt.toString()===mt.toString()||gt.search!==mt.search,pt=ut?Object.keys(ut)[0]:void 0,yt=getLoaderMatchesUntilBoundary(et,pt).filter((bt,xt)=>{if(bt.route.lazy)return!0;if(bt.route.loader==null)return!1;if(isNewLoader(_e.loaderData,_e.matches[xt],bt)||at.some(Lt=>Lt===bt.route.id))return!0;let wt=_e.matches[xt],Et=bt;return shouldRevalidateLoader(bt,_extends$3({currentUrl:gt,currentParams:wt.params,nextUrl:mt,nextParams:Et.params},tt,{actionResult:ct,defaultShouldRevalidate:ht||isNewRouteInstance(wt,Et)}))}),vt=[];return it.forEach((bt,xt)=>{if(!et.some(St=>St.route.id===bt.routeId))return;let wt=matchRoutes(ft,bt.path,st);if(!wt){vt.push(_extends$3({key:xt},bt,{matches:null,match:null}));return}let Et=getTargetMatch(wt,bt.path);if(ot.includes(xt)){vt.push(_extends$3({key:xt,matches:wt,match:Et},bt));return}shouldRevalidateLoader(Et,_extends$3({currentUrl:gt,currentParams:_e.matches[_e.matches.length-1].params,nextUrl:mt,nextParams:et[et.length-1].params},tt,{actionResult:ct,defaultShouldRevalidate:ht}))&&vt.push(_extends$3({key:xt,matches:wt,match:Et},bt))}),[yt,vt]}function isNewLoader($,_e,et){let tt=!_e||et.route.id!==_e.route.id,rt=$[et.route.id]===void 0;return tt||rt}function isNewRouteInstance($,_e){let et=$.route.path;return $.pathname!==_e.pathname||et!=null&&et.endsWith("*")&&$.params["*"]!==_e.params["*"]}function shouldRevalidateLoader($,_e){if($.route.shouldRevalidate){let et=$.route.shouldRevalidate(_e);if(typeof et=="boolean")return et}return _e.defaultShouldRevalidate}async function loadLazyRouteModule($,_e,et){if(!$.lazy)return;let tt=await $.lazy();if(!$.lazy)return;let rt=et[$.id];invariant$2(rt,"No route found in manifest");let nt={};for(let at in tt){let it=rt[at]!==void 0&&at!=="hasErrorBoundary";warning$2(!it,'Route "'+rt.id+'" has a static property "'+at+'" defined but its lazy function is also returning a value for this property. '+('The lazy route property "'+at+'" will be ignored.')),!it&&!immutableRouteKeys.has(at)&&(nt[at]=tt[at])}Object.assign(rt,nt),Object.assign(rt,{hasErrorBoundary:_e(_extends$3({},rt)),lazy:void 0})}async function callLoaderOrAction($,_e,et,tt,rt,nt,at,ot,it,ft){at===void 0&&(at="/"),ot===void 0&&(ot=!1),it===void 0&&(it=!1);let st,lt,ut,ct=ht=>{let pt,dt=new Promise((yt,vt)=>pt=vt);return ut=()=>pt(),_e.signal.addEventListener("abort",ut),Promise.race([ht({request:_e,params:et.params,context:ft}),dt])};try{let ht=et.route[$];if(et.route.lazy)if(ht)lt=(await Promise.all([ct(ht),loadLazyRouteModule(et.route,nt,rt)]))[0];else if(await loadLazyRouteModule(et.route,nt,rt),ht=et.route[$],ht)lt=await ct(ht);else{if($==="action")throw getInternalRouterError(405,{method:_e.method,pathname:new URL(_e.url).pathname,routeId:et.route.id});return{type:ResultType.data,data:void 0}}else invariant$2(ht,"Could not find the "+$+' to run on the "'+et.route.id+'" route'),lt=await ct(ht);invariant$2(lt!==void 0,"You defined "+($==="action"?"an action":"a loader")+" for route "+('"'+et.route.id+"\" but didn't return anything from your `"+$+"` ")+"function. Please return a value or `null`.")}catch(ht){st=ResultType.error,lt=ht}finally{ut&&_e.signal.removeEventListener("abort",ut)}if(isResponse(lt)){let ht=lt.status;if(redirectStatusCodes.has(ht)){let yt=lt.headers.get("Location");if(invariant$2(yt,"Redirects returned/thrown from loaders/actions must have a Location header"),ABSOLUTE_URL_REGEX.test(yt)){if(!ot){let vt=new URL(_e.url),bt=yt.startsWith("//")?new URL(vt.protocol+yt):new URL(yt),xt=stripBasename(bt.pathname,at)!=null;bt.origin===vt.origin&&xt&&(yt=bt.pathname+bt.search+bt.hash)}}else{let vt=tt.slice(0,tt.indexOf(et)+1),bt=getPathContributingMatches(vt).map(wt=>wt.pathnameBase),xt=resolveTo(yt,bt,new URL(_e.url).pathname);if(invariant$2(createPath(xt),"Unable to resolve redirect location: "+yt),at){let wt=xt.pathname;xt.pathname=wt==="/"?at:joinPaths([at,wt])}yt=createPath(xt)}if(ot)throw lt.headers.set("Location",yt),lt;return{type:ResultType.redirect,status:ht,location:yt,revalidate:lt.headers.get("X-Remix-Revalidate")!==null}}if(it)throw{type:st||ResultType.data,response:lt};let pt,dt=lt.headers.get("Content-Type");return dt&&/\bapplication\/json\b/.test(dt)?pt=await lt.json():pt=await lt.text(),st===ResultType.error?{type:st,error:new ErrorResponse(ht,lt.statusText,pt),headers:lt.headers}:{type:ResultType.data,data:pt,statusCode:lt.status,headers:lt.headers}}if(st===ResultType.error)return{type:st,error:lt};if(isDeferredData(lt)){var gt,mt;return{type:ResultType.deferred,deferredData:lt,statusCode:(gt=lt.init)==null?void 0:gt.status,headers:((mt=lt.init)==null?void 0:mt.headers)&&new Headers(lt.init.headers)}}return{type:ResultType.data,data:lt}}function createClientSideRequest($,_e,et,tt){let rt=$.createURL(stripHashFromPath(_e)).toString(),nt={signal:et};if(tt&&isMutationMethod(tt.formMethod)){let{formMethod:at,formEncType:ot,formData:it}=tt;nt.method=at.toUpperCase(),nt.body=ot==="application/x-www-form-urlencoded"?convertFormDataToSearchParams(it):it}return new Request(rt,nt)}function convertFormDataToSearchParams($){let _e=new URLSearchParams;for(let[et,tt]of $.entries())_e.append(et,tt instanceof File?tt.name:tt);return _e}function processRouteLoaderData($,_e,et,tt,rt){let nt={},at=null,ot,it=!1,ft={};return et.forEach((st,lt)=>{let ut=_e[lt].route.id;if(invariant$2(!isRedirectResult(st),"Cannot handle redirect results in processLoaderData"),isErrorResult(st)){let ct=findNearestBoundary($,ut),gt=st.error;tt&&(gt=Object.values(tt)[0],tt=void 0),at=at||{},at[ct.route.id]==null&&(at[ct.route.id]=gt),nt[ut]=void 0,it||(it=!0,ot=isRouteErrorResponse(st.error)?st.error.status:500),st.headers&&(ft[ut]=st.headers)}else isDeferredResult(st)?(rt.set(ut,st.deferredData),nt[ut]=st.deferredData.data):nt[ut]=st.data,st.statusCode!=null&&st.statusCode!==200&&!it&&(ot=st.statusCode),st.headers&&(ft[ut]=st.headers)}),tt&&(at=tt,nt[Object.keys(tt)[0]]=void 0),{loaderData:nt,errors:at,statusCode:ot||200,loaderHeaders:ft}}function processLoaderData($,_e,et,tt,rt,nt,at,ot){let{loaderData:it,errors:ft}=processRouteLoaderData(_e,et,tt,rt,ot);for(let st=0;sttt.route.id===_e)+1):[...$]).reverse().find(tt=>tt.route.hasErrorBoundary===!0)||$[0]}function getShortCircuitMatches($){let _e=$.find(et=>et.index||!et.path||et.path==="/")||{id:"__shim-error-route__"};return{matches:[{params:{},pathname:"",pathnameBase:"",route:_e}],route:_e}}function getInternalRouterError($,_e){let{pathname:et,routeId:tt,method:rt,type:nt}=_e===void 0?{}:_e,at="Unknown Server Error",ot="Unknown @remix-run/router error";return $===400?(at="Bad Request",rt&&et&&tt?ot="You made a "+rt+' request to "'+et+'" but '+('did not provide a `loader` for route "'+tt+'", ')+"so there is no way to handle the request.":nt==="defer-action"&&(ot="defer() is not supported in actions")):$===403?(at="Forbidden",ot='Route "'+tt+'" does not match URL "'+et+'"'):$===404?(at="Not Found",ot='No route matches URL "'+et+'"'):$===405&&(at="Method Not Allowed",rt&&et&&tt?ot="You made a "+rt.toUpperCase()+' request to "'+et+'" but '+('did not provide an `action` for route "'+tt+'", ')+"so there is no way to handle the request.":rt&&(ot='Invalid request method "'+rt.toUpperCase()+'"')),new ErrorResponse($||500,at,new Error(ot),!0)}function findRedirect($){for(let _e=$.length-1;_e>=0;_e--){let et=$[_e];if(isRedirectResult(et))return et}}function stripHashFromPath($){let _e=typeof $=="string"?parsePath($):$;return createPath(_extends$3({},_e,{hash:""}))}function isHashChangeOnly($,_e){return $.pathname===_e.pathname&&$.search===_e.search&&$.hash!==_e.hash}function isDeferredResult($){return $.type===ResultType.deferred}function isErrorResult($){return $.type===ResultType.error}function isRedirectResult($){return($&&$.type)===ResultType.redirect}function isDeferredData($){let _e=$;return _e&&typeof _e=="object"&&typeof _e.data=="object"&&typeof _e.subscribe=="function"&&typeof _e.cancel=="function"&&typeof _e.resolveData=="function"}function isResponse($){return $!=null&&typeof $.status=="number"&&typeof $.statusText=="string"&&typeof $.headers=="object"&&typeof $.body<"u"}function isValidMethod($){return validRequestMethods.has($.toLowerCase())}function isMutationMethod($){return validMutationMethods.has($.toLowerCase())}async function resolveDeferredResults($,_e,et,tt,rt,nt){for(let at=0;atlt.route.id===it.route.id),st=ft!=null&&!isNewRouteInstance(ft,it)&&(nt&&nt[it.route.id])!==void 0;isDeferredResult(ot)&&(rt||st)&&await resolveDeferredData(ot,tt,rt).then(lt=>{lt&&(et[at]=lt||et[at])})}}async function resolveDeferredData($,_e,et){if(et===void 0&&(et=!1),!await $.deferredData.resolveData(_e)){if(et)try{return{type:ResultType.data,data:$.deferredData.unwrappedData}}catch(rt){return{type:ResultType.error,error:rt}}return{type:ResultType.data,data:$.deferredData.data}}}function hasNakedIndexQuery($){return new URLSearchParams($).getAll("index").some(_e=>_e==="")}function createUseMatchesMatch($,_e){let{route:et,pathname:tt,params:rt}=$;return{id:et.id,pathname:tt,params:rt,data:_e[et.id],handle:et.handle}}function getTargetMatch($,_e){let et=typeof _e=="string"?parsePath(_e).search:_e.search;if($[$.length-1].route.index&&hasNakedIndexQuery(et||""))return $[$.length-1];let tt=getPathContributingMatches($);return tt[tt.length-1]}/** * React Router v6.10.0 * * Copyright (c) Remix Software Inc. * * This source code is licensed under the MIT license found in the * LICENSE.md file in the root directory of this source tree. * * @license MIT */function isPolyfill($,_e){return $===_e&&($!==0||1/$===1/_e)||$!==$&&_e!==_e}const is=typeof Object.is=="function"?Object.is:isPolyfill,{useState,useEffect,useLayoutEffect,useDebugValue}=React$3;function useSyncExternalStore$2($,_e,et){const tt=_e(),[{inst:rt},nt]=useState({inst:{value:tt,getSnapshot:_e}});return useLayoutEffect(()=>{rt.value=tt,rt.getSnapshot=_e,checkIfSnapshotChanged(rt)&&nt({inst:rt})},[$,tt,_e]),useEffect(()=>(checkIfSnapshotChanged(rt)&&nt({inst:rt}),$(()=>{checkIfSnapshotChanged(rt)&&nt({inst:rt})})),[$]),useDebugValue(tt),tt}function checkIfSnapshotChanged($){const _e=$.getSnapshot,et=$.value;try{const tt=_e();return!is(et,tt)}catch{return!0}}function useSyncExternalStore$1($,_e,et){return _e()}const canUseDOM=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",isServerEnvironment=!canUseDOM,shim=isServerEnvironment?useSyncExternalStore$1:useSyncExternalStore$2,useSyncExternalStore="useSyncExternalStore"in React$3?($=>$.useSyncExternalStore)(React$3):shim,DataRouterContext=reactExports.createContext(null),DataRouterStateContext=reactExports.createContext(null),NavigationContext=reactExports.createContext(null),LocationContext=reactExports.createContext(null),RouteContext=reactExports.createContext({outlet:null,matches:[]}),RouteErrorContext=reactExports.createContext(null);function _extends$2(){return _extends$2=Object.assign?Object.assign.bind():function($){for(var _e=1;_eot.pathnameBase)),nt=reactExports.useRef(!1);return reactExports.useEffect(()=>{nt.current=!0}),reactExports.useCallback(function(ot,it){if(it===void 0&&(it={}),!nt.current)return;if(typeof ot=="number"){_e.go(ot);return}let ft=resolveTo(ot,JSON.parse(rt),tt,it.relative==="path");$!=="/"&&(ft.pathname=ft.pathname==="/"?$:joinPaths([$,ft.pathname])),(it.replace?_e.replace:_e.push)(ft,it.state,it)},[$,_e,rt,tt])}const OutletContext=reactExports.createContext(null);function useOutlet($){let _e=reactExports.useContext(RouteContext).outlet;return _e&&reactExports.createElement(OutletContext.Provider,{value:$},_e)}function useRoutes($,_e){useInRouterContext()||invariant$2(!1);let{navigator:et}=reactExports.useContext(NavigationContext),tt=reactExports.useContext(DataRouterStateContext),{matches:rt}=reactExports.useContext(RouteContext),nt=rt[rt.length-1],at=nt?nt.params:{};nt&&nt.pathname;let ot=nt?nt.pathnameBase:"/";nt&&nt.route;let it=useLocation(),ft;if(_e){var st;let mt=typeof _e=="string"?parsePath(_e):_e;ot==="/"||(st=mt.pathname)!=null&&st.startsWith(ot)||invariant$2(!1),ft=mt}else ft=it;let lt=ft.pathname||"/",ut=ot==="/"?lt:lt.slice(ot.length)||"/",ct=matchRoutes($,{pathname:ut}),gt=_renderMatches(ct&&ct.map(mt=>Object.assign({},mt,{params:Object.assign({},at,mt.params),pathname:joinPaths([ot,et.encodeLocation?et.encodeLocation(mt.pathname).pathname:mt.pathname]),pathnameBase:mt.pathnameBase==="/"?ot:joinPaths([ot,et.encodeLocation?et.encodeLocation(mt.pathnameBase).pathname:mt.pathnameBase])})),rt,tt||void 0);return _e&>?reactExports.createElement(LocationContext.Provider,{value:{location:_extends$2({pathname:"/",search:"",hash:"",state:null,key:"default"},ft),navigationType:Action.Pop}},gt):gt}function DefaultErrorComponent(){let $=useRouteError(),_e=isRouteErrorResponse($)?$.status+" "+$.statusText:$ instanceof Error?$.message:JSON.stringify($),et=$ instanceof Error?$.stack:null,rt={padding:"0.5rem",backgroundColor:"rgba(200,200,200, 0.5)"},nt=null;return reactExports.createElement(reactExports.Fragment,null,reactExports.createElement("h2",null,"Unexpected Application Error!"),reactExports.createElement("h3",{style:{fontStyle:"italic"}},_e),et?reactExports.createElement("pre",{style:rt},et):null,nt)}class RenderErrorBoundary extends reactExports.Component{constructor(_e){super(_e),this.state={location:_e.location,error:_e.error}}static getDerivedStateFromError(_e){return{error:_e}}static getDerivedStateFromProps(_e,et){return et.location!==_e.location?{error:_e.error,location:_e.location}:{error:_e.error||et.error,location:et.location}}componentDidCatch(_e,et){console.error("React Router caught the following error during render",_e,et)}render(){return this.state.error?reactExports.createElement(RouteContext.Provider,{value:this.props.routeContext},reactExports.createElement(RouteErrorContext.Provider,{value:this.state.error,children:this.props.component})):this.props.children}}function RenderedRoute($){let{routeContext:_e,match:et,children:tt}=$,rt=reactExports.useContext(DataRouterContext);return rt&&rt.static&&rt.staticContext&&(et.route.errorElement||et.route.ErrorBoundary)&&(rt.staticContext._deepestRenderedBoundaryId=et.route.id),reactExports.createElement(RouteContext.Provider,{value:_e},tt)}function _renderMatches($,_e,et){if(_e===void 0&&(_e=[]),$==null)if(et!=null&&et.errors)$=et.matches;else return null;let tt=$,rt=et==null?void 0:et.errors;if(rt!=null){let nt=tt.findIndex(at=>at.route.id&&(rt==null?void 0:rt[at.route.id]));nt>=0||invariant$2(!1),tt=tt.slice(0,Math.min(tt.length,nt+1))}return tt.reduceRight((nt,at,ot)=>{let it=at.route.id?rt==null?void 0:rt[at.route.id]:null,ft=null;et&&(at.route.ErrorBoundary?ft=reactExports.createElement(at.route.ErrorBoundary,null):at.route.errorElement?ft=at.route.errorElement:ft=reactExports.createElement(DefaultErrorComponent,null));let st=_e.concat(tt.slice(0,ot+1)),lt=()=>{let ut=nt;return it?ut=ft:at.route.Component?ut=reactExports.createElement(at.route.Component,null):at.route.element&&(ut=at.route.element),reactExports.createElement(RenderedRoute,{match:at,routeContext:{outlet:nt,matches:st},children:ut})};return et&&(at.route.ErrorBoundary||at.route.errorElement||ot===0)?reactExports.createElement(RenderErrorBoundary,{location:et.location,component:ft,error:it,children:lt(),routeContext:{outlet:null,matches:st}}):lt()},null)}var DataRouterHook;(function($){$.UseBlocker="useBlocker",$.UseRevalidator="useRevalidator"})(DataRouterHook||(DataRouterHook={}));var DataRouterStateHook;(function($){$.UseBlocker="useBlocker",$.UseLoaderData="useLoaderData",$.UseActionData="useActionData",$.UseRouteError="useRouteError",$.UseNavigation="useNavigation",$.UseRouteLoaderData="useRouteLoaderData",$.UseMatches="useMatches",$.UseRevalidator="useRevalidator"})(DataRouterStateHook||(DataRouterStateHook={}));function useDataRouterState($){let _e=reactExports.useContext(DataRouterStateContext);return _e||invariant$2(!1),_e}function useRouteContext($){let _e=reactExports.useContext(RouteContext);return _e||invariant$2(!1),_e}function useCurrentRouteId($){let _e=useRouteContext(),et=_e.matches[_e.matches.length-1];return et.route.id||invariant$2(!1),et.route.id}function useLoaderData(){let $=useDataRouterState(DataRouterStateHook.UseLoaderData),_e=useCurrentRouteId(DataRouterStateHook.UseLoaderData);if($.errors&&$.errors[_e]!=null){console.error("You cannot `useLoaderData` in an errorElement (routeId: "+_e+")");return}return $.loaderData[_e]}function useRouteError(){var $;let _e=reactExports.useContext(RouteErrorContext),et=useDataRouterState(DataRouterStateHook.UseRouteError),tt=useCurrentRouteId(DataRouterStateHook.UseRouteError);return _e||(($=et.errors)==null?void 0:$[tt])}function RouterProvider($){let{fallbackElement:_e,router:et}=$,tt=reactExports.useCallback(()=>et.state,[et]),rt=useSyncExternalStore(et.subscribe,tt,tt),nt=reactExports.useMemo(()=>({createHref:et.createHref,encodeLocation:et.encodeLocation,go:it=>et.navigate(it),push:(it,ft,st)=>et.navigate(it,{state:ft,preventScrollReset:st==null?void 0:st.preventScrollReset}),replace:(it,ft,st)=>et.navigate(it,{replace:!0,state:ft,preventScrollReset:st==null?void 0:st.preventScrollReset})}),[et]),at=et.basename||"/",ot=reactExports.useMemo(()=>({router:et,navigator:nt,static:!1,basename:at}),[et,nt,at]);return reactExports.createElement(reactExports.Fragment,null,reactExports.createElement(DataRouterContext.Provider,{value:ot},reactExports.createElement(DataRouterStateContext.Provider,{value:rt},reactExports.createElement(Router,{basename:et.basename,location:et.state.location,navigationType:et.state.historyAction,navigator:nt},et.state.initialized?reactExports.createElement(Routes,null):_e))),null)}function Navigate($){let{to:_e,replace:et,state:tt,relative:rt}=$;useInRouterContext()||invariant$2(!1);let nt=reactExports.useContext(DataRouterStateContext),at=useNavigate();return reactExports.useEffect(()=>{nt&&nt.navigation.state!=="idle"||at(_e,{replace:et,state:tt,relative:rt})}),null}function Outlet($){return useOutlet($.context)}function Route($){invariant$2(!1)}function Router($){let{basename:_e="/",children:et=null,location:tt,navigationType:rt=Action.Pop,navigator:nt,static:at=!1}=$;useInRouterContext()&&invariant$2(!1);let ot=_e.replace(/^\/*/,"/"),it=reactExports.useMemo(()=>({basename:ot,navigator:nt,static:at}),[ot,nt,at]);typeof tt=="string"&&(tt=parsePath(tt));let{pathname:ft="/",search:st="",hash:lt="",state:ut=null,key:ct="default"}=tt,gt=reactExports.useMemo(()=>{let mt=stripBasename(ft,ot);return mt==null?null:{location:{pathname:mt,search:st,hash:lt,state:ut,key:ct},navigationType:rt}},[ot,ft,st,lt,ut,ct,rt]);return gt==null?null:reactExports.createElement(NavigationContext.Provider,{value:it},reactExports.createElement(LocationContext.Provider,{children:et,value:gt}))}function Routes($){let{children:_e,location:et}=$,tt=reactExports.useContext(DataRouterContext),rt=tt&&!_e?tt.router.routes:createRoutesFromChildren(_e);return useRoutes(rt,et)}var AwaitRenderStatus;(function($){$[$.pending=0]="pending",$[$.success=1]="success",$[$.error=2]="error"})(AwaitRenderStatus||(AwaitRenderStatus={}));new Promise(()=>{});function createRoutesFromChildren($,_e){_e===void 0&&(_e=[]);let et=[];return reactExports.Children.forEach($,(tt,rt)=>{if(!reactExports.isValidElement(tt))return;let nt=[..._e,rt];if(tt.type===reactExports.Fragment){et.push.apply(et,createRoutesFromChildren(tt.props.children,nt));return}tt.type!==Route&&invariant$2(!1),!tt.props.index||!tt.props.children||invariant$2(!1);let at={id:tt.props.id||nt.join("-"),caseSensitive:tt.props.caseSensitive,element:tt.props.element,Component:tt.props.Component,index:tt.props.index,path:tt.props.path,loader:tt.props.loader,action:tt.props.action,errorElement:tt.props.errorElement,ErrorBoundary:tt.props.ErrorBoundary,hasErrorBoundary:tt.props.ErrorBoundary!=null||tt.props.errorElement!=null,shouldRevalidate:tt.props.shouldRevalidate,handle:tt.props.handle,lazy:tt.props.lazy};tt.props.children&&(at.children=createRoutesFromChildren(tt.props.children,nt)),et.push(at)}),et}function detectErrorBoundary($){return!!$.ErrorBoundary||!!$.errorElement}function createMemoryRouter($,_e){return createRouter({basename:_e==null?void 0:_e.basename,future:_e==null?void 0:_e.future,history:createMemoryHistory({initialEntries:_e==null?void 0:_e.initialEntries,initialIndex:_e==null?void 0:_e.initialIndex}),hydrationData:_e==null?void 0:_e.hydrationData,routes:$,detectErrorBoundary}).initialize()}const index$1="";function n($){for(var _e=arguments.length,et=Array(_e>1?_e-1:0),tt=1;tt<_e;tt++)et[tt-1]=arguments[tt];throw Error("[Immer] minified error nr: "+$+(et.length?" "+et.map(function(rt){return"'"+rt+"'"}).join(","):"")+". Find the full error at: https://bit.ly/3cXEKWf")}function r($){return!!$&&!!$[Q]}function t($){var _e;return!!$&&(function(et){if(!et||typeof et!="object")return!1;var tt=Object.getPrototypeOf(et);if(tt===null)return!0;var rt=Object.hasOwnProperty.call(tt,"constructor")&&tt.constructor;return rt===Object||typeof rt=="function"&&Function.toString.call(rt)===Z}($)||Array.isArray($)||!!$[L]||!!(!((_e=$.constructor)===null||_e===void 0)&&_e[L])||s($)||v($))}function i$1($,_e,et){et===void 0&&(et=!1),o($)===0?(et?Object.keys:nn)($).forEach(function(tt){et&&typeof tt=="symbol"||_e(tt,$[tt],$)}):$.forEach(function(tt,rt){return _e(rt,tt,$)})}function o($){var _e=$[Q];return _e?_e.i>3?_e.i-4:_e.i:Array.isArray($)?1:s($)?2:v($)?3:0}function u($,_e){return o($)===2?$.has(_e):Object.prototype.hasOwnProperty.call($,_e)}function a($,_e){return o($)===2?$.get(_e):$[_e]}function f($,_e,et){var tt=o($);tt===2?$.set(_e,et):tt===3?$.add(et):$[_e]=et}function c($,_e){return $===_e?$!==0||1/$==1/_e:$!=$&&_e!=_e}function s($){return X&&$ instanceof Map}function v($){return q&&$ instanceof Set}function p($){return $.o||$.t}function l($){if(Array.isArray($))return Array.prototype.slice.call($);var _e=rn($);delete _e[Q];for(var et=nn(_e),tt=0;tt1&&($.set=$.add=$.clear=$.delete=h),Object.freeze($),_e&&i$1($,function(et,tt){return d(tt,!0)},!0)),$}function h(){n(2)}function y($){return $==null||typeof $!="object"||Object.isFrozen($)}function b($){var _e=tn[$];return _e||n(18,$),_e}function m($,_e){tn[$]||(tn[$]=_e)}function _(){return U}function j($,_e){_e&&(b("Patches"),$.u=[],$.s=[],$.v=_e)}function g($){O($),$.p.forEach(S),$.p=null}function O($){$===U&&(U=$.l)}function w($){return U={p:[],l:U,h:$,m:!0,_:0}}function S($){var _e=$[Q];_e.i===0||_e.i===1?_e.j():_e.g=!0}function P($,_e){_e._=_e.p.length;var et=_e.p[0],tt=$!==void 0&&$!==et;return _e.h.O||b("ES5").S(_e,$,tt),tt?(et[Q].P&&(g(_e),n(4)),t($)&&($=M(_e,$),_e.l||x(_e,$)),_e.u&&b("Patches").M(et[Q].t,$,_e.u,_e.s)):$=M(_e,et,[]),g(_e),_e.u&&_e.v(_e.u,_e.s),$!==H?$:void 0}function M($,_e,et){if(y(_e))return _e;var tt=_e[Q];if(!tt)return i$1(_e,function(ot,it){return A($,tt,_e,ot,it,et)},!0),_e;if(tt.A!==$)return _e;if(!tt.P)return x($,tt.t,!0),tt.t;if(!tt.I){tt.I=!0,tt.A._--;var rt=tt.i===4||tt.i===5?tt.o=l(tt.k):tt.o,nt=rt,at=!1;tt.i===3&&(nt=new Set(rt),rt.clear(),at=!0),i$1(nt,function(ot,it){return A($,tt,rt,ot,it,et,at)}),x($,rt,!1),et&&$.u&&b("Patches").N(tt,et,$.u,$.s)}return tt.o}function A($,_e,et,tt,rt,nt,at){if(r(rt)){var ot=M($,rt,nt&&_e&&_e.i!==3&&!u(_e.R,tt)?nt.concat(tt):void 0);if(f(et,tt,ot),!r(ot))return;$.m=!1}else at&&et.add(rt);if(t(rt)&&!y(rt)){if(!$.h.D&&$._<1)return;M($,rt),_e&&_e.A.l||x($,rt)}}function x($,_e,et){et===void 0&&(et=!1),!$.l&&$.h.D&&$.m&&d(_e,et)}function z($,_e){var et=$[Q];return(et?p(et):$)[_e]}function I($,_e){if(_e in $)for(var et=Object.getPrototypeOf($);et;){var tt=Object.getOwnPropertyDescriptor(et,_e);if(tt)return tt;et=Object.getPrototypeOf(et)}}function k($){$.P||($.P=!0,$.l&&k($.l))}function E($){$.o||($.o=l($.t))}function N($,_e,et){var tt=s(_e)?b("MapSet").F(_e,et):v(_e)?b("MapSet").T(_e,et):$.O?function(rt,nt){var at=Array.isArray(rt),ot={i:at?1:0,A:nt?nt.A:_(),P:!1,I:!1,R:{},l:nt,t:rt,k:null,o:null,j:null,C:!1},it=ot,ft=en;at&&(it=[ot],ft=on$1);var st=Proxy.revocable(it,ft),lt=st.revoke,ut=st.proxy;return ot.k=ut,ot.j=lt,ut}(_e,et):b("ES5").J(_e,et);return(et?et.A:_()).p.push(tt),tt}function R($){return r($)||n(22,$),function _e(et){if(!t(et))return et;var tt,rt=et[Q],nt=o(et);if(rt){if(!rt.P&&(rt.i<4||!b("ES5").K(rt)))return rt.t;rt.I=!0,tt=D(et,nt),rt.I=!1}else tt=D(et,nt);return i$1(tt,function(at,ot){rt&&a(rt.t,at)===ot||f(tt,at,_e(ot))}),nt===3?new Set(tt):tt}($)}function D($,_e){switch(_e){case 2:return new Map($);case 3:return Array.from($)}return l($)}function F(){function $(nt,at){var ot=rt[nt];return ot?ot.enumerable=at:rt[nt]=ot={configurable:!0,enumerable:at,get:function(){var it=this[Q];return en.get(it,nt)},set:function(it){var ft=this[Q];en.set(ft,nt,it)}},ot}function _e(nt){for(var at=nt.length-1;at>=0;at--){var ot=nt[at][Q];if(!ot.P)switch(ot.i){case 5:tt(ot)&&k(ot);break;case 4:et(ot)&&k(ot)}}}function et(nt){for(var at=nt.t,ot=nt.k,it=nn(ot),ft=it.length-1;ft>=0;ft--){var st=it[ft];if(st!==Q){var lt=at[st];if(lt===void 0&&!u(at,st))return!0;var ut=ot[st],ct=ut&&ut[Q];if(ct?ct.t!==lt:!c(ut,lt))return!0}}var gt=!!at[Q];return it.length!==nn(at).length+(gt?0:1)}function tt(nt){var at=nt.k;if(at.length!==nt.t.length)return!0;var ot=Object.getOwnPropertyDescriptor(at,at.length-1);if(ot&&!ot.get)return!0;for(var it=0;it1?pt-1:0),yt=1;yt1?st-1:0),ut=1;ut=0;rt--){var nt=tt[rt];if(nt.path.length===0&&nt.op==="replace"){et=nt.value;break}}rt>-1&&(tt=tt.slice(rt+1));var at=b("Patches").$;return r(et)?at(et,tt):this.produce(et,function(ot){return at(ot,tt)})},$}(),an=new un,fn=an.produce;an.produceWithPatches.bind(an);an.setAutoFreeze.bind(an);an.setUseProxies.bind(an);an.applyPatches.bind(an);an.createDraft.bind(an);an.finishDraft.bind(an);function _typeof$1($){"@babel/helpers - typeof";return _typeof$1=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(_e){return typeof _e}:function(_e){return _e&&typeof Symbol=="function"&&_e.constructor===Symbol&&_e!==Symbol.prototype?"symbol":typeof _e},_typeof$1($)}function toPrimitive($,_e){if(_typeof$1($)!="object"||!$)return $;var et=$[Symbol.toPrimitive];if(et!==void 0){var tt=et.call($,_e||"default");if(_typeof$1(tt)!="object")return tt;throw new TypeError("@@toPrimitive must return a primitive value.")}return(_e==="string"?String:Number)($)}function toPropertyKey($){var _e=toPrimitive($,"string");return _typeof$1(_e)=="symbol"?_e:_e+""}function _defineProperty$3($,_e,et){return(_e=toPropertyKey(_e))in $?Object.defineProperty($,_e,{value:et,enumerable:!0,configurable:!0,writable:!0}):$[_e]=et,$}function ownKeys$3($,_e){var et=Object.keys($);if(Object.getOwnPropertySymbols){var tt=Object.getOwnPropertySymbols($);_e&&(tt=tt.filter(function(rt){return Object.getOwnPropertyDescriptor($,rt).enumerable})),et.push.apply(et,tt)}return et}function _objectSpread2$1($){for(var _e=1;_e"u"&&(et=_e,_e=void 0),typeof et<"u"){if(typeof et!="function")throw new Error(formatProdErrorMessage(1));return et(createStore)($,_e)}if(typeof $!="function")throw new Error(formatProdErrorMessage(2));var rt=$,nt=_e,at=[],ot=at,it=!1;function ft(){ot===at&&(ot=at.slice())}function st(){if(it)throw new Error(formatProdErrorMessage(3));return nt}function lt(mt){if(typeof mt!="function")throw new Error(formatProdErrorMessage(4));if(it)throw new Error(formatProdErrorMessage(5));var ht=!0;return ft(),ot.push(mt),function(){if(ht){if(it)throw new Error(formatProdErrorMessage(6));ht=!1,ft();var dt=ot.indexOf(mt);ot.splice(dt,1),at=null}}}function ut(mt){if(!isPlainObject$1(mt))throw new Error(formatProdErrorMessage(7));if(typeof mt.type>"u")throw new Error(formatProdErrorMessage(8));if(it)throw new Error(formatProdErrorMessage(9));try{it=!0,nt=rt(nt,mt)}finally{it=!1}for(var ht=at=ot,pt=0;pt"u")throw new Error(formatProdErrorMessage(12));if(typeof et(void 0,{type:ActionTypes.PROBE_UNKNOWN_ACTION()})>"u")throw new Error(formatProdErrorMessage(13))})}function combineReducers($){for(var _e=Object.keys($),et={},tt=0;tt<_e.length;tt++){var rt=_e[tt];typeof $[rt]=="function"&&(et[rt]=$[rt])}var nt=Object.keys(et),at;try{assertReducerShape(et)}catch(ot){at=ot}return function(it,ft){if(it===void 0&&(it={}),at)throw at;for(var st=!1,lt={},ut=0;ut"u")throw ft&&ft.type,new Error(formatProdErrorMessage(14));lt[ct]=ht,st=st||ht!==mt}return st=st||nt.length!==Object.keys(it).length,st?lt:it}}function compose(){for(var $=arguments.length,_e=new Array($),et=0;et<$;et++)_e[et]=arguments[et];return _e.length===0?function(tt){return tt}:_e.length===1?_e[0]:_e.reduce(function(tt,rt){return function(){return tt(rt.apply(void 0,arguments))}})}function applyMiddleware(){for(var $=arguments.length,_e=new Array($),et=0;et<$;et++)_e[et]=arguments[et];return function(tt){return function(){var rt=tt.apply(void 0,arguments),nt=function(){throw new Error(formatProdErrorMessage(15))},at={getState:rt.getState,dispatch:function(){return nt.apply(void 0,arguments)}},ot=_e.map(function(it){return it(at)});return nt=compose.apply(void 0,ot)(rt.dispatch),_objectSpread2$1(_objectSpread2$1({},rt),{},{dispatch:nt})}}}var NOT_FOUND="NOT_FOUND";function createSingletonCache($){var _e;return{get:function(tt){return _e&&$(_e.key,tt)?_e.value:NOT_FOUND},put:function(tt,rt){_e={key:tt,value:rt}},getEntries:function(){return _e?[_e]:[]},clear:function(){_e=void 0}}}function createLruCache($,_e){var et=[];function tt(ot){var it=et.findIndex(function(st){return _e(ot,st.key)});if(it>-1){var ft=et[it];return it>0&&(et.splice(it,1),et.unshift(ft)),ft.value}return NOT_FOUND}function rt(ot,it){tt(ot)===NOT_FOUND&&(et.unshift({key:ot,value:it}),et.length>$&&et.pop())}function nt(){return et}function at(){et=[]}return{get:tt,put:rt,getEntries:nt,clear:at}}var defaultEqualityCheck=function(_e,et){return _e===et};function createCacheKeyComparator($){return function(et,tt){if(et===null||tt===null||et.length!==tt.length)return!1;for(var rt=et.length,nt=0;nt1?_e-1:0),tt=1;tt<_e;tt++)et[tt-1]=arguments[tt];var rt=function(){for(var at=arguments.length,ot=new Array(at),it=0;it0&&nt[nt.length-1])&&(ft[0]===6||ft[0]===2)){et=0;continue}if(ft[0]===3&&(!nt||ft[1]>nt[0]&&ft[1]($.Sticker="sticker",$))(ArtType||{});function assert($,_e){if(!$)throw new Error(_e)}const initialState$2={artType:ArtType.Sticker,order:[],data:{},title:"",author:"",packId:"",packKey:"",toasts:[]},adjustCover=$=>{var et;const _e=$.order[0];_e?$.cover=(et=$.data[_e])==null?void 0:et.imageData:delete $.cover},artSlice=createSlice({name:"art",initialState:initialState$2,reducers:{initializeImages:($,{payload:_e})=>{assert($.artType===ArtType.Sticker,"Unexpected art type");const et=MAX_STICKERS,tt=Array.from(new Set([...$.order,..._e])).slice(0,et-$.order.length);for(const rt of tt)$.data[rt]||($.data[rt]={},$.order.push(rt))},addImageData:($,{payload:_e})=>{var ot;assert($.artType===ArtType.Sticker,"Unexpected art type");const et=MAX_STICKER_BYTE_SIZE;if(_e.buffer.length>et){$.toasts.push({key:"StickerCreator--Toasts--tooLarge"}),$.order=$.order.filter(it=>it!==_e.path),delete $.data[_e.path];return}const tt=$.data[_e.path];if(!tt||tt.imageData)return;tt.imageData=_e;const rt="icu:StickerCreator--Toasts--imagesAdded",nt=(()=>{const it=$.toasts.find(st=>st.key===rt);if(it)return it;const ft={key:rt,subs:{count:"0"}};return $.toasts.push(ft),ft})(),at=(ot=nt==null?void 0:nt.subs)==null?void 0:ot.count;if(nt&&typeof at=="string"){const it=parseInt(at,10),ft=Number.isFinite(it)?it+1:1;nt.subs=nt.subs||{},nt.subs.count=ft.toString()}adjustCover($)},removeImage:($,{payload:_e})=>{$.order=$.order.filter(et=>et!==_e),delete $.data[_e],adjustCover($)},setOrder:($,{payload:_e})=>{$.order=_e},setCover:($,{payload:_e})=>{$.cover=_e},resetCover:$=>{adjustCover($)},setEmoji:($,{payload:_e})=>{const et=$.data[_e.id];et&&(et.emoji=_e.emoji)},setEmojiName:($,{payload:_e})=>{const et=$.data[_e.id];if(!et)return;const tt=_e.name.replace(/[^a-zA-Z_]/g,"");et.emoji?et.emoji.name=tt:et.emoji={name:tt,sheetX:-1,sheetY:-1}},setTitle:($,{payload:_e})=>{$.title=_e},setAuthor:($,{payload:_e})=>{$.author=_e},setPackMeta:($,{payload:{packId:_e,key:et}})=>{$.packId=_e,$.packKey=et},addToast:($,{payload:_e})=>{$.toasts=$.toasts.filter(({key:et})=>et===_e.key),$.toasts.push(_e)},dismissToast:$=>{$.toasts.pop()},resetStatus:$=>{$.toasts=[]},reset:($,{payload:_e})=>({...initialState$2,artType:_e})}}),{addImageData,initializeImages,removeImage,setCover,setEmoji,setEmojiName,setOrder,setTitle,setAuthor,setPackMeta,addToast,dismissToast,reset,resetStatus}=artSlice.actions,artReducer=artSlice.reducer,initialState$1={credentials:void 0},credentialsSlice=createSlice({name:"credentials",initialState:initialState$1,reducers:{setCredentials:($,{payload:_e})=>{$.credentials=_e}}}),credentialsReducer=credentialsSlice.reducer,store=configureStore({reducer:{art:artReducer,credentials:credentialsReducer},middleware:$=>$({serializableCheck:{ignoredActionPaths:["payload.buffer"],ignoredPaths:["art.cover.buffer",/^art.data.*.imageData.buffer$/]}})});var browser={exports:{}},ms,hasRequiredMs;function requireMs(){if(hasRequiredMs)return ms;hasRequiredMs=1;var $=1e3,_e=$*60,et=_e*60,tt=et*24,rt=tt*7,nt=tt*365.25;ms=function(st,lt){lt=lt||{};var ut=typeof st;if(ut==="string"&&st.length>0)return at(st);if(ut==="number"&&isFinite(st))return lt.long?it(st):ot(st);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(st))};function at(st){if(st=String(st),!(st.length>100)){var lt=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(st);if(lt){var ut=parseFloat(lt[1]),ct=(lt[2]||"ms").toLowerCase();switch(ct){case"years":case"year":case"yrs":case"yr":case"y":return ut*nt;case"weeks":case"week":case"w":return ut*rt;case"days":case"day":case"d":return ut*tt;case"hours":case"hour":case"hrs":case"hr":case"h":return ut*et;case"minutes":case"minute":case"mins":case"min":case"m":return ut*_e;case"seconds":case"second":case"secs":case"sec":case"s":return ut*$;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return ut;default:return}}}}function ot(st){var lt=Math.abs(st);return lt>=tt?Math.round(st/tt)+"d":lt>=et?Math.round(st/et)+"h":lt>=_e?Math.round(st/_e)+"m":lt>=$?Math.round(st/$)+"s":st+"ms"}function it(st){var lt=Math.abs(st);return lt>=tt?ft(st,lt,tt,"day"):lt>=et?ft(st,lt,et,"hour"):lt>=_e?ft(st,lt,_e,"minute"):lt>=$?ft(st,lt,$,"second"):st+" ms"}function ft(st,lt,ut,ct){var gt=lt>=ut*1.5;return Math.round(st/ut)+" "+ct+(gt?"s":"")}return ms}function setup($){et.debug=et,et.default=et,et.coerce=it,et.disable=nt,et.enable=rt,et.enabled=at,et.humanize=requireMs(),et.destroy=ft,Object.keys($).forEach(st=>{et[st]=$[st]}),et.names=[],et.skips=[],et.formatters={};function _e(st){let lt=0;for(let ut=0;ut{if(xt==="%%")return"%";vt++;const Et=et.formatters[wt];if(typeof Et=="function"){const Lt=ht[vt];xt=Et.call(pt,Lt),ht.splice(vt,1),vt--}return xt}),et.formatArgs.call(pt,ht),(pt.log||et.log).apply(pt,ht)}return mt.namespace=st,mt.useColors=et.useColors(),mt.color=et.selectColor(st),mt.extend=tt,mt.destroy=et.destroy,Object.defineProperty(mt,"enabled",{enumerable:!0,configurable:!1,get:()=>ut!==null?ut:(ct!==et.namespaces&&(ct=et.namespaces,gt=et.enabled(st)),gt),set:ht=>{ut=ht}}),typeof et.init=="function"&&et.init(mt),mt}function tt(st,lt){const ut=et(this.namespace+(typeof lt>"u"?":":lt)+st);return ut.log=this.log,ut}function rt(st){et.save(st),et.namespaces=st,et.names=[],et.skips=[];let lt;const ut=(typeof st=="string"?st:"").split(/[\s,]+/),ct=ut.length;for(lt=0;lt"-"+lt)].join(",");return et.enable(""),st}function at(st){if(st[st.length-1]==="*")return!0;let lt,ut;for(lt=0,ut=et.skips.length;lt{let it=!1;return()=>{it||(it=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})(),_e.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"];function et(){return typeof window<"u"&&window.process&&(window.process.type==="renderer"||window.process.__nwjs)?!0:typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)?!1:typeof document<"u"&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window<"u"&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)}function tt(it){if(it[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+it[0]+(this.useColors?"%c ":" ")+"+"+$.exports.humanize(this.diff),!this.useColors)return;const ft="color: "+this.color;it.splice(1,0,ft,"color: inherit");let st=0,lt=0;it[0].replace(/%[a-zA-Z%]/g,ut=>{ut!=="%%"&&(st++,ut==="%c"&&(lt=st))}),it.splice(lt,0,ft)}_e.log=console.debug||console.log||(()=>{});function rt(it){try{it?_e.storage.setItem("debug",it):_e.storage.removeItem("debug")}catch{}}function nt(){let it;try{it=_e.storage.getItem("debug")}catch{}return!it&&typeof process<"u"&&"env"in process&&(it={}.DEBUG),it}function at(){try{return localStorage}catch{}}$.exports=common(_e);const{formatters:ot}=$.exports;ot.j=function(it){try{return JSON.stringify(it)}catch(ft){return"[UnexpectedJSONParseError]: "+ft.message}}})(browser,browser.exports);var browserExports=browser.exports;const createDebug=getDefaultExportFromCjs(browserExports),scriptRel="modulepreload",assetsURL=function($,_e){return new URL($,_e).href},seen={},__vitePreload=function(_e,et,tt){if(!et||et.length===0)return _e();const rt=document.getElementsByTagName("link");return Promise.all(et.map(nt=>{if(nt=assetsURL(nt,tt),nt in seen)return;seen[nt]=!0;const at=nt.endsWith(".css"),ot=at?'[rel="stylesheet"]':"";if(!!tt)for(let st=rt.length-1;st>=0;st--){const lt=rt[st];if(lt.href===nt&&(!at||lt.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${nt}"]${ot}`))return;const ft=document.createElement("link");if(ft.rel=at?"stylesheet":scriptRel,at||(ft.as="script",ft.crossOrigin=""),ft.href=nt,document.head.appendChild(ft),at)return new Promise((st,lt)=>{ft.addEventListener("load",st),ft.addEventListener("error",()=>lt(new Error(`Unable to preload CSS for ${nt}`)))})})).then(()=>_e()).catch(nt=>{const at=new Event("vite:preloadError",{cancelable:!0});if(at.payload=nt,window.dispatchEvent(at),!at.defaultPrevented)throw nt})},__variableDynamicImportRuntimeHelper=($,_e)=>{const et=$[_e];return et?typeof et=="function"?et():Promise.resolve(et):new Promise((tt,rt)=>{(typeof queueMicrotask=="function"?queueMicrotask:setTimeout)(rt.bind(null,new Error("Unknown variable dynamic import: "+_e)))})};function memoize$1($,_e){var et=_e&&_e.cache?_e.cache:cacheDefault$1,tt=_e&&_e.serializer?_e.serializer:serializerDefault$1,rt=_e&&_e.strategy?_e.strategy:strategyDefault$1;return rt($,{cache:et,serializer:tt})}function isPrimitive$1($){return $==null||typeof $=="number"||typeof $=="boolean"}function monadic$1($,_e,et,tt){var rt=isPrimitive$1(tt)?tt:et(tt),nt=_e.get(rt);return typeof nt>"u"&&(nt=$.call(this,tt),_e.set(rt,nt)),nt}function variadic$1($,_e,et){var tt=Array.prototype.slice.call(arguments,3),rt=et(tt),nt=_e.get(rt);return typeof nt>"u"&&(nt=$.apply(this,tt),_e.set(rt,nt)),nt}function assemble$1($,_e,et,tt,rt){return et.bind(_e,$,tt,rt)}function strategyDefault$1($,_e){var et=$.length===1?monadic$1:variadic$1;return assemble$1($,this,et,_e.cache.create(),_e.serializer)}var serializerDefault$1=function(){return JSON.stringify(arguments)};function ObjectWithoutPrototypeCache$1(){this.cache=Object.create(null)}ObjectWithoutPrototypeCache$1.prototype.get=function($){return this.cache[$]};ObjectWithoutPrototypeCache$1.prototype.set=function($,_e){this.cache[$]=_e};var cacheDefault$1={create:function(){return new ObjectWithoutPrototypeCache$1}},extendStatics=function($,_e){return extendStatics=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(et,tt){et.__proto__=tt}||function(et,tt){for(var rt in tt)Object.prototype.hasOwnProperty.call(tt,rt)&&(et[rt]=tt[rt])},extendStatics($,_e)};function __extends($,_e){if(typeof _e!="function"&&_e!==null)throw new TypeError("Class extends value "+String(_e)+" is not a constructor or null");extendStatics($,_e);function et(){this.constructor=$}$.prototype=_e===null?Object.create(_e):(et.prototype=_e.prototype,new et)}var __assign=function(){return __assign=Object.assign||function(_e){for(var et,tt=1,rt=arguments.length;tt0&&nt[nt.length-1])&&(ft[0]===6||ft[0]===2)){et=0;continue}if(ft[0]===3&&(!nt||ft[1]>nt[0]&&ft[1]0)&&!(rt=tt.next()).done;)nt.push(rt.value)}catch(ot){at={error:ot}}finally{try{rt&&!rt.done&&(et=tt.return)&&et.call(tt)}finally{if(at)throw at.error}}return nt}function __spreadArray($,_e,et){if(et||arguments.length===2)for(var tt=0,rt=_e.length,nt;tt0}),et=[],tt=0,rt=_e;tt1)throw new RangeError("integer-width stems only accept a single optional option");rt.options[0].replace(INTEGER_WIDTH_REGEX,function(it,ft,st,lt,ut,ct){if(ft)_e.minimumIntegerDigits=st.length;else{if(lt&&ut)throw new Error("We currently do not support maximum integer digits");if(ct)throw new Error("We currently do not support exact integer digits")}return""});continue}if(CONCISE_INTEGER_WIDTH_REGEX.test(rt.stem)){_e.minimumIntegerDigits=rt.stem.length;continue}if(FRACTION_PRECISION_REGEX.test(rt.stem)){if(rt.options.length>1)throw new RangeError("Fraction-precision stems only accept a single optional option");rt.stem.replace(FRACTION_PRECISION_REGEX,function(it,ft,st,lt,ut,ct){return st==="*"?_e.minimumFractionDigits=ft.length:lt&<[0]==="#"?_e.maximumFractionDigits=lt.length:ut&&ct?(_e.minimumFractionDigits=ut.length,_e.maximumFractionDigits=ut.length+ct.length):(_e.minimumFractionDigits=ft.length,_e.maximumFractionDigits=ft.length),""});var nt=rt.options[0];nt==="w"?_e=__assign(__assign({},_e),{trailingZeroDisplay:"stripIfInteger"}):nt&&(_e=__assign(__assign({},_e),parseSignificantPrecision(nt)));continue}if(SIGNIFICANT_PRECISION_REGEX.test(rt.stem)){_e=__assign(__assign({},_e),parseSignificantPrecision(rt.stem));continue}var at=parseSign(rt.stem);at&&(_e=__assign(__assign({},_e),at));var ot=parseConciseScientificAndEngineeringStem(rt.stem);ot&&(_e=__assign(__assign({},_e),ot))}return _e}var timeData={AX:["H"],BQ:["H"],CP:["H"],CZ:["H"],DK:["H"],FI:["H"],ID:["H"],IS:["H"],ML:["H"],NE:["H"],RU:["H"],SE:["H"],SJ:["H"],SK:["H"],AS:["h","H"],BT:["h","H"],DJ:["h","H"],ER:["h","H"],GH:["h","H"],IN:["h","H"],LS:["h","H"],PG:["h","H"],PW:["h","H"],SO:["h","H"],TO:["h","H"],VU:["h","H"],WS:["h","H"],"001":["H","h"],AL:["h","H","hB"],TD:["h","H","hB"],"ca-ES":["H","h","hB"],CF:["H","h","hB"],CM:["H","h","hB"],"fr-CA":["H","h","hB"],"gl-ES":["H","h","hB"],"it-CH":["H","h","hB"],"it-IT":["H","h","hB"],LU:["H","h","hB"],NP:["H","h","hB"],PF:["H","h","hB"],SC:["H","h","hB"],SM:["H","h","hB"],SN:["H","h","hB"],TF:["H","h","hB"],VA:["H","h","hB"],CY:["h","H","hb","hB"],GR:["h","H","hb","hB"],CO:["h","H","hB","hb"],DO:["h","H","hB","hb"],KP:["h","H","hB","hb"],KR:["h","H","hB","hb"],NA:["h","H","hB","hb"],PA:["h","H","hB","hb"],PR:["h","H","hB","hb"],VE:["h","H","hB","hb"],AC:["H","h","hb","hB"],AI:["H","h","hb","hB"],BW:["H","h","hb","hB"],BZ:["H","h","hb","hB"],CC:["H","h","hb","hB"],CK:["H","h","hb","hB"],CX:["H","h","hb","hB"],DG:["H","h","hb","hB"],FK:["H","h","hb","hB"],GB:["H","h","hb","hB"],GG:["H","h","hb","hB"],GI:["H","h","hb","hB"],IE:["H","h","hb","hB"],IM:["H","h","hb","hB"],IO:["H","h","hb","hB"],JE:["H","h","hb","hB"],LT:["H","h","hb","hB"],MK:["H","h","hb","hB"],MN:["H","h","hb","hB"],MS:["H","h","hb","hB"],NF:["H","h","hb","hB"],NG:["H","h","hb","hB"],NR:["H","h","hb","hB"],NU:["H","h","hb","hB"],PN:["H","h","hb","hB"],SH:["H","h","hb","hB"],SX:["H","h","hb","hB"],TA:["H","h","hb","hB"],ZA:["H","h","hb","hB"],"af-ZA":["H","h","hB","hb"],AR:["H","h","hB","hb"],CL:["H","h","hB","hb"],CR:["H","h","hB","hb"],CU:["H","h","hB","hb"],EA:["H","h","hB","hb"],"es-BO":["H","h","hB","hb"],"es-BR":["H","h","hB","hb"],"es-EC":["H","h","hB","hb"],"es-ES":["H","h","hB","hb"],"es-GQ":["H","h","hB","hb"],"es-PE":["H","h","hB","hb"],GT:["H","h","hB","hb"],HN:["H","h","hB","hb"],IC:["H","h","hB","hb"],KG:["H","h","hB","hb"],KM:["H","h","hB","hb"],LK:["H","h","hB","hb"],MA:["H","h","hB","hb"],MX:["H","h","hB","hb"],NI:["H","h","hB","hb"],PY:["H","h","hB","hb"],SV:["H","h","hB","hb"],UY:["H","h","hB","hb"],JP:["H","h","K"],AD:["H","hB"],AM:["H","hB"],AO:["H","hB"],AT:["H","hB"],AW:["H","hB"],BE:["H","hB"],BF:["H","hB"],BJ:["H","hB"],BL:["H","hB"],BR:["H","hB"],CG:["H","hB"],CI:["H","hB"],CV:["H","hB"],DE:["H","hB"],EE:["H","hB"],FR:["H","hB"],GA:["H","hB"],GF:["H","hB"],GN:["H","hB"],GP:["H","hB"],GW:["H","hB"],HR:["H","hB"],IL:["H","hB"],IT:["H","hB"],KZ:["H","hB"],MC:["H","hB"],MD:["H","hB"],MF:["H","hB"],MQ:["H","hB"],MZ:["H","hB"],NC:["H","hB"],NL:["H","hB"],PM:["H","hB"],PT:["H","hB"],RE:["H","hB"],RO:["H","hB"],SI:["H","hB"],SR:["H","hB"],ST:["H","hB"],TG:["H","hB"],TR:["H","hB"],WF:["H","hB"],YT:["H","hB"],BD:["h","hB","H"],PK:["h","hB","H"],AZ:["H","hB","h"],BA:["H","hB","h"],BG:["H","hB","h"],CH:["H","hB","h"],GE:["H","hB","h"],LI:["H","hB","h"],ME:["H","hB","h"],RS:["H","hB","h"],UA:["H","hB","h"],UZ:["H","hB","h"],XK:["H","hB","h"],AG:["h","hb","H","hB"],AU:["h","hb","H","hB"],BB:["h","hb","H","hB"],BM:["h","hb","H","hB"],BS:["h","hb","H","hB"],CA:["h","hb","H","hB"],DM:["h","hb","H","hB"],"en-001":["h","hb","H","hB"],FJ:["h","hb","H","hB"],FM:["h","hb","H","hB"],GD:["h","hb","H","hB"],GM:["h","hb","H","hB"],GU:["h","hb","H","hB"],GY:["h","hb","H","hB"],JM:["h","hb","H","hB"],KI:["h","hb","H","hB"],KN:["h","hb","H","hB"],KY:["h","hb","H","hB"],LC:["h","hb","H","hB"],LR:["h","hb","H","hB"],MH:["h","hb","H","hB"],MP:["h","hb","H","hB"],MW:["h","hb","H","hB"],NZ:["h","hb","H","hB"],SB:["h","hb","H","hB"],SG:["h","hb","H","hB"],SL:["h","hb","H","hB"],SS:["h","hb","H","hB"],SZ:["h","hb","H","hB"],TC:["h","hb","H","hB"],TT:["h","hb","H","hB"],UM:["h","hb","H","hB"],US:["h","hb","H","hB"],VC:["h","hb","H","hB"],VG:["h","hb","H","hB"],VI:["h","hb","H","hB"],ZM:["h","hb","H","hB"],BO:["H","hB","h","hb"],EC:["H","hB","h","hb"],ES:["H","hB","h","hb"],GQ:["H","hB","h","hb"],PE:["H","hB","h","hb"],AE:["h","hB","hb","H"],"ar-001":["h","hB","hb","H"],BH:["h","hB","hb","H"],DZ:["h","hB","hb","H"],EG:["h","hB","hb","H"],EH:["h","hB","hb","H"],HK:["h","hB","hb","H"],IQ:["h","hB","hb","H"],JO:["h","hB","hb","H"],KW:["h","hB","hb","H"],LB:["h","hB","hb","H"],LY:["h","hB","hb","H"],MO:["h","hB","hb","H"],MR:["h","hB","hb","H"],OM:["h","hB","hb","H"],PH:["h","hB","hb","H"],PS:["h","hB","hb","H"],QA:["h","hB","hb","H"],SA:["h","hB","hb","H"],SD:["h","hB","hb","H"],SY:["h","hB","hb","H"],TN:["h","hB","hb","H"],YE:["h","hB","hb","H"],AF:["H","hb","hB","h"],LA:["H","hb","hB","h"],CN:["H","hB","hb","h"],LV:["H","hB","hb","h"],TL:["H","hB","hb","h"],"zu-ZA":["H","hB","hb","h"],CD:["hB","H"],IR:["hB","H"],"hi-IN":["hB","h","H"],"kn-IN":["hB","h","H"],"ml-IN":["hB","h","H"],"te-IN":["hB","h","H"],KH:["hB","h","H","hb"],"ta-IN":["hB","h","hb","H"],BN:["hb","hB","h","H"],MY:["hb","hB","h","H"],ET:["hB","hb","h","H"],"gu-IN":["hB","hb","h","H"],"mr-IN":["hB","hb","h","H"],"pa-IN":["hB","hb","h","H"],TW:["hB","hb","h","H"],KE:["hB","hb","H","h"],MM:["hB","hb","H","h"],TZ:["hB","hb","H","h"],UG:["hB","hb","H","h"]};function getBestPattern($,_e){for(var et="",tt=0;tt<$.length;tt++){var rt=$.charAt(tt);if(rt==="j"){for(var nt=0;tt+1<$.length&&$.charAt(tt+1)===rt;)nt++,tt++;var at=1+(nt&1),ot=nt<2?1:3+(nt>>1),it="a",ft=getDefaultHourSymbolFromLocale(_e);for((ft=="H"||ft=="k")&&(ot=0);ot-- >0;)et+=it;for(;at-- >0;)et=ft+et}else rt==="J"?et+="H":et+=rt}return et}function getDefaultHourSymbolFromLocale($){var _e=$.hourCycle;if(_e===void 0&&$.hourCycles&&$.hourCycles.length&&(_e=$.hourCycles[0]),_e)switch(_e){case"h24":return"k";case"h23":return"H";case"h12":return"h";case"h11":return"K";default:throw new Error("Invalid hourCycle")}var et=$.language,tt;et!=="root"&&(tt=$.maximize().region);var rt=timeData[tt||""]||timeData[et||""]||timeData["".concat(et,"-001")]||timeData["001"];return rt[0]}var _a,SPACE_SEPARATOR_START_REGEX=new RegExp("^".concat(SPACE_SEPARATOR_REGEX.source,"*")),SPACE_SEPARATOR_END_REGEX=new RegExp("".concat(SPACE_SEPARATOR_REGEX.source,"*$"));function createLocation($,_e){return{start:$,end:_e}}var hasNativeStartsWith=!!String.prototype.startsWith,hasNativeFromCodePoint=!!String.fromCodePoint,hasNativeFromEntries=!!Object.fromEntries,hasNativeCodePointAt=!!String.prototype.codePointAt,hasTrimStart=!!String.prototype.trimStart,hasTrimEnd=!!String.prototype.trimEnd,hasNativeIsSafeInteger=!!Number.isSafeInteger,isSafeInteger=hasNativeIsSafeInteger?Number.isSafeInteger:function($){return typeof $=="number"&&isFinite($)&&Math.floor($)===$&&Math.abs($)<=9007199254740991},REGEX_SUPPORTS_U_AND_Y=!0;try{var re=RE("([^\\p{White_Space}\\p{Pattern_Syntax}]*)","yu");REGEX_SUPPORTS_U_AND_Y=((_a=re.exec("a"))===null||_a===void 0?void 0:_a[0])==="a"}catch{REGEX_SUPPORTS_U_AND_Y=!1}var startsWith=hasNativeStartsWith?function(_e,et,tt){return _e.startsWith(et,tt)}:function(_e,et,tt){return _e.slice(tt,tt+et.length)===et},fromCodePoint=hasNativeFromCodePoint?String.fromCodePoint:function(){for(var _e=[],et=0;etnt;){if(at=_e[nt++],at>1114111)throw RangeError(at+" is not a valid code point");tt+=at<65536?String.fromCharCode(at):String.fromCharCode(((at-=65536)>>10)+55296,at%1024+56320)}return tt},fromEntries$1=hasNativeFromEntries?Object.fromEntries:function(_e){for(var et={},tt=0,rt=_e;tt=tt)){var rt=_e.charCodeAt(et),nt;return rt<55296||rt>56319||et+1===tt||(nt=_e.charCodeAt(et+1))<56320||nt>57343?rt:(rt-55296<<10)+(nt-56320)+65536}},trimStart=hasTrimStart?function(_e){return _e.trimStart()}:function(_e){return _e.replace(SPACE_SEPARATOR_START_REGEX,"")},trimEnd=hasTrimEnd?function(_e){return _e.trimEnd()}:function(_e){return _e.replace(SPACE_SEPARATOR_END_REGEX,"")};function RE($,_e){return new RegExp($,_e)}var matchIdentifierAtIndex;if(REGEX_SUPPORTS_U_AND_Y){var IDENTIFIER_PREFIX_RE_1=RE("([^\\p{White_Space}\\p{Pattern_Syntax}]*)","yu");matchIdentifierAtIndex=function(_e,et){var tt;IDENTIFIER_PREFIX_RE_1.lastIndex=et;var rt=IDENTIFIER_PREFIX_RE_1.exec(_e);return(tt=rt[1])!==null&&tt!==void 0?tt:""}}else matchIdentifierAtIndex=function(_e,et){for(var tt=[];;){var rt=codePointAt(_e,et);if(rt===void 0||_isWhiteSpace(rt)||_isPatternSyntax(rt))break;tt.push(rt),et+=rt>=65536?2:1}return fromCodePoint.apply(void 0,tt)};var Parser=function(){function $(_e,et){et===void 0&&(et={}),this.message=_e,this.position={offset:0,line:1,column:1},this.ignoreTag=!!et.ignoreTag,this.locale=et.locale,this.requiresOtherClause=!!et.requiresOtherClause,this.shouldParseSkeletons=!!et.shouldParseSkeletons}return $.prototype.parse=function(){if(this.offset()!==0)throw Error("parser can only be used once");return this.parseMessage(0,"",!1)},$.prototype.parseMessage=function(_e,et,tt){for(var rt=[];!this.isEOF();){var nt=this.char();if(nt===123){var at=this.parseArgument(_e,tt);if(at.err)return at;rt.push(at.val)}else{if(nt===125&&_e>0)break;if(nt===35&&(et==="plural"||et==="selectordinal")){var ot=this.clonePosition();this.bump(),rt.push({type:TYPE.pound,location:createLocation(ot,this.clonePosition())})}else if(nt===60&&!this.ignoreTag&&this.peek()===47){if(tt)break;return this.error(ErrorKind.UNMATCHED_CLOSING_TAG,createLocation(this.clonePosition(),this.clonePosition()))}else if(nt===60&&!this.ignoreTag&&_isAlpha(this.peek()||0)){var at=this.parseTag(_e,et);if(at.err)return at;rt.push(at.val)}else{var at=this.parseLiteral(_e,et);if(at.err)return at;rt.push(at.val)}}}return{val:rt,err:null}},$.prototype.parseTag=function(_e,et){var tt=this.clonePosition();this.bump();var rt=this.parseTagName();if(this.bumpSpace(),this.bumpIf("/>"))return{val:{type:TYPE.literal,value:"<".concat(rt,"/>"),location:createLocation(tt,this.clonePosition())},err:null};if(this.bumpIf(">")){var nt=this.parseMessage(_e+1,et,!0);if(nt.err)return nt;var at=nt.val,ot=this.clonePosition();if(this.bumpIf("")?{val:{type:TYPE.tag,value:rt,children:at,location:createLocation(tt,this.clonePosition())},err:null}:this.error(ErrorKind.INVALID_TAG,createLocation(ot,this.clonePosition())))}else return this.error(ErrorKind.UNCLOSED_TAG,createLocation(tt,this.clonePosition()))}else return this.error(ErrorKind.INVALID_TAG,createLocation(tt,this.clonePosition()))},$.prototype.parseTagName=function(){var _e=this.offset();for(this.bump();!this.isEOF()&&_isPotentialElementNameChar(this.char());)this.bump();return this.message.slice(_e,this.offset())},$.prototype.parseLiteral=function(_e,et){for(var tt=this.clonePosition(),rt="";;){var nt=this.tryParseQuote(et);if(nt){rt+=nt;continue}var at=this.tryParseUnquoted(_e,et);if(at){rt+=at;continue}var ot=this.tryParseLeftAngleBracket();if(ot){rt+=ot;continue}break}var it=createLocation(tt,this.clonePosition());return{val:{type:TYPE.literal,value:rt,location:it},err:null}},$.prototype.tryParseLeftAngleBracket=function(){return!this.isEOF()&&this.char()===60&&(this.ignoreTag||!_isAlphaOrSlash(this.peek()||0))?(this.bump(),"<"):null},$.prototype.tryParseQuote=function(_e){if(this.isEOF()||this.char()!==39)return null;switch(this.peek()){case 39:return this.bump(),this.bump(),"'";case 123:case 60:case 62:case 125:break;case 35:if(_e==="plural"||_e==="selectordinal")break;return null;default:return null}this.bump();var et=[this.char()];for(this.bump();!this.isEOF();){var tt=this.char();if(tt===39)if(this.peek()===39)et.push(39),this.bump();else{this.bump();break}else et.push(tt);this.bump()}return fromCodePoint.apply(void 0,et)},$.prototype.tryParseUnquoted=function(_e,et){if(this.isEOF())return null;var tt=this.char();return tt===60||tt===123||tt===35&&(et==="plural"||et==="selectordinal")||tt===125&&_e>0?null:(this.bump(),fromCodePoint(tt))},$.prototype.parseArgument=function(_e,et){var tt=this.clonePosition();if(this.bump(),this.bumpSpace(),this.isEOF())return this.error(ErrorKind.EXPECT_ARGUMENT_CLOSING_BRACE,createLocation(tt,this.clonePosition()));if(this.char()===125)return this.bump(),this.error(ErrorKind.EMPTY_ARGUMENT,createLocation(tt,this.clonePosition()));var rt=this.parseIdentifierIfPossible().value;if(!rt)return this.error(ErrorKind.MALFORMED_ARGUMENT,createLocation(tt,this.clonePosition()));if(this.bumpSpace(),this.isEOF())return this.error(ErrorKind.EXPECT_ARGUMENT_CLOSING_BRACE,createLocation(tt,this.clonePosition()));switch(this.char()){case 125:return this.bump(),{val:{type:TYPE.argument,value:rt,location:createLocation(tt,this.clonePosition())},err:null};case 44:return this.bump(),this.bumpSpace(),this.isEOF()?this.error(ErrorKind.EXPECT_ARGUMENT_CLOSING_BRACE,createLocation(tt,this.clonePosition())):this.parseArgumentOptions(_e,et,rt,tt);default:return this.error(ErrorKind.MALFORMED_ARGUMENT,createLocation(tt,this.clonePosition()))}},$.prototype.parseIdentifierIfPossible=function(){var _e=this.clonePosition(),et=this.offset(),tt=matchIdentifierAtIndex(this.message,et),rt=et+tt.length;this.bumpTo(rt);var nt=this.clonePosition(),at=createLocation(_e,nt);return{value:tt,location:at}},$.prototype.parseArgumentOptions=function(_e,et,tt,rt){var nt,at=this.clonePosition(),ot=this.parseIdentifierIfPossible().value,it=this.clonePosition();switch(ot){case"":return this.error(ErrorKind.EXPECT_ARGUMENT_TYPE,createLocation(at,it));case"number":case"date":case"time":{this.bumpSpace();var ft=null;if(this.bumpIf(",")){this.bumpSpace();var st=this.clonePosition(),lt=this.parseSimpleArgStyleIfPossible();if(lt.err)return lt;var ut=trimEnd(lt.val);if(ut.length===0)return this.error(ErrorKind.EXPECT_ARGUMENT_STYLE,createLocation(this.clonePosition(),this.clonePosition()));var ct=createLocation(st,this.clonePosition());ft={style:ut,styleLocation:ct}}var gt=this.tryParseArgumentClose(rt);if(gt.err)return gt;var mt=createLocation(rt,this.clonePosition());if(ft&&startsWith(ft==null?void 0:ft.style,"::",0)){var ht=trimStart(ft.style.slice(2));if(ot==="number"){var lt=this.parseNumberSkeletonFromString(ht,ft.styleLocation);return lt.err?lt:{val:{type:TYPE.number,value:tt,location:mt,style:lt.val},err:null}}else{if(ht.length===0)return this.error(ErrorKind.EXPECT_DATE_TIME_SKELETON,mt);var pt=ht;this.locale&&(pt=getBestPattern(ht,this.locale));var ut={type:SKELETON_TYPE.dateTime,pattern:pt,location:ft.styleLocation,parsedOptions:this.shouldParseSkeletons?parseDateTimeSkeleton(pt):{}},dt=ot==="date"?TYPE.date:TYPE.time;return{val:{type:dt,value:tt,location:mt,style:ut},err:null}}}return{val:{type:ot==="number"?TYPE.number:ot==="date"?TYPE.date:TYPE.time,value:tt,location:mt,style:(nt=ft==null?void 0:ft.style)!==null&&nt!==void 0?nt:null},err:null}}case"plural":case"selectordinal":case"select":{var yt=this.clonePosition();if(this.bumpSpace(),!this.bumpIf(","))return this.error(ErrorKind.EXPECT_SELECT_ARGUMENT_OPTIONS,createLocation(yt,__assign({},yt)));this.bumpSpace();var vt=this.parseIdentifierIfPossible(),bt=0;if(ot!=="select"&&vt.value==="offset"){if(!this.bumpIf(":"))return this.error(ErrorKind.EXPECT_PLURAL_ARGUMENT_OFFSET_VALUE,createLocation(this.clonePosition(),this.clonePosition()));this.bumpSpace();var lt=this.tryParseDecimalInteger(ErrorKind.EXPECT_PLURAL_ARGUMENT_OFFSET_VALUE,ErrorKind.INVALID_PLURAL_ARGUMENT_OFFSET_VALUE);if(lt.err)return lt;this.bumpSpace(),vt=this.parseIdentifierIfPossible(),bt=lt.val}var xt=this.tryParsePluralOrSelectOptions(_e,ot,et,vt);if(xt.err)return xt;var gt=this.tryParseArgumentClose(rt);if(gt.err)return gt;var wt=createLocation(rt,this.clonePosition());return ot==="select"?{val:{type:TYPE.select,value:tt,options:fromEntries$1(xt.val),location:wt},err:null}:{val:{type:TYPE.plural,value:tt,options:fromEntries$1(xt.val),offset:bt,pluralType:ot==="plural"?"cardinal":"ordinal",location:wt},err:null}}default:return this.error(ErrorKind.INVALID_ARGUMENT_TYPE,createLocation(at,it))}},$.prototype.tryParseArgumentClose=function(_e){return this.isEOF()||this.char()!==125?this.error(ErrorKind.EXPECT_ARGUMENT_CLOSING_BRACE,createLocation(_e,this.clonePosition())):(this.bump(),{val:!0,err:null})},$.prototype.parseSimpleArgStyleIfPossible=function(){for(var _e=0,et=this.clonePosition();!this.isEOF();){var tt=this.char();switch(tt){case 39:{this.bump();var rt=this.clonePosition();if(!this.bumpUntil("'"))return this.error(ErrorKind.UNCLOSED_QUOTE_IN_ARGUMENT_STYLE,createLocation(rt,this.clonePosition()));this.bump();break}case 123:{_e+=1,this.bump();break}case 125:{if(_e>0)_e-=1;else return{val:this.message.slice(et.offset,this.offset()),err:null};break}default:this.bump();break}}return{val:this.message.slice(et.offset,this.offset()),err:null}},$.prototype.parseNumberSkeletonFromString=function(_e,et){var tt=[];try{tt=parseNumberSkeletonFromString(_e)}catch{return this.error(ErrorKind.INVALID_NUMBER_SKELETON,et)}return{val:{type:SKELETON_TYPE.number,tokens:tt,location:et,parsedOptions:this.shouldParseSkeletons?parseNumberSkeleton(tt):{}},err:null}},$.prototype.tryParsePluralOrSelectOptions=function(_e,et,tt,rt){for(var nt,at=!1,ot=[],it=new Set,ft=rt.value,st=rt.location;;){if(ft.length===0){var lt=this.clonePosition();if(et!=="select"&&this.bumpIf("=")){var ut=this.tryParseDecimalInteger(ErrorKind.EXPECT_PLURAL_ARGUMENT_SELECTOR,ErrorKind.INVALID_PLURAL_ARGUMENT_SELECTOR);if(ut.err)return ut;st=createLocation(lt,this.clonePosition()),ft=this.message.slice(lt.offset,this.offset())}else break}if(it.has(ft))return this.error(et==="select"?ErrorKind.DUPLICATE_SELECT_ARGUMENT_SELECTOR:ErrorKind.DUPLICATE_PLURAL_ARGUMENT_SELECTOR,st);ft==="other"&&(at=!0),this.bumpSpace();var ct=this.clonePosition();if(!this.bumpIf("{"))return this.error(et==="select"?ErrorKind.EXPECT_SELECT_ARGUMENT_SELECTOR_FRAGMENT:ErrorKind.EXPECT_PLURAL_ARGUMENT_SELECTOR_FRAGMENT,createLocation(this.clonePosition(),this.clonePosition()));var gt=this.parseMessage(_e+1,et,tt);if(gt.err)return gt;var mt=this.tryParseArgumentClose(ct);if(mt.err)return mt;ot.push([ft,{value:gt.val,location:createLocation(ct,this.clonePosition())}]),it.add(ft),this.bumpSpace(),nt=this.parseIdentifierIfPossible(),ft=nt.value,st=nt.location}return ot.length===0?this.error(et==="select"?ErrorKind.EXPECT_SELECT_ARGUMENT_SELECTOR:ErrorKind.EXPECT_PLURAL_ARGUMENT_SELECTOR,createLocation(this.clonePosition(),this.clonePosition())):this.requiresOtherClause&&!at?this.error(ErrorKind.MISSING_OTHER_CLAUSE,createLocation(this.clonePosition(),this.clonePosition())):{val:ot,err:null}},$.prototype.tryParseDecimalInteger=function(_e,et){var tt=1,rt=this.clonePosition();this.bumpIf("+")||this.bumpIf("-")&&(tt=-1);for(var nt=!1,at=0;!this.isEOF();){var ot=this.char();if(ot>=48&&ot<=57)nt=!0,at=at*10+(ot-48),this.bump();else break}var it=createLocation(rt,this.clonePosition());return nt?(at*=tt,isSafeInteger(at)?{val:at,err:null}:this.error(et,it)):this.error(_e,it)},$.prototype.offset=function(){return this.position.offset},$.prototype.isEOF=function(){return this.offset()===this.message.length},$.prototype.clonePosition=function(){return{offset:this.position.offset,line:this.position.line,column:this.position.column}},$.prototype.char=function(){var _e=this.position.offset;if(_e>=this.message.length)throw Error("out of bound");var et=codePointAt(this.message,_e);if(et===void 0)throw Error("Offset ".concat(_e," is at invalid UTF-16 code unit boundary"));return et},$.prototype.error=function(_e,et){return{val:null,err:{kind:_e,message:this.message,location:et}}},$.prototype.bump=function(){if(!this.isEOF()){var _e=this.char();_e===10?(this.position.line+=1,this.position.column=1,this.position.offset+=1):(this.position.column+=1,this.position.offset+=_e<65536?1:2)}},$.prototype.bumpIf=function(_e){if(startsWith(this.message,_e,this.offset())){for(var et=0;et<_e.length;et++)this.bump();return!0}return!1},$.prototype.bumpUntil=function(_e){var et=this.offset(),tt=this.message.indexOf(_e,et);return tt>=0?(this.bumpTo(tt),!0):(this.bumpTo(this.message.length),!1)},$.prototype.bumpTo=function(_e){if(this.offset()>_e)throw Error("targetOffset ".concat(_e," must be greater than or equal to the current offset ").concat(this.offset()));for(_e=Math.min(_e,this.message.length);;){var et=this.offset();if(et===_e)break;if(et>_e)throw Error("targetOffset ".concat(_e," is at invalid UTF-16 code unit boundary"));if(this.bump(),this.isEOF())break}},$.prototype.bumpSpace=function(){for(;!this.isEOF()&&_isWhiteSpace(this.char());)this.bump()},$.prototype.peek=function(){if(this.isEOF())return null;var _e=this.char(),et=this.offset(),tt=this.message.charCodeAt(et+(_e>=65536?2:1));return tt??null},$}();function _isAlpha($){return $>=97&&$<=122||$>=65&&$<=90}function _isAlphaOrSlash($){return _isAlpha($)||$===47}function _isPotentialElementNameChar($){return $===45||$===46||$>=48&&$<=57||$===95||$>=97&&$<=122||$>=65&&$<=90||$==183||$>=192&&$<=214||$>=216&&$<=246||$>=248&&$<=893||$>=895&&$<=8191||$>=8204&&$<=8205||$>=8255&&$<=8256||$>=8304&&$<=8591||$>=11264&&$<=12271||$>=12289&&$<=55295||$>=63744&&$<=64975||$>=65008&&$<=65533||$>=65536&&$<=983039}function _isWhiteSpace($){return $>=9&&$<=13||$===32||$===133||$>=8206&&$<=8207||$===8232||$===8233}function _isPatternSyntax($){return $>=33&&$<=35||$===36||$>=37&&$<=39||$===40||$===41||$===42||$===43||$===44||$===45||$>=46&&$<=47||$>=58&&$<=59||$>=60&&$<=62||$>=63&&$<=64||$===91||$===92||$===93||$===94||$===96||$===123||$===124||$===125||$===126||$===161||$>=162&&$<=165||$===166||$===167||$===169||$===171||$===172||$===174||$===176||$===177||$===182||$===187||$===191||$===215||$===247||$>=8208&&$<=8213||$>=8214&&$<=8215||$===8216||$===8217||$===8218||$>=8219&&$<=8220||$===8221||$===8222||$===8223||$>=8224&&$<=8231||$>=8240&&$<=8248||$===8249||$===8250||$>=8251&&$<=8254||$>=8257&&$<=8259||$===8260||$===8261||$===8262||$>=8263&&$<=8273||$===8274||$===8275||$>=8277&&$<=8286||$>=8592&&$<=8596||$>=8597&&$<=8601||$>=8602&&$<=8603||$>=8604&&$<=8607||$===8608||$>=8609&&$<=8610||$===8611||$>=8612&&$<=8613||$===8614||$>=8615&&$<=8621||$===8622||$>=8623&&$<=8653||$>=8654&&$<=8655||$>=8656&&$<=8657||$===8658||$===8659||$===8660||$>=8661&&$<=8691||$>=8692&&$<=8959||$>=8960&&$<=8967||$===8968||$===8969||$===8970||$===8971||$>=8972&&$<=8991||$>=8992&&$<=8993||$>=8994&&$<=9e3||$===9001||$===9002||$>=9003&&$<=9083||$===9084||$>=9085&&$<=9114||$>=9115&&$<=9139||$>=9140&&$<=9179||$>=9180&&$<=9185||$>=9186&&$<=9254||$>=9255&&$<=9279||$>=9280&&$<=9290||$>=9291&&$<=9311||$>=9472&&$<=9654||$===9655||$>=9656&&$<=9664||$===9665||$>=9666&&$<=9719||$>=9720&&$<=9727||$>=9728&&$<=9838||$===9839||$>=9840&&$<=10087||$===10088||$===10089||$===10090||$===10091||$===10092||$===10093||$===10094||$===10095||$===10096||$===10097||$===10098||$===10099||$===10100||$===10101||$>=10132&&$<=10175||$>=10176&&$<=10180||$===10181||$===10182||$>=10183&&$<=10213||$===10214||$===10215||$===10216||$===10217||$===10218||$===10219||$===10220||$===10221||$===10222||$===10223||$>=10224&&$<=10239||$>=10240&&$<=10495||$>=10496&&$<=10626||$===10627||$===10628||$===10629||$===10630||$===10631||$===10632||$===10633||$===10634||$===10635||$===10636||$===10637||$===10638||$===10639||$===10640||$===10641||$===10642||$===10643||$===10644||$===10645||$===10646||$===10647||$===10648||$>=10649&&$<=10711||$===10712||$===10713||$===10714||$===10715||$>=10716&&$<=10747||$===10748||$===10749||$>=10750&&$<=11007||$>=11008&&$<=11055||$>=11056&&$<=11076||$>=11077&&$<=11078||$>=11079&&$<=11084||$>=11085&&$<=11123||$>=11124&&$<=11125||$>=11126&&$<=11157||$===11158||$>=11159&&$<=11263||$>=11776&&$<=11777||$===11778||$===11779||$===11780||$===11781||$>=11782&&$<=11784||$===11785||$===11786||$===11787||$===11788||$===11789||$>=11790&&$<=11798||$===11799||$>=11800&&$<=11801||$===11802||$===11803||$===11804||$===11805||$>=11806&&$<=11807||$===11808||$===11809||$===11810||$===11811||$===11812||$===11813||$===11814||$===11815||$===11816||$===11817||$>=11818&&$<=11822||$===11823||$>=11824&&$<=11833||$>=11834&&$<=11835||$>=11836&&$<=11839||$===11840||$===11841||$===11842||$>=11843&&$<=11855||$>=11856&&$<=11857||$===11858||$>=11859&&$<=11903||$>=12289&&$<=12291||$===12296||$===12297||$===12298||$===12299||$===12300||$===12301||$===12302||$===12303||$===12304||$===12305||$>=12306&&$<=12307||$===12308||$===12309||$===12310||$===12311||$===12312||$===12313||$===12314||$===12315||$===12316||$===12317||$>=12318&&$<=12319||$===12320||$===12336||$===64830||$===64831||$>=65093&&$<=65094}function pruneLocation($){$.forEach(function(_e){if(delete _e.location,isSelectElement(_e)||isPluralElement(_e))for(var et in _e.options)delete _e.options[et].location,pruneLocation(_e.options[et].value);else isNumberElement(_e)&&isNumberSkeleton(_e.style)||(isDateElement(_e)||isTimeElement(_e))&&isDateTimeSkeleton(_e.style)?delete _e.style.location:isTagElement(_e)&&pruneLocation(_e.children)})}function parse($,_e){_e===void 0&&(_e={}),_e=__assign({shouldParseSkeletons:!0,requiresOtherClause:!0},_e);var et=new Parser($,_e).parse();if(et.err){var tt=SyntaxError(ErrorKind[et.err.kind]);throw tt.location=et.err.location,tt.originalMessage=et.err.message,tt}return _e!=null&&_e.captureLocation||pruneLocation(et.val),et.val}function memoize($,_e){var et=_e&&_e.cache?_e.cache:cacheDefault,tt=_e&&_e.serializer?_e.serializer:serializerDefault,rt=_e&&_e.strategy?_e.strategy:strategyDefault;return rt($,{cache:et,serializer:tt})}function isPrimitive($){return $==null||typeof $=="number"||typeof $=="boolean"}function monadic($,_e,et,tt){var rt=isPrimitive(tt)?tt:et(tt),nt=_e.get(rt);return typeof nt>"u"&&(nt=$.call(this,tt),_e.set(rt,nt)),nt}function variadic($,_e,et){var tt=Array.prototype.slice.call(arguments,3),rt=et(tt),nt=_e.get(rt);return typeof nt>"u"&&(nt=$.apply(this,tt),_e.set(rt,nt)),nt}function assemble($,_e,et,tt,rt){return et.bind(_e,$,tt,rt)}function strategyDefault($,_e){var et=$.length===1?monadic:variadic;return assemble($,this,et,_e.cache.create(),_e.serializer)}function strategyVariadic($,_e){return assemble($,this,variadic,_e.cache.create(),_e.serializer)}function strategyMonadic($,_e){return assemble($,this,monadic,_e.cache.create(),_e.serializer)}var serializerDefault=function(){return JSON.stringify(arguments)};function ObjectWithoutPrototypeCache(){this.cache=Object.create(null)}ObjectWithoutPrototypeCache.prototype.get=function($){return this.cache[$]};ObjectWithoutPrototypeCache.prototype.set=function($,_e){this.cache[$]=_e};var cacheDefault={create:function(){return new ObjectWithoutPrototypeCache}},strategies={variadic:strategyVariadic,monadic:strategyMonadic},ErrorCode;(function($){$.MISSING_VALUE="MISSING_VALUE",$.INVALID_VALUE="INVALID_VALUE",$.MISSING_INTL_API="MISSING_INTL_API"})(ErrorCode||(ErrorCode={}));var FormatError=function($){__extends(_e,$);function _e(et,tt,rt){var nt=$.call(this,et)||this;return nt.code=tt,nt.originalMessage=rt,nt}return _e.prototype.toString=function(){return"[formatjs Error: ".concat(this.code,"] ").concat(this.message)},_e}(Error),InvalidValueError=function($){__extends(_e,$);function _e(et,tt,rt,nt){return $.call(this,'Invalid values for "'.concat(et,'": "').concat(tt,'". Options are "').concat(Object.keys(rt).join('", "'),'"'),ErrorCode.INVALID_VALUE,nt)||this}return _e}(FormatError),InvalidValueTypeError=function($){__extends(_e,$);function _e(et,tt,rt){return $.call(this,'Value for "'.concat(et,'" must be of type ').concat(tt),ErrorCode.INVALID_VALUE,rt)||this}return _e}(FormatError),MissingValueError=function($){__extends(_e,$);function _e(et,tt){return $.call(this,'The intl string context variable "'.concat(et,'" was not provided to the string "').concat(tt,'"'),ErrorCode.MISSING_VALUE,tt)||this}return _e}(FormatError),PART_TYPE;(function($){$[$.literal=0]="literal",$[$.object=1]="object"})(PART_TYPE||(PART_TYPE={}));function mergeLiteral($){return $.length<2?$:$.reduce(function(_e,et){var tt=_e[_e.length-1];return!tt||tt.type!==PART_TYPE.literal||et.type!==PART_TYPE.literal?_e.push(et):tt.value+=et.value,_e},[])}function isFormatXMLElementFn($){return typeof $=="function"}function formatToParts($,_e,et,tt,rt,nt,at){if($.length===1&&isLiteralElement($[0]))return[{type:PART_TYPE.literal,value:$[0].value}];for(var ot=[],it=0,ft=$;it"u")){var et=Intl.NumberFormat.supportedLocalesOf(_e);return et.length>0?new Intl.Locale(et[0]):new Intl.Locale(typeof _e=="string"?_e:_e[0])}},$.__parse=parse,$.formats={number:{integer:{maximumFractionDigits:0},currency:{style:"currency"},percent:{style:"percent"}},date:{short:{month:"numeric",day:"numeric",year:"2-digit"},medium:{month:"short",day:"numeric",year:"numeric"},long:{month:"long",day:"numeric",year:"numeric"},full:{weekday:"long",month:"long",day:"numeric",year:"numeric"}},time:{short:{hour:"numeric",minute:"numeric"},medium:{hour:"numeric",minute:"numeric",second:"numeric"},long:{hour:"numeric",minute:"numeric",second:"numeric",timeZoneName:"short"},full:{hour:"numeric",minute:"numeric",second:"numeric",timeZoneName:"short"}}},$}(),IntlErrorCode;(function($){$.FORMAT_ERROR="FORMAT_ERROR",$.UNSUPPORTED_FORMATTER="UNSUPPORTED_FORMATTER",$.INVALID_CONFIG="INVALID_CONFIG",$.MISSING_DATA="MISSING_DATA",$.MISSING_TRANSLATION="MISSING_TRANSLATION"})(IntlErrorCode||(IntlErrorCode={}));var IntlError=function($){__extends(_e,$);function _e(et,tt,rt){var nt=this,at=rt?rt instanceof Error?rt:new Error(String(rt)):void 0;return nt=$.call(this,"[@formatjs/intl Error ".concat(et,"] ").concat(tt,` `).concat(at?` `.concat(at.message,` `).concat(at.stack):""))||this,nt.code=et,typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(nt,_e),nt}return _e}(Error),UnsupportedFormatterError=function($){__extends(_e,$);function _e(et,tt){return $.call(this,IntlErrorCode.UNSUPPORTED_FORMATTER,et,tt)||this}return _e}(IntlError),InvalidConfigError=function($){__extends(_e,$);function _e(et,tt){return $.call(this,IntlErrorCode.INVALID_CONFIG,et,tt)||this}return _e}(IntlError),MissingDataError=function($){__extends(_e,$);function _e(et,tt){return $.call(this,IntlErrorCode.MISSING_DATA,et,tt)||this}return _e}(IntlError),IntlFormatError=function($){__extends(_e,$);function _e(et,tt,rt){var nt=$.call(this,IntlErrorCode.FORMAT_ERROR,"".concat(et,` Locale: `).concat(tt,` `),rt)||this;return nt.locale=tt,nt}return _e}(IntlError),MessageFormatError=function($){__extends(_e,$);function _e(et,tt,rt,nt){var at=$.call(this,"".concat(et,` MessageID: `).concat(rt==null?void 0:rt.id,` Default Message: `).concat(rt==null?void 0:rt.defaultMessage,` Description: `).concat(rt==null?void 0:rt.description,` `),tt,nt)||this;return at.descriptor=rt,at.locale=tt,at}return _e}(IntlFormatError),MissingTranslationError=function($){__extends(_e,$);function _e(et,tt){var rt=$.call(this,IntlErrorCode.MISSING_TRANSLATION,'Missing message: "'.concat(et.id,'" for locale "').concat(tt,'", using ').concat(et.defaultMessage?"default message (".concat(typeof et.defaultMessage=="string"?et.defaultMessage:et.defaultMessage.map(function(nt){var at;return(at=nt.value)!==null&&at!==void 0?at:JSON.stringify(nt)}).join(),")"):"id"," as fallback."))||this;return rt.descriptor=et,rt}return _e}(IntlError);function filterProps($,_e,et){return et===void 0&&(et={}),_e.reduce(function(tt,rt){return rt in $?tt[rt]=$[rt]:rt in et&&(tt[rt]=et[rt]),tt},{})}var defaultErrorHandler=function($){},defaultWarnHandler=function($){},DEFAULT_INTL_CONFIG$1={formats:{},messages:{},timeZone:void 0,defaultLocale:"en",defaultFormats:{},fallbackOnEmptyString:!0,onError:defaultErrorHandler,onWarn:defaultWarnHandler};function createIntlCache(){return{dateTime:{},number:{},message:{},relativeTime:{},pluralRules:{},list:{},displayNames:{}}}function createFastMemoizeCache($){return{create:function(){return{get:function(_e){return $[_e]},set:function(_e,et){$[_e]=et}}}}}function createFormatters($){$===void 0&&($=createIntlCache());var _e=Intl.RelativeTimeFormat,et=Intl.ListFormat,tt=Intl.DisplayNames,rt=memoize(function(){for(var ot,it=[],ft=0;ft needs to exist in the component ancestry.")}var DEFAULT_INTL_CONFIG=__assign(__assign({},DEFAULT_INTL_CONFIG$1),{textComponent:reactExports.Fragment});function assignUniqueKeysToParts($){return function(_e){return $(reactExports.Children.toArray(_e))}}function shallowEqual($,_e){if($===_e)return!0;if(!$||!_e)return!1;var et=Object.keys($),tt=Object.keys(_e),rt=et.length;if(tt.length!==rt)return!1;for(var nt=0;ntstickers are encrypted too. Use this tool to create your own custom sticker packs.",description:"A body of SignIn page"},"SignIn--qr":{message:"Sign In Code",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"Open Signal Desktop to Begin",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"Sorry, your browser is not supported. Please open this link in Firefox or Chrome",description:"A text displayed when user's browser is not supported"},cancel,minutesAgo,"EmojiPicker--empty":{message:"No emoji found",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"Search Emoji",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"Skin tone $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"Smileys & People",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"Animals & Nature",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"Food & Drink",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"Travel & Places",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"Activities",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"Objects",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"Symbols",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"Flags",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Signal Art Creator",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Signal Sticker Pack Creator",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Signal Logo",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Sticker Pack Creator Guidelines",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"Click to add or drop images here",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"Drop images here",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"Sticker pack",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"Sticker pack",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"Cancel",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"Copy",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"Next",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"Back",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"Add your stickers",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"Remove image",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"Click or drag/drop a file to add a sticker",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"Stickers must be in PNG, APNG, or WebP format with a transparent background and 512x512 pixels. Recommended margin is 16px.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"View margins",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"Add an emoji to each sticker",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"This allows us to suggest stickers to you as you're messaging.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"Just a few more details...",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"Title",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"Name your sticker pack",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"Author",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"Enter a name to submit your stickers under",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"Cover image",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"This is the image that will show up when you share your sticker pack",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"Are you sure you want to upload your sticker pack?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"Upload",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"You will no longer be able to make edits or delete after creating a sticker pack.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"Creating your sticker pack",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$count$ of $total$ uploaded",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"Congratulations! You created a sticker pack.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"Access your new stickers through the sticker icon, or share with your friends using the link below.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"Use the hashtag $hashtag$ to help other people find the URLs for any custom sticker packs that you would like to make publicly accessible.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"Sticker Pack URL",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"Install",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"Create another sticker pack",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Check out this new sticker pack I created for Signal. #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {1 image} other {# images}} added",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"Animated art is not currently supported",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"Dropped image is too large",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"Error processing image",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"Animated PNG images must be square",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"Animated images must loop forever",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"Animated PNG image dimensions are too large",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"Animated PNG image dimensions are too small",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"Error uploading images: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"Can't connect to server: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"Failed to upload images due to expired credentials. Please reopen the website from Signal Desktop again.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"Link copied",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"My sticker in light theme",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"My sticker in dark theme",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"Please set up Signal on your phone and desktop to use the Sticker Pack Creator",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label,CustomizingPreferredReactions__title,"ArtFrame--emoji-name-placeholder":{message:"Emoji alias",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}},messages=Object.freeze(Object.defineProperty({__proto__:null,CustomizingPreferredReactions__title,EmojiButton__label,cancel,default:englishMessages,minutesAgo,smartling},Symbol.toStringTag,{value:"Module"})),debug$4=createDebug("signal:i18n");memoize$1(($,_e)=>new Intl.NumberFormat($,_e)),memoize$1(($,_e)=>new Intl.DateTimeFormat($,_e)),memoize$1(($,_e)=>new Intl.PluralRules($,_e));function isLocaleMessageType($){return typeof $=="object"&&$!=null&&(Object.hasOwn($,"message")||Object.hasOwn($,"messageformat"))}function classifyMessages($){const _e={},et={};for(const[tt,rt]of Object.entries($))isLocaleMessageType(rt)&&(rt.messageformat!=null?_e[tt]=rt.messageformat:rt.message!=null&&(et[tt]=rt.message));return{icuMessages:_e,legacyMessages:et}}function createCachedIntl($,_e){const et=createIntlCache();return createIntl({locale:$.replace("_","-"),messages:_e},et)}function formatIcuMessage($,_e,et){assert(!Array.isArray(et),`substitutions must be an object for ICU message ${_e}`);const tt=$.formatMessage({id:_e},et);return assert(typeof tt=="string","i18n: formatted translation result must be a string, must use component to render JSX"),tt}async function loadLocale($=navigator.language){const _e=removeRegion($);let et=englishMessages,tt="en";if($!=="en"&&_e!=="en")try{et=(await __variableDynamicImportRuntimeHelper(Object.assign({"../assets/locales/af-ZA/messages.json":()=>__vitePreload(()=>import("./messages-3e3d7135.js"),[],import.meta.url),"../assets/locales/ar/messages.json":()=>__vitePreload(()=>import("./messages-73b0ce1b.js"),[],import.meta.url),"../assets/locales/az-AZ/messages.json":()=>__vitePreload(()=>import("./messages-2cc7364a.js"),[],import.meta.url),"../assets/locales/bg-BG/messages.json":()=>__vitePreload(()=>import("./messages-6bd68951.js"),[],import.meta.url),"../assets/locales/bn-BD/messages.json":()=>__vitePreload(()=>import("./messages-4541da14.js"),[],import.meta.url),"../assets/locales/bs-BA/messages.json":()=>__vitePreload(()=>import("./messages-1aacf11f.js"),[],import.meta.url),"../assets/locales/ca/messages.json":()=>__vitePreload(()=>import("./messages-b0bb5d7f.js"),[],import.meta.url),"../assets/locales/cs/messages.json":()=>__vitePreload(()=>import("./messages-f81502d7.js"),[],import.meta.url),"../assets/locales/da/messages.json":()=>__vitePreload(()=>import("./messages-b00a6376.js"),[],import.meta.url),"../assets/locales/de/messages.json":()=>__vitePreload(()=>import("./messages-3b56a5d6.js"),[],import.meta.url),"../assets/locales/el/messages.json":()=>__vitePreload(()=>import("./messages-6d976402.js"),[],import.meta.url),"../assets/locales/en/messages.json":()=>__vitePreload(()=>Promise.resolve().then(()=>messages),void 0,import.meta.url),"../assets/locales/es/messages.json":()=>__vitePreload(()=>import("./messages-79b4391e.js"),[],import.meta.url),"../assets/locales/et-EE/messages.json":()=>__vitePreload(()=>import("./messages-48b04bc4.js"),[],import.meta.url),"../assets/locales/eu/messages.json":()=>__vitePreload(()=>import("./messages-02269c66.js"),[],import.meta.url),"../assets/locales/fa-IR/messages.json":()=>__vitePreload(()=>import("./messages-1db3fb59.js"),[],import.meta.url),"../assets/locales/fi/messages.json":()=>__vitePreload(()=>import("./messages-ac68085d.js"),[],import.meta.url),"../assets/locales/fr/messages.json":()=>__vitePreload(()=>import("./messages-535afda6.js"),[],import.meta.url),"../assets/locales/ga-IE/messages.json":()=>__vitePreload(()=>import("./messages-47aea47c.js"),[],import.meta.url),"../assets/locales/gl-ES/messages.json":()=>__vitePreload(()=>import("./messages-e8574825.js"),[],import.meta.url),"../assets/locales/gu-IN/messages.json":()=>__vitePreload(()=>import("./messages-38ad1ea9.js"),[],import.meta.url),"../assets/locales/he/messages.json":()=>__vitePreload(()=>import("./messages-153918ff.js"),[],import.meta.url),"../assets/locales/hi-IN/messages.json":()=>__vitePreload(()=>import("./messages-689a6e93.js"),[],import.meta.url),"../assets/locales/hr-HR/messages.json":()=>__vitePreload(()=>import("./messages-a1cd65f8.js"),[],import.meta.url),"../assets/locales/hu/messages.json":()=>__vitePreload(()=>import("./messages-27ce531e.js"),[],import.meta.url),"../assets/locales/id/messages.json":()=>__vitePreload(()=>import("./messages-a4fc571b.js"),[],import.meta.url),"../assets/locales/it/messages.json":()=>__vitePreload(()=>import("./messages-0b39bbc6.js"),[],import.meta.url),"../assets/locales/ja/messages.json":()=>__vitePreload(()=>import("./messages-399746b0.js"),[],import.meta.url),"../assets/locales/ka-GE/messages.json":()=>__vitePreload(()=>import("./messages-e857af4e.js"),[],import.meta.url),"../assets/locales/kk-KZ/messages.json":()=>__vitePreload(()=>import("./messages-1e9dad69.js"),[],import.meta.url),"../assets/locales/km-KH/messages.json":()=>__vitePreload(()=>import("./messages-fa3cd8ab.js"),[],import.meta.url),"../assets/locales/kn-IN/messages.json":()=>__vitePreload(()=>import("./messages-df4d7ec5.js"),[],import.meta.url),"../assets/locales/ko/messages.json":()=>__vitePreload(()=>import("./messages-dfb046a2.js"),[],import.meta.url),"../assets/locales/ky-KG/messages.json":()=>__vitePreload(()=>import("./messages-d2bae14a.js"),[],import.meta.url),"../assets/locales/lt-LT/messages.json":()=>__vitePreload(()=>import("./messages-fa5f0b64.js"),[],import.meta.url),"../assets/locales/lv-LV/messages.json":()=>__vitePreload(()=>import("./messages-4fb314b3.js"),[],import.meta.url),"../assets/locales/mk-MK/messages.json":()=>__vitePreload(()=>import("./messages-488212eb.js"),[],import.meta.url),"../assets/locales/ml-IN/messages.json":()=>__vitePreload(()=>import("./messages-5056af43.js"),[],import.meta.url),"../assets/locales/mr-IN/messages.json":()=>__vitePreload(()=>import("./messages-7f3ad12f.js"),[],import.meta.url),"../assets/locales/ms/messages.json":()=>__vitePreload(()=>import("./messages-f2922483.js"),[],import.meta.url),"../assets/locales/my/messages.json":()=>__vitePreload(()=>import("./messages-cb1d533e.js"),[],import.meta.url),"../assets/locales/nb/messages.json":()=>__vitePreload(()=>import("./messages-ce28e0a0.js"),[],import.meta.url),"../assets/locales/nl/messages.json":()=>__vitePreload(()=>import("./messages-8030ba6f.js"),[],import.meta.url),"../assets/locales/pa-IN/messages.json":()=>__vitePreload(()=>import("./messages-7eca1a86.js"),[],import.meta.url),"../assets/locales/pl/messages.json":()=>__vitePreload(()=>import("./messages-428de749.js"),[],import.meta.url),"../assets/locales/pt-BR/messages.json":()=>__vitePreload(()=>import("./messages-2a49a948.js"),[],import.meta.url),"../assets/locales/pt-PT/messages.json":()=>__vitePreload(()=>import("./messages-32f4930b.js"),[],import.meta.url),"../assets/locales/ro-RO/messages.json":()=>__vitePreload(()=>import("./messages-b1eb7a68.js"),[],import.meta.url),"../assets/locales/ru/messages.json":()=>__vitePreload(()=>import("./messages-6af54135.js"),[],import.meta.url),"../assets/locales/sk-SK/messages.json":()=>__vitePreload(()=>import("./messages-8b94391b.js"),[],import.meta.url),"../assets/locales/sl-SI/messages.json":()=>__vitePreload(()=>import("./messages-7a43f641.js"),[],import.meta.url),"../assets/locales/sq-AL/messages.json":()=>__vitePreload(()=>import("./messages-937d1439.js"),[],import.meta.url),"../assets/locales/sr-YR/messages.json":()=>__vitePreload(()=>import("./messages-b482eeec.js"),[],import.meta.url),"../assets/locales/sv/messages.json":()=>__vitePreload(()=>import("./messages-f3b0fe6a.js"),[],import.meta.url),"../assets/locales/sw/messages.json":()=>__vitePreload(()=>import("./messages-f5b26261.js"),[],import.meta.url),"../assets/locales/ta-IN/messages.json":()=>__vitePreload(()=>import("./messages-a74ea384.js"),[],import.meta.url),"../assets/locales/te-IN/messages.json":()=>__vitePreload(()=>import("./messages-2f39f5f7.js"),[],import.meta.url),"../assets/locales/th/messages.json":()=>__vitePreload(()=>import("./messages-518fbf6c.js"),[],import.meta.url),"../assets/locales/tl-PH/messages.json":()=>__vitePreload(()=>import("./messages-a017f87d.js"),[],import.meta.url),"../assets/locales/tr/messages.json":()=>__vitePreload(()=>import("./messages-5762e808.js"),[],import.meta.url),"../assets/locales/ug/messages.json":()=>__vitePreload(()=>import("./messages-04876ba6.js"),[],import.meta.url),"../assets/locales/uk-UA/messages.json":()=>__vitePreload(()=>import("./messages-d0d2e9f0.js"),[],import.meta.url),"../assets/locales/ur/messages.json":()=>__vitePreload(()=>import("./messages-950aed42.js"),[],import.meta.url),"../assets/locales/vi/messages.json":()=>__vitePreload(()=>import("./messages-e236bfab.js"),[],import.meta.url),"../assets/locales/zh-CN/messages.json":()=>__vitePreload(()=>import("./messages-a46d5e10.js"),[],import.meta.url),"../assets/locales/zh-HK/messages.json":()=>__vitePreload(()=>import("./messages-f7c88106.js"),[],import.meta.url),"../assets/locales/zh-TW/messages.json":()=>__vitePreload(()=>import("./messages-8a031cb0.js"),[],import.meta.url),"../assets/locales/zh-YU/messages.json":()=>__vitePreload(()=>import("./messages-1c790ccc.js"),[],import.meta.url)}),`../assets/locales/${$}/messages.json`)).default,tt=$}catch{try{et=(await __variableDynamicImportRuntimeHelper(Object.assign({"../assets/locales/af-ZA/messages.json":()=>__vitePreload(()=>import("./messages-3e3d7135.js"),[],import.meta.url),"../assets/locales/ar/messages.json":()=>__vitePreload(()=>import("./messages-73b0ce1b.js"),[],import.meta.url),"../assets/locales/az-AZ/messages.json":()=>__vitePreload(()=>import("./messages-2cc7364a.js"),[],import.meta.url),"../assets/locales/bg-BG/messages.json":()=>__vitePreload(()=>import("./messages-6bd68951.js"),[],import.meta.url),"../assets/locales/bn-BD/messages.json":()=>__vitePreload(()=>import("./messages-4541da14.js"),[],import.meta.url),"../assets/locales/bs-BA/messages.json":()=>__vitePreload(()=>import("./messages-1aacf11f.js"),[],import.meta.url),"../assets/locales/ca/messages.json":()=>__vitePreload(()=>import("./messages-b0bb5d7f.js"),[],import.meta.url),"../assets/locales/cs/messages.json":()=>__vitePreload(()=>import("./messages-f81502d7.js"),[],import.meta.url),"../assets/locales/da/messages.json":()=>__vitePreload(()=>import("./messages-b00a6376.js"),[],import.meta.url),"../assets/locales/de/messages.json":()=>__vitePreload(()=>import("./messages-3b56a5d6.js"),[],import.meta.url),"../assets/locales/el/messages.json":()=>__vitePreload(()=>import("./messages-6d976402.js"),[],import.meta.url),"../assets/locales/en/messages.json":()=>__vitePreload(()=>Promise.resolve().then(()=>messages),void 0,import.meta.url),"../assets/locales/es/messages.json":()=>__vitePreload(()=>import("./messages-79b4391e.js"),[],import.meta.url),"../assets/locales/et-EE/messages.json":()=>__vitePreload(()=>import("./messages-48b04bc4.js"),[],import.meta.url),"../assets/locales/eu/messages.json":()=>__vitePreload(()=>import("./messages-02269c66.js"),[],import.meta.url),"../assets/locales/fa-IR/messages.json":()=>__vitePreload(()=>import("./messages-1db3fb59.js"),[],import.meta.url),"../assets/locales/fi/messages.json":()=>__vitePreload(()=>import("./messages-ac68085d.js"),[],import.meta.url),"../assets/locales/fr/messages.json":()=>__vitePreload(()=>import("./messages-535afda6.js"),[],import.meta.url),"../assets/locales/ga-IE/messages.json":()=>__vitePreload(()=>import("./messages-47aea47c.js"),[],import.meta.url),"../assets/locales/gl-ES/messages.json":()=>__vitePreload(()=>import("./messages-e8574825.js"),[],import.meta.url),"../assets/locales/gu-IN/messages.json":()=>__vitePreload(()=>import("./messages-38ad1ea9.js"),[],import.meta.url),"../assets/locales/he/messages.json":()=>__vitePreload(()=>import("./messages-153918ff.js"),[],import.meta.url),"../assets/locales/hi-IN/messages.json":()=>__vitePreload(()=>import("./messages-689a6e93.js"),[],import.meta.url),"../assets/locales/hr-HR/messages.json":()=>__vitePreload(()=>import("./messages-a1cd65f8.js"),[],import.meta.url),"../assets/locales/hu/messages.json":()=>__vitePreload(()=>import("./messages-27ce531e.js"),[],import.meta.url),"../assets/locales/id/messages.json":()=>__vitePreload(()=>import("./messages-a4fc571b.js"),[],import.meta.url),"../assets/locales/it/messages.json":()=>__vitePreload(()=>import("./messages-0b39bbc6.js"),[],import.meta.url),"../assets/locales/ja/messages.json":()=>__vitePreload(()=>import("./messages-399746b0.js"),[],import.meta.url),"../assets/locales/ka-GE/messages.json":()=>__vitePreload(()=>import("./messages-e857af4e.js"),[],import.meta.url),"../assets/locales/kk-KZ/messages.json":()=>__vitePreload(()=>import("./messages-1e9dad69.js"),[],import.meta.url),"../assets/locales/km-KH/messages.json":()=>__vitePreload(()=>import("./messages-fa3cd8ab.js"),[],import.meta.url),"../assets/locales/kn-IN/messages.json":()=>__vitePreload(()=>import("./messages-df4d7ec5.js"),[],import.meta.url),"../assets/locales/ko/messages.json":()=>__vitePreload(()=>import("./messages-dfb046a2.js"),[],import.meta.url),"../assets/locales/ky-KG/messages.json":()=>__vitePreload(()=>import("./messages-d2bae14a.js"),[],import.meta.url),"../assets/locales/lt-LT/messages.json":()=>__vitePreload(()=>import("./messages-fa5f0b64.js"),[],import.meta.url),"../assets/locales/lv-LV/messages.json":()=>__vitePreload(()=>import("./messages-4fb314b3.js"),[],import.meta.url),"../assets/locales/mk-MK/messages.json":()=>__vitePreload(()=>import("./messages-488212eb.js"),[],import.meta.url),"../assets/locales/ml-IN/messages.json":()=>__vitePreload(()=>import("./messages-5056af43.js"),[],import.meta.url),"../assets/locales/mr-IN/messages.json":()=>__vitePreload(()=>import("./messages-7f3ad12f.js"),[],import.meta.url),"../assets/locales/ms/messages.json":()=>__vitePreload(()=>import("./messages-f2922483.js"),[],import.meta.url),"../assets/locales/my/messages.json":()=>__vitePreload(()=>import("./messages-cb1d533e.js"),[],import.meta.url),"../assets/locales/nb/messages.json":()=>__vitePreload(()=>import("./messages-ce28e0a0.js"),[],import.meta.url),"../assets/locales/nl/messages.json":()=>__vitePreload(()=>import("./messages-8030ba6f.js"),[],import.meta.url),"../assets/locales/pa-IN/messages.json":()=>__vitePreload(()=>import("./messages-7eca1a86.js"),[],import.meta.url),"../assets/locales/pl/messages.json":()=>__vitePreload(()=>import("./messages-428de749.js"),[],import.meta.url),"../assets/locales/pt-BR/messages.json":()=>__vitePreload(()=>import("./messages-2a49a948.js"),[],import.meta.url),"../assets/locales/pt-PT/messages.json":()=>__vitePreload(()=>import("./messages-32f4930b.js"),[],import.meta.url),"../assets/locales/ro-RO/messages.json":()=>__vitePreload(()=>import("./messages-b1eb7a68.js"),[],import.meta.url),"../assets/locales/ru/messages.json":()=>__vitePreload(()=>import("./messages-6af54135.js"),[],import.meta.url),"../assets/locales/sk-SK/messages.json":()=>__vitePreload(()=>import("./messages-8b94391b.js"),[],import.meta.url),"../assets/locales/sl-SI/messages.json":()=>__vitePreload(()=>import("./messages-7a43f641.js"),[],import.meta.url),"../assets/locales/sq-AL/messages.json":()=>__vitePreload(()=>import("./messages-937d1439.js"),[],import.meta.url),"../assets/locales/sr-YR/messages.json":()=>__vitePreload(()=>import("./messages-b482eeec.js"),[],import.meta.url),"../assets/locales/sv/messages.json":()=>__vitePreload(()=>import("./messages-f3b0fe6a.js"),[],import.meta.url),"../assets/locales/sw/messages.json":()=>__vitePreload(()=>import("./messages-f5b26261.js"),[],import.meta.url),"../assets/locales/ta-IN/messages.json":()=>__vitePreload(()=>import("./messages-a74ea384.js"),[],import.meta.url),"../assets/locales/te-IN/messages.json":()=>__vitePreload(()=>import("./messages-2f39f5f7.js"),[],import.meta.url),"../assets/locales/th/messages.json":()=>__vitePreload(()=>import("./messages-518fbf6c.js"),[],import.meta.url),"../assets/locales/tl-PH/messages.json":()=>__vitePreload(()=>import("./messages-a017f87d.js"),[],import.meta.url),"../assets/locales/tr/messages.json":()=>__vitePreload(()=>import("./messages-5762e808.js"),[],import.meta.url),"../assets/locales/ug/messages.json":()=>__vitePreload(()=>import("./messages-04876ba6.js"),[],import.meta.url),"../assets/locales/uk-UA/messages.json":()=>__vitePreload(()=>import("./messages-d0d2e9f0.js"),[],import.meta.url),"../assets/locales/ur/messages.json":()=>__vitePreload(()=>import("./messages-950aed42.js"),[],import.meta.url),"../assets/locales/vi/messages.json":()=>__vitePreload(()=>import("./messages-e236bfab.js"),[],import.meta.url),"../assets/locales/zh-CN/messages.json":()=>__vitePreload(()=>import("./messages-a46d5e10.js"),[],import.meta.url),"../assets/locales/zh-HK/messages.json":()=>__vitePreload(()=>import("./messages-f7c88106.js"),[],import.meta.url),"../assets/locales/zh-TW/messages.json":()=>__vitePreload(()=>import("./messages-8a031cb0.js"),[],import.meta.url),"../assets/locales/zh-YU/messages.json":()=>__vitePreload(()=>import("./messages-1c790ccc.js"),[],import.meta.url)}),`../assets/locales/${_e}/messages.json`)).default,tt=_e}catch{}}return debug$4("using %j locale",tt),{locale:tt,messages:et}}function removeRegion($){const _e=/^([^-]+)(-.+)$/.exec($);return _e?_e[1]:$}const debug$3=createDebug("signal:components:I18n"),placeholder=()=>"NO LOCALE LOADED";placeholder.getLocale=()=>"none";placeholder.isLegacyFormat=()=>{throw new Error("Can't call isLegacyFormat on placeholder")};placeholder.getIntl=()=>{throw new Error("Can't call getIntl on placeholder")};const I18nContext=reactExports.createContext(placeholder);function I18n({messages:$,locale:_e,children:et}){const{icuMessages:tt,legacyMessages:rt}=reactExports.useMemo(()=>classifyMessages($),[$]),nt=reactExports.useMemo(()=>createCachedIntl(_e,tt),[_e,tt]),at=(it,ft)=>{if(Array.isArray(ft)&&ft.length>1)throw new Error("Array syntax is not supported with more than one placeholder");if(tt[it]!=null)return formatIcuMessage(nt,it,ft);const lt=rt[it];if(lt==null)return debug$3(`getMessage: No string found for key ${it}`),"";if(!ft)return lt;if(Array.isArray(ft))return ft.reduce((ht,pt)=>ht.toString().replace(/\$.+?\$/,pt.toString()),lt);const ut=/\$([^$]+)\$/g;let ct=ut.exec(lt),gt="",mt=0;for(;ct;){mt_e,at.isLegacyFormat=it=>rt[it]!=null,at.getIntl=()=>nt;const ot=reactExports.useCallback(at,[tt,rt,nt]);return jsx(I18nContext.Provider,{value:ot,children:et})}const useI18n=()=>reactExports.useContext(I18nContext);function Root(){const{locale:$,messages:_e}=useLoaderData();return _e.title&&"message"in _e.title&&(document.title=_e.title.message??""),jsx(I18n,{messages:_e,locale:$,children:jsx(Outlet,{})})}const container$5="_container_2rt48_1",grow$2="_grow_2rt48_7",scroll="_scroll_2rt48_11 _grow_2rt48_7",noScroll="_no-scroll_2rt48_18 _grow_2rt48_7",main$4="_main_2rt48_24",noMessage="_no-message_2rt48_38 _main_2rt48_24",empty="_empty_2rt48_42 _main_2rt48_24",footer="_footer_2rt48_46",footerRight="_footer-right_2rt48_60",button$1="_button_2rt48_66",toaster="_toaster_2rt48_70",appStyles={container:container$5,grow:grow$2,scroll,noScroll,main:main$4,noMessage,empty,footer,footerRight,button:button$1,toaster};var classnames$2={exports:{}};/*! Copyright (c) 2018 Jed Watson. Licensed under the MIT License (MIT), see http://jedwatson.github.io/classnames */(function($){(function(){var _e={}.hasOwnProperty;function et(){for(var tt=[],rt=0;rt_e&&$?styles$w.pillPrimary:_e?styles$w.pill:$?styles$w.primary:styles$w.base;function Button$1({className:$,children:_e,primary:et,...tt}){return jsx("button",{type:"button",className:classnames$1(getClassName$2({primary:et,...tt}),$),...tt,children:_e})}const logoUrl=""+new URL("signal-4c9914c7.svg",import.meta.url).href,base$a="_base_1nzpb_1",heading="_heading_1nzpb_6 _base_1nzpb_1",h1="_h1_1nzpb_11 _heading_1nzpb_6 _base_1nzpb_1",h2="_h2_1nzpb_25 _heading_1nzpb_6 _base_1nzpb_1",text$4="_text_1nzpb_40 _base_1nzpb_1",textCenter="_text-center_1nzpb_58 _text_1nzpb_40 _base_1nzpb_1",secondary="_secondary_1nzpb_63",styles$v={base:base$a,heading,h1,h2,text:text$4,textCenter,secondary},H1=React$2.memo(function({children:_e,className:et,...tt}){return jsx("h1",{className:classnames$1(styles$v.h1,et),...tt,children:_e})}),H2=React$2.memo(function({children:_e,className:et,...tt}){return jsx("h2",{className:classnames$1(styles$v.h2,et),...tt,children:_e})}),Text=React$2.memo(function({children:_e,className:et,center:tt,secondary:rt,...nt}){return jsx("p",{className:classnames$1(tt?styles$v.textCenter:styles$v.text,rt?styles$v.secondary:null,et),...nt,children:_e})}),Inline=React$2.memo(function({children:_e,className:et,...tt}){return jsx("span",{className:classnames$1(styles$v.text,et),...tt,children:_e})}),header="_header_tvw1r_1",guidelines="_guidelines_tvw1r_28",icon="_icon_tvw1r_34",grow$1="_grow_tvw1r_38",styles$u={header,guidelines,icon,grow:grow$1};function PageHeader(){const $=useI18n();return jsxs("div",{className:styles$u.header,children:[jsx("img",{className:styles$u.icon,alt:$("StickerCreator--title--icon"),src:logoUrl,width:"47",height:"47"}),jsx(H1,{children:$("StickerCreator--title--sticker")}),jsx("div",{className:styles$u.grow}),jsx("a",{className:styles$u.guidelines,href:"https://support.signal.org/hc/articles/360031836512-Stickers#sticker_creator",target:"_blank",rel:"noreferrer",children:$("StickerCreator--guidelines")})]})}const base$9="_base_7q7aa_1",input$2="_input_7q7aa_11",checkbox="_checkbox_7q7aa_18",checkboxChecked="_checkbox-checked_7q7aa_37 _checkbox_7q7aa_18",label$2="_label_7q7aa_44",styles$t={base:base$9,input:input$2,checkbox,checkboxChecked,label:label$2},checkSvg=jsx("svg",{viewBox:"0 0 16 16",width:"16px",height:"16px",children:jsx("path",{d:"M7 11.5c-.2 0-.4-.1-.5-.2L3.3 8.1 4.4 7 7 9.7l4.6-4.6 1.1 1.1-5.2 5.2c-.1 0-.3.1-.5.1z"})}),LabeledCheckbox=React$2.memo(function({children:_e,value:et,onChange:tt}){const rt=React$2.useCallback(()=>{tt!==void 0&&tt(!et)},[tt,et]),nt=et?styles$t.checkboxChecked:styles$t.checkbox;return jsxs("label",{className:styles$t.base,children:[jsx("input",{type:"checkbox",className:styles$t.input,checked:et,"aria-checked":et,onChange:rt}),jsx("span",{className:nt,children:et?checkSvg:null}),jsx(Inline,{className:styles$t.label,children:_e})]})});function noop$2(){}const base$8="_base_1mllw_1",styles$s={base:base$8},Toast=React$2.memo(function({children:_e,className:et,...tt}){return jsx("button",{type:"button",className:classnames$1(styles$s.base,et),...tt,children:_e})}),DEFAULT_DISMISS=1e4,Toaster=React$2.memo(function({loaf:_e,onDismiss:et,className:tt}){const rt=_e[_e.length-1];return React$2.useEffect(()=>{if(!rt)return noop$2;const nt=setTimeout(()=>{et()},DEFAULT_DISMISS);return()=>{clearTimeout(nt)}},[rt,et]),rt?jsx("div",{className:tt,children:jsx(Toast,{onClick:et,tabIndex:0,children:rt.text},rt.id)}):null}),useTitle=()=>useSelector(({art:$})=>$.title),useAuthor=()=>useSelector(({art:$})=>$.author),useCover=()=>useSelector(({art:$})=>$.cover),useArtType=()=>useSelector(({art:$})=>$.artType),useArtOrder=()=>useSelector(({art:$})=>$.order),useArtData=$=>useSelector(({art:_e})=>_e.data[$]),useArtReady=()=>useSelector(({art:$})=>{assert($.artType===ArtType.Sticker,"Unexpected art type");const _e=MIN_STICKERS,et=MAX_STICKERS;return $.order.length>=_e&&$.order.length<=et&&Object.values($.data).every(({imageData:tt})=>!!tt)}),useEmojisReady=()=>useSelector(({art:$})=>Object.values($.data).every(({emoji:_e})=>_e!=null&&_e.emoji?(assert($.artType===ArtType.Sticker,"Unexpected art type"),!0):!1)),useAllDataValid=()=>{const $=useArtReady(),_e=useEmojisReady(),et=useCover(),tt=useTitle(),rt=useAuthor();return!!($&&_e&&et&&tt&&rt)},selectUrl=createSelector(({art:$})=>$.artType,({art:$})=>$.packId,({art:$})=>$.packKey,($,_e,et)=>(assert($===ArtType.Sticker,"Unexpected art type"),`https://signal.art/addstickers/#pack_id=${_e}&pack_key=${et}`)),usePackUrl=()=>useSelector(selectUrl),useToasts=()=>useSelector(({art:$})=>$.toasts),selectOrderedData=createSelector(({art:$})=>$.order,({art:$})=>$.data,($,_e)=>$.map(et=>_e[et]).filter(et=>et!==void 0)),useSelectOrderedData=()=>useSelector(selectOrderedData),selectOrderedImagePaths=createSelector(selectOrderedData,$=>$.map(({imageData:_e})=>_e==null?void 0:_e.src).filter(_e=>_e!==void 0)),useOrderedImagePaths=()=>useSelector(selectOrderedImagePaths),getClassName$1=({noMessage:$,empty:_e})=>$?appStyles.noMessage:_e?appStyles.empty:appStyles.main;function AppStage($){const{children:_e,next:et,nextActive:tt,nextText:rt,noScroll:nt,onNext:at,onPrev:ot,prev:it,prevText:ft,showGuide:st=!1,setShowGuide:lt}=$,ut=useI18n(),ct=useNavigate(),mt=useArtOrder().length>0,ht=React$2.useCallback(()=>{et&&ct(et)},[et,ct]),pt=React$2.useCallback(()=>{it&&ct(it)},[it,ct]),dt=useDispatch(),yt=useToasts();return jsxs("div",{className:appStyles.container,children:[jsxs("div",{className:nt?appStyles.noScroll:appStyles.scroll,children:[jsx(PageHeader,{}),jsx("main",{className:getClassName$1($),children:_e})]}),jsxs("footer",{className:appStyles.footer,children:[lt&&mt?jsx(LabeledCheckbox,{onChange:lt,value:st,children:ut("StickerCreator--DropStage--showMargins")}):null,jsx("div",{className:appStyles.grow}),it||ot?jsx(Button$1,{className:appStyles.button,onClick:ot||pt,children:ft||ut("StickerCreator--AppStage--prev")}):null,et||at?jsx(Button$1,{className:appStyles.button,onClick:at||ht,primary:!0,disabled:!tt,children:rt||ut("StickerCreator--AppStage--next")}):null]}),jsx(Toaster,{className:appStyles.toaster,loaf:yt.map((vt,bt)=>({id:bt,text:ut(vt.key,vt.subs)})),onDismiss:()=>dt(dismissToast())})]})}const message$1="_message_1jr1k_1",main$3="_main_1jr1k_5",info="_info_1jr1k_12",stickerGrid="_sticker-grid_1jr1k_22",styles$r={message:message$1,main:main$3,info,stickerGrid};var dist={exports:{}};/**! * Sortable 1.15.0 * @author RubaXa * @author owenm * @license MIT */function ownKeys$2($,_e){var et=Object.keys($);if(Object.getOwnPropertySymbols){var tt=Object.getOwnPropertySymbols($);_e&&(tt=tt.filter(function(rt){return Object.getOwnPropertyDescriptor($,rt).enumerable})),et.push.apply(et,tt)}return et}function _objectSpread2($){for(var _e=1;_e=0)&&(et[rt]=$[rt]);return et}function _objectWithoutProperties$1($,_e){if($==null)return{};var et=_objectWithoutPropertiesLoose$2($,_e),tt,rt;if(Object.getOwnPropertySymbols){var nt=Object.getOwnPropertySymbols($);for(rt=0;rt=0)&&Object.prototype.propertyIsEnumerable.call($,tt)&&(et[tt]=$[tt])}return et}function _toConsumableArray$2($){return _arrayWithoutHoles$2($)||_iterableToArray$2($)||_unsupportedIterableToArray$3($)||_nonIterableSpread$2()}function _arrayWithoutHoles$2($){if(Array.isArray($))return _arrayLikeToArray$3($)}function _iterableToArray$2($){if(typeof Symbol<"u"&&$[Symbol.iterator]!=null||$["@@iterator"]!=null)return Array.from($)}function _unsupportedIterableToArray$3($,_e){if($){if(typeof $=="string")return _arrayLikeToArray$3($,_e);var et=Object.prototype.toString.call($).slice(8,-1);if(et==="Object"&&$.constructor&&(et=$.constructor.name),et==="Map"||et==="Set")return Array.from($);if(et==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(et))return _arrayLikeToArray$3($,_e)}}function _arrayLikeToArray$3($,_e){(_e==null||_e>$.length)&&(_e=$.length);for(var et=0,tt=new Array(_e);et<_e;et++)tt[et]=$[et];return tt}function _nonIterableSpread$2(){throw new TypeError(`Invalid attempt to spread non-iterable instance. In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var version="1.15.0";function userAgent($){if(typeof window<"u"&&window.navigator)return!!navigator.userAgent.match($)}var IE11OrLess=userAgent(/(?:Trident.*rv[ :]?11\.|msie|iemobile|Windows Phone)/i),Edge=userAgent(/Edge/i),FireFox=userAgent(/firefox/i),Safari=userAgent(/safari/i)&&!userAgent(/chrome/i)&&!userAgent(/android/i),IOS=userAgent(/iP(ad|od|hone)/i),ChromeForAndroid=userAgent(/chrome/i)&&userAgent(/android/i),captureMode={capture:!1,passive:!1};function on($,_e,et){$.addEventListener(_e,et,!IE11OrLess&&captureMode)}function off($,_e,et){$.removeEventListener(_e,et,!IE11OrLess&&captureMode)}function matches($,_e){if(_e){if(_e[0]===">"&&(_e=_e.substring(1)),$)try{if($.matches)return $.matches(_e);if($.msMatchesSelector)return $.msMatchesSelector(_e);if($.webkitMatchesSelector)return $.webkitMatchesSelector(_e)}catch{return!1}return!1}}function getParentOrHost($){return $.host&&$!==document&&$.host.nodeType?$.host:$.parentNode}function closest($,_e,et,tt){if($){et=et||document;do{if(_e!=null&&(_e[0]===">"?$.parentNode===et&&matches($,_e):matches($,_e))||tt&&$===et)return $;if($===et)break}while($=getParentOrHost($))}return null}var R_SPACE=/\s+/g;function toggleClass($,_e,et){if($&&_e)if($.classList)$.classList[et?"add":"remove"](_e);else{var tt=(" "+$.className+" ").replace(R_SPACE," ").replace(" "+_e+" "," ");$.className=(tt+(et?" "+_e:"")).replace(R_SPACE," ")}}function css($,_e,et){var tt=$&&$.style;if(tt){if(et===void 0)return document.defaultView&&document.defaultView.getComputedStyle?et=document.defaultView.getComputedStyle($,""):$.currentStyle&&(et=$.currentStyle),_e===void 0?et:et[_e];!(_e in tt)&&_e.indexOf("webkit")===-1&&(_e="-webkit-"+_e),tt[_e]=et+(typeof et=="string"?"":"px")}}function matrix($,_e){var et="";if(typeof $=="string")et=$;else do{var tt=css($,"transform");tt&&tt!=="none"&&(et=tt+" "+et)}while(!_e&&($=$.parentNode));var rt=window.DOMMatrix||window.WebKitCSSMatrix||window.CSSMatrix||window.MSCSSMatrix;return rt&&new rt(et)}function find($,_e,et){if($){var tt=$.getElementsByTagName(_e),rt=0,nt=tt.length;if(et)for(;rt=nt:at=rt<=nt,!at)return tt;if(tt===getWindowScrollingElement())break;tt=getParentAutoScrollElement(tt,!1)}return!1}function getChild($,_e,et,tt){for(var rt=0,nt=0,at=$.children;nt2&&arguments[2]!==void 0?arguments[2]:{},rt=tt.evt,nt=_objectWithoutProperties$1(tt,_excluded$3);PluginManager.pluginEvent.bind(Sortable)(_e,et,_objectSpread2({dragEl,parentEl,ghostEl,rootEl,nextEl,lastDownEl,cloneEl,cloneHidden,dragStarted:moved,putSortable,activeSortable:Sortable.active,originalEvent:rt,oldIndex,oldDraggableIndex,newIndex,newDraggableIndex,hideGhostForTarget:_hideGhostForTarget,unhideGhostForTarget:_unhideGhostForTarget,cloneNowHidden:function(){cloneHidden=!0},cloneNowShown:function(){cloneHidden=!1},dispatchSortableEvent:function(ot){_dispatchEvent({sortable:et,name:ot,originalEvent:rt})}},nt))};function _dispatchEvent($){dispatchEvent(_objectSpread2({putSortable,cloneEl,targetEl:dragEl,rootEl,oldIndex,oldDraggableIndex,newIndex,newDraggableIndex},$))}var dragEl,parentEl,ghostEl,rootEl,nextEl,lastDownEl,cloneEl,cloneHidden,oldIndex,newIndex,oldDraggableIndex,newDraggableIndex,activeGroup,putSortable,awaitingDragStarted=!1,ignoreNextClick=!1,sortables=[],tapEvt,touchEvt,lastDx,lastDy,tapDistanceLeft,tapDistanceTop,moved,lastTarget,lastDirection,pastFirstInvertThresh=!1,isCircumstantialInvert=!1,targetMoveDistance,ghostRelativeParent,ghostRelativeParentInitialScroll=[],_silent=!1,savedInputChecked=[],documentExists=typeof document<"u",PositionGhostAbsolutely=IOS,CSSFloatProperty=Edge||IE11OrLess?"cssFloat":"float",supportDraggable=documentExists&&!ChromeForAndroid&&!IOS&&"draggable"in document.createElement("div"),supportCssPointerEvents=function(){if(documentExists){if(IE11OrLess)return!1;var $=document.createElement("x");return $.style.cssText="pointer-events:auto",$.style.pointerEvents==="auto"}}(),_detectDirection=function(_e,et){var tt=css(_e),rt=parseInt(tt.width)-parseInt(tt.paddingLeft)-parseInt(tt.paddingRight)-parseInt(tt.borderLeftWidth)-parseInt(tt.borderRightWidth),nt=getChild(_e,0,et),at=getChild(_e,1,et),ot=nt&&css(nt),it=at&&css(at),ft=ot&&parseInt(ot.marginLeft)+parseInt(ot.marginRight)+getRect(nt).width,st=it&&parseInt(it.marginLeft)+parseInt(it.marginRight)+getRect(at).width;if(tt.display==="flex")return tt.flexDirection==="column"||tt.flexDirection==="column-reverse"?"vertical":"horizontal";if(tt.display==="grid")return tt.gridTemplateColumns.split(" ").length<=1?"vertical":"horizontal";if(nt&&ot.float&&ot.float!=="none"){var lt=ot.float==="left"?"left":"right";return at&&(it.clear==="both"||it.clear===lt)?"vertical":"horizontal"}return nt&&(ot.display==="block"||ot.display==="flex"||ot.display==="table"||ot.display==="grid"||ft>=rt&&tt[CSSFloatProperty]==="none"||at&&tt[CSSFloatProperty]==="none"&&ft+st>rt)?"vertical":"horizontal"},_dragElInRowColumn=function(_e,et,tt){var rt=tt?_e.left:_e.top,nt=tt?_e.right:_e.bottom,at=tt?_e.width:_e.height,ot=tt?et.left:et.top,it=tt?et.right:et.bottom,ft=tt?et.width:et.height;return rt===ot||nt===it||rt+at/2===ot+ft/2},_detectNearestEmptySortable=function(_e,et){var tt;return sortables.some(function(rt){var nt=rt[expando].options.emptyInsertThreshold;if(!(!nt||lastChild(rt))){var at=getRect(rt),ot=_e>=at.left-nt&&_e<=at.right+nt,it=et>=at.top-nt&&et<=at.bottom+nt;if(ot&&it)return tt=rt}}),tt},_prepareGroup=function(_e){function et(nt,at){return function(ot,it,ft,st){var lt=ot.options.group.name&&it.options.group.name&&ot.options.group.name===it.options.group.name;if(nt==null&&(at||lt))return!0;if(nt==null||nt===!1)return!1;if(at&&nt==="clone")return nt;if(typeof nt=="function")return et(nt(ot,it,ft,st),at)(ot,it,ft,st);var ut=(at?ot:it).options.group.name;return nt===!0||typeof nt=="string"&&nt===ut||nt.join&&nt.indexOf(ut)>-1}}var tt={},rt=_e.group;(!rt||_typeof(rt)!="object")&&(rt={name:rt}),tt.name=rt.name,tt.checkPull=et(rt.pull,!0),tt.checkPut=et(rt.put),tt.revertClone=rt.revertClone,_e.group=tt},_hideGhostForTarget=function(){!supportCssPointerEvents&&ghostEl&&css(ghostEl,"display","none")},_unhideGhostForTarget=function(){!supportCssPointerEvents&&ghostEl&&css(ghostEl,"display","")};documentExists&&!ChromeForAndroid&&document.addEventListener("click",function($){if(ignoreNextClick)return $.preventDefault(),$.stopPropagation&&$.stopPropagation(),$.stopImmediatePropagation&&$.stopImmediatePropagation(),ignoreNextClick=!1,!1},!0);var nearestEmptyInsertDetectEvent=function(_e){if(dragEl){_e=_e.touches?_e.touches[0]:_e;var et=_detectNearestEmptySortable(_e.clientX,_e.clientY);if(et){var tt={};for(var rt in _e)_e.hasOwnProperty(rt)&&(tt[rt]=_e[rt]);tt.target=tt.rootEl=et,tt.preventDefault=void 0,tt.stopPropagation=void 0,et[expando]._onDragOver(tt)}}},_checkOutsideTargetEl=function(_e){dragEl&&dragEl.parentNode[expando]._isOutsideThisEl(_e.target)};function Sortable($,_e){if(!($&&$.nodeType&&$.nodeType===1))throw"Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call($));this.el=$,this.options=_e=_extends$1({},_e),$[expando]=this;var et={group:null,sort:!0,disabled:!1,store:null,handle:null,draggable:/^[uo]l$/i.test($.nodeName)?">li":">*",swapThreshold:1,invertSwap:!1,invertedSwapThreshold:null,removeCloneOnHide:!0,direction:function(){return _detectDirection($,this.options)},ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",dragClass:"sortable-drag",ignore:"a, img",filter:null,preventOnFilter:!0,animation:0,easing:null,setData:function(at,ot){at.setData("Text",ot.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,delayOnTouchOnly:!1,touchStartThreshold:(Number.parseInt?Number:window).parseInt(window.devicePixelRatio,10)||1,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0},supportPointer:Sortable.supportPointer!==!1&&"PointerEvent"in window&&!Safari,emptyInsertThreshold:5};PluginManager.initializePlugins(this,$,et);for(var tt in et)!(tt in _e)&&(_e[tt]=et[tt]);_prepareGroup(_e);for(var rt in this)rt.charAt(0)==="_"&&typeof this[rt]=="function"&&(this[rt]=this[rt].bind(this));this.nativeDraggable=_e.forceFallback?!1:supportDraggable,this.nativeDraggable&&(this.options.touchStartThreshold=1),_e.supportPointer?on($,"pointerdown",this._onTapStart):(on($,"mousedown",this._onTapStart),on($,"touchstart",this._onTapStart)),this.nativeDraggable&&(on($,"dragover",this),on($,"dragenter",this)),sortables.push(this.el),_e.store&&_e.store.get&&this.sort(_e.store.get(this)||[]),_extends$1(this,AnimationStateManager())}Sortable.prototype={constructor:Sortable,_isOutsideThisEl:function(_e){!this.el.contains(_e)&&_e!==this.el&&(lastTarget=null)},_getDirection:function(_e,et){return typeof this.options.direction=="function"?this.options.direction.call(this,_e,et,dragEl):this.options.direction},_onTapStart:function(_e){if(_e.cancelable){var et=this,tt=this.el,rt=this.options,nt=rt.preventOnFilter,at=_e.type,ot=_e.touches&&_e.touches[0]||_e.pointerType&&_e.pointerType==="touch"&&_e,it=(ot||_e).target,ft=_e.target.shadowRoot&&(_e.path&&_e.path[0]||_e.composedPath&&_e.composedPath()[0])||it,st=rt.filter;if(_saveInputCheckedState(tt),!dragEl&&!(/mousedown|pointerdown/.test(at)&&_e.button!==0||rt.disabled)&&!ft.isContentEditable&&!(!this.nativeDraggable&&Safari&&it&&it.tagName.toUpperCase()==="SELECT")&&(it=closest(it,rt.draggable,tt,!1),!(it&&it.animated)&&lastDownEl!==it)){if(oldIndex=index(it),oldDraggableIndex=index(it,rt.draggable),typeof st=="function"){if(st.call(this,_e,it,this)){_dispatchEvent({sortable:et,rootEl:ft,name:"filter",targetEl:it,toEl:tt,fromEl:tt}),pluginEvent("filter",et,{evt:_e}),nt&&_e.cancelable&&_e.preventDefault();return}}else if(st&&(st=st.split(",").some(function(lt){if(lt=closest(ft,lt.trim(),tt,!1),lt)return _dispatchEvent({sortable:et,rootEl:lt,name:"filter",targetEl:it,fromEl:tt,toEl:tt}),pluginEvent("filter",et,{evt:_e}),!0}),st)){nt&&_e.cancelable&&_e.preventDefault();return}rt.handle&&!closest(ft,rt.handle,tt,!1)||this._prepareDragStart(_e,ot,it)}}},_prepareDragStart:function(_e,et,tt){var rt=this,nt=rt.el,at=rt.options,ot=nt.ownerDocument,it;if(tt&&!dragEl&&tt.parentNode===nt){var ft=getRect(tt);if(rootEl=nt,dragEl=tt,parentEl=dragEl.parentNode,nextEl=dragEl.nextSibling,lastDownEl=tt,activeGroup=at.group,Sortable.dragged=dragEl,tapEvt={target:dragEl,clientX:(et||_e).clientX,clientY:(et||_e).clientY},tapDistanceLeft=tapEvt.clientX-ft.left,tapDistanceTop=tapEvt.clientY-ft.top,this._lastX=(et||_e).clientX,this._lastY=(et||_e).clientY,dragEl.style["will-change"]="all",it=function(){if(pluginEvent("delayEnded",rt,{evt:_e}),Sortable.eventCanceled){rt._onDrop();return}rt._disableDelayedDragEvents(),!FireFox&&rt.nativeDraggable&&(dragEl.draggable=!0),rt._triggerDragStart(_e,et),_dispatchEvent({sortable:rt,name:"choose",originalEvent:_e}),toggleClass(dragEl,at.chosenClass,!0)},at.ignore.split(",").forEach(function(st){find(dragEl,st.trim(),_disableDraggable)}),on(ot,"dragover",nearestEmptyInsertDetectEvent),on(ot,"mousemove",nearestEmptyInsertDetectEvent),on(ot,"touchmove",nearestEmptyInsertDetectEvent),on(ot,"mouseup",rt._onDrop),on(ot,"touchend",rt._onDrop),on(ot,"touchcancel",rt._onDrop),FireFox&&this.nativeDraggable&&(this.options.touchStartThreshold=4,dragEl.draggable=!0),pluginEvent("delayStart",this,{evt:_e}),at.delay&&(!at.delayOnTouchOnly||et)&&(!this.nativeDraggable||!(Edge||IE11OrLess))){if(Sortable.eventCanceled){this._onDrop();return}on(ot,"mouseup",rt._disableDelayedDrag),on(ot,"touchend",rt._disableDelayedDrag),on(ot,"touchcancel",rt._disableDelayedDrag),on(ot,"mousemove",rt._delayedDragTouchMoveHandler),on(ot,"touchmove",rt._delayedDragTouchMoveHandler),at.supportPointer&&on(ot,"pointermove",rt._delayedDragTouchMoveHandler),rt._dragStartTimer=setTimeout(it,at.delay)}else it()}},_delayedDragTouchMoveHandler:function(_e){var et=_e.touches?_e.touches[0]:_e;Math.max(Math.abs(et.clientX-this._lastX),Math.abs(et.clientY-this._lastY))>=Math.floor(this.options.touchStartThreshold/(this.nativeDraggable&&window.devicePixelRatio||1))&&this._disableDelayedDrag()},_disableDelayedDrag:function(){dragEl&&_disableDraggable(dragEl),clearTimeout(this._dragStartTimer),this._disableDelayedDragEvents()},_disableDelayedDragEvents:function(){var _e=this.el.ownerDocument;off(_e,"mouseup",this._disableDelayedDrag),off(_e,"touchend",this._disableDelayedDrag),off(_e,"touchcancel",this._disableDelayedDrag),off(_e,"mousemove",this._delayedDragTouchMoveHandler),off(_e,"touchmove",this._delayedDragTouchMoveHandler),off(_e,"pointermove",this._delayedDragTouchMoveHandler)},_triggerDragStart:function(_e,et){et=et||_e.pointerType=="touch"&&_e,!this.nativeDraggable||et?this.options.supportPointer?on(document,"pointermove",this._onTouchMove):et?on(document,"touchmove",this._onTouchMove):on(document,"mousemove",this._onTouchMove):(on(dragEl,"dragend",this),on(rootEl,"dragstart",this._onDragStart));try{document.selection?_nextTick(function(){document.selection.empty()}):window.getSelection().removeAllRanges()}catch{}},_dragStarted:function(_e,et){if(awaitingDragStarted=!1,rootEl&&dragEl){pluginEvent("dragStarted",this,{evt:et}),this.nativeDraggable&&on(document,"dragover",_checkOutsideTargetEl);var tt=this.options;!_e&&toggleClass(dragEl,tt.dragClass,!1),toggleClass(dragEl,tt.ghostClass,!0),Sortable.active=this,_e&&this._appendGhost(),_dispatchEvent({sortable:this,name:"start",originalEvent:et})}else this._nulling()},_emulateDragOver:function(){if(touchEvt){this._lastX=touchEvt.clientX,this._lastY=touchEvt.clientY,_hideGhostForTarget();for(var _e=document.elementFromPoint(touchEvt.clientX,touchEvt.clientY),et=_e;_e&&_e.shadowRoot&&(_e=_e.shadowRoot.elementFromPoint(touchEvt.clientX,touchEvt.clientY),_e!==et);)et=_e;if(dragEl.parentNode[expando]._isOutsideThisEl(_e),et)do{if(et[expando]){var tt=void 0;if(tt=et[expando]._onDragOver({clientX:touchEvt.clientX,clientY:touchEvt.clientY,target:_e,rootEl:et}),tt&&!this.options.dragoverBubble)break}_e=et}while(et=et.parentNode);_unhideGhostForTarget()}},_onTouchMove:function(_e){if(tapEvt){var et=this.options,tt=et.fallbackTolerance,rt=et.fallbackOffset,nt=_e.touches?_e.touches[0]:_e,at=ghostEl&&matrix(ghostEl,!0),ot=ghostEl&&at&&at.a,it=ghostEl&&at&&at.d,ft=PositionGhostAbsolutely&&ghostRelativeParent&&getRelativeScrollOffset(ghostRelativeParent),st=(nt.clientX-tapEvt.clientX+rt.x)/(ot||1)+(ft?ft[0]-ghostRelativeParentInitialScroll[0]:0)/(ot||1),lt=(nt.clientY-tapEvt.clientY+rt.y)/(it||1)+(ft?ft[1]-ghostRelativeParentInitialScroll[1]:0)/(it||1);if(!Sortable.active&&!awaitingDragStarted){if(tt&&Math.max(Math.abs(nt.clientX-this._lastX),Math.abs(nt.clientY-this._lastY))=0&&(_dispatchEvent({rootEl:parentEl,name:"add",toEl:parentEl,fromEl:rootEl,originalEvent:_e}),_dispatchEvent({sortable:this,name:"remove",toEl:parentEl,originalEvent:_e}),_dispatchEvent({rootEl:parentEl,name:"sort",toEl:parentEl,fromEl:rootEl,originalEvent:_e}),_dispatchEvent({sortable:this,name:"sort",toEl:parentEl,originalEvent:_e})),putSortable&&putSortable.save()):newIndex!==oldIndex&&newIndex>=0&&(_dispatchEvent({sortable:this,name:"update",toEl:parentEl,originalEvent:_e}),_dispatchEvent({sortable:this,name:"sort",toEl:parentEl,originalEvent:_e})),Sortable.active&&((newIndex==null||newIndex===-1)&&(newIndex=oldIndex,newDraggableIndex=oldDraggableIndex),_dispatchEvent({sortable:this,name:"end",toEl:parentEl,originalEvent:_e}),this.save()))),this._nulling()},_nulling:function(){pluginEvent("nulling",this),rootEl=dragEl=parentEl=ghostEl=nextEl=cloneEl=lastDownEl=cloneHidden=tapEvt=touchEvt=moved=newIndex=newDraggableIndex=oldIndex=oldDraggableIndex=lastTarget=lastDirection=putSortable=activeGroup=Sortable.dragged=Sortable.ghost=Sortable.clone=Sortable.active=null,savedInputChecked.forEach(function(_e){_e.checked=!0}),savedInputChecked.length=lastDx=lastDy=0},handleEvent:function(_e){switch(_e.type){case"drop":case"dragend":this._onDrop(_e);break;case"dragenter":case"dragover":dragEl&&(this._onDragOver(_e),_globalDragOver(_e));break;case"selectstart":_e.preventDefault();break}},toArray:function(){for(var _e=[],et,tt=this.el.children,rt=0,nt=tt.length,at=this.options;rttt.right+rt||$.clientX<=tt.right&&$.clientY>tt.bottom&&$.clientX>=tt.left:$.clientX>tt.right&&$.clientY>tt.top||$.clientX<=tt.right&&$.clientY>tt.bottom+rt}function _getSwapDirection($,_e,et,tt,rt,nt,at,ot){var it=tt?$.clientY:$.clientX,ft=tt?et.height:et.width,st=tt?et.top:et.left,lt=tt?et.bottom:et.right,ut=!1;if(!at){if(ot&&targetMoveDistancest+ft*nt/2:itlt-targetMoveDistance)return-lastDirection}else if(it>st+ft*(1-rt)/2&&itlt-ft*nt/2)?it>st+ft/2?1:-1:0}function _getInsertDirection($){return index(dragEl)1&&(multiDragElements.forEach(function(ot){nt.addAnimationState({target:ot,rect:folding?getRect(ot):at}),unsetRect(ot),ot.fromRect=at,tt.removeAnimationState(ot)}),folding=!1,insertMultiDragElements(!this.options.removeCloneOnHide,rt))},dragOverCompleted:function(et){var tt=et.sortable,rt=et.isOwner,nt=et.insertion,at=et.activeSortable,ot=et.parentEl,it=et.putSortable,ft=this.options;if(nt){if(rt&&at._hideClone(),initialFolding=!1,ft.animation&&multiDragElements.length>1&&(folding||!rt&&!at.options.sort&&!it)){var st=getRect(dragEl$1,!1,!0,!0);multiDragElements.forEach(function(ut){ut!==dragEl$1&&(setRect(ut,st),ot.appendChild(ut))}),folding=!0}if(!rt)if(folding||removeMultiDragElements(),multiDragElements.length>1){var lt=clonesHidden;at._showClone(tt),at.options.animation&&!clonesHidden&<&&multiDragClones.forEach(function(ut){at.addAnimationState({target:ut,rect:clonesFromRect}),ut.fromRect=clonesFromRect,ut.thisAnimationDuration=null})}else at._showClone(tt)}},dragOverAnimationCapture:function(et){var tt=et.dragRect,rt=et.isOwner,nt=et.activeSortable;if(multiDragElements.forEach(function(ot){ot.thisAnimationDuration=null}),nt.options.animation&&!rt&&nt.multiDrag.isMultiDrag){clonesFromRect=_extends$1({},tt);var at=matrix(dragEl$1,!0);clonesFromRect.top-=at.f,clonesFromRect.left-=at.e}},dragOverAnimationComplete:function(){folding&&(folding=!1,removeMultiDragElements())},drop:function(et){var tt=et.originalEvent,rt=et.rootEl,nt=et.parentEl,at=et.sortable,ot=et.dispatchSortableEvent,it=et.oldIndex,ft=et.putSortable,st=ft||this.sortable;if(tt){var lt=this.options,ut=nt.children;if(!dragStarted)if(lt.multiDragKey&&!this.multiDragKeyDown&&this._deselectMultiDrag(),toggleClass(dragEl$1,lt.selectedClass,!~multiDragElements.indexOf(dragEl$1)),~multiDragElements.indexOf(dragEl$1))multiDragElements.splice(multiDragElements.indexOf(dragEl$1),1),lastMultiDragSelect=null,dispatchEvent({sortable:at,rootEl:rt,name:"deselect",targetEl:dragEl$1,originalEvent:tt});else{if(multiDragElements.push(dragEl$1),dispatchEvent({sortable:at,rootEl:rt,name:"select",targetEl:dragEl$1,originalEvent:tt}),tt.shiftKey&&lastMultiDragSelect&&at.el.contains(lastMultiDragSelect)){var ct=index(lastMultiDragSelect),gt=index(dragEl$1);if(~ct&&~gt&&ct!==gt){var mt,ht;for(gt>ct?(ht=ct,mt=gt):(ht=gt,mt=ct+1);ht1){var pt=getRect(dragEl$1),dt=index(dragEl$1,":not(."+this.options.selectedClass+")");if(!initialFolding&<.animation&&(dragEl$1.thisAnimationDuration=null),st.captureAnimationState(),!initialFolding&&(lt.animation&&(dragEl$1.fromRect=pt,multiDragElements.forEach(function(vt){if(vt.thisAnimationDuration=null,vt!==dragEl$1){var bt=folding?getRect(vt):pt;vt.fromRect=bt,st.addAnimationState({target:vt,rect:bt})}})),removeMultiDragElements(),multiDragElements.forEach(function(vt){ut[dt]?nt.insertBefore(vt,ut[dt]):nt.appendChild(vt),dt++}),it===index(dragEl$1))){var yt=!1;multiDragElements.forEach(function(vt){if(vt.sortableIndex!==index(vt)){yt=!0;return}}),yt&&ot("update")}multiDragElements.forEach(function(vt){unsetRect(vt)}),st.animateAll()}multiDragSortable=st}(rt===nt||ft&&ft.lastPutMode!=="clone")&&multiDragClones.forEach(function(vt){vt.parentNode&&vt.parentNode.removeChild(vt)})}},nullingGlobal:function(){this.isMultiDrag=dragStarted=!1,multiDragClones.length=0},destroyGlobal:function(){this._deselectMultiDrag(),off(document,"pointerup",this._deselectMultiDrag),off(document,"mouseup",this._deselectMultiDrag),off(document,"touchend",this._deselectMultiDrag),off(document,"keydown",this._checkKeyDown),off(document,"keyup",this._checkKeyUp)},_deselectMultiDrag:function(et){if(!(typeof dragStarted<"u"&&dragStarted)&&multiDragSortable===this.sortable&&!(et&&closest(et.target,this.options.draggable,this.sortable.el,!1))&&!(et&&et.button!==0))for(;multiDragElements.length;){var tt=multiDragElements[0];toggleClass(tt,this.options.selectedClass,!1),multiDragElements.shift(),dispatchEvent({sortable:this.sortable,rootEl:this.sortable.el,name:"deselect",targetEl:tt,originalEvent:et})}},_checkKeyDown:function(et){et.key===this.options.multiDragKey&&(this.multiDragKeyDown=!0)},_checkKeyUp:function(et){et.key===this.options.multiDragKey&&(this.multiDragKeyDown=!1)}},_extends$1($,{pluginName:"multiDrag",utils:{select:function(et){var tt=et.parentNode[expando];!tt||!tt.options.multiDrag||~multiDragElements.indexOf(et)||(multiDragSortable&&multiDragSortable!==tt&&(multiDragSortable.multiDrag._deselectMultiDrag(),multiDragSortable=tt),toggleClass(et,tt.options.selectedClass,!0),multiDragElements.push(et))},deselect:function(et){var tt=et.parentNode[expando],rt=multiDragElements.indexOf(et);!tt||!tt.options.multiDrag||!~rt||(toggleClass(et,tt.options.selectedClass,!1),multiDragElements.splice(rt,1))}},eventProperties:function(){var et=this,tt=[],rt=[];return multiDragElements.forEach(function(nt){tt.push({multiDragElement:nt,index:nt.sortableIndex});var at;folding&&nt!==dragEl$1?at=-1:folding?at=index(nt,":not(."+et.options.selectedClass+")"):at=index(nt),rt.push({multiDragElement:nt,index:at})}),{items:_toConsumableArray$2(multiDragElements),clones:[].concat(multiDragClones),oldIndicies:tt,newIndicies:rt}},optionListeners:{multiDragKey:function(et){return et=et.toLowerCase(),et==="ctrl"?et="Control":et.length>1&&(et=et.charAt(0).toUpperCase()+et.substr(1)),et}}})}function insertMultiDragElements($,_e){multiDragElements.forEach(function(et,tt){var rt=_e.children[et.sortableIndex+($?Number(tt):0)];rt?_e.insertBefore(et,rt):_e.appendChild(et)})}function insertMultiDragClones($,_e){multiDragClones.forEach(function(et,tt){var rt=_e.children[et.sortableIndex+($?Number(tt):0)];rt?_e.insertBefore(et,rt):_e.appendChild(et)})}function removeMultiDragElements(){multiDragElements.forEach(function($){$!==dragEl$1&&$.parentNode&&$.parentNode.removeChild($)})}Sortable.mount(new AutoScrollPlugin);Sortable.mount(Remove,Revert);const sortable_esm=Object.freeze(Object.defineProperty({__proto__:null,MultiDrag:MultiDragPlugin,Sortable,Swap:SwapPlugin,default:Sortable},Symbol.toStringTag,{value:"Module"})),require$$0=getAugmentedNamespace(sortable_esm);var classnames={exports:{}};/*! Copyright (c) 2018 Jed Watson. Licensed under the MIT License (MIT), see http://jedwatson.github.io/classnames */(function($){(function(){var _e={}.hasOwnProperty;function et(){for(var tt=[],rt=0;rt$882b6d93070905b3$re_export$Sortable),at($.exports,"Direction",()=>$882b6d93070905b3$re_export$Direction),at($.exports,"DOMRect",()=>$882b6d93070905b3$re_export$DOMRect),at($.exports,"GroupOptions",()=>$882b6d93070905b3$re_export$GroupOptions),at($.exports,"MoveEvent",()=>$882b6d93070905b3$re_export$MoveEvent),at($.exports,"Options",()=>$882b6d93070905b3$re_export$Options),at($.exports,"PullResult",()=>$882b6d93070905b3$re_export$PullResult),at($.exports,"PutResult",()=>$882b6d93070905b3$re_export$PutResult),at($.exports,"SortableEvent",()=>$882b6d93070905b3$re_export$SortableEvent),at($.exports,"SortableOptions",()=>$882b6d93070905b3$re_export$SortableOptions),at($.exports,"Utils",()=>$882b6d93070905b3$re_export$Utils),at($.exports,"ReactSortable",()=>vt);function it(xt){xt.parentElement!==null&&xt.parentElement.removeChild(xt)}function ft(xt,wt,Et){const Lt=xt.children[Et]||null;xt.insertBefore(wt,Lt)}function st(xt){xt.forEach(wt=>it(wt.element))}function lt(xt){xt.forEach(wt=>{ft(wt.parentElement,wt.element,wt.oldIndex)})}function ut(xt,wt){const Et=ht(xt),Lt={parentElement:xt.from};let St=[];switch(Et){case"normal":St=[{element:xt.item,newIndex:xt.newIndex,oldIndex:xt.oldIndex,parentElement:xt.from}];break;case"swap":const Tt={element:xt.item,oldIndex:xt.oldIndex,newIndex:xt.newIndex,...Lt},Rt={element:xt.swapItem,oldIndex:xt.newIndex,newIndex:xt.oldIndex,...Lt};St=[Tt,Rt];break;case"multidrag":St=xt.oldIndicies.map((Bt,Gt)=>({element:Bt.multiDragElement,oldIndex:Bt.index,newIndex:xt.newIndicies[Gt].index,...Lt}));break}return pt(St,wt)}function ct(xt,wt){const Et=gt(xt,wt);return mt(xt,Et)}function gt(xt,wt){const Et=[...wt];return xt.concat().reverse().forEach(Lt=>Et.splice(Lt.oldIndex,1)),Et}function mt(xt,wt,Et,Lt){const St=[...wt];return xt.forEach(jt=>{const Nt=Lt&&Et&&Lt(jt.item,Et);St.splice(jt.newIndex,0,Nt||jt.item)}),St}function ht(xt){return xt.oldIndicies&&xt.oldIndicies.length>0?"multidrag":xt.swapItem?"swap":"normal"}function pt(xt,wt){return xt.map(Lt=>({...Lt,item:wt[Lt.oldIndex]})).sort((Lt,St)=>Lt.oldIndex-St.oldIndex)}function dt(xt){const{list:wt,setList:Et,children:Lt,tag:St,style:jt,className:Nt,clone:Tt,onAdd:Rt,onChange:Bt,onChoose:Gt,onClone:Zt,onEnd:_t,onFilter:Dt,onRemove:At,onSort:Yt,onStart:Qt,onUnchoose:nr,onUpdate:Wt,onMove:er,onSpill:Xt,onSelect:or,onDeselect:lr,...hr}=xt;return hr}const yt={dragging:null};class vt extends tt.Component{constructor(wt){super(wt),this.ref=(0,tt.createRef)();const Et=[...wt.list].map(Lt=>Object.assign(Lt,{chosen:!1,selected:!1}));wt.setList(Et,this.sortable,yt),nt(rt)(!wt.plugins,` Plugins prop is no longer supported. Instead, mount it with "Sortable.mount(new MultiDrag())" Please read the updated README.md at https://github.com/SortableJS/react-sortablejs. `)}componentDidMount(){if(this.ref.current===null)return;const wt=this.makeOptions();nt(_e).create(this.ref.current,wt)}componentDidUpdate(wt){wt.disabled!==this.props.disabled&&this.sortable&&this.sortable.option("disabled",this.props.disabled)}render(){const{tag:wt,style:Et,className:Lt,id:St}=this.props,jt={style:Et,className:Lt,id:St},Nt=!wt||wt===null?"div":wt;return(0,tt.createElement)(Nt,{ref:this.ref,...jt},this.getChildren())}getChildren(){const{children:wt,dataIdAttr:Et,selectedClass:Lt="sortable-selected",chosenClass:St="sortable-chosen",dragClass:jt="sortable-drag",fallbackClass:Nt="sortable-falback",ghostClass:Tt="sortable-ghost",swapClass:Rt="sortable-swap-highlight",filter:Bt="sortable-filter",list:Gt}=this.props;if(!wt||wt==null)return null;const Zt=Et||"data-id";return tt.Children.map(wt,(_t,Dt)=>{if(_t===void 0)return;const At=Gt[Dt]||{},{className:Yt}=_t.props,Qt=typeof Bt=="string"&&{[Bt.replace(".","")]:!!At.filtered},nr=nt(et)(Yt,{[Lt]:At.selected,[St]:At.chosen,...Qt});return(0,tt.cloneElement)(_t,{[Zt]:_t.key,className:nr})})}get sortable(){const wt=this.ref.current;if(wt===null)return null;const Et=Object.keys(wt).find(Lt=>Lt.includes("Sortable"));return Et?wt[Et]:null}makeOptions(){const wt=["onAdd","onChoose","onDeselect","onEnd","onRemove","onSelect","onSpill","onStart","onUnchoose","onUpdate"],Et=["onChange","onClone","onFilter","onSort"],Lt=dt(this.props);return wt.forEach(jt=>Lt[jt]=this.prepareOnHandlerPropAndDOM(jt)),Et.forEach(jt=>Lt[jt]=this.prepareOnHandlerProp(jt)),{...Lt,onMove:(jt,Nt)=>{const{onMove:Tt}=this.props,Rt=jt.willInsertAfter||-1;if(!Tt)return Rt;const Bt=Tt(jt,Nt,this.sortable,yt);return typeof Bt>"u"?!1:Bt}}}prepareOnHandlerPropAndDOM(wt){return Et=>{this.callOnHandlerProp(Et,wt),this[wt](Et)}}prepareOnHandlerProp(wt){return Et=>{this.callOnHandlerProp(Et,wt)}}callOnHandlerProp(wt,Et){const Lt=this.props[Et];Lt&&Lt(wt,this.sortable,yt)}onAdd(wt){const{list:Et,setList:Lt,clone:St}=this.props,jt=[...yt.dragging.props.list],Nt=ut(wt,jt);st(Nt);const Tt=mt(Nt,Et,wt,St).map(Rt=>Object.assign(Rt,{selected:!1}));Lt(Tt,this.sortable,yt)}onRemove(wt){const{list:Et,setList:Lt}=this.props,St=ht(wt),jt=ut(wt,Et);lt(jt);let Nt=[...Et];if(wt.pullMode!=="clone")Nt=gt(jt,Nt);else{let Tt=jt;switch(St){case"multidrag":Tt=jt.map((Rt,Bt)=>({...Rt,element:wt.clones[Bt]}));break;case"normal":Tt=jt.map(Rt=>({...Rt,element:wt.clone}));break;case"swap":default:nt(rt)(!0,`mode "${St}" cannot clone. Please remove "props.clone" from when using the "${St}" plugin`)}st(Tt),jt.forEach(Rt=>{const Bt=Rt.oldIndex,Gt=this.props.clone(Rt.item,wt);Nt.splice(Bt,1,Gt)})}Nt=Nt.map(Tt=>Object.assign(Tt,{selected:!1})),Lt(Nt,this.sortable,yt)}onUpdate(wt){const{list:Et,setList:Lt}=this.props,St=ut(wt,Et);st(St),lt(St);const jt=ct(St,Et);return Lt(jt,this.sortable,yt)}onStart(){yt.dragging=this}onEnd(){yt.dragging=null}onChoose(wt){const{list:Et,setList:Lt}=this.props,St=Et.map((jt,Nt)=>{let Tt=jt;return Nt===wt.oldIndex&&(Tt=Object.assign(jt,{chosen:!0})),Tt});Lt(St,this.sortable,yt)}onUnchoose(wt){const{list:Et,setList:Lt}=this.props,St=Et.map((jt,Nt)=>{let Tt=jt;return Nt===wt.oldIndex&&(Tt=Object.assign(Tt,{chosen:!1})),Tt});Lt(St,this.sortable,yt)}onSpill(wt){const{removeOnSpill:Et,revertOnSpill:Lt}=this.props;Et&&!Lt&&it(wt.item)}onSelect(wt){const{list:Et,setList:Lt}=this.props,St=Et.map(jt=>Object.assign(jt,{selected:!1}));wt.newIndicies.forEach(jt=>{const Nt=jt.index;if(Nt===-1){console.log(`"${wt.type}" had indice of "${jt.index}", which is probably -1 and doesn't usually happen here.`),console.log(wt);return}St[Nt].selected=!0}),Lt(St,this.sortable,yt)}onDeselect(wt){const{list:Et,setList:Lt}=this.props,St=Et.map(jt=>Object.assign(jt,{selected:!1}));wt.newIndicies.forEach(jt=>{const Nt=jt.index;Nt!==-1&&(St[Nt].selected=!0)}),Lt(St,this.sortable,yt)}}Or(vt,"defaultProps",{clone:wt=>wt});var bt={};ot($.exports,bt)})(dist);var distExports=dist.exports;const grid$1="_grid_r6ffd_1",drop="_drop_r6ffd_7",styles$q={grid:grid$1,drop},container$4="_container_7xrn4_1",nonDraggable="_non-draggable_7xrn4_7",sizeContainer="_size-container_7xrn4_11",image$1="_image_7xrn4_43",spinner$1="_spinner_7xrn4_52 _image_7xrn4_43",emojiPickerSpinner="_emoji-picker-spinner_7xrn4_67 _spinner_7xrn4_52 _image_7xrn4_43",guide="_guide_7xrn4_82",closeButton="_close-button_7xrn4_109",emojiButton="_emoji-button_7xrn4_133",emoji="_emoji_7xrn4_67",emojiNameInput="_emoji-name-input_7xrn4_167",artFrameStyles={container:container$4,nonDraggable,sizeContainer,image:image$1,spinner:spinner$1,emojiPickerSpinner,guide,closeButton,emojiButton,emoji,emojiNameInput};var ManagerReferenceNodeContext=reactExports.createContext(),ManagerReferenceNodeSetterContext=reactExports.createContext();function Manager($){var _e=$.children,et=reactExports.useState(null),tt=et[0],rt=et[1],nt=reactExports.useRef(!1);reactExports.useEffect(function(){return function(){nt.current=!0}},[]);var at=reactExports.useCallback(function(ot){nt.current||rt(ot)},[]);return reactExports.createElement(ManagerReferenceNodeContext.Provider,{value:tt},reactExports.createElement(ManagerReferenceNodeSetterContext.Provider,{value:at},_e))}var unwrapArray=function(_e){return Array.isArray(_e)?_e[0]:_e},safeInvoke=function(_e){if(typeof _e=="function"){for(var et=arguments.length,tt=new Array(et>1?et-1:0),rt=1;rt"u")return!1;var _e=getWindow($).ShadowRoot;return $ instanceof _e||$ instanceof ShadowRoot}function applyStyles($){var _e=$.state;Object.keys(_e.elements).forEach(function(et){var tt=_e.styles[et]||{},rt=_e.attributes[et]||{},nt=_e.elements[et];!isHTMLElement(nt)||!getNodeName(nt)||(Object.assign(nt.style,tt),Object.keys(rt).forEach(function(at){var ot=rt[at];ot===!1?nt.removeAttribute(at):nt.setAttribute(at,ot===!0?"":ot)}))})}function effect$2($){var _e=$.state,et={popper:{position:_e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(_e.elements.popper.style,et.popper),_e.styles=et,_e.elements.arrow&&Object.assign(_e.elements.arrow.style,et.arrow),function(){Object.keys(_e.elements).forEach(function(tt){var rt=_e.elements[tt],nt=_e.attributes[tt]||{},at=Object.keys(_e.styles.hasOwnProperty(tt)?_e.styles[tt]:et[tt]),ot=at.reduce(function(it,ft){return it[ft]="",it},{});!isHTMLElement(rt)||!getNodeName(rt)||(Object.assign(rt.style,ot),Object.keys(nt).forEach(function(it){rt.removeAttribute(it)}))})}}const applyStyles$1={name:"applyStyles",enabled:!0,phase:"write",fn:applyStyles,effect:effect$2,requires:["computeStyles"]};function getBasePlacement($){return $.split("-")[0]}var max=Math.max,min=Math.min,round=Math.round;function getUAString(){var $=navigator.userAgentData;return $!=null&&$.brands&&Array.isArray($.brands)?$.brands.map(function(_e){return _e.brand+"/"+_e.version}).join(" "):navigator.userAgent}function isLayoutViewport(){return!/^((?!chrome|android).)*safari/i.test(getUAString())}function getBoundingClientRect($,_e,et){_e===void 0&&(_e=!1),et===void 0&&(et=!1);var tt=$.getBoundingClientRect(),rt=1,nt=1;_e&&isHTMLElement($)&&(rt=$.offsetWidth>0&&round(tt.width)/$.offsetWidth||1,nt=$.offsetHeight>0&&round(tt.height)/$.offsetHeight||1);var at=isElement($)?getWindow($):window,ot=at.visualViewport,it=!isLayoutViewport()&&et,ft=(tt.left+(it&&ot?ot.offsetLeft:0))/rt,st=(tt.top+(it&&ot?ot.offsetTop:0))/nt,lt=tt.width/rt,ut=tt.height/nt;return{width:lt,height:ut,top:st,right:ft+lt,bottom:st+ut,left:ft,x:ft,y:st}}function getLayoutRect($){var _e=getBoundingClientRect($),et=$.offsetWidth,tt=$.offsetHeight;return Math.abs(_e.width-et)<=1&&(et=_e.width),Math.abs(_e.height-tt)<=1&&(tt=_e.height),{x:$.offsetLeft,y:$.offsetTop,width:et,height:tt}}function contains($,_e){var et=_e.getRootNode&&_e.getRootNode();if($.contains(_e))return!0;if(et&&isShadowRoot(et)){var tt=_e;do{if(tt&&$.isSameNode(tt))return!0;tt=tt.parentNode||tt.host}while(tt)}return!1}function getComputedStyle($){return getWindow($).getComputedStyle($)}function isTableElement($){return["table","td","th"].indexOf(getNodeName($))>=0}function getDocumentElement($){return((isElement($)?$.ownerDocument:$.document)||window.document).documentElement}function getParentNode($){return getNodeName($)==="html"?$:$.assignedSlot||$.parentNode||(isShadowRoot($)?$.host:null)||getDocumentElement($)}function getTrueOffsetParent($){return!isHTMLElement($)||getComputedStyle($).position==="fixed"?null:$.offsetParent}function getContainingBlock($){var _e=/firefox/i.test(getUAString()),et=/Trident/i.test(getUAString());if(et&&isHTMLElement($)){var tt=getComputedStyle($);if(tt.position==="fixed")return null}var rt=getParentNode($);for(isShadowRoot(rt)&&(rt=rt.host);isHTMLElement(rt)&&["html","body"].indexOf(getNodeName(rt))<0;){var nt=getComputedStyle(rt);if(nt.transform!=="none"||nt.perspective!=="none"||nt.contain==="paint"||["transform","perspective"].indexOf(nt.willChange)!==-1||_e&&nt.willChange==="filter"||_e&&nt.filter&&nt.filter!=="none")return rt;rt=rt.parentNode}return null}function getOffsetParent($){for(var _e=getWindow($),et=getTrueOffsetParent($);et&&isTableElement(et)&&getComputedStyle(et).position==="static";)et=getTrueOffsetParent(et);return et&&(getNodeName(et)==="html"||getNodeName(et)==="body"&&getComputedStyle(et).position==="static")?_e:et||getContainingBlock($)||_e}function getMainAxisFromPlacement($){return["top","bottom"].indexOf($)>=0?"x":"y"}function within($,_e,et){return max($,min(_e,et))}function withinMaxClamp($,_e,et){var tt=within($,_e,et);return tt>et?et:tt}function getFreshSideObject(){return{top:0,right:0,bottom:0,left:0}}function mergePaddingObject($){return Object.assign({},getFreshSideObject(),$)}function expandToHashMap($,_e){return _e.reduce(function(et,tt){return et[tt]=$,et},{})}var toPaddingObject=function(_e,et){return _e=typeof _e=="function"?_e(Object.assign({},et.rects,{placement:et.placement})):_e,mergePaddingObject(typeof _e!="number"?_e:expandToHashMap(_e,basePlacements))};function arrow$1($){var _e,et=$.state,tt=$.name,rt=$.options,nt=et.elements.arrow,at=et.modifiersData.popperOffsets,ot=getBasePlacement(et.placement),it=getMainAxisFromPlacement(ot),ft=[left,right].indexOf(ot)>=0,st=ft?"height":"width";if(!(!nt||!at)){var lt=toPaddingObject(rt.padding,et),ut=getLayoutRect(nt),ct=it==="y"?top:left,gt=it==="y"?bottom$1:right,mt=et.rects.reference[st]+et.rects.reference[it]-at[it]-et.rects.popper[st],ht=at[it]-et.rects.reference[it],pt=getOffsetParent(nt),dt=pt?it==="y"?pt.clientHeight||0:pt.clientWidth||0:0,yt=mt/2-ht/2,vt=lt[ct],bt=dt-ut[st]-lt[gt],xt=dt/2-ut[st]/2+yt,wt=within(vt,xt,bt),Et=it;et.modifiersData[tt]=(_e={},_e[Et]=wt,_e.centerOffset=wt-xt,_e)}}function effect$1($){var _e=$.state,et=$.options,tt=et.element,rt=tt===void 0?"[data-popper-arrow]":tt;rt!=null&&(typeof rt=="string"&&(rt=_e.elements.popper.querySelector(rt),!rt)||contains(_e.elements.popper,rt)&&(_e.elements.arrow=rt))}const arrow$2={name:"arrow",enabled:!0,phase:"main",fn:arrow$1,effect:effect$1,requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function getVariation($){return $.split("-")[1]}var unsetSides={top:"auto",right:"auto",bottom:"auto",left:"auto"};function roundOffsetsByDPR($,_e){var et=$.x,tt=$.y,rt=_e.devicePixelRatio||1;return{x:round(et*rt)/rt||0,y:round(tt*rt)/rt||0}}function mapToStyles($){var _e,et=$.popper,tt=$.popperRect,rt=$.placement,nt=$.variation,at=$.offsets,ot=$.position,it=$.gpuAcceleration,ft=$.adaptive,st=$.roundOffsets,lt=$.isFixed,ut=at.x,ct=ut===void 0?0:ut,gt=at.y,mt=gt===void 0?0:gt,ht=typeof st=="function"?st({x:ct,y:mt}):{x:ct,y:mt};ct=ht.x,mt=ht.y;var pt=at.hasOwnProperty("x"),dt=at.hasOwnProperty("y"),yt=left,vt=top,bt=window;if(ft){var xt=getOffsetParent(et),wt="clientHeight",Et="clientWidth";if(xt===getWindow(et)&&(xt=getDocumentElement(et),getComputedStyle(xt).position!=="static"&&ot==="absolute"&&(wt="scrollHeight",Et="scrollWidth")),xt=xt,rt===top||(rt===left||rt===right)&&nt===end){vt=bottom$1;var Lt=lt&&xt===bt&&bt.visualViewport?bt.visualViewport.height:xt[wt];mt-=Lt-tt.height,mt*=it?1:-1}if(rt===left||(rt===top||rt===bottom$1)&&nt===end){yt=right;var St=lt&&xt===bt&&bt.visualViewport?bt.visualViewport.width:xt[Et];ct-=St-tt.width,ct*=it?1:-1}}var jt=Object.assign({position:ot},ft&&unsetSides),Nt=st===!0?roundOffsetsByDPR({x:ct,y:mt},getWindow(et)):{x:ct,y:mt};if(ct=Nt.x,mt=Nt.y,it){var Tt;return Object.assign({},jt,(Tt={},Tt[vt]=dt?"0":"",Tt[yt]=pt?"0":"",Tt.transform=(bt.devicePixelRatio||1)<=1?"translate("+ct+"px, "+mt+"px)":"translate3d("+ct+"px, "+mt+"px, 0)",Tt))}return Object.assign({},jt,(_e={},_e[vt]=dt?mt+"px":"",_e[yt]=pt?ct+"px":"",_e.transform="",_e))}function computeStyles($){var _e=$.state,et=$.options,tt=et.gpuAcceleration,rt=tt===void 0?!0:tt,nt=et.adaptive,at=nt===void 0?!0:nt,ot=et.roundOffsets,it=ot===void 0?!0:ot,ft={placement:getBasePlacement(_e.placement),variation:getVariation(_e.placement),popper:_e.elements.popper,popperRect:_e.rects.popper,gpuAcceleration:rt,isFixed:_e.options.strategy==="fixed"};_e.modifiersData.popperOffsets!=null&&(_e.styles.popper=Object.assign({},_e.styles.popper,mapToStyles(Object.assign({},ft,{offsets:_e.modifiersData.popperOffsets,position:_e.options.strategy,adaptive:at,roundOffsets:it})))),_e.modifiersData.arrow!=null&&(_e.styles.arrow=Object.assign({},_e.styles.arrow,mapToStyles(Object.assign({},ft,{offsets:_e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:it})))),_e.attributes.popper=Object.assign({},_e.attributes.popper,{"data-popper-placement":_e.placement})}const computeStyles$1={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:computeStyles,data:{}};var passive={passive:!0};function effect($){var _e=$.state,et=$.instance,tt=$.options,rt=tt.scroll,nt=rt===void 0?!0:rt,at=tt.resize,ot=at===void 0?!0:at,it=getWindow(_e.elements.popper),ft=[].concat(_e.scrollParents.reference,_e.scrollParents.popper);return nt&&ft.forEach(function(st){st.addEventListener("scroll",et.update,passive)}),ot&&it.addEventListener("resize",et.update,passive),function(){nt&&ft.forEach(function(st){st.removeEventListener("scroll",et.update,passive)}),ot&&it.removeEventListener("resize",et.update,passive)}}const eventListeners={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect,data:{}};var hash$1={left:"right",right:"left",bottom:"top",top:"bottom"};function getOppositePlacement($){return $.replace(/left|right|bottom|top/g,function(_e){return hash$1[_e]})}var hash={start:"end",end:"start"};function getOppositeVariationPlacement($){return $.replace(/start|end/g,function(_e){return hash[_e]})}function getWindowScroll($){var _e=getWindow($),et=_e.pageXOffset,tt=_e.pageYOffset;return{scrollLeft:et,scrollTop:tt}}function getWindowScrollBarX($){return getBoundingClientRect(getDocumentElement($)).left+getWindowScroll($).scrollLeft}function getViewportRect($,_e){var et=getWindow($),tt=getDocumentElement($),rt=et.visualViewport,nt=tt.clientWidth,at=tt.clientHeight,ot=0,it=0;if(rt){nt=rt.width,at=rt.height;var ft=isLayoutViewport();(ft||!ft&&_e==="fixed")&&(ot=rt.offsetLeft,it=rt.offsetTop)}return{width:nt,height:at,x:ot+getWindowScrollBarX($),y:it}}function getDocumentRect($){var _e,et=getDocumentElement($),tt=getWindowScroll($),rt=(_e=$.ownerDocument)==null?void 0:_e.body,nt=max(et.scrollWidth,et.clientWidth,rt?rt.scrollWidth:0,rt?rt.clientWidth:0),at=max(et.scrollHeight,et.clientHeight,rt?rt.scrollHeight:0,rt?rt.clientHeight:0),ot=-tt.scrollLeft+getWindowScrollBarX($),it=-tt.scrollTop;return getComputedStyle(rt||et).direction==="rtl"&&(ot+=max(et.clientWidth,rt?rt.clientWidth:0)-nt),{width:nt,height:at,x:ot,y:it}}function isScrollParent($){var _e=getComputedStyle($),et=_e.overflow,tt=_e.overflowX,rt=_e.overflowY;return/auto|scroll|overlay|hidden/.test(et+rt+tt)}function getScrollParent($){return["html","body","#document"].indexOf(getNodeName($))>=0?$.ownerDocument.body:isHTMLElement($)&&isScrollParent($)?$:getScrollParent(getParentNode($))}function listScrollParents($,_e){var et;_e===void 0&&(_e=[]);var tt=getScrollParent($),rt=tt===((et=$.ownerDocument)==null?void 0:et.body),nt=getWindow(tt),at=rt?[nt].concat(nt.visualViewport||[],isScrollParent(tt)?tt:[]):tt,ot=_e.concat(at);return rt?ot:ot.concat(listScrollParents(getParentNode(at)))}function rectToClientRect($){return Object.assign({},$,{left:$.x,top:$.y,right:$.x+$.width,bottom:$.y+$.height})}function getInnerBoundingClientRect($,_e){var et=getBoundingClientRect($,!1,_e==="fixed");return et.top=et.top+$.clientTop,et.left=et.left+$.clientLeft,et.bottom=et.top+$.clientHeight,et.right=et.left+$.clientWidth,et.width=$.clientWidth,et.height=$.clientHeight,et.x=et.left,et.y=et.top,et}function getClientRectFromMixedType($,_e,et){return _e===viewport?rectToClientRect(getViewportRect($,et)):isElement(_e)?getInnerBoundingClientRect(_e,et):rectToClientRect(getDocumentRect(getDocumentElement($)))}function getClippingParents($){var _e=listScrollParents(getParentNode($)),et=["absolute","fixed"].indexOf(getComputedStyle($).position)>=0,tt=et&&isHTMLElement($)?getOffsetParent($):$;return isElement(tt)?_e.filter(function(rt){return isElement(rt)&&contains(rt,tt)&&getNodeName(rt)!=="body"}):[]}function getClippingRect($,_e,et,tt){var rt=_e==="clippingParents"?getClippingParents($):[].concat(_e),nt=[].concat(rt,[et]),at=nt[0],ot=nt.reduce(function(it,ft){var st=getClientRectFromMixedType($,ft,tt);return it.top=max(st.top,it.top),it.right=min(st.right,it.right),it.bottom=min(st.bottom,it.bottom),it.left=max(st.left,it.left),it},getClientRectFromMixedType($,at,tt));return ot.width=ot.right-ot.left,ot.height=ot.bottom-ot.top,ot.x=ot.left,ot.y=ot.top,ot}function computeOffsets($){var _e=$.reference,et=$.element,tt=$.placement,rt=tt?getBasePlacement(tt):null,nt=tt?getVariation(tt):null,at=_e.x+_e.width/2-et.width/2,ot=_e.y+_e.height/2-et.height/2,it;switch(rt){case top:it={x:at,y:_e.y-et.height};break;case bottom$1:it={x:at,y:_e.y+_e.height};break;case right:it={x:_e.x+_e.width,y:ot};break;case left:it={x:_e.x-et.width,y:ot};break;default:it={x:_e.x,y:_e.y}}var ft=rt?getMainAxisFromPlacement(rt):null;if(ft!=null){var st=ft==="y"?"height":"width";switch(nt){case start:it[ft]=it[ft]-(_e[st]/2-et[st]/2);break;case end:it[ft]=it[ft]+(_e[st]/2-et[st]/2);break}}return it}function detectOverflow($,_e){_e===void 0&&(_e={});var et=_e,tt=et.placement,rt=tt===void 0?$.placement:tt,nt=et.strategy,at=nt===void 0?$.strategy:nt,ot=et.boundary,it=ot===void 0?clippingParents:ot,ft=et.rootBoundary,st=ft===void 0?viewport:ft,lt=et.elementContext,ut=lt===void 0?popper:lt,ct=et.altBoundary,gt=ct===void 0?!1:ct,mt=et.padding,ht=mt===void 0?0:mt,pt=mergePaddingObject(typeof ht!="number"?ht:expandToHashMap(ht,basePlacements)),dt=ut===popper?reference:popper,yt=$.rects.popper,vt=$.elements[gt?dt:ut],bt=getClippingRect(isElement(vt)?vt:vt.contextElement||getDocumentElement($.elements.popper),it,st,at),xt=getBoundingClientRect($.elements.reference),wt=computeOffsets({reference:xt,element:yt,strategy:"absolute",placement:rt}),Et=rectToClientRect(Object.assign({},yt,wt)),Lt=ut===popper?Et:xt,St={top:bt.top-Lt.top+pt.top,bottom:Lt.bottom-bt.bottom+pt.bottom,left:bt.left-Lt.left+pt.left,right:Lt.right-bt.right+pt.right},jt=$.modifiersData.offset;if(ut===popper&&jt){var Nt=jt[rt];Object.keys(St).forEach(function(Tt){var Rt=[right,bottom$1].indexOf(Tt)>=0?1:-1,Bt=[top,bottom$1].indexOf(Tt)>=0?"y":"x";St[Tt]+=Nt[Bt]*Rt})}return St}function computeAutoPlacement($,_e){_e===void 0&&(_e={});var et=_e,tt=et.placement,rt=et.boundary,nt=et.rootBoundary,at=et.padding,ot=et.flipVariations,it=et.allowedAutoPlacements,ft=it===void 0?placements:it,st=getVariation(tt),lt=st?ot?variationPlacements:variationPlacements.filter(function(gt){return getVariation(gt)===st}):basePlacements,ut=lt.filter(function(gt){return ft.indexOf(gt)>=0});ut.length===0&&(ut=lt);var ct=ut.reduce(function(gt,mt){return gt[mt]=detectOverflow($,{placement:mt,boundary:rt,rootBoundary:nt,padding:at})[getBasePlacement(mt)],gt},{});return Object.keys(ct).sort(function(gt,mt){return ct[gt]-ct[mt]})}function getExpandedFallbackPlacements($){if(getBasePlacement($)===auto)return[];var _e=getOppositePlacement($);return[getOppositeVariationPlacement($),_e,getOppositeVariationPlacement(_e)]}function flip($){var _e=$.state,et=$.options,tt=$.name;if(!_e.modifiersData[tt]._skip){for(var rt=et.mainAxis,nt=rt===void 0?!0:rt,at=et.altAxis,ot=at===void 0?!0:at,it=et.fallbackPlacements,ft=et.padding,st=et.boundary,lt=et.rootBoundary,ut=et.altBoundary,ct=et.flipVariations,gt=ct===void 0?!0:ct,mt=et.allowedAutoPlacements,ht=_e.options.placement,pt=getBasePlacement(ht),dt=pt===ht,yt=it||(dt||!gt?[getOppositePlacement(ht)]:getExpandedFallbackPlacements(ht)),vt=[ht].concat(yt).reduce(function(Wt,er){return Wt.concat(getBasePlacement(er)===auto?computeAutoPlacement(_e,{placement:er,boundary:st,rootBoundary:lt,padding:ft,flipVariations:gt,allowedAutoPlacements:mt}):er)},[]),bt=_e.rects.reference,xt=_e.rects.popper,wt=new Map,Et=!0,Lt=vt[0],St=0;St=0,Bt=Rt?"width":"height",Gt=detectOverflow(_e,{placement:jt,boundary:st,rootBoundary:lt,altBoundary:ut,padding:ft}),Zt=Rt?Tt?right:left:Tt?bottom$1:top;bt[Bt]>xt[Bt]&&(Zt=getOppositePlacement(Zt));var _t=getOppositePlacement(Zt),Dt=[];if(nt&&Dt.push(Gt[Nt]<=0),ot&&Dt.push(Gt[Zt]<=0,Gt[_t]<=0),Dt.every(function(Wt){return Wt})){Lt=jt,Et=!1;break}wt.set(jt,Dt)}if(Et)for(var At=gt?3:1,Yt=function(er){var Xt=vt.find(function(or){var lr=wt.get(or);if(lr)return lr.slice(0,er).every(function(hr){return hr})});if(Xt)return Lt=Xt,"break"},Qt=At;Qt>0;Qt--){var nr=Yt(Qt);if(nr==="break")break}_e.placement!==Lt&&(_e.modifiersData[tt]._skip=!0,_e.placement=Lt,_e.reset=!0)}}const flip$1={name:"flip",enabled:!0,phase:"main",fn:flip,requiresIfExists:["offset"],data:{_skip:!1}};function getSideOffsets($,_e,et){return et===void 0&&(et={x:0,y:0}),{top:$.top-_e.height-et.y,right:$.right-_e.width+et.x,bottom:$.bottom-_e.height+et.y,left:$.left-_e.width-et.x}}function isAnySideFullyClipped($){return[top,right,bottom$1,left].some(function(_e){return $[_e]>=0})}function hide($){var _e=$.state,et=$.name,tt=_e.rects.reference,rt=_e.rects.popper,nt=_e.modifiersData.preventOverflow,at=detectOverflow(_e,{elementContext:"reference"}),ot=detectOverflow(_e,{altBoundary:!0}),it=getSideOffsets(at,tt),ft=getSideOffsets(ot,rt,nt),st=isAnySideFullyClipped(it),lt=isAnySideFullyClipped(ft);_e.modifiersData[et]={referenceClippingOffsets:it,popperEscapeOffsets:ft,isReferenceHidden:st,hasPopperEscaped:lt},_e.attributes.popper=Object.assign({},_e.attributes.popper,{"data-popper-reference-hidden":st,"data-popper-escaped":lt})}const hide$1={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:hide};function distanceAndSkiddingToXY($,_e,et){var tt=getBasePlacement($),rt=[left,top].indexOf(tt)>=0?-1:1,nt=typeof et=="function"?et(Object.assign({},_e,{placement:$})):et,at=nt[0],ot=nt[1];return at=at||0,ot=(ot||0)*rt,[left,right].indexOf(tt)>=0?{x:ot,y:at}:{x:at,y:ot}}function offset($){var _e=$.state,et=$.options,tt=$.name,rt=et.offset,nt=rt===void 0?[0,0]:rt,at=placements.reduce(function(st,lt){return st[lt]=distanceAndSkiddingToXY(lt,_e.rects,nt),st},{}),ot=at[_e.placement],it=ot.x,ft=ot.y;_e.modifiersData.popperOffsets!=null&&(_e.modifiersData.popperOffsets.x+=it,_e.modifiersData.popperOffsets.y+=ft),_e.modifiersData[tt]=at}const offset$1={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:offset};function popperOffsets($){var _e=$.state,et=$.name;_e.modifiersData[et]=computeOffsets({reference:_e.rects.reference,element:_e.rects.popper,strategy:"absolute",placement:_e.placement})}const popperOffsets$1={name:"popperOffsets",enabled:!0,phase:"read",fn:popperOffsets,data:{}};function getAltAxis($){return $==="x"?"y":"x"}function preventOverflow($){var _e=$.state,et=$.options,tt=$.name,rt=et.mainAxis,nt=rt===void 0?!0:rt,at=et.altAxis,ot=at===void 0?!1:at,it=et.boundary,ft=et.rootBoundary,st=et.altBoundary,lt=et.padding,ut=et.tether,ct=ut===void 0?!0:ut,gt=et.tetherOffset,mt=gt===void 0?0:gt,ht=detectOverflow(_e,{boundary:it,rootBoundary:ft,padding:lt,altBoundary:st}),pt=getBasePlacement(_e.placement),dt=getVariation(_e.placement),yt=!dt,vt=getMainAxisFromPlacement(pt),bt=getAltAxis(vt),xt=_e.modifiersData.popperOffsets,wt=_e.rects.reference,Et=_e.rects.popper,Lt=typeof mt=="function"?mt(Object.assign({},_e.rects,{placement:_e.placement})):mt,St=typeof Lt=="number"?{mainAxis:Lt,altAxis:Lt}:Object.assign({mainAxis:0,altAxis:0},Lt),jt=_e.modifiersData.offset?_e.modifiersData.offset[_e.placement]:null,Nt={x:0,y:0};if(xt){if(nt){var Tt,Rt=vt==="y"?top:left,Bt=vt==="y"?bottom$1:right,Gt=vt==="y"?"height":"width",Zt=xt[vt],_t=Zt+ht[Rt],Dt=Zt-ht[Bt],At=ct?-Et[Gt]/2:0,Yt=dt===start?wt[Gt]:Et[Gt],Qt=dt===start?-Et[Gt]:-wt[Gt],nr=_e.elements.arrow,Wt=ct&&nr?getLayoutRect(nr):{width:0,height:0},er=_e.modifiersData["arrow#persistent"]?_e.modifiersData["arrow#persistent"].padding:getFreshSideObject(),Xt=er[Rt],or=er[Bt],lr=within(0,wt[Gt],Wt[Gt]),hr=yt?wt[Gt]/2-At-lr-Xt-St.mainAxis:Yt-lr-Xt-St.mainAxis,Er=yt?-wt[Gt]/2+At+lr+or+St.mainAxis:Qt+lr+or+St.mainAxis,fr=_e.elements.arrow&&getOffsetParent(_e.elements.arrow),dr=fr?vt==="y"?fr.clientTop||0:fr.clientLeft||0:0,vr=(Tt=jt==null?void 0:jt[vt])!=null?Tt:0,Mr=Zt+hr-vr-dr,Lr=Zt+Er-vr,yr=within(ct?min(_t,Mr):_t,Zt,ct?max(Dt,Lr):Dt);xt[vt]=yr,Nt[vt]=yr-Zt}if(ot){var ur,Cr=vt==="x"?top:left,wr=vt==="x"?bottom$1:right,sr=xt[bt],cr=bt==="y"?"height":"width",xr=sr+ht[Cr],Sr=sr-ht[wr],kt=[top,left].indexOf(pt)!==-1,Ot=(ur=jt==null?void 0:jt[bt])!=null?ur:0,Kt=kt?xr:sr-wt[cr]-Et[cr]-Ot+St.altAxis,qt=kt?sr+wt[cr]+Et[cr]-Ot-St.altAxis:Sr,tr=ct&&kt?withinMaxClamp(Kt,sr,qt):within(ct?Kt:xr,sr,ct?qt:Sr);xt[bt]=tr,Nt[bt]=tr-sr}_e.modifiersData[tt]=Nt}}const preventOverflow$1={name:"preventOverflow",enabled:!0,phase:"main",fn:preventOverflow,requiresIfExists:["offset"]};function getHTMLElementScroll($){return{scrollLeft:$.scrollLeft,scrollTop:$.scrollTop}}function getNodeScroll($){return $===getWindow($)||!isHTMLElement($)?getWindowScroll($):getHTMLElementScroll($)}function isElementScaled($){var _e=$.getBoundingClientRect(),et=round(_e.width)/$.offsetWidth||1,tt=round(_e.height)/$.offsetHeight||1;return et!==1||tt!==1}function getCompositeRect($,_e,et){et===void 0&&(et=!1);var tt=isHTMLElement(_e),rt=isHTMLElement(_e)&&isElementScaled(_e),nt=getDocumentElement(_e),at=getBoundingClientRect($,rt,et),ot={scrollLeft:0,scrollTop:0},it={x:0,y:0};return(tt||!tt&&!et)&&((getNodeName(_e)!=="body"||isScrollParent(nt))&&(ot=getNodeScroll(_e)),isHTMLElement(_e)?(it=getBoundingClientRect(_e,!0),it.x+=_e.clientLeft,it.y+=_e.clientTop):nt&&(it.x=getWindowScrollBarX(nt))),{x:at.left+ot.scrollLeft-it.x,y:at.top+ot.scrollTop-it.y,width:at.width,height:at.height}}function order($){var _e=new Map,et=new Set,tt=[];$.forEach(function(nt){_e.set(nt.name,nt)});function rt(nt){et.add(nt.name);var at=[].concat(nt.requires||[],nt.requiresIfExists||[]);at.forEach(function(ot){if(!et.has(ot)){var it=_e.get(ot);it&&rt(it)}}),tt.push(nt)}return $.forEach(function(nt){et.has(nt.name)||rt(nt)}),tt}function orderModifiers($){var _e=order($);return modifierPhases.reduce(function(et,tt){return et.concat(_e.filter(function(rt){return rt.phase===tt}))},[])}function debounce($){var _e;return function(){return _e||(_e=new Promise(function(et){Promise.resolve().then(function(){_e=void 0,et($())})})),_e}}function mergeByName($){var _e=$.reduce(function(et,tt){var rt=et[tt.name];return et[tt.name]=rt?Object.assign({},rt,tt,{options:Object.assign({},rt.options,tt.options),data:Object.assign({},rt.data,tt.data)}):tt,et},{});return Object.keys(_e).map(function(et){return _e[et]})}var DEFAULT_OPTIONS={placement:"bottom",modifiers:[],strategy:"absolute"};function areValidElements(){for(var $=arguments.length,_e=new Array($),et=0;et<$;et++)_e[et]=arguments[et];return!_e.some(function(tt){return!(tt&&typeof tt.getBoundingClientRect=="function")})}function popperGenerator($){$===void 0&&($={});var _e=$,et=_e.defaultModifiers,tt=et===void 0?[]:et,rt=_e.defaultOptions,nt=rt===void 0?DEFAULT_OPTIONS:rt;return function(ot,it,ft){ft===void 0&&(ft=nt);var st={placement:"bottom",orderedModifiers:[],options:Object.assign({},DEFAULT_OPTIONS,nt),modifiersData:{},elements:{reference:ot,popper:it},attributes:{},styles:{}},lt=[],ut=!1,ct={state:st,setOptions:function(pt){var dt=typeof pt=="function"?pt(st.options):pt;mt(),st.options=Object.assign({},nt,st.options,dt),st.scrollParents={reference:isElement(ot)?listScrollParents(ot):ot.contextElement?listScrollParents(ot.contextElement):[],popper:listScrollParents(it)};var yt=orderModifiers(mergeByName([].concat(tt,st.options.modifiers)));return st.orderedModifiers=yt.filter(function(vt){return vt.enabled}),gt(),ct.update()},forceUpdate:function(){if(!ut){var pt=st.elements,dt=pt.reference,yt=pt.popper;if(areValidElements(dt,yt)){st.rects={reference:getCompositeRect(dt,getOffsetParent(yt),st.options.strategy==="fixed"),popper:getLayoutRect(yt)},st.reset=!1,st.placement=st.options.placement,st.orderedModifiers.forEach(function(St){return st.modifiersData[St.name]=Object.assign({},St.data)});for(var vt=0;vt{};function $8ae05eaa5c114e9c$export$7f54fc3180508a52($){const _e=reactExports.useRef(null);return $f0a04ccd8dbdd83b$export$e5c5a5f917a5871c(()=>{_e.current=$},[$]),reactExports.useCallback((...et)=>{const tt=_e.current;return tt==null?void 0:tt(...et)},[])}function $c87311424ea30a05$var$testUserAgent($){var _e;return typeof window>"u"||window.navigator==null?!1:((_e=window.navigator.userAgentData)===null||_e===void 0?void 0:_e.brands.some(et=>$.test(et.brand)))||$.test(window.navigator.userAgent)}function $c87311424ea30a05$var$testPlatform($){var _e;return typeof window<"u"&&window.navigator!=null?$.test(((_e=window.navigator.userAgentData)===null||_e===void 0?void 0:_e.platform)||window.navigator.platform):!1}function $c87311424ea30a05$var$cached($){let _e=null;return()=>(_e==null&&(_e=$()),_e)}const $c87311424ea30a05$export$9ac100e40613ea10=$c87311424ea30a05$var$cached(function(){return $c87311424ea30a05$var$testPlatform(/^Mac/i)}),$c87311424ea30a05$export$a11b0059900ceec8=$c87311424ea30a05$var$cached(function(){return $c87311424ea30a05$var$testUserAgent(/Android/i)});function $6a7db85432448f7f$export$60278871457622de($){return $.mozInputSource===0&&$.isTrusted?!0:$c87311424ea30a05$export$a11b0059900ceec8()&&$.pointerType?$.type==="click"&&$.buttons===1:$.detail===0&&!$.pointerType}const $ae1eeba8b9eafd08$export$5165eccb35aaadb5=React$2.createContext(null);$ae1eeba8b9eafd08$export$5165eccb35aaadb5.displayName="PressResponderContext";let $507fabe10e71c6fb$var$changeHandlers=new Set,$507fabe10e71c6fb$var$hasSetupGlobalListeners=!1,$507fabe10e71c6fb$var$hasEventBeforeFocus=!1,$507fabe10e71c6fb$var$hasBlurredWindowRecently=!1;function $507fabe10e71c6fb$var$triggerChangeHandlers($,_e){for(let et of $507fabe10e71c6fb$var$changeHandlers)et($,_e)}function $507fabe10e71c6fb$var$isValidKey($){return!($.metaKey||!$c87311424ea30a05$export$9ac100e40613ea10()&&$.altKey||$.ctrlKey||$.key==="Control"||$.key==="Shift"||$.key==="Meta")}function $507fabe10e71c6fb$var$handleKeyboardEvent($){$507fabe10e71c6fb$var$hasEventBeforeFocus=!0,$507fabe10e71c6fb$var$isValidKey($)&&$507fabe10e71c6fb$var$triggerChangeHandlers("keyboard",$)}function $507fabe10e71c6fb$var$handlePointerEvent($){($.type==="mousedown"||$.type==="pointerdown")&&($507fabe10e71c6fb$var$hasEventBeforeFocus=!0,$507fabe10e71c6fb$var$triggerChangeHandlers("pointer",$))}function $507fabe10e71c6fb$var$handleClickEvent($){$6a7db85432448f7f$export$60278871457622de($)&&($507fabe10e71c6fb$var$hasEventBeforeFocus=!0)}function $507fabe10e71c6fb$var$handleFocusEvent($){$.target===window||$.target===document||(!$507fabe10e71c6fb$var$hasEventBeforeFocus&&!$507fabe10e71c6fb$var$hasBlurredWindowRecently&&$507fabe10e71c6fb$var$triggerChangeHandlers("virtual",$),$507fabe10e71c6fb$var$hasEventBeforeFocus=!1,$507fabe10e71c6fb$var$hasBlurredWindowRecently=!1)}function $507fabe10e71c6fb$var$handleWindowBlur(){$507fabe10e71c6fb$var$hasEventBeforeFocus=!1,$507fabe10e71c6fb$var$hasBlurredWindowRecently=!0}function $507fabe10e71c6fb$var$setupGlobalFocusEvents(){if(typeof window>"u"||$507fabe10e71c6fb$var$hasSetupGlobalListeners)return;let $=HTMLElement.prototype.focus;HTMLElement.prototype.focus=function(){$507fabe10e71c6fb$var$hasEventBeforeFocus=!0,$.apply(this,arguments)},document.addEventListener("keydown",$507fabe10e71c6fb$var$handleKeyboardEvent,!0),document.addEventListener("keyup",$507fabe10e71c6fb$var$handleKeyboardEvent,!0),document.addEventListener("click",$507fabe10e71c6fb$var$handleClickEvent,!0),window.addEventListener("focus",$507fabe10e71c6fb$var$handleFocusEvent,!0),window.addEventListener("blur",$507fabe10e71c6fb$var$handleWindowBlur,!1),typeof PointerEvent<"u"?(document.addEventListener("pointerdown",$507fabe10e71c6fb$var$handlePointerEvent,!0),document.addEventListener("pointermove",$507fabe10e71c6fb$var$handlePointerEvent,!0),document.addEventListener("pointerup",$507fabe10e71c6fb$var$handlePointerEvent,!0)):(document.addEventListener("mousedown",$507fabe10e71c6fb$var$handlePointerEvent,!0),document.addEventListener("mousemove",$507fabe10e71c6fb$var$handlePointerEvent,!0),document.addEventListener("mouseup",$507fabe10e71c6fb$var$handlePointerEvent,!0)),$507fabe10e71c6fb$var$hasSetupGlobalListeners=!0}typeof document<"u"&&(document.readyState!=="loading"?$507fabe10e71c6fb$var$setupGlobalFocusEvents():document.addEventListener("DOMContentLoaded",$507fabe10e71c6fb$var$setupGlobalFocusEvents));function $e0b6e0b68ec7f50f$export$872b660ac5a1ff98($){let{ref:_e,onInteractOutside:et,isDisabled:tt,onInteractOutsideStart:rt}=$,nt=reactExports.useRef({isPointerDown:!1,ignoreEmulatedMouseEvents:!1}),at=$8ae05eaa5c114e9c$export$7f54fc3180508a52(it=>{et&&$e0b6e0b68ec7f50f$var$isValidEvent(it,_e)&&(rt&&rt(it),nt.current.isPointerDown=!0)}),ot=$8ae05eaa5c114e9c$export$7f54fc3180508a52(it=>{et&&et(it)});reactExports.useEffect(()=>{let it=nt.current;if(!tt)if(typeof PointerEvent<"u"){let ft=st=>{it.isPointerDown&&$e0b6e0b68ec7f50f$var$isValidEvent(st,_e)&&ot(st),it.isPointerDown=!1};return document.addEventListener("pointerdown",at,!0),document.addEventListener("pointerup",ft,!0),()=>{document.removeEventListener("pointerdown",at,!0),document.removeEventListener("pointerup",ft,!0)}}else{let ft=lt=>{it.ignoreEmulatedMouseEvents?it.ignoreEmulatedMouseEvents=!1:it.isPointerDown&&$e0b6e0b68ec7f50f$var$isValidEvent(lt,_e)&&ot(lt),it.isPointerDown=!1},st=lt=>{it.ignoreEmulatedMouseEvents=!0,it.isPointerDown&&$e0b6e0b68ec7f50f$var$isValidEvent(lt,_e)&&ot(lt),it.isPointerDown=!1};return document.addEventListener("mousedown",at,!0),document.addEventListener("mouseup",ft,!0),document.addEventListener("touchstart",at,!0),document.addEventListener("touchend",st,!0),()=>{document.removeEventListener("mousedown",at,!0),document.removeEventListener("mouseup",ft,!0),document.removeEventListener("touchstart",at,!0),document.removeEventListener("touchend",st,!0)}}},[_e,tt,at,ot])}function $e0b6e0b68ec7f50f$var$isValidEvent($,_e){if($.button>0)return!1;if($.target){const et=$.target.ownerDocument;if(!et||!et.documentElement.contains($.target)||$.target.closest("[data-react-aria-top-layer]"))return!1}return _e.current&&!_e.current.contains($.target)}const AddEmoji=reactExports.memo(function(){return jsx("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",children:jsx("path",{d:"M14 21a8.91 8.91 0 0 1-6.545-2.823l1.09-1.029A7.43 7.43 0 0 0 14 19.5a7.5 7.5 0 0 0 0-15 7.432 7.432 0 0 0-5.455 2.352l-1.09-1.029A8.912 8.912 0 0 1 14 3a9 9 0 0 1 0 18Zm4.608-5.812a.749.749 0 1 0-1.216-.876 4.267 4.267 0 0 1-6.786.015.748.748 0 0 0-1.245.05.75.75 0 0 0 .033.832 5.762 5.762 0 0 0 9.214-.021ZM11.25 8.75A1.476 1.476 0 0 0 10 10.375 1.477 1.477 0 0 0 11.25 12a1.476 1.476 0 0 0 1.25-1.625 1.476 1.476 0 0 0-1.25-1.625Zm5.5 0a1.476 1.476 0 0 0-1.25 1.625A1.476 1.476 0 0 0 16.75 12 1.476 1.476 0 0 0 18 10.375a1.476 1.476 0 0 0-1.25-1.625ZM8 11.25H4.75V8h-1.5v3.25H0v1.5h3.25V16h1.5v-3.25H8v-1.5Z"})})}),base$7="_base_x5rel_1",text$3="_text_x5rel_19",standalone="_standalone_x5rel_35 _base_x5rel_1",active="_active_x5rel_51 _standalone_x5rel_35 _base_x5rel_1",styles$p={base:base$7,text:text$3,standalone,active};class APIError extends Error{constructor(_e,et){super(_e),this.errorMessageI18nKey=et}}async function upload($,{onProgress:_e}){const{encryptedManifest:et,encryptedImages:tt,key:rt}=$,nt=await window.uploadStickerPack(et,tt,_e);return window.installStickerPack(nt,rt),{key:rt,packId:nt}}function getFilePath($){return window.getFilePath($)}var propTypes={exports:{}},ReactPropTypesSecret$1="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED",ReactPropTypesSecret_1=ReactPropTypesSecret$1,ReactPropTypesSecret=ReactPropTypesSecret_1;function emptyFunction(){}function emptyFunctionWithReset(){}emptyFunctionWithReset.resetWarningCache=emptyFunction;var factoryWithThrowingShims=function(){function $(tt,rt,nt,at,ot,it){if(it!==ReactPropTypesSecret){var ft=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw ft.name="Invariant Violation",ft}}$.isRequired=$;function _e(){return $}var et={array:$,bigint:$,bool:$,func:$,number:$,object:$,string:$,symbol:$,any:$,arrayOf:_e,element:$,elementType:$,instanceOf:_e,node:$,objectOf:_e,oneOf:_e,oneOfType:_e,shape:_e,exact:_e,checkPropTypes:emptyFunctionWithReset,resetWarningCache:emptyFunction};return et.PropTypes=et,et};propTypes.exports=factoryWithThrowingShims();var propTypesExports=propTypes.exports;const PropTypes=getDefaultExportFromCjs(propTypesExports);var COMMON_MIME_TYPES=new Map([["aac","audio/aac"],["abw","application/x-abiword"],["arc","application/x-freearc"],["avif","image/avif"],["avi","video/x-msvideo"],["azw","application/vnd.amazon.ebook"],["bin","application/octet-stream"],["bmp","image/bmp"],["bz","application/x-bzip"],["bz2","application/x-bzip2"],["cda","application/x-cdf"],["csh","application/x-csh"],["css","text/css"],["csv","text/csv"],["doc","application/msword"],["docx","application/vnd.openxmlformats-officedocument.wordprocessingml.document"],["eot","application/vnd.ms-fontobject"],["epub","application/epub+zip"],["gz","application/gzip"],["gif","image/gif"],["heic","image/heic"],["heif","image/heif"],["htm","text/html"],["html","text/html"],["ico","image/vnd.microsoft.icon"],["ics","text/calendar"],["jar","application/java-archive"],["jpeg","image/jpeg"],["jpg","image/jpeg"],["js","text/javascript"],["json","application/json"],["jsonld","application/ld+json"],["mid","audio/midi"],["midi","audio/midi"],["mjs","text/javascript"],["mp3","audio/mpeg"],["mp4","video/mp4"],["mpeg","video/mpeg"],["mpkg","application/vnd.apple.installer+xml"],["odp","application/vnd.oasis.opendocument.presentation"],["ods","application/vnd.oasis.opendocument.spreadsheet"],["odt","application/vnd.oasis.opendocument.text"],["oga","audio/ogg"],["ogv","video/ogg"],["ogx","application/ogg"],["opus","audio/opus"],["otf","font/otf"],["png","image/png"],["pdf","application/pdf"],["php","application/x-httpd-php"],["ppt","application/vnd.ms-powerpoint"],["pptx","application/vnd.openxmlformats-officedocument.presentationml.presentation"],["rar","application/vnd.rar"],["rtf","application/rtf"],["sh","application/x-sh"],["svg","image/svg+xml"],["swf","application/x-shockwave-flash"],["tar","application/x-tar"],["tif","image/tiff"],["tiff","image/tiff"],["ts","video/mp2t"],["ttf","font/ttf"],["txt","text/plain"],["vsd","application/vnd.visio"],["wav","audio/wav"],["weba","audio/webm"],["webm","video/webm"],["webp","image/webp"],["woff","font/woff"],["woff2","font/woff2"],["xhtml","application/xhtml+xml"],["xls","application/vnd.ms-excel"],["xlsx","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"],["xml","application/xml"],["xul","application/vnd.mozilla.xul+xml"],["zip","application/zip"],["7z","application/x-7z-compressed"],["mkv","video/x-matroska"],["mov","video/quicktime"],["msg","application/vnd.ms-outlook"]]);function toFileWithPath($,_e){var et=withMimeType($);if(typeof et.path!="string"){var tt=$.webkitRelativePath;Object.defineProperty(et,"path",{value:typeof _e=="string"?_e:typeof tt=="string"&&tt.length>0?tt:$.name,writable:!1,configurable:!1,enumerable:!0})}return et}function withMimeType($){var _e=$.name,et=_e&&_e.lastIndexOf(".")!==-1;if(et&&!$.type){var tt=_e.split(".").pop().toLowerCase(),rt=COMMON_MIME_TYPES.get(tt);rt&&Object.defineProperty($,"type",{value:rt,writable:!1,configurable:!1,enumerable:!0})}return $}var FILES_TO_IGNORE=[".DS_Store","Thumbs.db"];function fromEvent($){return __awaiter(this,void 0,void 0,function(){return __generator(this,function(_e){return isObject($)&&isDataTransfer($.dataTransfer)?[2,getDataTransferFiles($.dataTransfer,$.type)]:isChangeEvt($)?[2,getInputFiles($)]:Array.isArray($)&&$.every(function(et){return"getFile"in et&&typeof et.getFile=="function"})?[2,getFsHandleFiles($)]:[2,[]]})})}function isDataTransfer($){return isObject($)}function isChangeEvt($){return isObject($)&&isObject($.target)}function isObject($){return typeof $=="object"&&$!==null}function getInputFiles($){return fromList($.target.files).map(function(_e){return toFileWithPath(_e)})}function getFsHandleFiles($){return __awaiter(this,void 0,void 0,function(){var _e;return __generator(this,function(et){switch(et.label){case 0:return[4,Promise.all($.map(function(tt){return tt.getFile()}))];case 1:return _e=et.sent(),[2,_e.map(function(tt){return toFileWithPath(tt)})]}})})}function getDataTransferFiles($,_e){return __awaiter(this,void 0,void 0,function(){var et,tt;return __generator(this,function(rt){switch(rt.label){case 0:return $.items?(et=fromList($.items).filter(function(nt){return nt.kind==="file"}),_e!=="drop"?[2,et]:[4,Promise.all(et.map(toFilePromises))]):[3,2];case 1:return tt=rt.sent(),[2,noIgnoredFiles(flatten(tt))];case 2:return[2,noIgnoredFiles(fromList($.files).map(function(nt){return toFileWithPath(nt)}))]}})})}function noIgnoredFiles($){return $.filter(function(_e){return FILES_TO_IGNORE.indexOf(_e.name)===-1})}function fromList($){if($===null)return[];for(var _e=[],et=0;et<$.length;et++){var tt=$[et];_e.push(tt)}return _e}function toFilePromises($){if(typeof $.webkitGetAsEntry!="function")return fromDataTransferItem($);var _e=$.webkitGetAsEntry();return _e&&_e.isDirectory?fromDirEntry(_e):fromDataTransferItem($)}function flatten($){return $.reduce(function(_e,et){return __spreadArray(__spreadArray([],__read(_e),!1),__read(Array.isArray(et)?flatten(et):[et]),!1)},[])}function fromDataTransferItem($){var _e=$.getAsFile();if(!_e)return Promise.reject("".concat($," is not a File"));var et=toFileWithPath(_e);return Promise.resolve(et)}function fromEntry($){return __awaiter(this,void 0,void 0,function(){return __generator(this,function(_e){return[2,$.isDirectory?fromDirEntry($):fromFileEntry($)]})})}function fromDirEntry($){var _e=$.createReader();return new Promise(function(et,tt){var rt=[];function nt(){var at=this;_e.readEntries(function(ot){return __awaiter(at,void 0,void 0,function(){var it,ft,st;return __generator(this,function(lt){switch(lt.label){case 0:if(ot.length)return[3,5];lt.label=1;case 1:return lt.trys.push([1,3,,4]),[4,Promise.all(rt)];case 2:return it=lt.sent(),et(it),[3,4];case 3:return ft=lt.sent(),tt(ft),[3,4];case 4:return[3,6];case 5:st=Promise.all(ot.map(fromEntry)),rt.push(st),nt(),lt.label=6;case 6:return[2]}})})},function(ot){tt(ot)})}nt()})}function fromFileEntry($){return __awaiter(this,void 0,void 0,function(){return __generator(this,function(_e){return[2,new Promise(function(et,tt){$.file(function(rt){var nt=toFileWithPath(rt,$.fullPath);et(nt)},function(rt){tt(rt)})})]})})}var _default=function($,_e){if($&&_e){var et=Array.isArray(_e)?_e:_e.split(",");if(et.length===0)return!0;var tt=$.name||"",rt=($.type||"").toLowerCase(),nt=rt.replace(/\/.*$/,"");return et.some(function(at){var ot=at.trim().toLowerCase();return ot.charAt(0)==="."?tt.toLowerCase().endsWith(ot):ot.endsWith("/*")?nt===ot.replace(/\/.*$/,""):rt===ot})}return!0};function _toConsumableArray$1($){return _arrayWithoutHoles$1($)||_iterableToArray$1($)||_unsupportedIterableToArray$2($)||_nonIterableSpread$1()}function _nonIterableSpread$1(){throw new TypeError(`Invalid attempt to spread non-iterable instance. In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function _iterableToArray$1($){if(typeof Symbol<"u"&&$[Symbol.iterator]!=null||$["@@iterator"]!=null)return Array.from($)}function _arrayWithoutHoles$1($){if(Array.isArray($))return _arrayLikeToArray$2($)}function ownKeys$1($,_e){var et=Object.keys($);if(Object.getOwnPropertySymbols){var tt=Object.getOwnPropertySymbols($);_e&&(tt=tt.filter(function(rt){return Object.getOwnPropertyDescriptor($,rt).enumerable})),et.push.apply(et,tt)}return et}function _objectSpread$1($){for(var _e=1;_e$.length)&&(_e=$.length);for(var et=0,tt=new Array(_e);et<_e;et++)tt[et]=$[et];return tt}function _iterableToArrayLimit$1($,_e){var et=$==null?null:typeof Symbol<"u"&&$[Symbol.iterator]||$["@@iterator"];if(et!=null){var tt=[],rt=!0,nt=!1,at,ot;try{for(et=et.call($);!(rt=(at=et.next()).done)&&(tt.push(at.value),!(_e&&tt.length===_e));rt=!0);}catch(it){nt=!0,ot=it}finally{try{!rt&&et.return!=null&&et.return()}finally{if(nt)throw ot}}return tt}}function _arrayWithHoles$1($){if(Array.isArray($))return $}var FILE_INVALID_TYPE="file-invalid-type",FILE_TOO_LARGE="file-too-large",FILE_TOO_SMALL="file-too-small",TOO_MANY_FILES="too-many-files",getInvalidTypeRejectionErr=function(_e){_e=Array.isArray(_e)&&_e.length===1?_e[0]:_e;var et=Array.isArray(_e)?"one of ".concat(_e.join(", ")):_e;return{code:FILE_INVALID_TYPE,message:"File type must be ".concat(et)}},getTooLargeRejectionErr=function(_e){return{code:FILE_TOO_LARGE,message:"File is larger than ".concat(_e," ").concat(_e===1?"byte":"bytes")}},getTooSmallRejectionErr=function(_e){return{code:FILE_TOO_SMALL,message:"File is smaller than ".concat(_e," ").concat(_e===1?"byte":"bytes")}},TOO_MANY_FILES_REJECTION={code:TOO_MANY_FILES,message:"Too many files"};function fileAccepted($,_e){var et=$.type==="application/x-moz-file"||_default($,_e);return[et,et?null:getInvalidTypeRejectionErr(_e)]}function fileMatchSize($,_e,et){if(isDefined($.size))if(isDefined(_e)&&isDefined(et)){if($.size>et)return[!1,getTooLargeRejectionErr(et)];if($.size<_e)return[!1,getTooSmallRejectionErr(_e)]}else{if(isDefined(_e)&&$.size<_e)return[!1,getTooSmallRejectionErr(_e)];if(isDefined(et)&&$.size>et)return[!1,getTooLargeRejectionErr(et)]}return[!0,null]}function isDefined($){return $!=null}function allFilesAccepted($){var _e=$.files,et=$.accept,tt=$.minSize,rt=$.maxSize,nt=$.multiple,at=$.maxFiles,ot=$.validator;return!nt&&_e.length>1||nt&&at>=1&&_e.length>at?!1:_e.every(function(it){var ft=fileAccepted(it,et),st=_slicedToArray$1(ft,1),lt=st[0],ut=fileMatchSize(it,tt,rt),ct=_slicedToArray$1(ut,1),gt=ct[0],mt=ot?ot(it):null;return lt&>&&!mt})}function isPropagationStopped($){return typeof $.isPropagationStopped=="function"?$.isPropagationStopped():typeof $.cancelBubble<"u"?$.cancelBubble:!1}function isEvtWithFiles($){return $.dataTransfer?Array.prototype.some.call($.dataTransfer.types,function(_e){return _e==="Files"||_e==="application/x-moz-file"}):!!$.target&&!!$.target.files}function onDocumentDragOver($){$.preventDefault()}function isIe($){return $.indexOf("MSIE")!==-1||$.indexOf("Trident/")!==-1}function isEdge($){return $.indexOf("Edge/")!==-1}function isIeOrEdge(){var $=arguments.length>0&&arguments[0]!==void 0?arguments[0]:window.navigator.userAgent;return isIe($)||isEdge($)}function composeEventHandlers(){for(var $=arguments.length,_e=new Array($),et=0;et<$;et++)_e[et]=arguments[et];return function(tt){for(var rt=arguments.length,nt=new Array(rt>1?rt-1:0),at=1;at$.length)&&(_e=$.length);for(var et=0,tt=new Array(_e);et<_e;et++)tt[et]=$[et];return tt}function _iterableToArrayLimit($,_e){var et=$==null?null:typeof Symbol<"u"&&$[Symbol.iterator]||$["@@iterator"];if(et!=null){var tt=[],rt=!0,nt=!1,at,ot;try{for(et=et.call($);!(rt=(at=et.next()).done)&&(tt.push(at.value),!(_e&&tt.length===_e));rt=!0);}catch(it){nt=!0,ot=it}finally{try{!rt&&et.return!=null&&et.return()}finally{if(nt)throw ot}}return tt}}function _arrayWithHoles($){if(Array.isArray($))return $}function ownKeys($,_e){var et=Object.keys($);if(Object.getOwnPropertySymbols){var tt=Object.getOwnPropertySymbols($);_e&&(tt=tt.filter(function(rt){return Object.getOwnPropertyDescriptor($,rt).enumerable})),et.push.apply(et,tt)}return et}function _objectSpread($){for(var _e=1;_e=0)&&Object.prototype.propertyIsEnumerable.call($,tt)&&(et[tt]=$[tt])}return et}function _objectWithoutPropertiesLoose$1($,_e){if($==null)return{};var et={},tt=Object.keys($),rt,nt;for(nt=0;nt=0)&&(et[rt]=$[rt]);return et}var Dropzone=reactExports.forwardRef(function($,_e){var et=$.children,tt=_objectWithoutProperties($,_excluded$2),rt=useDropzone(tt),nt=rt.open,at=_objectWithoutProperties(rt,_excluded2);return reactExports.useImperativeHandle(_e,function(){return{open:nt}},[nt]),React$2.createElement(reactExports.Fragment,null,et(_objectSpread(_objectSpread({},at),{},{open:nt})))});Dropzone.displayName="Dropzone";var defaultProps={disabled:!1,getFilesFromEvent:fromEvent,maxSize:1/0,minSize:0,multiple:!0,maxFiles:0,preventDropOnDocument:!0,noClick:!1,noKeyboard:!1,noDrag:!1,noDragEventsBubbling:!1,validator:null,useFsAccessApi:!0,autoFocus:!1};Dropzone.defaultProps=defaultProps;Dropzone.propTypes={children:PropTypes.func,accept:PropTypes.objectOf(PropTypes.arrayOf(PropTypes.string)),multiple:PropTypes.bool,preventDropOnDocument:PropTypes.bool,noClick:PropTypes.bool,noKeyboard:PropTypes.bool,noDrag:PropTypes.bool,noDragEventsBubbling:PropTypes.bool,minSize:PropTypes.number,maxSize:PropTypes.number,maxFiles:PropTypes.number,disabled:PropTypes.bool,getFilesFromEvent:PropTypes.func,onFileDialogCancel:PropTypes.func,onFileDialogOpen:PropTypes.func,useFsAccessApi:PropTypes.bool,autoFocus:PropTypes.bool,onDragEnter:PropTypes.func,onDragLeave:PropTypes.func,onDragOver:PropTypes.func,onDrop:PropTypes.func,onDropAccepted:PropTypes.func,onDropRejected:PropTypes.func,onError:PropTypes.func,validator:PropTypes.func};var initialState={isFocused:!1,isFileDialogActive:!1,isDragActive:!1,isDragAccept:!1,isDragReject:!1,acceptedFiles:[],fileRejections:[]};function useDropzone(){var $=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},_e=_objectSpread(_objectSpread({},defaultProps),$),et=_e.accept,tt=_e.disabled,rt=_e.getFilesFromEvent,nt=_e.maxSize,at=_e.minSize,ot=_e.multiple,it=_e.maxFiles,ft=_e.onDragEnter,st=_e.onDragLeave,lt=_e.onDragOver,ut=_e.onDrop,ct=_e.onDropAccepted,gt=_e.onDropRejected,mt=_e.onFileDialogCancel,ht=_e.onFileDialogOpen,pt=_e.useFsAccessApi,dt=_e.autoFocus,yt=_e.preventDropOnDocument,vt=_e.noClick,bt=_e.noKeyboard,xt=_e.noDrag,wt=_e.noDragEventsBubbling,Et=_e.onError,Lt=_e.validator,St=reactExports.useMemo(function(){return acceptPropAsAcceptAttr(et)},[et]),jt=reactExports.useMemo(function(){return pickerOptionsFromAccept(et)},[et]),Nt=reactExports.useMemo(function(){return typeof ht=="function"?ht:noop$1},[ht]),Tt=reactExports.useMemo(function(){return typeof mt=="function"?mt:noop$1},[mt]),Rt=reactExports.useRef(null),Bt=reactExports.useRef(null),Gt=reactExports.useReducer(reducer,initialState),Zt=_slicedToArray(Gt,2),_t=Zt[0],Dt=Zt[1],At=_t.isFocused,Yt=_t.isFileDialogActive,Qt=reactExports.useRef(typeof window<"u"&&window.isSecureContext&&pt&&canUseFileSystemAccessAPI()),nr=function(){!Qt.current&&Yt&&setTimeout(function(){if(Bt.current){var Ot=Bt.current.files;Ot.length||(Dt({type:"closeDialog"}),Tt())}},300)};reactExports.useEffect(function(){return window.addEventListener("focus",nr,!1),function(){window.removeEventListener("focus",nr,!1)}},[Bt,Yt,Tt,Qt]);var Wt=reactExports.useRef([]),er=function(Ot){Rt.current&&Rt.current.contains(Ot.target)||(Ot.preventDefault(),Wt.current=[])};reactExports.useEffect(function(){return yt&&(document.addEventListener("dragover",onDocumentDragOver,!1),document.addEventListener("drop",er,!1)),function(){yt&&(document.removeEventListener("dragover",onDocumentDragOver),document.removeEventListener("drop",er))}},[Rt,yt]),reactExports.useEffect(function(){return!tt&&dt&&Rt.current&&Rt.current.focus(),function(){}},[Rt,dt,tt]);var Xt=reactExports.useCallback(function(kt){Et?Et(kt):console.error(kt)},[Et]),or=reactExports.useCallback(function(kt){kt.preventDefault(),kt.persist(),sr(kt),Wt.current=[].concat(_toConsumableArray(Wt.current),[kt.target]),isEvtWithFiles(kt)&&Promise.resolve(rt(kt)).then(function(Ot){if(!(isPropagationStopped(kt)&&!wt)){var Kt=Ot.length,qt=Kt>0&&allFilesAccepted({files:Ot,accept:St,minSize:at,maxSize:nt,multiple:ot,maxFiles:it,validator:Lt}),tr=Kt>0&&!qt;Dt({isDragAccept:qt,isDragReject:tr,isDragActive:!0,type:"setDraggedFiles"}),ft&&ft(kt)}}).catch(function(Ot){return Xt(Ot)})},[rt,ft,Xt,wt,St,at,nt,ot,it,Lt]),lr=reactExports.useCallback(function(kt){kt.preventDefault(),kt.persist(),sr(kt);var Ot=isEvtWithFiles(kt);if(Ot&&kt.dataTransfer)try{kt.dataTransfer.dropEffect="copy"}catch{}return Ot&<&<(kt),!1},[lt,wt]),hr=reactExports.useCallback(function(kt){kt.preventDefault(),kt.persist(),sr(kt);var Ot=Wt.current.filter(function(qt){return Rt.current&&Rt.current.contains(qt)}),Kt=Ot.indexOf(kt.target);Kt!==-1&&Ot.splice(Kt,1),Wt.current=Ot,!(Ot.length>0)&&(Dt({type:"setDraggedFiles",isDragActive:!1,isDragAccept:!1,isDragReject:!1}),isEvtWithFiles(kt)&&st&&st(kt))},[Rt,st,wt]),Er=reactExports.useCallback(function(kt,Ot){var Kt=[],qt=[];kt.forEach(function(tr){var Mt=fileAccepted(tr,St),Ct=_slicedToArray(Mt,2),It=Ct[0],Pt=Ct[1],$t=fileMatchSize(tr,at,nt),Ft=_slicedToArray($t,2),Ut=Ft[0],Ht=Ft[1],zt=Lt?Lt(tr):null;if(It&&Ut&&!zt)Kt.push(tr);else{var Jt=[Pt,Ht];zt&&(Jt=Jt.concat(zt)),qt.push({file:tr,errors:Jt.filter(function(Vt){return Vt})})}}),(!ot&&Kt.length>1||ot&&it>=1&&Kt.length>it)&&(Kt.forEach(function(tr){qt.push({file:tr,errors:[TOO_MANY_FILES_REJECTION]})}),Kt.splice(0)),Dt({acceptedFiles:Kt,fileRejections:qt,type:"setFiles"}),ut&&ut(Kt,qt,Ot),qt.length>0&>&>(qt,Ot),Kt.length>0&&ct&&ct(Kt,Ot)},[Dt,ot,St,at,nt,it,ut,ct,gt,Lt]),fr=reactExports.useCallback(function(kt){kt.preventDefault(),kt.persist(),sr(kt),Wt.current=[],isEvtWithFiles(kt)&&Promise.resolve(rt(kt)).then(function(Ot){isPropagationStopped(kt)&&!wt||Er(Ot,kt)}).catch(function(Ot){return Xt(Ot)}),Dt({type:"reset"})},[rt,Er,Xt,wt]),dr=reactExports.useCallback(function(){if(Qt.current){Dt({type:"openDialog"}),Nt();var kt={multiple:ot,types:jt};window.showOpenFilePicker(kt).then(function(Ot){return rt(Ot)}).then(function(Ot){Er(Ot,null),Dt({type:"closeDialog"})}).catch(function(Ot){isAbort(Ot)?(Tt(Ot),Dt({type:"closeDialog"})):isSecurityError(Ot)?(Qt.current=!1,Bt.current?(Bt.current.value=null,Bt.current.click()):Xt(new Error("Cannot open the file picker because the https://developer.mozilla.org/en-US/docs/Web/API/File_System_Access_API is not supported and no was provided."))):Xt(Ot)});return}Bt.current&&(Dt({type:"openDialog"}),Nt(),Bt.current.value=null,Bt.current.click())},[Dt,Nt,Tt,pt,Er,Xt,jt,ot]),vr=reactExports.useCallback(function(kt){!Rt.current||!Rt.current.isEqualNode(kt.target)||(kt.key===" "||kt.key==="Enter"||kt.keyCode===32||kt.keyCode===13)&&(kt.preventDefault(),dr())},[Rt,dr]),Mr=reactExports.useCallback(function(){Dt({type:"focus"})},[]),Lr=reactExports.useCallback(function(){Dt({type:"blur"})},[]),yr=reactExports.useCallback(function(){vt||(isIeOrEdge()?setTimeout(dr,0):dr())},[vt,dr]),ur=function(Ot){return tt?null:Ot},Cr=function(Ot){return bt?null:ur(Ot)},wr=function(Ot){return xt?null:ur(Ot)},sr=function(Ot){wt&&Ot.stopPropagation()},cr=reactExports.useMemo(function(){return function(){var kt=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},Ot=kt.refKey,Kt=Ot===void 0?"ref":Ot,qt=kt.role,tr=kt.onKeyDown,Mt=kt.onFocus,Ct=kt.onBlur,It=kt.onClick,Pt=kt.onDragEnter,$t=kt.onDragOver,Ft=kt.onDragLeave,Ut=kt.onDrop,Ht=_objectWithoutProperties(kt,_excluded3);return _objectSpread(_objectSpread(_defineProperty({onKeyDown:Cr(composeEventHandlers(tr,vr)),onFocus:Cr(composeEventHandlers(Mt,Mr)),onBlur:Cr(composeEventHandlers(Ct,Lr)),onClick:ur(composeEventHandlers(It,yr)),onDragEnter:wr(composeEventHandlers(Pt,or)),onDragOver:wr(composeEventHandlers($t,lr)),onDragLeave:wr(composeEventHandlers(Ft,hr)),onDrop:wr(composeEventHandlers(Ut,fr)),role:typeof qt=="string"&&qt!==""?qt:"presentation"},Kt,Rt),!tt&&!bt?{tabIndex:0}:{}),Ht)}},[Rt,vr,Mr,Lr,yr,or,lr,hr,fr,bt,xt,tt]),xr=reactExports.useCallback(function(kt){kt.stopPropagation()},[]),Sr=reactExports.useMemo(function(){return function(){var kt=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},Ot=kt.refKey,Kt=Ot===void 0?"ref":Ot,qt=kt.onChange,tr=kt.onClick,Mt=_objectWithoutProperties(kt,_excluded4),Ct=_defineProperty({accept:St,multiple:ot,type:"file",style:{display:"none"},onChange:ur(composeEventHandlers(qt,fr)),onClick:ur(composeEventHandlers(tr,xr)),tabIndex:-1},Kt,Bt);return _objectSpread(_objectSpread({},Ct),Mt)}},[Bt,et,ot,fr,tt]);return _objectSpread(_objectSpread({},_t),{},{isFocused:At&&!tt,getRootProps:cr,getInputProps:Sr,rootRef:Rt,inputRef:Bt,open:ur(dr)})}function reducer($,_e){switch(_e.type){case"focus":return _objectSpread(_objectSpread({},$),{},{isFocused:!0});case"blur":return _objectSpread(_objectSpread({},$),{},{isFocused:!1});case"openDialog":return _objectSpread(_objectSpread({},initialState),{},{isFileDialogActive:!0});case"closeDialog":return _objectSpread(_objectSpread({},$),{},{isFileDialogActive:!1});case"setDraggedFiles":return _objectSpread(_objectSpread({},$),{},{isDragActive:_e.isDragActive,isDragAccept:_e.isDragAccept,isDragReject:_e.isDragReject});case"setFiles":return _objectSpread(_objectSpread({},$),{},{acceptedFiles:_e.acceptedFiles,fileRejections:_e.fileRejections});case"reset":return _objectSpread({},initialState);default:return $}}function noop$1(){}const useStickerDropzone=$=>useDropzone({onDrop:$,accept:{"image/png":[".png"],"image/webp":[".webp"],"image/apng":[".apng"]}}),getClassName=({inner:$},_e)=>$?styles$p.base:_e?styles$p.active:styles$p.standalone;function DropZone($){const{inner:_e,label:et,onDrop:tt,onDragActive:rt}=$,nt=useI18n(),at=React$2.useCallback(st=>{tt(st.filter(lt=>getFilePath(lt)!==void 0))},[tt]),{getRootProps:ot,getInputProps:it,isDragActive:ft}=useStickerDropzone(at);return React$2.useEffect(()=>{rt&&rt(ft)},[ft,rt]),jsxs("div",{...ot({className:getClassName($,ft)}),role:"button","aria-label":et,children:[jsx("input",{...it()}),jsx("svg",{viewBox:"0 0 36 36",width:"36px",height:"36px",children:jsx("path",{d:"M32 17.25H18.75V4h-1.5v13.25H4v1.5h13.25V32h1.5V18.75H32v-1.5z"})}),_e?null:jsx("p",{className:styles$p.text,children:nt(ft?"StickerCreator--DropZone--activeText":"StickerCreator--DropZone--staticText")})]})}const base$6="_base_8os4x_1",frame="_frame_8os4x_19",frameLight="_frame-light_8os4x_25 _frame_8os4x_19",frameDark="_frame-dark_8os4x_31 _frame_8os4x_19",arrow="_arrow_8os4x_37",arrowTop="_arrow-top_8os4x_44 _arrow_8os4x_37",arrowBottom="_arrow-bottom_8os4x_58 _arrow_8os4x_37",arrowLeft="_arrow-left_8os4x_72 _arrow_8os4x_37",arrowRight="_arrow-right_8os4x_86 _arrow_8os4x_37",styles$o={base:base$6,frame,frameLight,frameDark,arrow,arrowTop,arrowBottom,arrowLeft,arrowRight},base$5="_base_19ht0_1",styles$n={base:base$5},base$4="_base_1nc66_1",item="_item_1nc66_8",bubble="_bubble_1nc66_15 _item_1nc66_8",light="_light_1nc66_20 _item_1nc66_8",dark="_dark_1nc66_25 _item_1nc66_8",styles$m={base:base$4,item,bubble,light,dark},getItemClass=({kind:$})=>$==="dark"?styles$m.dark:$==="light"?styles$m.light:styles$m.bubble,MessageMeta=React$2.memo(function(_e){const et=useI18n(),tt=getItemClass(_e);return jsxs("div",{className:styles$m.base,children:[jsx("svg",{width:12,height:12,className:tt,children:jsxs("g",{fillRule:"evenodd",children:[jsx("path",{d:"M8.5 1.67L9 .804a6 6 0 11-7.919 1.76l.868.504-.008.011L6.25 5.567l-.5.866-4.309-2.488A5 5 0 108.5 1.67z"}),jsx("path",{d:"M6.003 1H6a5.06 5.06 0 00-.5.025V.02A6.08 6.08 0 016 0h.003A6 6 0 0112 6h-1a5 5 0 00-4.997-5zM3.443.572l.502.87a5.06 5.06 0 00-.866.5l-.502-.87a6.08 6.08 0 01.866-.5z"})]})}),jsx("div",{className:tt,children:et("minutesAgo",{minutes:_e.minutesAgo})}),jsxs("svg",{width:18,height:12,className:tt,children:[jsxs("defs",{children:[jsx("path",{d:"M7.917.313a6.99 6.99 0 00-2.844 6.7L5 7.084l-1.795-1.79L2.5 6 5 8.5l.34-.34a7.015 7.015 0 002.577 3.527A6.002 6.002 0 010 6 6.002 6.002 0 017.917.313zM12 0c3.312 0 6 2.688 6 6s-2.688 6-6 6-6-2.688-6-6 2.688-6 6-6zm-1 8.5L15.5 4l-.705-.71L11 7.085l-1.795-1.79L8.5 6 11 8.5z",id:"prefix__a"}),jsx("path",{id:"prefix__c",d:"M0 0h18v12H0z"})]}),jsxs("g",{fillRule:"evenodd",children:[jsx("mask",{id:"prefix__b",children:jsx("use",{xlinkHref:"#prefix__a"})}),jsx("g",{mask:"url(#prefix__b)",children:jsx("use",{xlinkHref:"#prefix__c"})})]})]})]})});function MessageBubble({children:$,minutesAgo:_e}){return jsxs("div",{className:styles$n.base,children:[$,jsx(MessageMeta,{kind:"bubble",minutesAgo:_e})]})}const base$3="_base_1tsip_1",image="_image_1tsip_6",styles$l={base:base$3,image};function MessageSticker({image:$,kind:_e,minutesAgo:et}){return jsxs("div",{className:styles$l.base,children:[jsx("img",{src:$,alt:"Sticker",className:styles$l.image}),jsx(MessageMeta,{kind:_e,minutesAgo:et})]})}const renderMessages=($,_e,et)=>jsxs(Fragment,{children:[jsx(MessageBubble,{minutesAgo:3,children:$}),jsx(MessageSticker,{image:_e,kind:et,minutesAgo:2})]}),getArrowClass=$=>$==="top"?styles$o.arrowBottom:$==="right"?styles$o.arrowLeft:$==="left"?styles$o.arrowRight:styles$o.arrowTop,StickerPreview=React$2.memo(React$2.forwardRef(({image:$,style:_e,arrowProps:et,placement:tt},rt)=>{const nt=useI18n();return jsxs("div",{className:styles$o.base,ref:rt,style:_e,children:[et?jsx("div",{ref:et.ref,style:et.style,className:getArrowClass(tt)}):null,jsx("div",{className:styles$o.frameLight,children:renderMessages(nt("StickerCreator--StickerPreview--light"),$,"light")}),jsx("div",{className:styles$o.frameDark,children:renderMessages(nt("StickerCreator--StickerPreview--dark"),$,"dark")})]})})),spinner="_spinner_1pz4l_6",spin="_spin_1pz4l_6",styles$k={spinner,spin};function Spinner({size:$}){return jsx("svg",{width:$,height:$,className:styles$k.spinner,children:jsx("path",{d:"M52.36 14.185A27.872 27.872 0 0156 28c0 15.464-12.536 28-28 28v-2c14.36 0 26-11.64 26-26 0-4.66-1.226-9.033-3.372-12.815l1.732-1z"})})}function asArray($){return[].concat($)}function isPsuedoSelector($){return $.startsWith(":")}function isStyleCondition($){return isString($)&&($==="*"||$.length>1&&":>~.+*".includes($.slice(0,1))||isImmediatePostcondition($))}function isValidProperty($,_e){return(isString(_e)||typeof _e=="number")&&!isCssVariables($)&&!isPsuedoSelector($)&&!isMediaQuery($)}function isMediaQuery($){return $.startsWith("@media")}function isDirectClass($){return $==="."}function isCssVariables($){return $==="--"}function isString($){return $+""===$}function isImmediatePostcondition($){return isString($)&&($.startsWith("&")||isPsuedoSelector($))}function joinTruthy($,_e=""){return $.filter(Boolean).join(_e)}function stableHash($,_e){let et=0;if(_e.length===0)return et.toString();for(let tt=0;tt<_e.length;tt++){const rt=_e.charCodeAt(tt);et=(et<<5)-et+rt,et=et&et}return`${$??"cl"}_${et.toString(36)}`}function handlePropertyValue($,_e){return $==="content"?`"${_e}"`:_e}function camelCaseToDash($){return $.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}function joinedProperty($,_e){return`${$}:${_e}`}function toClass($){return $?`.${$}`:""}function appendString($,_e){return $?`${$} ${_e}`:_e}var Rule=class zr{constructor(_e,et,tt,rt){this.sheet=_e,this.property=et,this.value=tt,this.selector=rt,this.property=et,this.value=tt,this.joined=joinedProperty(et,tt);const nt=this.selector.preconditions.concat(this.selector.postconditions);this.hash=this.selector.hasConditions?this.selector.scopeClassName:stableHash(this.sheet.name,this.joined),this.key=joinTruthy([this.joined,nt,this.hash])}toString(){let _e=mergeSelectors(this.selector.preconditions,{right:this.hash});return _e=mergeSelectors(this.selector.postconditions,{left:_e}),`${_e} {${zr.genRule(this.property,this.value)}}`}static genRule(_e,et){const tt=camelCaseToDash(_e);return joinedProperty(tt,handlePropertyValue(_e,et))+";"}};function mergeSelectors($,{left:_e="",right:et=""}={}){const tt=$.reduce((rt,nt)=>isPsuedoSelector(nt)?rt+nt:isImmediatePostcondition(nt)?rt+nt.slice(1):joinTruthy([rt,nt]," "),_e);return joinTruthy([tt,toClass(et)]," ")}var Selector=class Dr{constructor(_e,et=null,{preconditions:tt,postconditions:rt}={}){this.sheet=_e,this.preconditions=[],this.scopeClassName=null,this.scopeName=null,this.postconditions=[],this.preconditions=tt?asArray(tt):[],this.postconditions=rt?asArray(rt):[],this.setScope(et)}setScope(_e){return _e?(this.scopeClassName||(this.scopeName=_e,this.scopeClassName=stableHash(this.sheet.name,_e+this.sheet.count)),this):this}get hasConditions(){return this.preconditions.length>0||this.postconditions.length>0}addScope(_e){return new Dr(this.sheet,_e,{preconditions:this.preconditions,postconditions:this.postconditions})}addPrecondition(_e){return new Dr(this.sheet,this.scopeClassName,{postconditions:this.postconditions,preconditions:this.preconditions.concat(_e)})}addPostcondition(_e){return new Dr(this.sheet,this.scopeClassName,{preconditions:this.preconditions,postconditions:this.postconditions.concat(_e)})}createRule(_e,et){return new Rule(this.sheet,_e,et,this)}},Sheet=class{constructor($,_e){this.name=$,this.rootNode=_e,this.storedStyles={},this.storedClasses={},this.style="",this.count=0,this.id=`flairup-${$}`,this.styleTag=this.createStyleTag()}getStyle(){return this.style}append($){this.style=appendString(this.style,$)}apply(){this.count++,this.styleTag&&(this.styleTag.innerHTML=this.style)}isApplied(){return!!this.styleTag}createStyleTag(){if(typeof document>"u"||this.isApplied()||this.rootNode===null)return this.styleTag;const $=document.createElement("style");return $.type="text/css",$.id=this.id,(this.rootNode??document.head).appendChild($),$}addRule($){const _e=this.storedClasses[$.key];return isString(_e)?_e:(this.storedClasses[$.key]=$.hash,this.storedStyles[$.hash]=[$.property,$.value],this.append($.toString()),$.hash)}};function forIn($,_e){for(const et in $)_e(et.trim(),$[et])}function cx(...$){const _e=$.reduce((et,tt)=>(tt instanceof Set?et.push(...tt):typeof tt=="string"?et.push(tt):Array.isArray(tt)?et.push(cx(...tt)):typeof tt=="object"&&Object.entries(tt).forEach(([rt,nt])=>{nt&&et.push(rt)}),et),[]);return joinTruthy(_e," ").trim()}function createSheet($,_e){const et=new Sheet($,_e);return{create:tt,getStyle:et.getStyle.bind(et),isApplied:et.isApplied.bind(et)};function tt(rt){const nt={};return iteratePreconditions(et,rt,new Selector(et)).forEach(([ot,it,ft])=>{iterateStyles(et,it,ft).forEach(st=>{at(ot,st)})}),et.apply(),nt;function at(ot,it){nt[ot]=nt[ot]??new Set,nt[ot].add(it)}}}function iteratePreconditions($,_e,et){const tt=[];return forIn(_e,(rt,nt)=>{if(isStyleCondition(rt))return iteratePreconditions($,nt,et.addPrecondition(rt)).forEach(at=>tt.push(at));tt.push([rt,_e[rt],et.addScope(rt)])}),tt}function iterateStyles($,_e,et){const tt=new Set;return forIn(_e,(rt,nt)=>{let at=[];if(isStyleCondition(rt))at=iterateStyles($,nt,et.addPostcondition(rt));else if(isDirectClass(rt))at=asArray(nt);else if(isMediaQuery(rt))at=handleMediaQuery($,nt,rt,et);else if(isCssVariables(rt))at=cssVariablesBlock($,nt,et);else if(isValidProperty(rt,nt)){const ot=et.createRule(rt,nt);$.addRule(ot),tt.add(ot.hash)}return addEachClass(at,tt)}),tt}function addEachClass($,_e){return $.forEach(et=>_e.add(et)),_e}function cssVariablesBlock($,_e,et){const tt=new Set,rt=[];if(forIn(_e,(nt,at)=>{if(isValidProperty(nt,at)){rt.push(Rule.genRule(nt,at));return}const ot=iterateStyles($,at??{},et);addEachClass(ot,tt)}),!et.scopeClassName)return tt;if(rt.length){const nt=rt.join(" ");$.append(`${mergeSelectors(et.preconditions,{right:et.scopeClassName})} {${nt}}`)}return tt.add(et.scopeClassName),tt}function handleMediaQuery($,_e,et,tt){$.append(et+" {");const rt=iterateStyles($,_e,tt);return $.append("}"),rt}function _extends(){return _extends=Object.assign?Object.assign.bind():function($){for(var _e=1;_e=0)continue;et[tt]=$[tt]}return et}function _unsupportedIterableToArray($,_e){if($){if(typeof $=="string")return _arrayLikeToArray($,_e);var et=Object.prototype.toString.call($).slice(8,-1);if(et==="Object"&&$.constructor&&(et=$.constructor.name),et==="Map"||et==="Set")return Array.from($);if(et==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(et))return _arrayLikeToArray($,_e)}}function _arrayLikeToArray($,_e){(_e==null||_e>$.length)&&(_e=$.length);for(var et=0,tt=new Array(_e);et<_e;et++)tt[et]=$[et];return tt}function _createForOfIteratorHelperLoose($,_e){var et=typeof Symbol<"u"&&$[Symbol.iterator]||$["@@iterator"];if(et)return(et=et.call($)).next.bind(et);if(Array.isArray($)||(et=_unsupportedIterableToArray($))||_e&&$&&typeof $.length=="number"){et&&($=et);var tt=0;return function(){return tt>=$.length?{done:!0}:{done:!1,value:$[tt++]}}}throw new TypeError(`Invalid attempt to iterate non-iterable instance. In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var ClassNames;(function($){$.hiddenOnSearch="epr-hidden-on-search",$.searchActive="epr-search-active",$.hidden="epr-hidden",$.visible="epr-visible",$.active="epr-active",$.emoji="epr-emoji",$.category="epr-emoji-category",$.label="epr-emoji-category-label",$.categoryContent="epr-emoji-category-content",$.emojiHasVariations="epr-emoji-has-variations",$.scrollBody="epr-body",$.emojiList="epr-emoji-list",$.external="__EmojiPicker__",$.emojiPicker="EmojiPickerReact",$.open="epr-open",$.vertical="epr-vertical",$.horizontal="epr-horizontal",$.variationPicker="epr-emoji-variation-picker",$.darkTheme="epr-dark-theme",$.autoTheme="epr-auto-theme"})(ClassNames||(ClassNames={}));function asSelectors(){for(var $=arguments.length,_e=new Array($),et=0;et<$;et++)_e[et]=arguments[et];return _e.map(function(tt){return"."+tt}).join("")}var stylesheet=createSheet("epr",null),hidden={display:"none",opacity:"0",pointerEvents:"none",visibility:"hidden",overflow:"hidden"},commonStyles=stylesheet.create({hidden:_extends({".":ClassNames.hidden},hidden)}),PickerStyleTag=reactExports.memo(function(){return reactExports.createElement("style",{suppressHydrationWarning:!0,dangerouslySetInnerHTML:{__html:stylesheet.getStyle()}})}),commonInteractionStyles=stylesheet.create({".epr-main":{":has(input:not(:placeholder-shown))":{categoryBtn:{":hover":{opacity:"1",backgroundPositionY:"var(--epr-category-navigation-button-size)"}},hiddenOnSearch:_extends({".":ClassNames.hiddenOnSearch},hidden)},":has(input(:placeholder-shown))":{visibleOnSearchOnly:hidden}},hiddenOnReactions:{transition:"all 0.5s ease-in-out"},".epr-reactions":{hiddenOnReactions:{height:"0px",width:"0px",opacity:"0",pointerEvents:"none",overflow:"hidden"}},".EmojiPickerReact:not(.epr-search-active)":{categoryBtn:{":hover":{opacity:"1",backgroundPositionY:"var(--epr-category-navigation-button-size)"},"&.epr-active":{opacity:"1",backgroundPositionY:"var(--epr-category-navigation-button-size)"}},visibleOnSearchOnly:_extends({".":"epr-visible-on-search-only"},hidden)}});function darkMode($,_e){var et,tt;return{".epr-dark-theme":(et={},et[$]=_e,et),".epr-auto-theme":(tt={},tt[$]={"@media (prefers-color-scheme: dark)":_e},tt)}}function compareConfig($,_e){var et,tt,rt=(et=$.customEmojis)!=null?et:[],nt=(tt=_e.customEmojis)!=null?tt:[];return $.open===_e.open&&$.emojiVersion===_e.emojiVersion&&$.reactionsDefaultOpen===_e.reactionsDefaultOpen&&$.searchPlaceHolder===_e.searchPlaceHolder&&$.searchPlaceholder===_e.searchPlaceholder&&$.defaultSkinTone===_e.defaultSkinTone&&$.skinTonesDisabled===_e.skinTonesDisabled&&$.autoFocusSearch===_e.autoFocusSearch&&$.emojiStyle===_e.emojiStyle&&$.theme===_e.theme&&$.suggestedEmojisMode===_e.suggestedEmojisMode&&$.lazyLoadEmojis===_e.lazyLoadEmojis&&$.className===_e.className&&$.height===_e.height&&$.width===_e.width&&$.style===_e.style&&$.searchDisabled===_e.searchDisabled&&$.skinTonePickerLocation===_e.skinTonePickerLocation&&rt.length===nt.length}var DEFAULT_REACTIONS=["1f44d","2764-fe0f","1f603","1f622","1f64f","1f44e","1f621"],SuggestionMode;(function($){$.RECENT="recent",$.FREQUENT="frequent"})(SuggestionMode||(SuggestionMode={}));var EmojiStyle;(function($){$.NATIVE="native",$.APPLE="apple",$.TWITTER="twitter",$.GOOGLE="google",$.FACEBOOK="facebook"})(EmojiStyle||(EmojiStyle={}));var Theme;(function($){$.DARK="dark",$.LIGHT="light",$.AUTO="auto"})(Theme||(Theme={}));var SkinTones;(function($){$.NEUTRAL="neutral",$.LIGHT="1f3fb",$.MEDIUM_LIGHT="1f3fc",$.MEDIUM="1f3fd",$.MEDIUM_DARK="1f3fe",$.DARK="1f3ff"})(SkinTones||(SkinTones={}));var Categories;(function($){$.SUGGESTED="suggested",$.CUSTOM="custom",$.SMILEYS_PEOPLE="smileys_people",$.ANIMALS_NATURE="animals_nature",$.FOOD_DRINK="food_drink",$.TRAVEL_PLACES="travel_places",$.ACTIVITIES="activities",$.OBJECTS="objects",$.SYMBOLS="symbols",$.FLAGS="flags"})(Categories||(Categories={}));var SkinTonePickerLocation;(function($){$.SEARCH="SEARCH",$.PREVIEW="PREVIEW"})(SkinTonePickerLocation||(SkinTonePickerLocation={}));var _configByCategory,categoriesOrdered=[Categories.SUGGESTED,Categories.CUSTOM,Categories.SMILEYS_PEOPLE,Categories.ANIMALS_NATURE,Categories.FOOD_DRINK,Categories.TRAVEL_PLACES,Categories.ACTIVITIES,Categories.OBJECTS,Categories.SYMBOLS,Categories.FLAGS],SuggestedRecent={name:"Recently Used",category:Categories.SUGGESTED},configByCategory=(_configByCategory={},_configByCategory[Categories.SUGGESTED]={category:Categories.SUGGESTED,name:"Frequently Used"},_configByCategory[Categories.CUSTOM]={category:Categories.CUSTOM,name:"Custom Emojis"},_configByCategory[Categories.SMILEYS_PEOPLE]={category:Categories.SMILEYS_PEOPLE,name:"Smileys & People"},_configByCategory[Categories.ANIMALS_NATURE]={category:Categories.ANIMALS_NATURE,name:"Animals & Nature"},_configByCategory[Categories.FOOD_DRINK]={category:Categories.FOOD_DRINK,name:"Food & Drink"},_configByCategory[Categories.TRAVEL_PLACES]={category:Categories.TRAVEL_PLACES,name:"Travel & Places"},_configByCategory[Categories.ACTIVITIES]={category:Categories.ACTIVITIES,name:"Activities"},_configByCategory[Categories.OBJECTS]={category:Categories.OBJECTS,name:"Objects"},_configByCategory[Categories.SYMBOLS]={category:Categories.SYMBOLS,name:"Symbols"},_configByCategory[Categories.FLAGS]={category:Categories.FLAGS,name:"Flags"},_configByCategory);function baseCategoriesConfig($){return categoriesOrdered.map(function(_e){return _extends({},configByCategory[_e],$&&$[_e]&&$[_e])})}function categoryFromCategoryConfig($){return $.category}function categoryNameFromCategoryConfig($){return $.name}function mergeCategoriesConfig($,_e){var et;$===void 0&&($=[]),_e===void 0&&(_e={});var tt={};_e.suggestionMode===SuggestionMode.RECENT&&(tt[Categories.SUGGESTED]=SuggestedRecent);var rt=baseCategoriesConfig(tt);return(et=$)!=null&&et.length?$.map(function(nt){return typeof nt=="string"?getBaseConfigByCategory(nt,tt[nt]):_extends({},getBaseConfigByCategory(nt.category,tt[nt.category]),nt)}):rt}function getBaseConfigByCategory($,_e){return _e===void 0&&(_e={}),Object.assign(configByCategory[$],_e)}var CDN_URL_APPLE="https://cdn.jsdelivr.net/npm/emoji-datasource-apple/img/apple/64/",CDN_URL_FACEBOOK="https://cdn.jsdelivr.net/npm/emoji-datasource-facebook/img/facebook/64/",CDN_URL_TWITTER="https://cdn.jsdelivr.net/npm/emoji-datasource-twitter/img/twitter/64/",CDN_URL_GOOGLE="https://cdn.jsdelivr.net/npm/emoji-datasource-google/img/google/64/";function cdnUrl($){switch($){case EmojiStyle.TWITTER:return CDN_URL_TWITTER;case EmojiStyle.GOOGLE:return CDN_URL_GOOGLE;case EmojiStyle.FACEBOOK:return CDN_URL_FACEBOOK;case EmojiStyle.APPLE:default:return CDN_URL_APPLE}}var custom=[],smileys_people=[{n:["grinning","grinning face"],u:"1f600",a:"1.0",x:32,y:47},{n:["smiley","smiling face with open mouth"],u:"1f603",a:"0.6",x:32,y:50},{n:["smile","smiling face with open mouth and smiling eyes"],u:"1f604",a:"0.6",x:32,y:51},{n:["grin","grinning face with smiling eyes"],u:"1f601",a:"0.6",x:32,y:48},{n:["laughing","satisfied","smiling face with open mouth and tightly-closed eyes"],u:"1f606",a:"0.6",x:32,y:53},{n:["sweat smile","smiling face with open mouth and cold sweat"],u:"1f605",a:"0.6",x:32,y:52},{n:["rolling on the floor laughing"],u:"1f923",a:"3.0",x:40,y:55},{n:["joy","face with tears of joy"],u:"1f602",a:"0.6",x:32,y:49},{n:["slightly smiling face"],u:"1f642",a:"1.0",x:33,y:56},{n:["upside-down face","upside down face"],u:"1f643",a:"1.0",x:33,y:57},{n:["melting face"],u:"1fae0",a:"14.0",x:56,y:37},{n:["wink","winking face"],u:"1f609",a:"0.6",x:32,y:56},{n:["blush","smiling face with smiling eyes"],u:"1f60a",a:"0.6",x:32,y:57},{n:["innocent","smiling face with halo"],u:"1f607",a:"1.0",x:32,y:54},{n:["smiling face with 3 hearts","smiling face with smiling eyes and three hearts"],u:"1f970",a:"11.0",x:44,y:33},{n:["heart eyes","smiling face with heart-shaped eyes"],u:"1f60d",a:"0.6",x:32,y:60},{n:["star-struck","grinning face with star eyes"],u:"1f929",a:"5.0",x:41,y:16},{n:["kissing heart","face throwing a kiss"],u:"1f618",a:"0.6",x:33,y:9},{n:["kissing","kissing face"],u:"1f617",a:"1.0",x:33,y:8},{n:["relaxed","white smiling face"],u:"263a-fe0f",a:"0.6",x:58,y:41},{n:["kissing closed eyes","kissing face with closed eyes"],u:"1f61a",a:"0.6",x:33,y:11},{n:["kissing smiling eyes","kissing face with smiling eyes"],u:"1f619",a:"1.0",x:33,y:10},{n:["smiling face with tear"],u:"1f972",a:"13.0",x:44,y:35},{n:["yum","face savouring delicious food"],u:"1f60b",a:"0.6",x:32,y:58},{n:["stuck out tongue","face with stuck-out tongue"],u:"1f61b",a:"1.0",x:33,y:12},{n:["stuck out tongue winking eye","face with stuck-out tongue and winking eye"],u:"1f61c",a:"0.6",x:33,y:13},{n:["zany face","grinning face with one large and one small eye"],u:"1f92a",a:"5.0",x:41,y:17},{n:["stuck out tongue closed eyes","face with stuck-out tongue and tightly-closed eyes"],u:"1f61d",a:"0.6",x:33,y:14},{n:["money-mouth face","money mouth face"],u:"1f911",a:"1.0",x:39,y:39},{n:["hugging face"],u:"1f917",a:"1.0",x:39,y:45},{n:["face with hand over mouth","smiling face with smiling eyes and hand covering mouth"],u:"1f92d",a:"5.0",x:41,y:20},{n:["face with open eyes and hand over mouth"],u:"1fae2",a:"14.0",x:56,y:39},{n:["face with peeking eye"],u:"1fae3",a:"14.0",x:56,y:40},{n:["shushing face","face with finger covering closed lips"],u:"1f92b",a:"5.0",x:41,y:18},{n:["thinking face"],u:"1f914",a:"1.0",x:39,y:42},{n:["saluting face"],u:"1fae1",a:"14.0",x:56,y:38},{n:["zipper-mouth face","zipper mouth face"],u:"1f910",a:"1.0",x:39,y:38},{n:["face with raised eyebrow","face with one eyebrow raised"],u:"1f928",a:"5.0",x:41,y:15},{n:["neutral face"],u:"1f610",a:"0.7",x:33,y:1},{n:["expressionless","expressionless face"],u:"1f611",a:"1.0",x:33,y:2},{n:["no mouth","face without mouth"],u:"1f636",a:"1.0",x:33,y:42},{n:["dotted line face"],u:"1fae5",a:"14.0",x:56,y:42},{n:["face in clouds"],u:"1f636-200d-1f32b-fe0f",a:"13.1",x:33,y:41},{n:["smirk","smirking face"],u:"1f60f",a:"0.6",x:33,y:0},{n:["unamused","unamused face"],u:"1f612",a:"0.6",x:33,y:3},{n:["face with rolling eyes"],u:"1f644",a:"1.0",x:33,y:58},{n:["grimacing","grimacing face"],u:"1f62c",a:"1.0",x:33,y:29},{n:["face exhaling"],u:"1f62e-200d-1f4a8",a:"13.1",x:33,y:31},{n:["lying face"],u:"1f925",a:"3.0",x:40,y:57},{n:["shaking face"],u:"1fae8",a:"15.0",x:56,y:45},{n:["head shaking horizontally"],u:"1f642-200d-2194-fe0f",a:"15.1",x:33,y:54},{n:["head shaking vertically"],u:"1f642-200d-2195-fe0f",a:"15.1",x:33,y:55},{n:["relieved","relieved face"],u:"1f60c",a:"0.6",x:32,y:59},{n:["pensive","pensive face"],u:"1f614",a:"0.6",x:33,y:5},{n:["sleepy","sleepy face"],u:"1f62a",a:"0.6",x:33,y:27},{n:["drooling face"],u:"1f924",a:"3.0",x:40,y:56},{n:["sleeping","sleeping face"],u:"1f634",a:"1.0",x:33,y:38},{n:["face with bags under eyes"],u:"1fae9",a:"16.0",x:56,y:46},{n:["mask","face with medical mask"],u:"1f637",a:"0.6",x:33,y:43},{n:["face with thermometer"],u:"1f912",a:"1.0",x:39,y:40},{n:["face with head-bandage","face with head bandage"],u:"1f915",a:"1.0",x:39,y:43},{n:["nauseated face"],u:"1f922",a:"3.0",x:40,y:54},{n:["face vomiting","face with open mouth vomiting"],u:"1f92e",a:"5.0",x:41,y:21},{n:["sneezing face"],u:"1f927",a:"3.0",x:41,y:14},{n:["hot face","overheated face"],u:"1f975",a:"11.0",x:44,y:38},{n:["cold face","freezing face"],u:"1f976",a:"11.0",x:44,y:39},{n:["woozy face","face with uneven eyes and wavy mouth"],u:"1f974",a:"11.0",x:44,y:37},{n:["dizzy face"],u:"1f635",a:"0.6",x:33,y:40},{n:["face with spiral eyes"],u:"1f635-200d-1f4ab",a:"13.1",x:33,y:39},{n:["exploding head","shocked face with exploding head"],u:"1f92f",a:"5.0",x:41,y:22},{n:["face with cowboy hat"],u:"1f920",a:"3.0",x:40,y:52},{n:["partying face","face with party horn and party hat"],u:"1f973",a:"11.0",x:44,y:36},{n:["disguised face"],u:"1f978",a:"13.0",x:44,y:46},{n:["sunglasses","smiling face with sunglasses"],u:"1f60e",a:"1.0",x:32,y:61},{n:["nerd face"],u:"1f913",a:"1.0",x:39,y:41},{n:["face with monocle"],u:"1f9d0",a:"5.0",x:48,y:0},{n:["confused","confused face"],u:"1f615",a:"1.0",x:33,y:6},{n:["face with diagonal mouth"],u:"1fae4",a:"14.0",x:56,y:41},{n:["worried","worried face"],u:"1f61f",a:"1.0",x:33,y:16},{n:["slightly frowning face"],u:"1f641",a:"1.0",x:33,y:53},{n:["frowning face","white frowning face"],u:"2639-fe0f",a:"0.7",x:58,y:40},{n:["open mouth","face with open mouth"],u:"1f62e",a:"1.0",x:33,y:32},{n:["hushed","hushed face"],u:"1f62f",a:"1.0",x:33,y:33},{n:["astonished","astonished face"],u:"1f632",a:"0.6",x:33,y:36},{n:["flushed","flushed face"],u:"1f633",a:"0.6",x:33,y:37},{n:["pleading face","face with pleading eyes"],u:"1f97a",a:"11.0",x:44,y:48},{n:["face holding back tears"],u:"1f979",a:"14.0",x:44,y:47},{n:["frowning","frowning face with open mouth"],u:"1f626",a:"1.0",x:33,y:23},{n:["anguished","anguished face"],u:"1f627",a:"1.0",x:33,y:24},{n:["fearful","fearful face"],u:"1f628",a:"0.6",x:33,y:25},{n:["cold sweat","face with open mouth and cold sweat"],u:"1f630",a:"0.6",x:33,y:34},{n:["disappointed relieved","disappointed but relieved face"],u:"1f625",a:"0.6",x:33,y:22},{n:["cry","crying face"],u:"1f622",a:"0.6",x:33,y:19},{n:["sob","loudly crying face"],u:"1f62d",a:"0.6",x:33,y:30},{n:["scream","face screaming in fear"],u:"1f631",a:"0.6",x:33,y:35},{n:["confounded","confounded face"],u:"1f616",a:"0.6",x:33,y:7},{n:["persevere","persevering face"],u:"1f623",a:"0.6",x:33,y:20},{n:["disappointed","disappointed face"],u:"1f61e",a:"0.6",x:33,y:15},{n:["sweat","face with cold sweat"],u:"1f613",a:"0.6",x:33,y:4},{n:["weary","weary face"],u:"1f629",a:"0.6",x:33,y:26},{n:["tired face"],u:"1f62b",a:"0.6",x:33,y:28},{n:["yawning face"],u:"1f971",a:"12.0",x:44,y:34},{n:["triumph","face with look of triumph"],u:"1f624",a:"0.6",x:33,y:21},{n:["rage","pouting face"],u:"1f621",a:"0.6",x:33,y:18},{n:["angry","angry face"],u:"1f620",a:"0.6",x:33,y:17},{n:["face with symbols on mouth","serious face with symbols covering mouth"],u:"1f92c",a:"5.0",x:41,y:19},{n:["smiling imp","smiling face with horns"],u:"1f608",a:"1.0",x:32,y:55},{n:["imp"],u:"1f47f",a:"0.6",x:25,y:42},{n:["skull"],u:"1f480",a:"0.6",x:25,y:43},{n:["skull and crossbones"],u:"2620-fe0f",a:"1.0",x:58,y:32},{n:["poop","shit","hankey","pile of poo"],u:"1f4a9",a:"0.6",x:28,y:26},{n:["clown face"],u:"1f921",a:"3.0",x:40,y:53},{n:["japanese ogre"],u:"1f479",a:"0.6",x:25,y:31},{n:["japanese goblin"],u:"1f47a",a:"0.6",x:25,y:32},{n:["ghost"],u:"1f47b",a:"0.6",x:25,y:33},{n:["alien","extraterrestrial alien"],u:"1f47d",a:"0.6",x:25,y:40},{n:["alien monster","space invader"],u:"1f47e",a:"0.6",x:25,y:41},{n:["robot face"],u:"1f916",a:"1.0",x:39,y:44},{n:["smiley cat","smiling cat face with open mouth"],u:"1f63a",a:"0.6",x:33,y:46},{n:["smile cat","grinning cat face with smiling eyes"],u:"1f638",a:"0.6",x:33,y:44},{n:["joy cat","cat face with tears of joy"],u:"1f639",a:"0.6",x:33,y:45},{n:["heart eyes cat","smiling cat face with heart-shaped eyes"],u:"1f63b",a:"0.6",x:33,y:47},{n:["smirk cat","cat face with wry smile"],u:"1f63c",a:"0.6",x:33,y:48},{n:["kissing cat","kissing cat face with closed eyes"],u:"1f63d",a:"0.6",x:33,y:49},{n:["scream cat","weary cat face"],u:"1f640",a:"0.6",x:33,y:52},{n:["crying cat face"],u:"1f63f",a:"0.6",x:33,y:51},{n:["pouting cat","pouting cat face"],u:"1f63e",a:"0.6",x:33,y:50},{n:["see no evil","see-no-evil monkey"],u:"1f648",a:"0.6",x:34,y:51},{n:["hear no evil","hear-no-evil monkey"],u:"1f649",a:"0.6",x:34,y:52},{n:["speak no evil","speak-no-evil monkey"],u:"1f64a",a:"0.6",x:34,y:53},{n:["love letter"],u:"1f48c",a:"0.6",x:27,y:9},{n:["cupid","heart with arrow"],u:"1f498",a:"0.6",x:28,y:9},{n:["gift heart","heart with ribbon"],u:"1f49d",a:"0.6",x:28,y:14},{n:["sparkling heart"],u:"1f496",a:"0.6",x:28,y:7},{n:["heartpulse","growing heart"],u:"1f497",a:"0.6",x:28,y:8},{n:["heartbeat","beating heart"],u:"1f493",a:"0.6",x:28,y:4},{n:["revolving hearts"],u:"1f49e",a:"0.6",x:28,y:15},{n:["two hearts"],u:"1f495",a:"0.6",x:28,y:6},{n:["heart decoration"],u:"1f49f",a:"0.6",x:28,y:16},{n:["heart exclamation","heavy heart exclamation mark ornament"],u:"2763-fe0f",a:"1.0",x:60,y:43},{n:["broken heart"],u:"1f494",a:"0.6",x:28,y:5},{n:["heart on fire"],u:"2764-fe0f-200d-1f525",a:"13.1",x:60,y:44},{n:["mending heart"],u:"2764-fe0f-200d-1fa79",a:"13.1",x:60,y:45},{n:["heart","heavy black heart"],u:"2764-fe0f",a:"0.6",x:60,y:46},{n:["pink heart"],u:"1fa77",a:"15.0",x:54,y:58},{n:["orange heart"],u:"1f9e1",a:"5.0",x:54,y:20},{n:["yellow heart"],u:"1f49b",a:"0.6",x:28,y:12},{n:["green heart"],u:"1f49a",a:"0.6",x:28,y:11},{n:["blue heart"],u:"1f499",a:"0.6",x:28,y:10},{n:["light blue heart"],u:"1fa75",a:"15.0",x:54,y:56},{n:["purple heart"],u:"1f49c",a:"0.6",x:28,y:13},{n:["brown heart"],u:"1f90e",a:"12.0",x:39,y:31},{n:["black heart"],u:"1f5a4",a:"3.0",x:32,y:21},{n:["grey heart"],u:"1fa76",a:"15.0",x:54,y:57},{n:["white heart"],u:"1f90d",a:"12.0",x:39,y:30},{n:["kiss","kiss mark"],u:"1f48b",a:"0.6",x:27,y:8},{n:["100","hundred points symbol"],u:"1f4af",a:"0.6",x:28,y:37},{n:["anger","anger symbol"],u:"1f4a2",a:"0.6",x:28,y:19},{n:["boom","collision","collision symbol"],u:"1f4a5",a:"0.6",x:28,y:22},{n:["dizzy","dizzy symbol"],u:"1f4ab",a:"0.6",x:28,y:33},{n:["sweat drops","splashing sweat symbol"],u:"1f4a6",a:"0.6",x:28,y:23},{n:["dash","dash symbol"],u:"1f4a8",a:"0.6",x:28,y:25},{n:["hole"],u:"1f573-fe0f",a:"0.7",x:31,y:25},{n:["speech balloon"],u:"1f4ac",a:"0.6",x:28,y:34},{n:["eye in speech bubble","eye-in-speech-bubble"],u:"1f441-fe0f-200d-1f5e8-fe0f",a:"2.0",x:12,y:3},{n:["left speech bubble"],u:"1f5e8-fe0f",a:"2.0",x:32,y:38},{n:["right anger bubble"],u:"1f5ef-fe0f",a:"0.7",x:32,y:39},{n:["thought balloon"],u:"1f4ad",a:"1.0",x:28,y:35},{n:["zzz","sleeping symbol"],u:"1f4a4",a:"0.6",x:28,y:21},{n:["wave","waving hand sign"],u:"1f44b",v:["1f44b-1f3fb","1f44b-1f3fc","1f44b-1f3fd","1f44b-1f3fe","1f44b-1f3ff"],a:"0.6",x:12,y:49},{n:["raised back of hand"],u:"1f91a",v:["1f91a-1f3fb","1f91a-1f3fc","1f91a-1f3fd","1f91a-1f3fe","1f91a-1f3ff"],a:"3.0",x:39,y:58},{n:["hand with fingers splayed","raised hand with fingers splayed"],u:"1f590-fe0f",v:["1f590-1f3fb","1f590-1f3fc","1f590-1f3fd","1f590-1f3fe","1f590-1f3ff"],a:"0.7",x:32,y:3},{n:["hand","raised hand"],u:"270b",v:["270b-1f3fb","270b-1f3fc","270b-1f3fd","270b-1f3fe","270b-1f3ff"],a:"0.6",x:60,y:8},{n:["spock-hand","raised hand with part between middle and ring fingers"],u:"1f596",v:["1f596-1f3fb","1f596-1f3fc","1f596-1f3fd","1f596-1f3fe","1f596-1f3ff"],a:"1.0",x:32,y:15},{n:["rightwards hand"],u:"1faf1",v:["1faf1-1f3fb","1faf1-1f3fc","1faf1-1f3fd","1faf1-1f3fe","1faf1-1f3ff"],a:"14.0",x:56,y:53},{n:["leftwards hand"],u:"1faf2",v:["1faf2-1f3fb","1faf2-1f3fc","1faf2-1f3fd","1faf2-1f3fe","1faf2-1f3ff"],a:"14.0",x:56,y:59},{n:["palm down hand"],u:"1faf3",v:["1faf3-1f3fb","1faf3-1f3fc","1faf3-1f3fd","1faf3-1f3fe","1faf3-1f3ff"],a:"14.0",x:57,y:3},{n:["palm up hand"],u:"1faf4",v:["1faf4-1f3fb","1faf4-1f3fc","1faf4-1f3fd","1faf4-1f3fe","1faf4-1f3ff"],a:"14.0",x:57,y:9},{n:["leftwards pushing hand"],u:"1faf7",v:["1faf7-1f3fb","1faf7-1f3fc","1faf7-1f3fd","1faf7-1f3fe","1faf7-1f3ff"],a:"15.0",x:57,y:27},{n:["rightwards pushing hand"],u:"1faf8",v:["1faf8-1f3fb","1faf8-1f3fc","1faf8-1f3fd","1faf8-1f3fe","1faf8-1f3ff"],a:"15.0",x:57,y:33},{n:["ok hand","ok hand sign"],u:"1f44c",v:["1f44c-1f3fb","1f44c-1f3fc","1f44c-1f3fd","1f44c-1f3fe","1f44c-1f3ff"],a:"0.6",x:12,y:55},{n:["pinched fingers"],u:"1f90c",v:["1f90c-1f3fb","1f90c-1f3fc","1f90c-1f3fd","1f90c-1f3fe","1f90c-1f3ff"],a:"13.0",x:39,y:24},{n:["pinching hand"],u:"1f90f",v:["1f90f-1f3fb","1f90f-1f3fc","1f90f-1f3fd","1f90f-1f3fe","1f90f-1f3ff"],a:"12.0",x:39,y:32},{n:["v","victory hand"],u:"270c-fe0f",v:["270c-1f3fb","270c-1f3fc","270c-1f3fd","270c-1f3fe","270c-1f3ff"],a:"0.6",x:60,y:14},{n:["crossed fingers","hand with index and middle fingers crossed"],u:"1f91e",v:["1f91e-1f3fb","1f91e-1f3fc","1f91e-1f3fd","1f91e-1f3fe","1f91e-1f3ff"],a:"3.0",x:40,y:40},{n:["hand with index finger and thumb crossed"],u:"1faf0",v:["1faf0-1f3fb","1faf0-1f3fc","1faf0-1f3fd","1faf0-1f3fe","1faf0-1f3ff"],a:"14.0",x:56,y:47},{n:["i love you hand sign"],u:"1f91f",v:["1f91f-1f3fb","1f91f-1f3fc","1f91f-1f3fd","1f91f-1f3fe","1f91f-1f3ff"],a:"5.0",x:40,y:46},{n:["the horns","sign of the horns"],u:"1f918",v:["1f918-1f3fb","1f918-1f3fc","1f918-1f3fd","1f918-1f3fe","1f918-1f3ff"],a:"1.0",x:39,y:46},{n:["call me hand"],u:"1f919",v:["1f919-1f3fb","1f919-1f3fc","1f919-1f3fd","1f919-1f3fe","1f919-1f3ff"],a:"3.0",x:39,y:52},{n:["point left","white left pointing backhand index"],u:"1f448",v:["1f448-1f3fb","1f448-1f3fc","1f448-1f3fd","1f448-1f3fe","1f448-1f3ff"],a:"0.6",x:12,y:31},{n:["point right","white right pointing backhand index"],u:"1f449",v:["1f449-1f3fb","1f449-1f3fc","1f449-1f3fd","1f449-1f3fe","1f449-1f3ff"],a:"0.6",x:12,y:37},{n:["point up 2","white up pointing backhand index"],u:"1f446",v:["1f446-1f3fb","1f446-1f3fc","1f446-1f3fd","1f446-1f3fe","1f446-1f3ff"],a:"0.6",x:12,y:19},{n:["middle finger","reversed hand with middle finger extended"],u:"1f595",v:["1f595-1f3fb","1f595-1f3fc","1f595-1f3fd","1f595-1f3fe","1f595-1f3ff"],a:"1.0",x:32,y:9},{n:["point down","white down pointing backhand index"],u:"1f447",v:["1f447-1f3fb","1f447-1f3fc","1f447-1f3fd","1f447-1f3fe","1f447-1f3ff"],a:"0.6",x:12,y:25},{n:["point up","white up pointing index"],u:"261d-fe0f",v:["261d-1f3fb","261d-1f3fc","261d-1f3fd","261d-1f3fe","261d-1f3ff"],a:"0.6",x:58,y:26},{n:["index pointing at the viewer"],u:"1faf5",v:["1faf5-1f3fb","1faf5-1f3fc","1faf5-1f3fd","1faf5-1f3fe","1faf5-1f3ff"],a:"14.0",x:57,y:15},{n:["+1","thumbsup","thumbs up sign"],u:"1f44d",v:["1f44d-1f3fb","1f44d-1f3fc","1f44d-1f3fd","1f44d-1f3fe","1f44d-1f3ff"],a:"0.6",x:12,y:61},{n:["-1","thumbsdown","thumbs down sign"],u:"1f44e",v:["1f44e-1f3fb","1f44e-1f3fc","1f44e-1f3fd","1f44e-1f3fe","1f44e-1f3ff"],a:"0.6",x:13,y:5},{n:["fist","raised fist"],u:"270a",v:["270a-1f3fb","270a-1f3fc","270a-1f3fd","270a-1f3fe","270a-1f3ff"],a:"0.6",x:60,y:2},{n:["punch","facepunch","fisted hand sign"],u:"1f44a",v:["1f44a-1f3fb","1f44a-1f3fc","1f44a-1f3fd","1f44a-1f3fe","1f44a-1f3ff"],a:"0.6",x:12,y:43},{n:["left-facing fist"],u:"1f91b",v:["1f91b-1f3fb","1f91b-1f3fc","1f91b-1f3fd","1f91b-1f3fe","1f91b-1f3ff"],a:"3.0",x:40,y:2},{n:["right-facing fist"],u:"1f91c",v:["1f91c-1f3fb","1f91c-1f3fc","1f91c-1f3fd","1f91c-1f3fe","1f91c-1f3ff"],a:"3.0",x:40,y:8},{n:["clap","clapping hands sign"],u:"1f44f",v:["1f44f-1f3fb","1f44f-1f3fc","1f44f-1f3fd","1f44f-1f3fe","1f44f-1f3ff"],a:"0.6",x:13,y:11},{n:["raised hands","person raising both hands in celebration"],u:"1f64c",v:["1f64c-1f3fb","1f64c-1f3fc","1f64c-1f3fd","1f64c-1f3fe","1f64c-1f3ff"],a:"0.6",x:35,y:10},{n:["heart hands"],u:"1faf6",v:["1faf6-1f3fb","1faf6-1f3fc","1faf6-1f3fd","1faf6-1f3fe","1faf6-1f3ff"],a:"14.0",x:57,y:21},{n:["open hands","open hands sign"],u:"1f450",v:["1f450-1f3fb","1f450-1f3fc","1f450-1f3fd","1f450-1f3fe","1f450-1f3ff"],a:"0.6",x:13,y:17},{n:["palms up together"],u:"1f932",v:["1f932-1f3fb","1f932-1f3fc","1f932-1f3fd","1f932-1f3fe","1f932-1f3ff"],a:"5.0",x:41,y:35},{n:["handshake"],u:"1f91d",v:["1f91d-1f3fb","1f91d-1f3fc","1f91d-1f3fd","1f91d-1f3fe","1f91d-1f3ff","1faf1-1f3fb-200d-1faf2-1f3fc","1faf1-1f3fb-200d-1faf2-1f3fd","1faf1-1f3fb-200d-1faf2-1f3fe","1faf1-1f3fb-200d-1faf2-1f3ff","1faf1-1f3fc-200d-1faf2-1f3fb","1faf1-1f3fc-200d-1faf2-1f3fd","1faf1-1f3fc-200d-1faf2-1f3fe","1faf1-1f3fc-200d-1faf2-1f3ff","1faf1-1f3fd-200d-1faf2-1f3fb","1faf1-1f3fd-200d-1faf2-1f3fc","1faf1-1f3fd-200d-1faf2-1f3fe","1faf1-1f3fd-200d-1faf2-1f3ff","1faf1-1f3fe-200d-1faf2-1f3fb","1faf1-1f3fe-200d-1faf2-1f3fc","1faf1-1f3fe-200d-1faf2-1f3fd","1faf1-1f3fe-200d-1faf2-1f3ff","1faf1-1f3ff-200d-1faf2-1f3fb","1faf1-1f3ff-200d-1faf2-1f3fc","1faf1-1f3ff-200d-1faf2-1f3fd","1faf1-1f3ff-200d-1faf2-1f3fe"],a:"3.0",x:40,y:14},{n:["pray","person with folded hands"],u:"1f64f",v:["1f64f-1f3fb","1f64f-1f3fc","1f64f-1f3fd","1f64f-1f3fe","1f64f-1f3ff"],a:"0.6",x:35,y:52},{n:["writing hand"],u:"270d-fe0f",v:["270d-1f3fb","270d-1f3fc","270d-1f3fd","270d-1f3fe","270d-1f3ff"],a:"0.7",x:60,y:20},{n:["nail care","nail polish"],u:"1f485",v:["1f485-1f3fb","1f485-1f3fc","1f485-1f3fd","1f485-1f3fe","1f485-1f3ff"],a:"0.6",x:26,y:25},{n:["selfie"],u:"1f933",v:["1f933-1f3fb","1f933-1f3fc","1f933-1f3fd","1f933-1f3fe","1f933-1f3ff"],a:"3.0",x:41,y:41},{n:["muscle","flexed biceps"],u:"1f4aa",v:["1f4aa-1f3fb","1f4aa-1f3fc","1f4aa-1f3fd","1f4aa-1f3fe","1f4aa-1f3ff"],a:"0.6",x:28,y:27},{n:["mechanical arm"],u:"1f9be",a:"12.0",x:46,y:37},{n:["mechanical leg"],u:"1f9bf",a:"12.0",x:46,y:38},{n:["leg"],u:"1f9b5",v:["1f9b5-1f3fb","1f9b5-1f3fc","1f9b5-1f3fd","1f9b5-1f3fe","1f9b5-1f3ff"],a:"11.0",x:45,y:41},{n:["foot"],u:"1f9b6",v:["1f9b6-1f3fb","1f9b6-1f3fc","1f9b6-1f3fd","1f9b6-1f3fe","1f9b6-1f3ff"],a:"11.0",x:45,y:47},{n:["ear"],u:"1f442",v:["1f442-1f3fb","1f442-1f3fc","1f442-1f3fd","1f442-1f3fe","1f442-1f3ff"],a:"0.6",x:12,y:5},{n:["ear with hearing aid"],u:"1f9bb",v:["1f9bb-1f3fb","1f9bb-1f3fc","1f9bb-1f3fd","1f9bb-1f3fe","1f9bb-1f3ff"],a:"12.0",x:46,y:29},{n:["nose"],u:"1f443",v:["1f443-1f3fb","1f443-1f3fc","1f443-1f3fd","1f443-1f3fe","1f443-1f3ff"],a:"0.6",x:12,y:11},{n:["brain"],u:"1f9e0",a:"5.0",x:54,y:19},{n:["anatomical heart"],u:"1fac0",a:"13.0",x:55,y:61},{n:["lungs"],u:"1fac1",a:"13.0",x:56,y:0},{n:["tooth"],u:"1f9b7",a:"11.0",x:45,y:53},{n:["bone"],u:"1f9b4",a:"11.0",x:45,y:40},{n:["eyes"],u:"1f440",a:"0.6",x:12,y:2},{n:["eye"],u:"1f441-fe0f",a:"0.7",x:12,y:4},{n:["tongue"],u:"1f445",a:"0.6",x:12,y:18},{n:["lips","mouth"],u:"1f444",a:"0.6",x:12,y:17},{n:["biting lip"],u:"1fae6",a:"14.0",x:56,y:43},{n:["baby"],u:"1f476",v:["1f476-1f3fb","1f476-1f3fc","1f476-1f3fd","1f476-1f3fe","1f476-1f3ff"],a:"0.6",x:25,y:1},{n:["child"],u:"1f9d2",v:["1f9d2-1f3fb","1f9d2-1f3fc","1f9d2-1f3fd","1f9d2-1f3fe","1f9d2-1f3ff"],a:"5.0",x:51,y:19},{n:["boy"],u:"1f466",v:["1f466-1f3fb","1f466-1f3fc","1f466-1f3fd","1f466-1f3fe","1f466-1f3ff"],a:"0.6",x:13,y:44},{n:["girl"],u:"1f467",v:["1f467-1f3fb","1f467-1f3fc","1f467-1f3fd","1f467-1f3fe","1f467-1f3ff"],a:"0.6",x:13,y:50},{n:["adult"],u:"1f9d1",v:["1f9d1-1f3fb","1f9d1-1f3fc","1f9d1-1f3fd","1f9d1-1f3fe","1f9d1-1f3ff"],a:"5.0",x:51,y:13},{n:["person with blond hair"],u:"1f471",v:["1f471-1f3fb","1f471-1f3fc","1f471-1f3fd","1f471-1f3fe","1f471-1f3ff"],a:"0.6",x:24,y:21},{n:["man"],u:"1f468",v:["1f468-1f3fb","1f468-1f3fc","1f468-1f3fd","1f468-1f3fe","1f468-1f3ff"],a:"0.6",x:17,y:37},{n:["bearded person"],u:"1f9d4",v:["1f9d4-1f3fb","1f9d4-1f3fc","1f9d4-1f3fd","1f9d4-1f3fe","1f9d4-1f3ff"],a:"5.0",x:51,y:43},{n:["man: beard","man with beard"],u:"1f9d4-200d-2642-fe0f",v:["1f9d4-1f3fb-200d-2642-fe0f","1f9d4-1f3fc-200d-2642-fe0f","1f9d4-1f3fd-200d-2642-fe0f","1f9d4-1f3fe-200d-2642-fe0f","1f9d4-1f3ff-200d-2642-fe0f"],a:"13.1",x:51,y:37},{n:["woman: beard","woman with beard"],u:"1f9d4-200d-2640-fe0f",v:["1f9d4-1f3fb-200d-2640-fe0f","1f9d4-1f3fc-200d-2640-fe0f","1f9d4-1f3fd-200d-2640-fe0f","1f9d4-1f3fe-200d-2640-fe0f","1f9d4-1f3ff-200d-2640-fe0f"],a:"13.1",x:51,y:31},{n:["man: red hair","red haired man"],u:"1f468-200d-1f9b0",v:["1f468-1f3fb-200d-1f9b0","1f468-1f3fc-200d-1f9b0","1f468-1f3fd-200d-1f9b0","1f468-1f3fe-200d-1f9b0","1f468-1f3ff-200d-1f9b0"],a:"11.0",x:15,y:43},{n:["man: curly hair","curly haired man"],u:"1f468-200d-1f9b1",v:["1f468-1f3fb-200d-1f9b1","1f468-1f3fc-200d-1f9b1","1f468-1f3fd-200d-1f9b1","1f468-1f3fe-200d-1f9b1","1f468-1f3ff-200d-1f9b1"],a:"11.0",x:15,y:49},{n:["man: white hair","white haired man"],u:"1f468-200d-1f9b3",v:["1f468-1f3fb-200d-1f9b3","1f468-1f3fc-200d-1f9b3","1f468-1f3fd-200d-1f9b3","1f468-1f3fe-200d-1f9b3","1f468-1f3ff-200d-1f9b3"],a:"11.0",x:15,y:61},{n:["bald man","man: bald"],u:"1f468-200d-1f9b2",v:["1f468-1f3fb-200d-1f9b2","1f468-1f3fc-200d-1f9b2","1f468-1f3fd-200d-1f9b2","1f468-1f3fe-200d-1f9b2","1f468-1f3ff-200d-1f9b2"],a:"11.0",x:15,y:55},{n:["woman"],u:"1f469",v:["1f469-1f3fb","1f469-1f3fc","1f469-1f3fd","1f469-1f3fe","1f469-1f3ff"],a:"0.6",x:22,y:9},{n:["woman: red hair","red haired woman"],u:"1f469-200d-1f9b0",v:["1f469-1f3fb-200d-1f9b0","1f469-1f3fc-200d-1f9b0","1f469-1f3fd-200d-1f9b0","1f469-1f3fe-200d-1f9b0","1f469-1f3ff-200d-1f9b0"],a:"11.0",x:19,y:25},{n:["person: red hair","red haired person"],u:"1f9d1-200d-1f9b0",v:["1f9d1-1f3fb-200d-1f9b0","1f9d1-1f3fc-200d-1f9b0","1f9d1-1f3fd-200d-1f9b0","1f9d1-1f3fe-200d-1f9b0","1f9d1-1f3ff-200d-1f9b0"],a:"12.1",x:50,y:5},{n:["woman: curly hair","curly haired woman"],u:"1f469-200d-1f9b1",v:["1f469-1f3fb-200d-1f9b1","1f469-1f3fc-200d-1f9b1","1f469-1f3fd-200d-1f9b1","1f469-1f3fe-200d-1f9b1","1f469-1f3ff-200d-1f9b1"],a:"11.0",x:19,y:31},{n:["person: curly hair","curly haired person"],u:"1f9d1-200d-1f9b1",v:["1f9d1-1f3fb-200d-1f9b1","1f9d1-1f3fc-200d-1f9b1","1f9d1-1f3fd-200d-1f9b1","1f9d1-1f3fe-200d-1f9b1","1f9d1-1f3ff-200d-1f9b1"],a:"12.1",x:50,y:11},{n:["woman: white hair","white haired woman"],u:"1f469-200d-1f9b3",v:["1f469-1f3fb-200d-1f9b3","1f469-1f3fc-200d-1f9b3","1f469-1f3fd-200d-1f9b3","1f469-1f3fe-200d-1f9b3","1f469-1f3ff-200d-1f9b3"],a:"11.0",x:19,y:43},{n:["person: white hair","white haired person"],u:"1f9d1-200d-1f9b3",v:["1f9d1-1f3fb-200d-1f9b3","1f9d1-1f3fc-200d-1f9b3","1f9d1-1f3fd-200d-1f9b3","1f9d1-1f3fe-200d-1f9b3","1f9d1-1f3ff-200d-1f9b3"],a:"12.1",x:50,y:23},{n:["bald woman","woman: bald"],u:"1f469-200d-1f9b2",v:["1f469-1f3fb-200d-1f9b2","1f469-1f3fc-200d-1f9b2","1f469-1f3fd-200d-1f9b2","1f469-1f3fe-200d-1f9b2","1f469-1f3ff-200d-1f9b2"],a:"11.0",x:19,y:37},{n:["bald person","person: bald"],u:"1f9d1-200d-1f9b2",v:["1f9d1-1f3fb-200d-1f9b2","1f9d1-1f3fc-200d-1f9b2","1f9d1-1f3fd-200d-1f9b2","1f9d1-1f3fe-200d-1f9b2","1f9d1-1f3ff-200d-1f9b2"],a:"12.1",x:50,y:17},{n:["woman: blond hair","blond-haired-woman"],u:"1f471-200d-2640-fe0f",v:["1f471-1f3fb-200d-2640-fe0f","1f471-1f3fc-200d-2640-fe0f","1f471-1f3fd-200d-2640-fe0f","1f471-1f3fe-200d-2640-fe0f","1f471-1f3ff-200d-2640-fe0f"],a:"4.0",x:24,y:9},{n:["man: blond hair","blond-haired-man"],u:"1f471-200d-2642-fe0f",v:["1f471-1f3fb-200d-2642-fe0f","1f471-1f3fc-200d-2642-fe0f","1f471-1f3fd-200d-2642-fe0f","1f471-1f3fe-200d-2642-fe0f","1f471-1f3ff-200d-2642-fe0f"],a:"4.0",x:24,y:15},{n:["older adult"],u:"1f9d3",v:["1f9d3-1f3fb","1f9d3-1f3fc","1f9d3-1f3fd","1f9d3-1f3fe","1f9d3-1f3ff"],a:"5.0",x:51,y:25},{n:["older man"],u:"1f474",v:["1f474-1f3fb","1f474-1f3fc","1f474-1f3fd","1f474-1f3fe","1f474-1f3ff"],a:"0.6",x:24,y:51},{n:["older woman"],u:"1f475",v:["1f475-1f3fb","1f475-1f3fc","1f475-1f3fd","1f475-1f3fe","1f475-1f3ff"],a:"0.6",x:24,y:57},{n:["person frowning"],u:"1f64d",v:["1f64d-1f3fb","1f64d-1f3fc","1f64d-1f3fd","1f64d-1f3fe","1f64d-1f3ff"],a:"0.6",x:35,y:28},{n:["man frowning","man-frowning"],u:"1f64d-200d-2642-fe0f",v:["1f64d-1f3fb-200d-2642-fe0f","1f64d-1f3fc-200d-2642-fe0f","1f64d-1f3fd-200d-2642-fe0f","1f64d-1f3fe-200d-2642-fe0f","1f64d-1f3ff-200d-2642-fe0f"],a:"4.0",x:35,y:22},{n:["woman frowning","woman-frowning"],u:"1f64d-200d-2640-fe0f",v:["1f64d-1f3fb-200d-2640-fe0f","1f64d-1f3fc-200d-2640-fe0f","1f64d-1f3fd-200d-2640-fe0f","1f64d-1f3fe-200d-2640-fe0f","1f64d-1f3ff-200d-2640-fe0f"],a:"4.0",x:35,y:16},{n:["person with pouting face"],u:"1f64e",v:["1f64e-1f3fb","1f64e-1f3fc","1f64e-1f3fd","1f64e-1f3fe","1f64e-1f3ff"],a:"0.6",x:35,y:46},{n:["man pouting","man-pouting"],u:"1f64e-200d-2642-fe0f",v:["1f64e-1f3fb-200d-2642-fe0f","1f64e-1f3fc-200d-2642-fe0f","1f64e-1f3fd-200d-2642-fe0f","1f64e-1f3fe-200d-2642-fe0f","1f64e-1f3ff-200d-2642-fe0f"],a:"4.0",x:35,y:40},{n:["woman pouting","woman-pouting"],u:"1f64e-200d-2640-fe0f",v:["1f64e-1f3fb-200d-2640-fe0f","1f64e-1f3fc-200d-2640-fe0f","1f64e-1f3fd-200d-2640-fe0f","1f64e-1f3fe-200d-2640-fe0f","1f64e-1f3ff-200d-2640-fe0f"],a:"4.0",x:35,y:34},{n:["no good","face with no good gesture"],u:"1f645",v:["1f645-1f3fb","1f645-1f3fc","1f645-1f3fd","1f645-1f3fe","1f645-1f3ff"],a:"0.6",x:34,y:9},{n:["man gesturing no","man-gesturing-no"],u:"1f645-200d-2642-fe0f",v:["1f645-1f3fb-200d-2642-fe0f","1f645-1f3fc-200d-2642-fe0f","1f645-1f3fd-200d-2642-fe0f","1f645-1f3fe-200d-2642-fe0f","1f645-1f3ff-200d-2642-fe0f"],a:"4.0",x:34,y:3},{n:["woman gesturing no","woman-gesturing-no"],u:"1f645-200d-2640-fe0f",v:["1f645-1f3fb-200d-2640-fe0f","1f645-1f3fc-200d-2640-fe0f","1f645-1f3fd-200d-2640-fe0f","1f645-1f3fe-200d-2640-fe0f","1f645-1f3ff-200d-2640-fe0f"],a:"4.0",x:33,y:59},{n:["ok woman","face with ok gesture"],u:"1f646",v:["1f646-1f3fb","1f646-1f3fc","1f646-1f3fd","1f646-1f3fe","1f646-1f3ff"],a:"0.6",x:34,y:27},{n:["man gesturing ok","man-gesturing-ok"],u:"1f646-200d-2642-fe0f",v:["1f646-1f3fb-200d-2642-fe0f","1f646-1f3fc-200d-2642-fe0f","1f646-1f3fd-200d-2642-fe0f","1f646-1f3fe-200d-2642-fe0f","1f646-1f3ff-200d-2642-fe0f"],a:"4.0",x:34,y:21},{n:["woman gesturing ok","woman-gesturing-ok"],u:"1f646-200d-2640-fe0f",v:["1f646-1f3fb-200d-2640-fe0f","1f646-1f3fc-200d-2640-fe0f","1f646-1f3fd-200d-2640-fe0f","1f646-1f3fe-200d-2640-fe0f","1f646-1f3ff-200d-2640-fe0f"],a:"4.0",x:34,y:15},{n:["information desk person"],u:"1f481",v:["1f481-1f3fb","1f481-1f3fc","1f481-1f3fd","1f481-1f3fe","1f481-1f3ff"],a:"0.6",x:25,y:56},{n:["man tipping hand","man-tipping-hand"],u:"1f481-200d-2642-fe0f",v:["1f481-1f3fb-200d-2642-fe0f","1f481-1f3fc-200d-2642-fe0f","1f481-1f3fd-200d-2642-fe0f","1f481-1f3fe-200d-2642-fe0f","1f481-1f3ff-200d-2642-fe0f"],a:"4.0",x:25,y:50},{n:["woman tipping hand","woman-tipping-hand"],u:"1f481-200d-2640-fe0f",v:["1f481-1f3fb-200d-2640-fe0f","1f481-1f3fc-200d-2640-fe0f","1f481-1f3fd-200d-2640-fe0f","1f481-1f3fe-200d-2640-fe0f","1f481-1f3ff-200d-2640-fe0f"],a:"4.0",x:25,y:44},{n:["raising hand","happy person raising one hand"],u:"1f64b",v:["1f64b-1f3fb","1f64b-1f3fc","1f64b-1f3fd","1f64b-1f3fe","1f64b-1f3ff"],a:"0.6",x:35,y:4},{n:["man raising hand","man-raising-hand"],u:"1f64b-200d-2642-fe0f",v:["1f64b-1f3fb-200d-2642-fe0f","1f64b-1f3fc-200d-2642-fe0f","1f64b-1f3fd-200d-2642-fe0f","1f64b-1f3fe-200d-2642-fe0f","1f64b-1f3ff-200d-2642-fe0f"],a:"4.0",x:34,y:60},{n:["woman raising hand","woman-raising-hand"],u:"1f64b-200d-2640-fe0f",v:["1f64b-1f3fb-200d-2640-fe0f","1f64b-1f3fc-200d-2640-fe0f","1f64b-1f3fd-200d-2640-fe0f","1f64b-1f3fe-200d-2640-fe0f","1f64b-1f3ff-200d-2640-fe0f"],a:"4.0",x:34,y:54},{n:["deaf person"],u:"1f9cf",v:["1f9cf-1f3fb","1f9cf-1f3fc","1f9cf-1f3fd","1f9cf-1f3fe","1f9cf-1f3ff"],a:"12.0",x:47,y:56},{n:["deaf man"],u:"1f9cf-200d-2642-fe0f",v:["1f9cf-1f3fb-200d-2642-fe0f","1f9cf-1f3fc-200d-2642-fe0f","1f9cf-1f3fd-200d-2642-fe0f","1f9cf-1f3fe-200d-2642-fe0f","1f9cf-1f3ff-200d-2642-fe0f"],a:"12.0",x:47,y:50},{n:["deaf woman"],u:"1f9cf-200d-2640-fe0f",v:["1f9cf-1f3fb-200d-2640-fe0f","1f9cf-1f3fc-200d-2640-fe0f","1f9cf-1f3fd-200d-2640-fe0f","1f9cf-1f3fe-200d-2640-fe0f","1f9cf-1f3ff-200d-2640-fe0f"],a:"12.0",x:47,y:44},{n:["bow","person bowing deeply"],u:"1f647",v:["1f647-1f3fb","1f647-1f3fc","1f647-1f3fd","1f647-1f3fe","1f647-1f3ff"],a:"0.6",x:34,y:45},{n:["man bowing","man-bowing"],u:"1f647-200d-2642-fe0f",v:["1f647-1f3fb-200d-2642-fe0f","1f647-1f3fc-200d-2642-fe0f","1f647-1f3fd-200d-2642-fe0f","1f647-1f3fe-200d-2642-fe0f","1f647-1f3ff-200d-2642-fe0f"],a:"4.0",x:34,y:39},{n:["woman bowing","woman-bowing"],u:"1f647-200d-2640-fe0f",v:["1f647-1f3fb-200d-2640-fe0f","1f647-1f3fc-200d-2640-fe0f","1f647-1f3fd-200d-2640-fe0f","1f647-1f3fe-200d-2640-fe0f","1f647-1f3ff-200d-2640-fe0f"],a:"4.0",x:34,y:33},{n:["face palm"],u:"1f926",v:["1f926-1f3fb","1f926-1f3fc","1f926-1f3fd","1f926-1f3fe","1f926-1f3ff"],a:"3.0",x:41,y:8},{n:["man facepalming","man-facepalming"],u:"1f926-200d-2642-fe0f",v:["1f926-1f3fb-200d-2642-fe0f","1f926-1f3fc-200d-2642-fe0f","1f926-1f3fd-200d-2642-fe0f","1f926-1f3fe-200d-2642-fe0f","1f926-1f3ff-200d-2642-fe0f"],a:"4.0",x:41,y:2},{n:["woman facepalming","woman-facepalming"],u:"1f926-200d-2640-fe0f",v:["1f926-1f3fb-200d-2640-fe0f","1f926-1f3fc-200d-2640-fe0f","1f926-1f3fd-200d-2640-fe0f","1f926-1f3fe-200d-2640-fe0f","1f926-1f3ff-200d-2640-fe0f"],a:"4.0",x:40,y:58},{n:["shrug"],u:"1f937",v:["1f937-1f3fb","1f937-1f3fc","1f937-1f3fd","1f937-1f3fe","1f937-1f3ff"],a:"3.0",x:42,y:27},{n:["man shrugging","man-shrugging"],u:"1f937-200d-2642-fe0f",v:["1f937-1f3fb-200d-2642-fe0f","1f937-1f3fc-200d-2642-fe0f","1f937-1f3fd-200d-2642-fe0f","1f937-1f3fe-200d-2642-fe0f","1f937-1f3ff-200d-2642-fe0f"],a:"4.0",x:42,y:21},{n:["woman shrugging","woman-shrugging"],u:"1f937-200d-2640-fe0f",v:["1f937-1f3fb-200d-2640-fe0f","1f937-1f3fc-200d-2640-fe0f","1f937-1f3fd-200d-2640-fe0f","1f937-1f3fe-200d-2640-fe0f","1f937-1f3ff-200d-2640-fe0f"],a:"4.0",x:42,y:15},{n:["health worker"],u:"1f9d1-200d-2695-fe0f",v:["1f9d1-1f3fb-200d-2695-fe0f","1f9d1-1f3fc-200d-2695-fe0f","1f9d1-1f3fd-200d-2695-fe0f","1f9d1-1f3fe-200d-2695-fe0f","1f9d1-1f3ff-200d-2695-fe0f"],a:"12.1",x:50,y:57},{n:["male-doctor","man health worker"],u:"1f468-200d-2695-fe0f",v:["1f468-1f3fb-200d-2695-fe0f","1f468-1f3fc-200d-2695-fe0f","1f468-1f3fd-200d-2695-fe0f","1f468-1f3fe-200d-2695-fe0f","1f468-1f3ff-200d-2695-fe0f"],a:"4.0",x:16,y:29},{n:["female-doctor","woman health worker"],u:"1f469-200d-2695-fe0f",v:["1f469-1f3fb-200d-2695-fe0f","1f469-1f3fc-200d-2695-fe0f","1f469-1f3fd-200d-2695-fe0f","1f469-1f3fe-200d-2695-fe0f","1f469-1f3ff-200d-2695-fe0f"],a:"4.0",x:20,y:11},{n:["student"],u:"1f9d1-200d-1f393",v:["1f9d1-1f3fb-200d-1f393","1f9d1-1f3fc-200d-1f393","1f9d1-1f3fd-200d-1f393","1f9d1-1f3fe-200d-1f393","1f9d1-1f3ff-200d-1f393"],a:"12.1",x:48,y:25},{n:["man student","male-student"],u:"1f468-200d-1f393",v:["1f468-1f3fb-200d-1f393","1f468-1f3fc-200d-1f393","1f468-1f3fd-200d-1f393","1f468-1f3fe-200d-1f393","1f468-1f3ff-200d-1f393"],a:"4.0",x:14,y:12},{n:["woman student","female-student"],u:"1f469-200d-1f393",v:["1f469-1f3fb-200d-1f393","1f469-1f3fc-200d-1f393","1f469-1f3fd-200d-1f393","1f469-1f3fe-200d-1f393","1f469-1f3ff-200d-1f393"],a:"4.0",x:17,y:61},{n:["teacher"],u:"1f9d1-200d-1f3eb",v:["1f9d1-1f3fb-200d-1f3eb","1f9d1-1f3fc-200d-1f3eb","1f9d1-1f3fd-200d-1f3eb","1f9d1-1f3fe-200d-1f3eb","1f9d1-1f3ff-200d-1f3eb"],a:"12.1",x:48,y:43},{n:["man teacher","male-teacher"],u:"1f468-200d-1f3eb",v:["1f468-1f3fb-200d-1f3eb","1f468-1f3fc-200d-1f3eb","1f468-1f3fd-200d-1f3eb","1f468-1f3fe-200d-1f3eb","1f468-1f3ff-200d-1f3eb"],a:"4.0",x:14,y:30},{n:["woman teacher","female-teacher"],u:"1f469-200d-1f3eb",v:["1f469-1f3fb-200d-1f3eb","1f469-1f3fc-200d-1f3eb","1f469-1f3fd-200d-1f3eb","1f469-1f3fe-200d-1f3eb","1f469-1f3ff-200d-1f3eb"],a:"4.0",x:18,y:17},{n:["judge"],u:"1f9d1-200d-2696-fe0f",v:["1f9d1-1f3fb-200d-2696-fe0f","1f9d1-1f3fc-200d-2696-fe0f","1f9d1-1f3fd-200d-2696-fe0f","1f9d1-1f3fe-200d-2696-fe0f","1f9d1-1f3ff-200d-2696-fe0f"],a:"12.1",x:51,y:1},{n:["man judge","male-judge"],u:"1f468-200d-2696-fe0f",v:["1f468-1f3fb-200d-2696-fe0f","1f468-1f3fc-200d-2696-fe0f","1f468-1f3fd-200d-2696-fe0f","1f468-1f3fe-200d-2696-fe0f","1f468-1f3ff-200d-2696-fe0f"],a:"4.0",x:16,y:35},{n:["woman judge","female-judge"],u:"1f469-200d-2696-fe0f",v:["1f469-1f3fb-200d-2696-fe0f","1f469-1f3fc-200d-2696-fe0f","1f469-1f3fd-200d-2696-fe0f","1f469-1f3fe-200d-2696-fe0f","1f469-1f3ff-200d-2696-fe0f"],a:"4.0",x:20,y:17},{n:["farmer"],u:"1f9d1-200d-1f33e",v:["1f9d1-1f3fb-200d-1f33e","1f9d1-1f3fc-200d-1f33e","1f9d1-1f3fd-200d-1f33e","1f9d1-1f3fe-200d-1f33e","1f9d1-1f3ff-200d-1f33e"],a:"12.1",x:48,y:1},{n:["man farmer","male-farmer"],u:"1f468-200d-1f33e",v:["1f468-1f3fb-200d-1f33e","1f468-1f3fc-200d-1f33e","1f468-1f3fd-200d-1f33e","1f468-1f3fe-200d-1f33e","1f468-1f3ff-200d-1f33e"],a:"4.0",x:13,y:56},{n:["woman farmer","female-farmer"],u:"1f469-200d-1f33e",v:["1f469-1f3fb-200d-1f33e","1f469-1f3fc-200d-1f33e","1f469-1f3fd-200d-1f33e","1f469-1f3fe-200d-1f33e","1f469-1f3ff-200d-1f33e"],a:"4.0",x:17,y:43},{n:["cook"],u:"1f9d1-200d-1f373",v:["1f9d1-1f3fb-200d-1f373","1f9d1-1f3fc-200d-1f373","1f9d1-1f3fd-200d-1f373","1f9d1-1f3fe-200d-1f373","1f9d1-1f3ff-200d-1f373"],a:"12.1",x:48,y:7},{n:["man cook","male-cook"],u:"1f468-200d-1f373",v:["1f468-1f3fb-200d-1f373","1f468-1f3fc-200d-1f373","1f468-1f3fd-200d-1f373","1f468-1f3fe-200d-1f373","1f468-1f3ff-200d-1f373"],a:"4.0",x:14,y:0},{n:["woman cook","female-cook"],u:"1f469-200d-1f373",v:["1f469-1f3fb-200d-1f373","1f469-1f3fc-200d-1f373","1f469-1f3fd-200d-1f373","1f469-1f3fe-200d-1f373","1f469-1f3ff-200d-1f373"],a:"4.0",x:17,y:49},{n:["mechanic"],u:"1f9d1-200d-1f527",v:["1f9d1-1f3fb-200d-1f527","1f9d1-1f3fc-200d-1f527","1f9d1-1f3fd-200d-1f527","1f9d1-1f3fe-200d-1f527","1f9d1-1f3ff-200d-1f527"],a:"12.1",x:49,y:5},{n:["man mechanic","male-mechanic"],u:"1f468-200d-1f527",v:["1f468-1f3fb-200d-1f527","1f468-1f3fc-200d-1f527","1f468-1f3fd-200d-1f527","1f468-1f3fe-200d-1f527","1f468-1f3ff-200d-1f527"],a:"4.0",x:15,y:7},{n:["woman mechanic","female-mechanic"],u:"1f469-200d-1f527",v:["1f469-1f3fb-200d-1f527","1f469-1f3fc-200d-1f527","1f469-1f3fd-200d-1f527","1f469-1f3fe-200d-1f527","1f469-1f3ff-200d-1f527"],a:"4.0",x:18,y:51},{n:["factory worker"],u:"1f9d1-200d-1f3ed",v:["1f9d1-1f3fb-200d-1f3ed","1f9d1-1f3fc-200d-1f3ed","1f9d1-1f3fd-200d-1f3ed","1f9d1-1f3fe-200d-1f3ed","1f9d1-1f3ff-200d-1f3ed"],a:"12.1",x:48,y:49},{n:["man factory worker","male-factory-worker"],u:"1f468-200d-1f3ed",v:["1f468-1f3fb-200d-1f3ed","1f468-1f3fc-200d-1f3ed","1f468-1f3fd-200d-1f3ed","1f468-1f3fe-200d-1f3ed","1f468-1f3ff-200d-1f3ed"],a:"4.0",x:14,y:36},{n:["woman factory worker","female-factory-worker"],u:"1f469-200d-1f3ed",v:["1f469-1f3fb-200d-1f3ed","1f469-1f3fc-200d-1f3ed","1f469-1f3fd-200d-1f3ed","1f469-1f3fe-200d-1f3ed","1f469-1f3ff-200d-1f3ed"],a:"4.0",x:18,y:23},{n:["office worker"],u:"1f9d1-200d-1f4bc",v:["1f9d1-1f3fb-200d-1f4bc","1f9d1-1f3fc-200d-1f4bc","1f9d1-1f3fd-200d-1f4bc","1f9d1-1f3fe-200d-1f4bc","1f9d1-1f3ff-200d-1f4bc"],a:"12.1",x:48,y:61},{n:["man office worker","male-office-worker"],u:"1f468-200d-1f4bc",v:["1f468-1f3fb-200d-1f4bc","1f468-1f3fc-200d-1f4bc","1f468-1f3fd-200d-1f4bc","1f468-1f3fe-200d-1f4bc","1f468-1f3ff-200d-1f4bc"],a:"4.0",x:15,y:1},{n:["woman office worker","female-office-worker"],u:"1f469-200d-1f4bc",v:["1f469-1f3fb-200d-1f4bc","1f469-1f3fc-200d-1f4bc","1f469-1f3fd-200d-1f4bc","1f469-1f3fe-200d-1f4bc","1f469-1f3ff-200d-1f4bc"],a:"4.0",x:18,y:45},{n:["scientist"],u:"1f9d1-200d-1f52c",v:["1f9d1-1f3fb-200d-1f52c","1f9d1-1f3fc-200d-1f52c","1f9d1-1f3fd-200d-1f52c","1f9d1-1f3fe-200d-1f52c","1f9d1-1f3ff-200d-1f52c"],a:"12.1",x:49,y:11},{n:["man scientist","male-scientist"],u:"1f468-200d-1f52c",v:["1f468-1f3fb-200d-1f52c","1f468-1f3fc-200d-1f52c","1f468-1f3fd-200d-1f52c","1f468-1f3fe-200d-1f52c","1f468-1f3ff-200d-1f52c"],a:"4.0",x:15,y:13},{n:["woman scientist","female-scientist"],u:"1f469-200d-1f52c",v:["1f469-1f3fb-200d-1f52c","1f469-1f3fc-200d-1f52c","1f469-1f3fd-200d-1f52c","1f469-1f3fe-200d-1f52c","1f469-1f3ff-200d-1f52c"],a:"4.0",x:18,y:57},{n:["technologist"],u:"1f9d1-200d-1f4bb",v:["1f9d1-1f3fb-200d-1f4bb","1f9d1-1f3fc-200d-1f4bb","1f9d1-1f3fd-200d-1f4bb","1f9d1-1f3fe-200d-1f4bb","1f9d1-1f3ff-200d-1f4bb"],a:"12.1",x:48,y:55},{n:["man technologist","male-technologist"],u:"1f468-200d-1f4bb",v:["1f468-1f3fb-200d-1f4bb","1f468-1f3fc-200d-1f4bb","1f468-1f3fd-200d-1f4bb","1f468-1f3fe-200d-1f4bb","1f468-1f3ff-200d-1f4bb"],a:"4.0",x:14,y:57},{n:["woman technologist","female-technologist"],u:"1f469-200d-1f4bb",v:["1f469-1f3fb-200d-1f4bb","1f469-1f3fc-200d-1f4bb","1f469-1f3fd-200d-1f4bb","1f469-1f3fe-200d-1f4bb","1f469-1f3ff-200d-1f4bb"],a:"4.0",x:18,y:39},{n:["singer"],u:"1f9d1-200d-1f3a4",v:["1f9d1-1f3fb-200d-1f3a4","1f9d1-1f3fc-200d-1f3a4","1f9d1-1f3fd-200d-1f3a4","1f9d1-1f3fe-200d-1f3a4","1f9d1-1f3ff-200d-1f3a4"],a:"12.1",x:48,y:31},{n:["man singer","male-singer"],u:"1f468-200d-1f3a4",v:["1f468-1f3fb-200d-1f3a4","1f468-1f3fc-200d-1f3a4","1f468-1f3fd-200d-1f3a4","1f468-1f3fe-200d-1f3a4","1f468-1f3ff-200d-1f3a4"],a:"4.0",x:14,y:18},{n:["woman singer","female-singer"],u:"1f469-200d-1f3a4",v:["1f469-1f3fb-200d-1f3a4","1f469-1f3fc-200d-1f3a4","1f469-1f3fd-200d-1f3a4","1f469-1f3fe-200d-1f3a4","1f469-1f3ff-200d-1f3a4"],a:"4.0",x:18,y:5},{n:["artist"],u:"1f9d1-200d-1f3a8",v:["1f9d1-1f3fb-200d-1f3a8","1f9d1-1f3fc-200d-1f3a8","1f9d1-1f3fd-200d-1f3a8","1f9d1-1f3fe-200d-1f3a8","1f9d1-1f3ff-200d-1f3a8"],a:"12.1",x:48,y:37},{n:["man artist","male-artist"],u:"1f468-200d-1f3a8",v:["1f468-1f3fb-200d-1f3a8","1f468-1f3fc-200d-1f3a8","1f468-1f3fd-200d-1f3a8","1f468-1f3fe-200d-1f3a8","1f468-1f3ff-200d-1f3a8"],a:"4.0",x:14,y:24},{n:["woman artist","female-artist"],u:"1f469-200d-1f3a8",v:["1f469-1f3fb-200d-1f3a8","1f469-1f3fc-200d-1f3a8","1f469-1f3fd-200d-1f3a8","1f469-1f3fe-200d-1f3a8","1f469-1f3ff-200d-1f3a8"],a:"4.0",x:18,y:11},{n:["pilot"],u:"1f9d1-200d-2708-fe0f",v:["1f9d1-1f3fb-200d-2708-fe0f","1f9d1-1f3fc-200d-2708-fe0f","1f9d1-1f3fd-200d-2708-fe0f","1f9d1-1f3fe-200d-2708-fe0f","1f9d1-1f3ff-200d-2708-fe0f"],a:"12.1",x:51,y:7},{n:["man pilot","male-pilot"],u:"1f468-200d-2708-fe0f",v:["1f468-1f3fb-200d-2708-fe0f","1f468-1f3fc-200d-2708-fe0f","1f468-1f3fd-200d-2708-fe0f","1f468-1f3fe-200d-2708-fe0f","1f468-1f3ff-200d-2708-fe0f"],a:"4.0",x:16,y:41},{n:["woman pilot","female-pilot"],u:"1f469-200d-2708-fe0f",v:["1f469-1f3fb-200d-2708-fe0f","1f469-1f3fc-200d-2708-fe0f","1f469-1f3fd-200d-2708-fe0f","1f469-1f3fe-200d-2708-fe0f","1f469-1f3ff-200d-2708-fe0f"],a:"4.0",x:20,y:23},{n:["astronaut"],u:"1f9d1-200d-1f680",v:["1f9d1-1f3fb-200d-1f680","1f9d1-1f3fc-200d-1f680","1f9d1-1f3fd-200d-1f680","1f9d1-1f3fe-200d-1f680","1f9d1-1f3ff-200d-1f680"],a:"12.1",x:49,y:17},{n:["man astronaut","male-astronaut"],u:"1f468-200d-1f680",v:["1f468-1f3fb-200d-1f680","1f468-1f3fc-200d-1f680","1f468-1f3fd-200d-1f680","1f468-1f3fe-200d-1f680","1f468-1f3ff-200d-1f680"],a:"4.0",x:15,y:19},{n:["woman astronaut","female-astronaut"],u:"1f469-200d-1f680",v:["1f469-1f3fb-200d-1f680","1f469-1f3fc-200d-1f680","1f469-1f3fd-200d-1f680","1f469-1f3fe-200d-1f680","1f469-1f3ff-200d-1f680"],a:"4.0",x:19,y:1},{n:["firefighter"],u:"1f9d1-200d-1f692",v:["1f9d1-1f3fb-200d-1f692","1f9d1-1f3fc-200d-1f692","1f9d1-1f3fd-200d-1f692","1f9d1-1f3fe-200d-1f692","1f9d1-1f3ff-200d-1f692"],a:"12.1",x:49,y:23},{n:["man firefighter","male-firefighter"],u:"1f468-200d-1f692",v:["1f468-1f3fb-200d-1f692","1f468-1f3fc-200d-1f692","1f468-1f3fd-200d-1f692","1f468-1f3fe-200d-1f692","1f468-1f3ff-200d-1f692"],a:"4.0",x:15,y:25},{n:["woman firefighter","female-firefighter"],u:"1f469-200d-1f692",v:["1f469-1f3fb-200d-1f692","1f469-1f3fc-200d-1f692","1f469-1f3fd-200d-1f692","1f469-1f3fe-200d-1f692","1f469-1f3ff-200d-1f692"],a:"4.0",x:19,y:7},{n:["cop","police officer"],u:"1f46e",v:["1f46e-1f3fb","1f46e-1f3fc","1f46e-1f3fd","1f46e-1f3fe","1f46e-1f3ff"],a:"0.6",x:23,y:44},{n:["man police officer","male-police-officer"],u:"1f46e-200d-2642-fe0f",v:["1f46e-1f3fb-200d-2642-fe0f","1f46e-1f3fc-200d-2642-fe0f","1f46e-1f3fd-200d-2642-fe0f","1f46e-1f3fe-200d-2642-fe0f","1f46e-1f3ff-200d-2642-fe0f"],a:"4.0",x:23,y:38},{n:["woman police officer","female-police-officer"],u:"1f46e-200d-2640-fe0f",v:["1f46e-1f3fb-200d-2640-fe0f","1f46e-1f3fc-200d-2640-fe0f","1f46e-1f3fd-200d-2640-fe0f","1f46e-1f3fe-200d-2640-fe0f","1f46e-1f3ff-200d-2640-fe0f"],a:"4.0",x:23,y:32},{n:["detective","sleuth or spy"],u:"1f575-fe0f",v:["1f575-1f3fb","1f575-1f3fc","1f575-1f3fd","1f575-1f3fe","1f575-1f3ff"],a:"0.7",x:31,y:44},{n:["man detective","male-detective"],u:"1f575-fe0f-200d-2642-fe0f",v:["1f575-1f3fb-200d-2642-fe0f","1f575-1f3fc-200d-2642-fe0f","1f575-1f3fd-200d-2642-fe0f","1f575-1f3fe-200d-2642-fe0f","1f575-1f3ff-200d-2642-fe0f"],a:"4.0",x:31,y:38},{n:["woman detective","female-detective"],u:"1f575-fe0f-200d-2640-fe0f",v:["1f575-1f3fb-200d-2640-fe0f","1f575-1f3fc-200d-2640-fe0f","1f575-1f3fd-200d-2640-fe0f","1f575-1f3fe-200d-2640-fe0f","1f575-1f3ff-200d-2640-fe0f"],a:"4.0",x:31,y:32},{n:["guardsman"],u:"1f482",v:["1f482-1f3fb","1f482-1f3fc","1f482-1f3fd","1f482-1f3fe","1f482-1f3ff"],a:"0.6",x:26,y:12},{n:["man guard","male-guard"],u:"1f482-200d-2642-fe0f",v:["1f482-1f3fb-200d-2642-fe0f","1f482-1f3fc-200d-2642-fe0f","1f482-1f3fd-200d-2642-fe0f","1f482-1f3fe-200d-2642-fe0f","1f482-1f3ff-200d-2642-fe0f"],a:"4.0",x:26,y:6},{n:["woman guard","female-guard"],u:"1f482-200d-2640-fe0f",v:["1f482-1f3fb-200d-2640-fe0f","1f482-1f3fc-200d-2640-fe0f","1f482-1f3fd-200d-2640-fe0f","1f482-1f3fe-200d-2640-fe0f","1f482-1f3ff-200d-2640-fe0f"],a:"4.0",x:26,y:0},{n:["ninja"],u:"1f977",v:["1f977-1f3fb","1f977-1f3fc","1f977-1f3fd","1f977-1f3fe","1f977-1f3ff"],a:"13.0",x:44,y:40},{n:["construction worker"],u:"1f477",v:["1f477-1f3fb","1f477-1f3fc","1f477-1f3fd","1f477-1f3fe","1f477-1f3ff"],a:"0.6",x:25,y:19},{n:["man construction worker","male-construction-worker"],u:"1f477-200d-2642-fe0f",v:["1f477-1f3fb-200d-2642-fe0f","1f477-1f3fc-200d-2642-fe0f","1f477-1f3fd-200d-2642-fe0f","1f477-1f3fe-200d-2642-fe0f","1f477-1f3ff-200d-2642-fe0f"],a:"4.0",x:25,y:13},{n:["woman construction worker","female-construction-worker"],u:"1f477-200d-2640-fe0f",v:["1f477-1f3fb-200d-2640-fe0f","1f477-1f3fc-200d-2640-fe0f","1f477-1f3fd-200d-2640-fe0f","1f477-1f3fe-200d-2640-fe0f","1f477-1f3ff-200d-2640-fe0f"],a:"4.0",x:25,y:7},{n:["person with crown"],u:"1fac5",v:["1fac5-1f3fb","1fac5-1f3fc","1fac5-1f3fd","1fac5-1f3fe","1fac5-1f3ff"],a:"14.0",x:56,y:14},{n:["prince"],u:"1f934",v:["1f934-1f3fb","1f934-1f3fc","1f934-1f3fd","1f934-1f3fe","1f934-1f3ff"],a:"3.0",x:41,y:47},{n:["princess"],u:"1f478",v:["1f478-1f3fb","1f478-1f3fc","1f478-1f3fd","1f478-1f3fe","1f478-1f3ff"],a:"0.6",x:25,y:25},{n:["man with turban"],u:"1f473",v:["1f473-1f3fb","1f473-1f3fc","1f473-1f3fd","1f473-1f3fe","1f473-1f3ff"],a:"0.6",x:24,y:45},{n:["man wearing turban","man-wearing-turban"],u:"1f473-200d-2642-fe0f",v:["1f473-1f3fb-200d-2642-fe0f","1f473-1f3fc-200d-2642-fe0f","1f473-1f3fd-200d-2642-fe0f","1f473-1f3fe-200d-2642-fe0f","1f473-1f3ff-200d-2642-fe0f"],a:"4.0",x:24,y:39},{n:["woman wearing turban","woman-wearing-turban"],u:"1f473-200d-2640-fe0f",v:["1f473-1f3fb-200d-2640-fe0f","1f473-1f3fc-200d-2640-fe0f","1f473-1f3fd-200d-2640-fe0f","1f473-1f3fe-200d-2640-fe0f","1f473-1f3ff-200d-2640-fe0f"],a:"4.0",x:24,y:33},{n:["man with gua pi mao"],u:"1f472",v:["1f472-1f3fb","1f472-1f3fc","1f472-1f3fd","1f472-1f3fe","1f472-1f3ff"],a:"0.6",x:24,y:27},{n:["person with headscarf"],u:"1f9d5",v:["1f9d5-1f3fb","1f9d5-1f3fc","1f9d5-1f3fd","1f9d5-1f3fe","1f9d5-1f3ff"],a:"5.0",x:51,y:49},{n:["man in tuxedo","person in tuxedo"],u:"1f935",v:["1f935-1f3fb","1f935-1f3fc","1f935-1f3fd","1f935-1f3fe","1f935-1f3ff"],a:"3.0",x:42,y:3},{n:["man in tuxedo"],u:"1f935-200d-2642-fe0f",v:["1f935-1f3fb-200d-2642-fe0f","1f935-1f3fc-200d-2642-fe0f","1f935-1f3fd-200d-2642-fe0f","1f935-1f3fe-200d-2642-fe0f","1f935-1f3ff-200d-2642-fe0f"],a:"13.0",x:41,y:59},{n:["woman in tuxedo"],u:"1f935-200d-2640-fe0f",v:["1f935-1f3fb-200d-2640-fe0f","1f935-1f3fc-200d-2640-fe0f","1f935-1f3fd-200d-2640-fe0f","1f935-1f3fe-200d-2640-fe0f","1f935-1f3ff-200d-2640-fe0f"],a:"13.0",x:41,y:53},{n:["bride with veil"],u:"1f470",v:["1f470-1f3fb","1f470-1f3fc","1f470-1f3fd","1f470-1f3fe","1f470-1f3ff"],a:"0.6",x:24,y:3},{n:["man with veil"],u:"1f470-200d-2642-fe0f",v:["1f470-1f3fb-200d-2642-fe0f","1f470-1f3fc-200d-2642-fe0f","1f470-1f3fd-200d-2642-fe0f","1f470-1f3fe-200d-2642-fe0f","1f470-1f3ff-200d-2642-fe0f"],a:"13.0",x:23,y:59},{n:["woman with veil"],u:"1f470-200d-2640-fe0f",v:["1f470-1f3fb-200d-2640-fe0f","1f470-1f3fc-200d-2640-fe0f","1f470-1f3fd-200d-2640-fe0f","1f470-1f3fe-200d-2640-fe0f","1f470-1f3ff-200d-2640-fe0f"],a:"13.0",x:23,y:53},{n:["pregnant woman"],u:"1f930",v:["1f930-1f3fb","1f930-1f3fc","1f930-1f3fd","1f930-1f3fe","1f930-1f3ff"],a:"3.0",x:41,y:23},{n:["pregnant man"],u:"1fac3",v:["1fac3-1f3fb","1fac3-1f3fc","1fac3-1f3fd","1fac3-1f3fe","1fac3-1f3ff"],a:"14.0",x:56,y:2},{n:["pregnant person"],u:"1fac4",v:["1fac4-1f3fb","1fac4-1f3fc","1fac4-1f3fd","1fac4-1f3fe","1fac4-1f3ff"],a:"14.0",x:56,y:8},{n:["breast-feeding"],u:"1f931",v:["1f931-1f3fb","1f931-1f3fc","1f931-1f3fd","1f931-1f3fe","1f931-1f3ff"],a:"5.0",x:41,y:29},{n:["woman feeding baby"],u:"1f469-200d-1f37c",v:["1f469-1f3fb-200d-1f37c","1f469-1f3fc-200d-1f37c","1f469-1f3fd-200d-1f37c","1f469-1f3fe-200d-1f37c","1f469-1f3ff-200d-1f37c"],a:"13.0",x:17,y:55},{n:["man feeding baby"],u:"1f468-200d-1f37c",v:["1f468-1f3fb-200d-1f37c","1f468-1f3fc-200d-1f37c","1f468-1f3fd-200d-1f37c","1f468-1f3fe-200d-1f37c","1f468-1f3ff-200d-1f37c"],a:"13.0",x:14,y:6},{n:["person feeding baby"],u:"1f9d1-200d-1f37c",v:["1f9d1-1f3fb-200d-1f37c","1f9d1-1f3fc-200d-1f37c","1f9d1-1f3fd-200d-1f37c","1f9d1-1f3fe-200d-1f37c","1f9d1-1f3ff-200d-1f37c"],a:"13.0",x:48,y:13},{n:["angel","baby angel"],u:"1f47c",v:["1f47c-1f3fb","1f47c-1f3fc","1f47c-1f3fd","1f47c-1f3fe","1f47c-1f3ff"],a:"0.6",x:25,y:34},{n:["santa","father christmas"],u:"1f385",v:["1f385-1f3fb","1f385-1f3fc","1f385-1f3fd","1f385-1f3fe","1f385-1f3ff"],a:"0.6",x:7,y:4},{n:["mrs claus","mother christmas"],u:"1f936",v:["1f936-1f3fb","1f936-1f3fc","1f936-1f3fd","1f936-1f3fe","1f936-1f3ff"],a:"3.0",x:42,y:9},{n:["mx claus"],u:"1f9d1-200d-1f384",v:["1f9d1-1f3fb-200d-1f384","1f9d1-1f3fc-200d-1f384","1f9d1-1f3fd-200d-1f384","1f9d1-1f3fe-200d-1f384","1f9d1-1f3ff-200d-1f384"],a:"13.0",x:48,y:19},{n:["superhero"],u:"1f9b8",v:["1f9b8-1f3fb","1f9b8-1f3fc","1f9b8-1f3fd","1f9b8-1f3fe","1f9b8-1f3ff"],a:"11.0",x:46,y:4},{n:["man superhero","male superhero"],u:"1f9b8-200d-2642-fe0f",v:["1f9b8-1f3fb-200d-2642-fe0f","1f9b8-1f3fc-200d-2642-fe0f","1f9b8-1f3fd-200d-2642-fe0f","1f9b8-1f3fe-200d-2642-fe0f","1f9b8-1f3ff-200d-2642-fe0f"],a:"11.0",x:45,y:60},{n:["woman superhero","female superhero"],u:"1f9b8-200d-2640-fe0f",v:["1f9b8-1f3fb-200d-2640-fe0f","1f9b8-1f3fc-200d-2640-fe0f","1f9b8-1f3fd-200d-2640-fe0f","1f9b8-1f3fe-200d-2640-fe0f","1f9b8-1f3ff-200d-2640-fe0f"],a:"11.0",x:45,y:54},{n:["supervillain"],u:"1f9b9",v:["1f9b9-1f3fb","1f9b9-1f3fc","1f9b9-1f3fd","1f9b9-1f3fe","1f9b9-1f3ff"],a:"11.0",x:46,y:22},{n:["man supervillain","male supervillain"],u:"1f9b9-200d-2642-fe0f",v:["1f9b9-1f3fb-200d-2642-fe0f","1f9b9-1f3fc-200d-2642-fe0f","1f9b9-1f3fd-200d-2642-fe0f","1f9b9-1f3fe-200d-2642-fe0f","1f9b9-1f3ff-200d-2642-fe0f"],a:"11.0",x:46,y:16},{n:["woman supervillain","female supervillain"],u:"1f9b9-200d-2640-fe0f",v:["1f9b9-1f3fb-200d-2640-fe0f","1f9b9-1f3fc-200d-2640-fe0f","1f9b9-1f3fd-200d-2640-fe0f","1f9b9-1f3fe-200d-2640-fe0f","1f9b9-1f3ff-200d-2640-fe0f"],a:"11.0",x:46,y:10},{n:["mage"],u:"1f9d9",v:["1f9d9-1f3fb","1f9d9-1f3fc","1f9d9-1f3fd","1f9d9-1f3fe","1f9d9-1f3ff"],a:"5.0",x:52,y:59},{n:["man mage","male mage"],u:"1f9d9-200d-2642-fe0f",v:["1f9d9-1f3fb-200d-2642-fe0f","1f9d9-1f3fc-200d-2642-fe0f","1f9d9-1f3fd-200d-2642-fe0f","1f9d9-1f3fe-200d-2642-fe0f","1f9d9-1f3ff-200d-2642-fe0f"],a:"5.0",x:52,y:53},{n:["woman mage","female mage"],u:"1f9d9-200d-2640-fe0f",v:["1f9d9-1f3fb-200d-2640-fe0f","1f9d9-1f3fc-200d-2640-fe0f","1f9d9-1f3fd-200d-2640-fe0f","1f9d9-1f3fe-200d-2640-fe0f","1f9d9-1f3ff-200d-2640-fe0f"],a:"5.0",x:52,y:47},{n:["fairy"],u:"1f9da",v:["1f9da-1f3fb","1f9da-1f3fc","1f9da-1f3fd","1f9da-1f3fe","1f9da-1f3ff"],a:"5.0",x:53,y:15},{n:["man fairy","male fairy"],u:"1f9da-200d-2642-fe0f",v:["1f9da-1f3fb-200d-2642-fe0f","1f9da-1f3fc-200d-2642-fe0f","1f9da-1f3fd-200d-2642-fe0f","1f9da-1f3fe-200d-2642-fe0f","1f9da-1f3ff-200d-2642-fe0f"],a:"5.0",x:53,y:9},{n:["woman fairy","female fairy"],u:"1f9da-200d-2640-fe0f",v:["1f9da-1f3fb-200d-2640-fe0f","1f9da-1f3fc-200d-2640-fe0f","1f9da-1f3fd-200d-2640-fe0f","1f9da-1f3fe-200d-2640-fe0f","1f9da-1f3ff-200d-2640-fe0f"],a:"5.0",x:53,y:3},{n:["vampire"],u:"1f9db",v:["1f9db-1f3fb","1f9db-1f3fc","1f9db-1f3fd","1f9db-1f3fe","1f9db-1f3ff"],a:"5.0",x:53,y:33},{n:["man vampire","male vampire"],u:"1f9db-200d-2642-fe0f",v:["1f9db-1f3fb-200d-2642-fe0f","1f9db-1f3fc-200d-2642-fe0f","1f9db-1f3fd-200d-2642-fe0f","1f9db-1f3fe-200d-2642-fe0f","1f9db-1f3ff-200d-2642-fe0f"],a:"5.0",x:53,y:27},{n:["woman vampire","female vampire"],u:"1f9db-200d-2640-fe0f",v:["1f9db-1f3fb-200d-2640-fe0f","1f9db-1f3fc-200d-2640-fe0f","1f9db-1f3fd-200d-2640-fe0f","1f9db-1f3fe-200d-2640-fe0f","1f9db-1f3ff-200d-2640-fe0f"],a:"5.0",x:53,y:21},{n:["merperson"],u:"1f9dc",v:["1f9dc-1f3fb","1f9dc-1f3fc","1f9dc-1f3fd","1f9dc-1f3fe","1f9dc-1f3ff"],a:"5.0",x:53,y:51},{n:["merman"],u:"1f9dc-200d-2642-fe0f",v:["1f9dc-1f3fb-200d-2642-fe0f","1f9dc-1f3fc-200d-2642-fe0f","1f9dc-1f3fd-200d-2642-fe0f","1f9dc-1f3fe-200d-2642-fe0f","1f9dc-1f3ff-200d-2642-fe0f"],a:"5.0",x:53,y:45},{n:["mermaid"],u:"1f9dc-200d-2640-fe0f",v:["1f9dc-1f3fb-200d-2640-fe0f","1f9dc-1f3fc-200d-2640-fe0f","1f9dc-1f3fd-200d-2640-fe0f","1f9dc-1f3fe-200d-2640-fe0f","1f9dc-1f3ff-200d-2640-fe0f"],a:"5.0",x:53,y:39},{n:["elf"],u:"1f9dd",v:["1f9dd-1f3fb","1f9dd-1f3fc","1f9dd-1f3fd","1f9dd-1f3fe","1f9dd-1f3ff"],a:"5.0",x:54,y:7},{n:["man elf","male elf"],u:"1f9dd-200d-2642-fe0f",v:["1f9dd-1f3fb-200d-2642-fe0f","1f9dd-1f3fc-200d-2642-fe0f","1f9dd-1f3fd-200d-2642-fe0f","1f9dd-1f3fe-200d-2642-fe0f","1f9dd-1f3ff-200d-2642-fe0f"],a:"5.0",x:54,y:1},{n:["woman elf","female elf"],u:"1f9dd-200d-2640-fe0f",v:["1f9dd-1f3fb-200d-2640-fe0f","1f9dd-1f3fc-200d-2640-fe0f","1f9dd-1f3fd-200d-2640-fe0f","1f9dd-1f3fe-200d-2640-fe0f","1f9dd-1f3ff-200d-2640-fe0f"],a:"5.0",x:53,y:57},{n:["genie"],u:"1f9de",a:"5.0",x:54,y:15},{n:["man genie","male genie"],u:"1f9de-200d-2642-fe0f",a:"5.0",x:54,y:14},{n:["woman genie","female genie"],u:"1f9de-200d-2640-fe0f",a:"5.0",x:54,y:13},{n:["zombie"],u:"1f9df",a:"5.0",x:54,y:18},{n:["man zombie","male zombie"],u:"1f9df-200d-2642-fe0f",a:"5.0",x:54,y:17},{n:["woman zombie","female zombie"],u:"1f9df-200d-2640-fe0f",a:"5.0",x:54,y:16},{n:["troll"],u:"1f9cc",a:"14.0",x:46,y:51},{n:["massage","face massage"],u:"1f486",v:["1f486-1f3fb","1f486-1f3fc","1f486-1f3fd","1f486-1f3fe","1f486-1f3ff"],a:"0.6",x:26,y:43},{n:["man getting massage","man-getting-massage"],u:"1f486-200d-2642-fe0f",v:["1f486-1f3fb-200d-2642-fe0f","1f486-1f3fc-200d-2642-fe0f","1f486-1f3fd-200d-2642-fe0f","1f486-1f3fe-200d-2642-fe0f","1f486-1f3ff-200d-2642-fe0f"],a:"4.0",x:26,y:37},{n:["woman getting massage","woman-getting-massage"],u:"1f486-200d-2640-fe0f",v:["1f486-1f3fb-200d-2640-fe0f","1f486-1f3fc-200d-2640-fe0f","1f486-1f3fd-200d-2640-fe0f","1f486-1f3fe-200d-2640-fe0f","1f486-1f3ff-200d-2640-fe0f"],a:"4.0",x:26,y:31},{n:["haircut"],u:"1f487",v:["1f487-1f3fb","1f487-1f3fc","1f487-1f3fd","1f487-1f3fe","1f487-1f3ff"],a:"0.6",x:26,y:61},{n:["man getting haircut","man-getting-haircut"],u:"1f487-200d-2642-fe0f",v:["1f487-1f3fb-200d-2642-fe0f","1f487-1f3fc-200d-2642-fe0f","1f487-1f3fd-200d-2642-fe0f","1f487-1f3fe-200d-2642-fe0f","1f487-1f3ff-200d-2642-fe0f"],a:"4.0",x:26,y:55},{n:["woman getting haircut","woman-getting-haircut"],u:"1f487-200d-2640-fe0f",v:["1f487-1f3fb-200d-2640-fe0f","1f487-1f3fc-200d-2640-fe0f","1f487-1f3fd-200d-2640-fe0f","1f487-1f3fe-200d-2640-fe0f","1f487-1f3ff-200d-2640-fe0f"],a:"4.0",x:26,y:49},{n:["walking","pedestrian"],u:"1f6b6",v:["1f6b6-1f3fb","1f6b6-1f3fc","1f6b6-1f3fd","1f6b6-1f3fe","1f6b6-1f3ff"],a:"0.6",x:38,y:7},{n:["man walking","man-walking"],u:"1f6b6-200d-2642-fe0f",v:["1f6b6-1f3fb-200d-2642-fe0f","1f6b6-1f3fc-200d-2642-fe0f","1f6b6-1f3fd-200d-2642-fe0f","1f6b6-1f3fe-200d-2642-fe0f","1f6b6-1f3ff-200d-2642-fe0f"],a:"4.0",x:37,y:51},{n:["woman walking","woman-walking"],u:"1f6b6-200d-2640-fe0f",v:["1f6b6-1f3fb-200d-2640-fe0f","1f6b6-1f3fc-200d-2640-fe0f","1f6b6-1f3fd-200d-2640-fe0f","1f6b6-1f3fe-200d-2640-fe0f","1f6b6-1f3ff-200d-2640-fe0f"],a:"4.0",x:37,y:39},{n:["person walking facing right"],u:"1f6b6-200d-27a1-fe0f",v:["1f6b6-1f3fb-200d-27a1-fe0f","1f6b6-1f3fc-200d-27a1-fe0f","1f6b6-1f3fd-200d-27a1-fe0f","1f6b6-1f3fe-200d-27a1-fe0f","1f6b6-1f3ff-200d-27a1-fe0f"],a:"15.1",x:38,y:1},{n:["woman walking facing right"],u:"1f6b6-200d-2640-fe0f-200d-27a1-fe0f",v:["1f6b6-1f3fb-200d-2640-fe0f-200d-27a1-fe0f","1f6b6-1f3fc-200d-2640-fe0f-200d-27a1-fe0f","1f6b6-1f3fd-200d-2640-fe0f-200d-27a1-fe0f","1f6b6-1f3fe-200d-2640-fe0f-200d-27a1-fe0f","1f6b6-1f3ff-200d-2640-fe0f-200d-27a1-fe0f"],a:"15.1",x:37,y:45},{n:["man walking facing right"],u:"1f6b6-200d-2642-fe0f-200d-27a1-fe0f",v:["1f6b6-1f3fb-200d-2642-fe0f-200d-27a1-fe0f","1f6b6-1f3fc-200d-2642-fe0f-200d-27a1-fe0f","1f6b6-1f3fd-200d-2642-fe0f-200d-27a1-fe0f","1f6b6-1f3fe-200d-2642-fe0f-200d-27a1-fe0f","1f6b6-1f3ff-200d-2642-fe0f-200d-27a1-fe0f"],a:"15.1",x:37,y:57},{n:["standing person"],u:"1f9cd",v:["1f9cd-1f3fb","1f9cd-1f3fc","1f9cd-1f3fd","1f9cd-1f3fe","1f9cd-1f3ff"],a:"12.0",x:47,y:2},{n:["man standing"],u:"1f9cd-200d-2642-fe0f",v:["1f9cd-1f3fb-200d-2642-fe0f","1f9cd-1f3fc-200d-2642-fe0f","1f9cd-1f3fd-200d-2642-fe0f","1f9cd-1f3fe-200d-2642-fe0f","1f9cd-1f3ff-200d-2642-fe0f"],a:"12.0",x:46,y:58},{n:["woman standing"],u:"1f9cd-200d-2640-fe0f",v:["1f9cd-1f3fb-200d-2640-fe0f","1f9cd-1f3fc-200d-2640-fe0f","1f9cd-1f3fd-200d-2640-fe0f","1f9cd-1f3fe-200d-2640-fe0f","1f9cd-1f3ff-200d-2640-fe0f"],a:"12.0",x:46,y:52},{n:["kneeling person"],u:"1f9ce",v:["1f9ce-1f3fb","1f9ce-1f3fc","1f9ce-1f3fd","1f9ce-1f3fe","1f9ce-1f3ff"],a:"12.0",x:47,y:38},{n:["man kneeling"],u:"1f9ce-200d-2642-fe0f",v:["1f9ce-1f3fb-200d-2642-fe0f","1f9ce-1f3fc-200d-2642-fe0f","1f9ce-1f3fd-200d-2642-fe0f","1f9ce-1f3fe-200d-2642-fe0f","1f9ce-1f3ff-200d-2642-fe0f"],a:"12.0",x:47,y:20},{n:["woman kneeling"],u:"1f9ce-200d-2640-fe0f",v:["1f9ce-1f3fb-200d-2640-fe0f","1f9ce-1f3fc-200d-2640-fe0f","1f9ce-1f3fd-200d-2640-fe0f","1f9ce-1f3fe-200d-2640-fe0f","1f9ce-1f3ff-200d-2640-fe0f"],a:"12.0",x:47,y:8},{n:["person kneeling facing right"],u:"1f9ce-200d-27a1-fe0f",v:["1f9ce-1f3fb-200d-27a1-fe0f","1f9ce-1f3fc-200d-27a1-fe0f","1f9ce-1f3fd-200d-27a1-fe0f","1f9ce-1f3fe-200d-27a1-fe0f","1f9ce-1f3ff-200d-27a1-fe0f"],a:"15.1",x:47,y:32},{n:["woman kneeling facing right"],u:"1f9ce-200d-2640-fe0f-200d-27a1-fe0f",v:["1f9ce-1f3fb-200d-2640-fe0f-200d-27a1-fe0f","1f9ce-1f3fc-200d-2640-fe0f-200d-27a1-fe0f","1f9ce-1f3fd-200d-2640-fe0f-200d-27a1-fe0f","1f9ce-1f3fe-200d-2640-fe0f-200d-27a1-fe0f","1f9ce-1f3ff-200d-2640-fe0f-200d-27a1-fe0f"],a:"15.1",x:47,y:14},{n:["man kneeling facing right"],u:"1f9ce-200d-2642-fe0f-200d-27a1-fe0f",v:["1f9ce-1f3fb-200d-2642-fe0f-200d-27a1-fe0f","1f9ce-1f3fc-200d-2642-fe0f-200d-27a1-fe0f","1f9ce-1f3fd-200d-2642-fe0f-200d-27a1-fe0f","1f9ce-1f3fe-200d-2642-fe0f-200d-27a1-fe0f","1f9ce-1f3ff-200d-2642-fe0f-200d-27a1-fe0f"],a:"15.1",x:47,y:26},{n:["person with white cane","person with probing cane"],u:"1f9d1-200d-1f9af",v:["1f9d1-1f3fb-200d-1f9af","1f9d1-1f3fc-200d-1f9af","1f9d1-1f3fd-200d-1f9af","1f9d1-1f3fe-200d-1f9af","1f9d1-1f3ff-200d-1f9af"],a:"12.1",x:49,y:61},{n:["person with white cane facing right"],u:"1f9d1-200d-1f9af-200d-27a1-fe0f",v:["1f9d1-1f3fb-200d-1f9af-200d-27a1-fe0f","1f9d1-1f3fc-200d-1f9af-200d-27a1-fe0f","1f9d1-1f3fd-200d-1f9af-200d-27a1-fe0f","1f9d1-1f3fe-200d-1f9af-200d-27a1-fe0f","1f9d1-1f3ff-200d-1f9af-200d-27a1-fe0f"],a:"15.1",x:49,y:55},{n:["man with white cane","man with probing cane"],u:"1f468-200d-1f9af",v:["1f468-1f3fb-200d-1f9af","1f468-1f3fc-200d-1f9af","1f468-1f3fd-200d-1f9af","1f468-1f3fe-200d-1f9af","1f468-1f3ff-200d-1f9af"],a:"12.0",x:15,y:37},{n:["man with white cane facing right"],u:"1f468-200d-1f9af-200d-27a1-fe0f",v:["1f468-1f3fb-200d-1f9af-200d-27a1-fe0f","1f468-1f3fc-200d-1f9af-200d-27a1-fe0f","1f468-1f3fd-200d-1f9af-200d-27a1-fe0f","1f468-1f3fe-200d-1f9af-200d-27a1-fe0f","1f468-1f3ff-200d-1f9af-200d-27a1-fe0f"],a:"15.1",x:15,y:31},{n:["woman with white cane","woman with probing cane"],u:"1f469-200d-1f9af",v:["1f469-1f3fb-200d-1f9af","1f469-1f3fc-200d-1f9af","1f469-1f3fd-200d-1f9af","1f469-1f3fe-200d-1f9af","1f469-1f3ff-200d-1f9af"],a:"12.0",x:19,y:19},{n:["woman with white cane facing right"],u:"1f469-200d-1f9af-200d-27a1-fe0f",v:["1f469-1f3fb-200d-1f9af-200d-27a1-fe0f","1f469-1f3fc-200d-1f9af-200d-27a1-fe0f","1f469-1f3fd-200d-1f9af-200d-27a1-fe0f","1f469-1f3fe-200d-1f9af-200d-27a1-fe0f","1f469-1f3ff-200d-1f9af-200d-27a1-fe0f"],a:"15.1",x:19,y:13},{n:["person in motorized wheelchair"],u:"1f9d1-200d-1f9bc",v:["1f9d1-1f3fb-200d-1f9bc","1f9d1-1f3fc-200d-1f9bc","1f9d1-1f3fd-200d-1f9bc","1f9d1-1f3fe-200d-1f9bc","1f9d1-1f3ff-200d-1f9bc"],a:"12.1",x:50,y:35},{n:["person in motorized wheelchair facing right"],u:"1f9d1-200d-1f9bc-200d-27a1-fe0f",v:["1f9d1-1f3fb-200d-1f9bc-200d-27a1-fe0f","1f9d1-1f3fc-200d-1f9bc-200d-27a1-fe0f","1f9d1-1f3fd-200d-1f9bc-200d-27a1-fe0f","1f9d1-1f3fe-200d-1f9bc-200d-27a1-fe0f","1f9d1-1f3ff-200d-1f9bc-200d-27a1-fe0f"],a:"15.1",x:50,y:29},{n:["man in motorized wheelchair"],u:"1f468-200d-1f9bc",v:["1f468-1f3fb-200d-1f9bc","1f468-1f3fc-200d-1f9bc","1f468-1f3fd-200d-1f9bc","1f468-1f3fe-200d-1f9bc","1f468-1f3ff-200d-1f9bc"],a:"12.0",x:16,y:11},{n:["man in motorized wheelchair facing right"],u:"1f468-200d-1f9bc-200d-27a1-fe0f",v:["1f468-1f3fb-200d-1f9bc-200d-27a1-fe0f","1f468-1f3fc-200d-1f9bc-200d-27a1-fe0f","1f468-1f3fd-200d-1f9bc-200d-27a1-fe0f","1f468-1f3fe-200d-1f9bc-200d-27a1-fe0f","1f468-1f3ff-200d-1f9bc-200d-27a1-fe0f"],a:"15.1",x:16,y:5},{n:["woman in motorized wheelchair"],u:"1f469-200d-1f9bc",v:["1f469-1f3fb-200d-1f9bc","1f469-1f3fc-200d-1f9bc","1f469-1f3fd-200d-1f9bc","1f469-1f3fe-200d-1f9bc","1f469-1f3ff-200d-1f9bc"],a:"12.0",x:19,y:55},{n:["woman in motorized wheelchair facing right"],u:"1f469-200d-1f9bc-200d-27a1-fe0f",v:["1f469-1f3fb-200d-1f9bc-200d-27a1-fe0f","1f469-1f3fc-200d-1f9bc-200d-27a1-fe0f","1f469-1f3fd-200d-1f9bc-200d-27a1-fe0f","1f469-1f3fe-200d-1f9bc-200d-27a1-fe0f","1f469-1f3ff-200d-1f9bc-200d-27a1-fe0f"],a:"15.1",x:19,y:49},{n:["person in manual wheelchair"],u:"1f9d1-200d-1f9bd",v:["1f9d1-1f3fb-200d-1f9bd","1f9d1-1f3fc-200d-1f9bd","1f9d1-1f3fd-200d-1f9bd","1f9d1-1f3fe-200d-1f9bd","1f9d1-1f3ff-200d-1f9bd"],a:"12.1",x:50,y:47},{n:["person in manual wheelchair facing right"],u:"1f9d1-200d-1f9bd-200d-27a1-fe0f",v:["1f9d1-1f3fb-200d-1f9bd-200d-27a1-fe0f","1f9d1-1f3fc-200d-1f9bd-200d-27a1-fe0f","1f9d1-1f3fd-200d-1f9bd-200d-27a1-fe0f","1f9d1-1f3fe-200d-1f9bd-200d-27a1-fe0f","1f9d1-1f3ff-200d-1f9bd-200d-27a1-fe0f"],a:"15.1",x:50,y:41},{n:["man in manual wheelchair"],u:"1f468-200d-1f9bd",v:["1f468-1f3fb-200d-1f9bd","1f468-1f3fc-200d-1f9bd","1f468-1f3fd-200d-1f9bd","1f468-1f3fe-200d-1f9bd","1f468-1f3ff-200d-1f9bd"],a:"12.0",x:16,y:23},{n:["man in manual wheelchair facing right"],u:"1f468-200d-1f9bd-200d-27a1-fe0f",v:["1f468-1f3fb-200d-1f9bd-200d-27a1-fe0f","1f468-1f3fc-200d-1f9bd-200d-27a1-fe0f","1f468-1f3fd-200d-1f9bd-200d-27a1-fe0f","1f468-1f3fe-200d-1f9bd-200d-27a1-fe0f","1f468-1f3ff-200d-1f9bd-200d-27a1-fe0f"],a:"15.1",x:16,y:17},{n:["woman in manual wheelchair"],u:"1f469-200d-1f9bd",v:["1f469-1f3fb-200d-1f9bd","1f469-1f3fc-200d-1f9bd","1f469-1f3fd-200d-1f9bd","1f469-1f3fe-200d-1f9bd","1f469-1f3ff-200d-1f9bd"],a:"12.0",x:20,y:5},{n:["woman in manual wheelchair facing right"],u:"1f469-200d-1f9bd-200d-27a1-fe0f",v:["1f469-1f3fb-200d-1f9bd-200d-27a1-fe0f","1f469-1f3fc-200d-1f9bd-200d-27a1-fe0f","1f469-1f3fd-200d-1f9bd-200d-27a1-fe0f","1f469-1f3fe-200d-1f9bd-200d-27a1-fe0f","1f469-1f3ff-200d-1f9bd-200d-27a1-fe0f"],a:"15.1",x:19,y:61},{n:["runner","running"],u:"1f3c3",v:["1f3c3-1f3fb","1f3c3-1f3fc","1f3c3-1f3fd","1f3c3-1f3fe","1f3c3-1f3ff"],a:"0.6",x:8,y:39},{n:["man running","man-running"],u:"1f3c3-200d-2642-fe0f",v:["1f3c3-1f3fb-200d-2642-fe0f","1f3c3-1f3fc-200d-2642-fe0f","1f3c3-1f3fd-200d-2642-fe0f","1f3c3-1f3fe-200d-2642-fe0f","1f3c3-1f3ff-200d-2642-fe0f"],a:"4.0",x:8,y:21},{n:["woman running","woman-running"],u:"1f3c3-200d-2640-fe0f",v:["1f3c3-1f3fb-200d-2640-fe0f","1f3c3-1f3fc-200d-2640-fe0f","1f3c3-1f3fd-200d-2640-fe0f","1f3c3-1f3fe-200d-2640-fe0f","1f3c3-1f3ff-200d-2640-fe0f"],a:"4.0",x:8,y:9},{n:["person running facing right"],u:"1f3c3-200d-27a1-fe0f",v:["1f3c3-1f3fb-200d-27a1-fe0f","1f3c3-1f3fc-200d-27a1-fe0f","1f3c3-1f3fd-200d-27a1-fe0f","1f3c3-1f3fe-200d-27a1-fe0f","1f3c3-1f3ff-200d-27a1-fe0f"],a:"15.1",x:8,y:33},{n:["woman running facing right"],u:"1f3c3-200d-2640-fe0f-200d-27a1-fe0f",v:["1f3c3-1f3fb-200d-2640-fe0f-200d-27a1-fe0f","1f3c3-1f3fc-200d-2640-fe0f-200d-27a1-fe0f","1f3c3-1f3fd-200d-2640-fe0f-200d-27a1-fe0f","1f3c3-1f3fe-200d-2640-fe0f-200d-27a1-fe0f","1f3c3-1f3ff-200d-2640-fe0f-200d-27a1-fe0f"],a:"15.1",x:8,y:15},{n:["man running facing right"],u:"1f3c3-200d-2642-fe0f-200d-27a1-fe0f",v:["1f3c3-1f3fb-200d-2642-fe0f-200d-27a1-fe0f","1f3c3-1f3fc-200d-2642-fe0f-200d-27a1-fe0f","1f3c3-1f3fd-200d-2642-fe0f-200d-27a1-fe0f","1f3c3-1f3fe-200d-2642-fe0f-200d-27a1-fe0f","1f3c3-1f3ff-200d-2642-fe0f-200d-27a1-fe0f"],a:"15.1",x:8,y:27},{n:["dancer"],u:"1f483",v:["1f483-1f3fb","1f483-1f3fc","1f483-1f3fd","1f483-1f3fe","1f483-1f3ff"],a:"0.6",x:26,y:18},{n:["man dancing"],u:"1f57a",v:["1f57a-1f3fb","1f57a-1f3fc","1f57a-1f3fd","1f57a-1f3fe","1f57a-1f3ff"],a:"3.0",x:31,y:54},{n:["person in suit levitating","man in business suit levitating"],u:"1f574-fe0f",v:["1f574-1f3fb","1f574-1f3fc","1f574-1f3fd","1f574-1f3fe","1f574-1f3ff"],a:"0.7",x:31,y:26},{n:["dancers","woman with bunny ears"],u:"1f46f",a:"0.6",x:23,y:52},{n:["men with bunny ears","men-with-bunny-ears-partying","man-with-bunny-ears-partying"],u:"1f46f-200d-2642-fe0f",a:"4.0",x:23,y:51},{n:["women with bunny ears","women-with-bunny-ears-partying","woman-with-bunny-ears-partying"],u:"1f46f-200d-2640-fe0f",a:"4.0",x:23,y:50},{n:["person in steamy room"],u:"1f9d6",v:["1f9d6-1f3fb","1f9d6-1f3fc","1f9d6-1f3fd","1f9d6-1f3fe","1f9d6-1f3ff"],a:"5.0",x:52,y:5},{n:["man in steamy room"],u:"1f9d6-200d-2642-fe0f",v:["1f9d6-1f3fb-200d-2642-fe0f","1f9d6-1f3fc-200d-2642-fe0f","1f9d6-1f3fd-200d-2642-fe0f","1f9d6-1f3fe-200d-2642-fe0f","1f9d6-1f3ff-200d-2642-fe0f"],a:"5.0",x:51,y:61},{n:["woman in steamy room"],u:"1f9d6-200d-2640-fe0f",v:["1f9d6-1f3fb-200d-2640-fe0f","1f9d6-1f3fc-200d-2640-fe0f","1f9d6-1f3fd-200d-2640-fe0f","1f9d6-1f3fe-200d-2640-fe0f","1f9d6-1f3ff-200d-2640-fe0f"],a:"5.0",x:51,y:55},{n:["person climbing"],u:"1f9d7",v:["1f9d7-1f3fb","1f9d7-1f3fc","1f9d7-1f3fd","1f9d7-1f3fe","1f9d7-1f3ff"],a:"5.0",x:52,y:23},{n:["man climbing"],u:"1f9d7-200d-2642-fe0f",v:["1f9d7-1f3fb-200d-2642-fe0f","1f9d7-1f3fc-200d-2642-fe0f","1f9d7-1f3fd-200d-2642-fe0f","1f9d7-1f3fe-200d-2642-fe0f","1f9d7-1f3ff-200d-2642-fe0f"],a:"5.0",x:52,y:17},{n:["woman climbing"],u:"1f9d7-200d-2640-fe0f",v:["1f9d7-1f3fb-200d-2640-fe0f","1f9d7-1f3fc-200d-2640-fe0f","1f9d7-1f3fd-200d-2640-fe0f","1f9d7-1f3fe-200d-2640-fe0f","1f9d7-1f3ff-200d-2640-fe0f"],a:"5.0",x:52,y:11},{n:["fencer"],u:"1f93a",a:"3.0",x:43,y:7},{n:["horse racing"],u:"1f3c7",v:["1f3c7-1f3fb","1f3c7-1f3fc","1f3c7-1f3fd","1f3c7-1f3fe","1f3c7-1f3ff"],a:"1.0",x:9,y:3},{n:["skier"],u:"26f7-fe0f",a:"0.7",x:59,y:38},{n:["snowboarder"],u:"1f3c2",v:["1f3c2-1f3fb","1f3c2-1f3fc","1f3c2-1f3fd","1f3c2-1f3fe","1f3c2-1f3ff"],a:"0.6",x:8,y:3},{n:["golfer","person golfing"],u:"1f3cc-fe0f",v:["1f3cc-1f3fb","1f3cc-1f3fc","1f3cc-1f3fd","1f3cc-1f3fe","1f3cc-1f3ff"],a:"0.7",x:9,y:59},{n:["man golfing","man-golfing"],u:"1f3cc-fe0f-200d-2642-fe0f",v:["1f3cc-1f3fb-200d-2642-fe0f","1f3cc-1f3fc-200d-2642-fe0f","1f3cc-1f3fd-200d-2642-fe0f","1f3cc-1f3fe-200d-2642-fe0f","1f3cc-1f3ff-200d-2642-fe0f"],a:"4.0",x:9,y:53},{n:["woman golfing","woman-golfing"],u:"1f3cc-fe0f-200d-2640-fe0f",v:["1f3cc-1f3fb-200d-2640-fe0f","1f3cc-1f3fc-200d-2640-fe0f","1f3cc-1f3fd-200d-2640-fe0f","1f3cc-1f3fe-200d-2640-fe0f","1f3cc-1f3ff-200d-2640-fe0f"],a:"4.0",x:9,y:47},{n:["surfer"],u:"1f3c4",v:["1f3c4-1f3fb","1f3c4-1f3fc","1f3c4-1f3fd","1f3c4-1f3fe","1f3c4-1f3ff"],a:"0.6",x:8,y:57},{n:["man surfing","man-surfing"],u:"1f3c4-200d-2642-fe0f",v:["1f3c4-1f3fb-200d-2642-fe0f","1f3c4-1f3fc-200d-2642-fe0f","1f3c4-1f3fd-200d-2642-fe0f","1f3c4-1f3fe-200d-2642-fe0f","1f3c4-1f3ff-200d-2642-fe0f"],a:"4.0",x:8,y:51},{n:["woman surfing","woman-surfing"],u:"1f3c4-200d-2640-fe0f",v:["1f3c4-1f3fb-200d-2640-fe0f","1f3c4-1f3fc-200d-2640-fe0f","1f3c4-1f3fd-200d-2640-fe0f","1f3c4-1f3fe-200d-2640-fe0f","1f3c4-1f3ff-200d-2640-fe0f"],a:"4.0",x:8,y:45},{n:["rowboat"],u:"1f6a3",v:["1f6a3-1f3fb","1f6a3-1f3fc","1f6a3-1f3fd","1f6a3-1f3fe","1f6a3-1f3ff"],a:"1.0",x:36,y:43},{n:["man rowing boat","man-rowing-boat"],u:"1f6a3-200d-2642-fe0f",v:["1f6a3-1f3fb-200d-2642-fe0f","1f6a3-1f3fc-200d-2642-fe0f","1f6a3-1f3fd-200d-2642-fe0f","1f6a3-1f3fe-200d-2642-fe0f","1f6a3-1f3ff-200d-2642-fe0f"],a:"4.0",x:36,y:37},{n:["woman rowing boat","woman-rowing-boat"],u:"1f6a3-200d-2640-fe0f",v:["1f6a3-1f3fb-200d-2640-fe0f","1f6a3-1f3fc-200d-2640-fe0f","1f6a3-1f3fd-200d-2640-fe0f","1f6a3-1f3fe-200d-2640-fe0f","1f6a3-1f3ff-200d-2640-fe0f"],a:"4.0",x:36,y:31},{n:["swimmer"],u:"1f3ca",v:["1f3ca-1f3fb","1f3ca-1f3fc","1f3ca-1f3fd","1f3ca-1f3fe","1f3ca-1f3ff"],a:"0.6",x:9,y:23},{n:["man swimming","man-swimming"],u:"1f3ca-200d-2642-fe0f",v:["1f3ca-1f3fb-200d-2642-fe0f","1f3ca-1f3fc-200d-2642-fe0f","1f3ca-1f3fd-200d-2642-fe0f","1f3ca-1f3fe-200d-2642-fe0f","1f3ca-1f3ff-200d-2642-fe0f"],a:"4.0",x:9,y:17},{n:["woman swimming","woman-swimming"],u:"1f3ca-200d-2640-fe0f",v:["1f3ca-1f3fb-200d-2640-fe0f","1f3ca-1f3fc-200d-2640-fe0f","1f3ca-1f3fd-200d-2640-fe0f","1f3ca-1f3fe-200d-2640-fe0f","1f3ca-1f3ff-200d-2640-fe0f"],a:"4.0",x:9,y:11},{n:["person with ball","person bouncing ball"],u:"26f9-fe0f",v:["26f9-1f3fb","26f9-1f3fc","26f9-1f3fd","26f9-1f3fe","26f9-1f3ff"],a:"0.7",x:59,y:52},{n:["man bouncing ball","man-bouncing-ball"],u:"26f9-fe0f-200d-2642-fe0f",v:["26f9-1f3fb-200d-2642-fe0f","26f9-1f3fc-200d-2642-fe0f","26f9-1f3fd-200d-2642-fe0f","26f9-1f3fe-200d-2642-fe0f","26f9-1f3ff-200d-2642-fe0f"],a:"4.0",x:59,y:46},{n:["woman bouncing ball","woman-bouncing-ball"],u:"26f9-fe0f-200d-2640-fe0f",v:["26f9-1f3fb-200d-2640-fe0f","26f9-1f3fc-200d-2640-fe0f","26f9-1f3fd-200d-2640-fe0f","26f9-1f3fe-200d-2640-fe0f","26f9-1f3ff-200d-2640-fe0f"],a:"4.0",x:59,y:40},{n:["weight lifter","person lifting weights"],u:"1f3cb-fe0f",v:["1f3cb-1f3fb","1f3cb-1f3fc","1f3cb-1f3fd","1f3cb-1f3fe","1f3cb-1f3ff"],a:"0.7",x:9,y:41},{n:["man lifting weights","man-lifting-weights"],u:"1f3cb-fe0f-200d-2642-fe0f",v:["1f3cb-1f3fb-200d-2642-fe0f","1f3cb-1f3fc-200d-2642-fe0f","1f3cb-1f3fd-200d-2642-fe0f","1f3cb-1f3fe-200d-2642-fe0f","1f3cb-1f3ff-200d-2642-fe0f"],a:"4.0",x:9,y:35},{n:["woman lifting weights","woman-lifting-weights"],u:"1f3cb-fe0f-200d-2640-fe0f",v:["1f3cb-1f3fb-200d-2640-fe0f","1f3cb-1f3fc-200d-2640-fe0f","1f3cb-1f3fd-200d-2640-fe0f","1f3cb-1f3fe-200d-2640-fe0f","1f3cb-1f3ff-200d-2640-fe0f"],a:"4.0",x:9,y:29},{n:["bicyclist"],u:"1f6b4",v:["1f6b4-1f3fb","1f6b4-1f3fc","1f6b4-1f3fd","1f6b4-1f3fe","1f6b4-1f3ff"],a:"1.0",x:37,y:15},{n:["man biking","man-biking"],u:"1f6b4-200d-2642-fe0f",v:["1f6b4-1f3fb-200d-2642-fe0f","1f6b4-1f3fc-200d-2642-fe0f","1f6b4-1f3fd-200d-2642-fe0f","1f6b4-1f3fe-200d-2642-fe0f","1f6b4-1f3ff-200d-2642-fe0f"],a:"4.0",x:37,y:9},{n:["woman biking","woman-biking"],u:"1f6b4-200d-2640-fe0f",v:["1f6b4-1f3fb-200d-2640-fe0f","1f6b4-1f3fc-200d-2640-fe0f","1f6b4-1f3fd-200d-2640-fe0f","1f6b4-1f3fe-200d-2640-fe0f","1f6b4-1f3ff-200d-2640-fe0f"],a:"4.0",x:37,y:3},{n:["mountain bicyclist"],u:"1f6b5",v:["1f6b5-1f3fb","1f6b5-1f3fc","1f6b5-1f3fd","1f6b5-1f3fe","1f6b5-1f3ff"],a:"1.0",x:37,y:33},{n:["man mountain biking","man-mountain-biking"],u:"1f6b5-200d-2642-fe0f",v:["1f6b5-1f3fb-200d-2642-fe0f","1f6b5-1f3fc-200d-2642-fe0f","1f6b5-1f3fd-200d-2642-fe0f","1f6b5-1f3fe-200d-2642-fe0f","1f6b5-1f3ff-200d-2642-fe0f"],a:"4.0",x:37,y:27},{n:["woman mountain biking","woman-mountain-biking"],u:"1f6b5-200d-2640-fe0f",v:["1f6b5-1f3fb-200d-2640-fe0f","1f6b5-1f3fc-200d-2640-fe0f","1f6b5-1f3fd-200d-2640-fe0f","1f6b5-1f3fe-200d-2640-fe0f","1f6b5-1f3ff-200d-2640-fe0f"],a:"4.0",x:37,y:21},{n:["person doing cartwheel"],u:"1f938",v:["1f938-1f3fb","1f938-1f3fc","1f938-1f3fd","1f938-1f3fe","1f938-1f3ff"],a:"3.0",x:42,y:45},{n:["man cartwheeling","man-cartwheeling"],u:"1f938-200d-2642-fe0f",v:["1f938-1f3fb-200d-2642-fe0f","1f938-1f3fc-200d-2642-fe0f","1f938-1f3fd-200d-2642-fe0f","1f938-1f3fe-200d-2642-fe0f","1f938-1f3ff-200d-2642-fe0f"],a:"4.0",x:42,y:39},{n:["woman cartwheeling","woman-cartwheeling"],u:"1f938-200d-2640-fe0f",v:["1f938-1f3fb-200d-2640-fe0f","1f938-1f3fc-200d-2640-fe0f","1f938-1f3fd-200d-2640-fe0f","1f938-1f3fe-200d-2640-fe0f","1f938-1f3ff-200d-2640-fe0f"],a:"4.0",x:42,y:33},{n:["wrestlers"],u:"1f93c",a:"3.0",x:43,y:10},{n:["men wrestling","man-wrestling"],u:"1f93c-200d-2642-fe0f",a:"4.0",x:43,y:9},{n:["women wrestling","woman-wrestling"],u:"1f93c-200d-2640-fe0f",a:"4.0",x:43,y:8},{n:["water polo"],u:"1f93d",v:["1f93d-1f3fb","1f93d-1f3fc","1f93d-1f3fd","1f93d-1f3fe","1f93d-1f3ff"],a:"3.0",x:43,y:23},{n:["man playing water polo","man-playing-water-polo"],u:"1f93d-200d-2642-fe0f",v:["1f93d-1f3fb-200d-2642-fe0f","1f93d-1f3fc-200d-2642-fe0f","1f93d-1f3fd-200d-2642-fe0f","1f93d-1f3fe-200d-2642-fe0f","1f93d-1f3ff-200d-2642-fe0f"],a:"4.0",x:43,y:17},{n:["woman playing water polo","woman-playing-water-polo"],u:"1f93d-200d-2640-fe0f",v:["1f93d-1f3fb-200d-2640-fe0f","1f93d-1f3fc-200d-2640-fe0f","1f93d-1f3fd-200d-2640-fe0f","1f93d-1f3fe-200d-2640-fe0f","1f93d-1f3ff-200d-2640-fe0f"],a:"4.0",x:43,y:11},{n:["handball"],u:"1f93e",v:["1f93e-1f3fb","1f93e-1f3fc","1f93e-1f3fd","1f93e-1f3fe","1f93e-1f3ff"],a:"3.0",x:43,y:41},{n:["man playing handball","man-playing-handball"],u:"1f93e-200d-2642-fe0f",v:["1f93e-1f3fb-200d-2642-fe0f","1f93e-1f3fc-200d-2642-fe0f","1f93e-1f3fd-200d-2642-fe0f","1f93e-1f3fe-200d-2642-fe0f","1f93e-1f3ff-200d-2642-fe0f"],a:"4.0",x:43,y:35},{n:["woman playing handball","woman-playing-handball"],u:"1f93e-200d-2640-fe0f",v:["1f93e-1f3fb-200d-2640-fe0f","1f93e-1f3fc-200d-2640-fe0f","1f93e-1f3fd-200d-2640-fe0f","1f93e-1f3fe-200d-2640-fe0f","1f93e-1f3ff-200d-2640-fe0f"],a:"4.0",x:43,y:29},{n:["juggling"],u:"1f939",v:["1f939-1f3fb","1f939-1f3fc","1f939-1f3fd","1f939-1f3fe","1f939-1f3ff"],a:"3.0",x:43,y:1},{n:["man juggling","man-juggling"],u:"1f939-200d-2642-fe0f",v:["1f939-1f3fb-200d-2642-fe0f","1f939-1f3fc-200d-2642-fe0f","1f939-1f3fd-200d-2642-fe0f","1f939-1f3fe-200d-2642-fe0f","1f939-1f3ff-200d-2642-fe0f"],a:"4.0",x:42,y:57},{n:["woman juggling","woman-juggling"],u:"1f939-200d-2640-fe0f",v:["1f939-1f3fb-200d-2640-fe0f","1f939-1f3fc-200d-2640-fe0f","1f939-1f3fd-200d-2640-fe0f","1f939-1f3fe-200d-2640-fe0f","1f939-1f3ff-200d-2640-fe0f"],a:"4.0",x:42,y:51},{n:["person in lotus position"],u:"1f9d8",v:["1f9d8-1f3fb","1f9d8-1f3fc","1f9d8-1f3fd","1f9d8-1f3fe","1f9d8-1f3ff"],a:"5.0",x:52,y:41},{n:["man in lotus position"],u:"1f9d8-200d-2642-fe0f",v:["1f9d8-1f3fb-200d-2642-fe0f","1f9d8-1f3fc-200d-2642-fe0f","1f9d8-1f3fd-200d-2642-fe0f","1f9d8-1f3fe-200d-2642-fe0f","1f9d8-1f3ff-200d-2642-fe0f"],a:"5.0",x:52,y:35},{n:["woman in lotus position"],u:"1f9d8-200d-2640-fe0f",v:["1f9d8-1f3fb-200d-2640-fe0f","1f9d8-1f3fc-200d-2640-fe0f","1f9d8-1f3fd-200d-2640-fe0f","1f9d8-1f3fe-200d-2640-fe0f","1f9d8-1f3ff-200d-2640-fe0f"],a:"5.0",x:52,y:29},{n:["bath"],u:"1f6c0",v:["1f6c0-1f3fb","1f6c0-1f3fc","1f6c0-1f3fd","1f6c0-1f3fe","1f6c0-1f3ff"],a:"0.6",x:38,y:22},{n:["sleeping accommodation"],u:"1f6cc",v:["1f6cc-1f3fb","1f6cc-1f3fc","1f6cc-1f3fd","1f6cc-1f3fe","1f6cc-1f3ff"],a:"1.0",x:38,y:34},{n:["people holding hands"],u:"1f9d1-200d-1f91d-200d-1f9d1",v:["1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb","1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fc","1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fd","1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fe","1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3ff","1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fb","1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc","1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fd","1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fe","1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3ff","1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fb","1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fc","1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd","1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fe","1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3ff","1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fb","1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fc","1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fd","1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe","1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3ff","1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fb","1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fc","1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fd","1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fe","1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff"],a:"12.0",x:49,y:29},{n:["women holding hands","two women holding hands"],u:"1f46d",v:["1f46d-1f3fb","1f46d-1f3fc","1f46d-1f3fd","1f46d-1f3fe","1f46d-1f3ff","1f469-1f3fb-200d-1f91d-200d-1f469-1f3fc","1f469-1f3fb-200d-1f91d-200d-1f469-1f3fd","1f469-1f3fb-200d-1f91d-200d-1f469-1f3fe","1f469-1f3fb-200d-1f91d-200d-1f469-1f3ff","1f469-1f3fc-200d-1f91d-200d-1f469-1f3fb","1f469-1f3fc-200d-1f91d-200d-1f469-1f3fd","1f469-1f3fc-200d-1f91d-200d-1f469-1f3fe","1f469-1f3fc-200d-1f91d-200d-1f469-1f3ff","1f469-1f3fd-200d-1f91d-200d-1f469-1f3fb","1f469-1f3fd-200d-1f91d-200d-1f469-1f3fc","1f469-1f3fd-200d-1f91d-200d-1f469-1f3fe","1f469-1f3fd-200d-1f91d-200d-1f469-1f3ff","1f469-1f3fe-200d-1f91d-200d-1f469-1f3fb","1f469-1f3fe-200d-1f91d-200d-1f469-1f3fc","1f469-1f3fe-200d-1f91d-200d-1f469-1f3fd","1f469-1f3fe-200d-1f91d-200d-1f469-1f3ff","1f469-1f3ff-200d-1f91d-200d-1f469-1f3fb","1f469-1f3ff-200d-1f91d-200d-1f469-1f3fc","1f469-1f3ff-200d-1f91d-200d-1f469-1f3fd","1f469-1f3ff-200d-1f91d-200d-1f469-1f3fe"],a:"1.0",x:23,y:6},{n:["couple","man and woman holding hands","woman and man holding hands"],u:"1f46b",v:["1f46b-1f3fb","1f46b-1f3fc","1f46b-1f3fd","1f46b-1f3fe","1f46b-1f3ff","1f469-1f3fb-200d-1f91d-200d-1f468-1f3fc","1f469-1f3fb-200d-1f91d-200d-1f468-1f3fd","1f469-1f3fb-200d-1f91d-200d-1f468-1f3fe","1f469-1f3fb-200d-1f91d-200d-1f468-1f3ff","1f469-1f3fc-200d-1f91d-200d-1f468-1f3fb","1f469-1f3fc-200d-1f91d-200d-1f468-1f3fd","1f469-1f3fc-200d-1f91d-200d-1f468-1f3fe","1f469-1f3fc-200d-1f91d-200d-1f468-1f3ff","1f469-1f3fd-200d-1f91d-200d-1f468-1f3fb","1f469-1f3fd-200d-1f91d-200d-1f468-1f3fc","1f469-1f3fd-200d-1f91d-200d-1f468-1f3fe","1f469-1f3fd-200d-1f91d-200d-1f468-1f3ff","1f469-1f3fe-200d-1f91d-200d-1f468-1f3fb","1f469-1f3fe-200d-1f91d-200d-1f468-1f3fc","1f469-1f3fe-200d-1f91d-200d-1f468-1f3fd","1f469-1f3fe-200d-1f91d-200d-1f468-1f3ff","1f469-1f3ff-200d-1f91d-200d-1f468-1f3fb","1f469-1f3ff-200d-1f91d-200d-1f468-1f3fc","1f469-1f3ff-200d-1f91d-200d-1f468-1f3fd","1f469-1f3ff-200d-1f91d-200d-1f468-1f3fe"],a:"0.6",x:22,y:16},{n:["men holding hands","two men holding hands"],u:"1f46c",v:["1f46c-1f3fb","1f46c-1f3fc","1f46c-1f3fd","1f46c-1f3fe","1f46c-1f3ff","1f468-1f3fb-200d-1f91d-200d-1f468-1f3fc","1f468-1f3fb-200d-1f91d-200d-1f468-1f3fd","1f468-1f3fb-200d-1f91d-200d-1f468-1f3fe","1f468-1f3fb-200d-1f91d-200d-1f468-1f3ff","1f468-1f3fc-200d-1f91d-200d-1f468-1f3fb","1f468-1f3fc-200d-1f91d-200d-1f468-1f3fd","1f468-1f3fc-200d-1f91d-200d-1f468-1f3fe","1f468-1f3fc-200d-1f91d-200d-1f468-1f3ff","1f468-1f3fd-200d-1f91d-200d-1f468-1f3fb","1f468-1f3fd-200d-1f91d-200d-1f468-1f3fc","1f468-1f3fd-200d-1f91d-200d-1f468-1f3fe","1f468-1f3fd-200d-1f91d-200d-1f468-1f3ff","1f468-1f3fe-200d-1f91d-200d-1f468-1f3fb","1f468-1f3fe-200d-1f91d-200d-1f468-1f3fc","1f468-1f3fe-200d-1f91d-200d-1f468-1f3fd","1f468-1f3fe-200d-1f91d-200d-1f468-1f3ff","1f468-1f3ff-200d-1f91d-200d-1f468-1f3fb","1f468-1f3ff-200d-1f91d-200d-1f468-1f3fc","1f468-1f3ff-200d-1f91d-200d-1f468-1f3fd","1f468-1f3ff-200d-1f91d-200d-1f468-1f3fe"],a:"1.0",x:22,y:42},{n:["kiss","couplekiss"],u:"1f48f",v:["1f48f-1f3fb","1f48f-1f3fc","1f48f-1f3fd","1f48f-1f3fe","1f48f-1f3ff","1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc","1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd","1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe","1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff","1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb","1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd","1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe","1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff","1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb","1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc","1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe","1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff","1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb","1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc","1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd","1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff","1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb","1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc","1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd","1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe"],a:"0.6",x:27,y:12},{n:["woman-kiss-man","kiss: woman, man"],u:"1f469-200d-2764-fe0f-200d-1f48b-200d-1f468",v:["1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb","1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc","1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd","1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe","1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff","1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb","1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc","1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd","1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe","1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff","1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb","1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc","1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd","1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe","1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff","1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb","1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc","1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd","1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe","1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff","1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb","1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc","1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd","1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe","1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff"],a:"2.0",x:21,y:19},{n:["man-kiss-man","kiss: man, man"],u:"1f468-200d-2764-fe0f-200d-1f48b-200d-1f468",v:["1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb","1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc","1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd","1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe","1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff","1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb","1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc","1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd","1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe","1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff","1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb","1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc","1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd","1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe","1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff","1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb","1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc","1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd","1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe","1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff","1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb","1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc","1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd","1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe","1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff"],a:"2.0",x:17,y:11},{n:["woman-kiss-woman","kiss: woman, woman"],u:"1f469-200d-2764-fe0f-200d-1f48b-200d-1f469",v:["1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb","1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc","1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd","1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe","1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff","1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb","1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc","1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd","1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe","1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff","1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb","1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc","1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd","1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe","1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff","1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb","1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc","1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd","1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe","1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff","1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb","1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc","1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd","1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe","1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff"],a:"2.0",x:21,y:45},{n:["couple with heart"],u:"1f491",v:["1f491-1f3fb","1f491-1f3fc","1f491-1f3fd","1f491-1f3fe","1f491-1f3ff","1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fc","1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fd","1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fe","1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3ff","1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fb","1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fd","1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fe","1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3ff","1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fb","1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fc","1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fe","1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3ff","1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fb","1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fc","1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fd","1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3ff","1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fb","1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fc","1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fd","1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fe"],a:"0.6",x:27,y:39},{n:["woman-heart-man","couple with heart: woman, man"],u:"1f469-200d-2764-fe0f-200d-1f468",v:["1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fb","1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fc","1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fd","1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fe","1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3ff","1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fb","1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fc","1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fd","1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fe","1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3ff","1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fb","1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fc","1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fd","1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fe","1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3ff","1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fb","1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fc","1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fd","1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fe","1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3ff","1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fb","1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fc","1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fd","1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fe","1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3ff"],a:"2.0",x:20,y:29},{n:["man-heart-man","couple with heart: man, man"],u:"1f468-200d-2764-fe0f-200d-1f468",v:["1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fb","1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fc","1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fd","1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fe","1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3ff","1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fb","1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fc","1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fd","1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fe","1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3ff","1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fb","1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fc","1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fd","1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fe","1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3ff","1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fb","1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fc","1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fd","1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fe","1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3ff","1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fb","1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fc","1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fd","1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fe","1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3ff"],a:"2.0",x:16,y:47},{n:["woman-heart-woman","couple with heart: woman, woman"],u:"1f469-200d-2764-fe0f-200d-1f469",v:["1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fb","1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fc","1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fd","1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fe","1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3ff","1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fb","1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fc","1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fd","1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fe","1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3ff","1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fb","1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fc","1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fd","1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fe","1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3ff","1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fb","1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fc","1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fd","1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fe","1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3ff","1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fb","1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fc","1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fd","1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fe","1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3ff"],a:"2.0",x:20,y:55},{n:["man-woman-boy","family: man, woman, boy"],u:"1f468-200d-1f469-200d-1f466",a:"2.0",x:14,y:52},{n:["man-woman-girl","family: man, woman, girl"],u:"1f468-200d-1f469-200d-1f467",a:"2.0",x:14,y:54},{n:["man-woman-girl-boy","family: man, woman, girl, boy"],u:"1f468-200d-1f469-200d-1f467-200d-1f466",a:"2.0",x:14,y:55},{n:["man-woman-boy-boy","family: man, woman, boy, boy"],u:"1f468-200d-1f469-200d-1f466-200d-1f466",a:"2.0",x:14,y:53},{n:["man-woman-girl-girl","family: man, woman, girl, girl"],u:"1f468-200d-1f469-200d-1f467-200d-1f467",a:"2.0",x:14,y:56},{n:["man-man-boy","family: man, man, boy"],u:"1f468-200d-1f468-200d-1f466",a:"2.0",x:14,y:47},{n:["man-man-girl","family: man, man, girl"],u:"1f468-200d-1f468-200d-1f467",a:"2.0",x:14,y:49},{n:["man-man-girl-boy","family: man, man, girl, boy"],u:"1f468-200d-1f468-200d-1f467-200d-1f466",a:"2.0",x:14,y:50},{n:["man-man-boy-boy","family: man, man, boy, boy"],u:"1f468-200d-1f468-200d-1f466-200d-1f466",a:"2.0",x:14,y:48},{n:["man-man-girl-girl","family: man, man, girl, girl"],u:"1f468-200d-1f468-200d-1f467-200d-1f467",a:"2.0",x:14,y:51},{n:["woman-woman-boy","family: woman, woman, boy"],u:"1f469-200d-1f469-200d-1f466",a:"2.0",x:18,y:34},{n:["woman-woman-girl","family: woman, woman, girl"],u:"1f469-200d-1f469-200d-1f467",a:"2.0",x:18,y:36},{n:["woman-woman-girl-boy","family: woman, woman, girl, boy"],u:"1f469-200d-1f469-200d-1f467-200d-1f466",a:"2.0",x:18,y:37},{n:["woman-woman-boy-boy","family: woman, woman, boy, boy"],u:"1f469-200d-1f469-200d-1f466-200d-1f466",a:"2.0",x:18,y:35},{n:["woman-woman-girl-girl","family: woman, woman, girl, girl"],u:"1f469-200d-1f469-200d-1f467-200d-1f467",a:"2.0",x:18,y:38},{n:["man-boy","family: man, boy"],u:"1f468-200d-1f466",a:"4.0",x:14,y:43},{n:["man-boy-boy","family: man, boy, boy"],u:"1f468-200d-1f466-200d-1f466",a:"4.0",x:14,y:42},{n:["man-girl","family: man, girl"],u:"1f468-200d-1f467",a:"4.0",x:14,y:46},{n:["man-girl-boy","family: man, girl, boy"],u:"1f468-200d-1f467-200d-1f466",a:"4.0",x:14,y:44},{n:["man-girl-girl","family: man, girl, girl"],u:"1f468-200d-1f467-200d-1f467",a:"4.0",x:14,y:45},{n:["woman-boy","family: woman, boy"],u:"1f469-200d-1f466",a:"4.0",x:18,y:30},{n:["woman-boy-boy","family: woman, boy, boy"],u:"1f469-200d-1f466-200d-1f466",a:"4.0",x:18,y:29},{n:["woman-girl","family: woman, girl"],u:"1f469-200d-1f467",a:"4.0",x:18,y:33},{n:["woman-girl-boy","family: woman, girl, boy"],u:"1f469-200d-1f467-200d-1f466",a:"4.0",x:18,y:31},{n:["woman-girl-girl","family: woman, girl, girl"],u:"1f469-200d-1f467-200d-1f467",a:"4.0",x:18,y:32},{n:["speaking head","speaking head in silhouette"],u:"1f5e3-fe0f",a:"0.7",x:32,y:37},{n:["bust in silhouette"],u:"1f464",a:"0.6",x:13,y:42},{n:["busts in silhouette"],u:"1f465",a:"1.0",x:13,y:43},{n:["people hugging"],u:"1fac2",a:"13.0",x:56,y:1},{n:["family"],u:"1f46a",a:"0.6",x:22,y:15},{n:["family adult adult child","family: adult, adult, child"],u:"1f9d1-200d-1f9d1-200d-1f9d2",a:"15.1",x:50,y:53},{n:["family adult adult child child","family: adult, adult, child, child"],u:"1f9d1-200d-1f9d1-200d-1f9d2-200d-1f9d2",a:"15.1",x:50,y:54},{n:["family adult child","family: adult, child"],u:"1f9d1-200d-1f9d2",a:"15.1",x:50,y:56},{n:["family adult child child","family: adult, child, child"],u:"1f9d1-200d-1f9d2-200d-1f9d2",a:"15.1",x:50,y:55},{n:["footprints"],u:"1f463",a:"0.6",x:13,y:41},{n:["fingerprint"],u:"1fac6",a:"16.0",x:56,y:20}],animals_nature=[{n:["monkey face"],u:"1f435",a:"0.6",x:11,y:52},{n:["monkey"],u:"1f412",a:"0.6",x:11,y:14},{n:["gorilla"],u:"1f98d",a:"3.0",x:45,y:5},{n:["orangutan"],u:"1f9a7",a:"12.0",x:45,y:31},{n:["dog","dog face"],u:"1f436",a:"0.6",x:11,y:53},{n:["dog","dog2"],u:"1f415",a:"0.7",x:11,y:18},{n:["guide dog"],u:"1f9ae",a:"12.0",x:45,y:38},{n:["service dog"],u:"1f415-200d-1f9ba",a:"12.0",x:11,y:17},{n:["poodle"],u:"1f429",a:"0.6",x:11,y:40},{n:["wolf","wolf face"],u:"1f43a",a:"0.6",x:11,y:57},{n:["fox face"],u:"1f98a",a:"3.0",x:45,y:2},{n:["raccoon"],u:"1f99d",a:"11.0",x:45,y:21},{n:["cat","cat face"],u:"1f431",a:"0.6",x:11,y:48},{n:["cat","cat2"],u:"1f408",a:"0.7",x:11,y:4},{n:["black cat"],u:"1f408-200d-2b1b",a:"13.0",x:11,y:3},{n:["lion face"],u:"1f981",a:"1.0",x:44,y:55},{n:["tiger","tiger face"],u:"1f42f",a:"0.6",x:11,y:46},{n:["tiger","tiger2"],u:"1f405",a:"1.0",x:11,y:0},{n:["leopard"],u:"1f406",a:"1.0",x:11,y:1},{n:["horse","horse face"],u:"1f434",a:"0.6",x:11,y:51},{n:["moose"],u:"1face",a:"15.0",x:56,y:21},{n:["donkey"],u:"1facf",a:"15.0",x:56,y:22},{n:["horse","racehorse"],u:"1f40e",a:"0.6",x:11,y:10},{n:["unicorn face"],u:"1f984",a:"1.0",x:44,y:58},{n:["zebra face"],u:"1f993",a:"5.0",x:45,y:11},{n:["deer"],u:"1f98c",a:"3.0",x:45,y:4},{n:["bison"],u:"1f9ac",a:"13.0",x:45,y:36},{n:["cow","cow face"],u:"1f42e",a:"0.6",x:11,y:45},{n:["ox"],u:"1f402",a:"1.0",x:10,y:59},{n:["water buffalo"],u:"1f403",a:"1.0",x:10,y:60},{n:["cow","cow2"],u:"1f404",a:"1.0",x:10,y:61},{n:["pig","pig face"],u:"1f437",a:"0.6",x:11,y:54},{n:["pig","pig2"],u:"1f416",a:"1.0",x:11,y:19},{n:["boar"],u:"1f417",a:"0.6",x:11,y:20},{n:["pig nose"],u:"1f43d",a:"0.6",x:11,y:61},{n:["ram"],u:"1f40f",a:"1.0",x:11,y:11},{n:["sheep"],u:"1f411",a:"0.6",x:11,y:13},{n:["goat"],u:"1f410",a:"1.0",x:11,y:12},{n:["dromedary camel"],u:"1f42a",a:"1.0",x:11,y:41},{n:["camel","bactrian camel"],u:"1f42b",a:"0.6",x:11,y:42},{n:["llama"],u:"1f999",a:"11.0",x:45,y:17},{n:["giraffe face"],u:"1f992",a:"5.0",x:45,y:10},{n:["elephant"],u:"1f418",a:"0.6",x:11,y:21},{n:["mammoth"],u:"1f9a3",a:"13.0",x:45,y:27},{n:["rhinoceros"],u:"1f98f",a:"3.0",x:45,y:7},{n:["hippopotamus"],u:"1f99b",a:"11.0",x:45,y:19},{n:["mouse","mouse face"],u:"1f42d",a:"0.6",x:11,y:44},{n:["mouse","mouse2"],u:"1f401",a:"1.0",x:10,y:58},{n:["rat"],u:"1f400",a:"1.0",x:10,y:57},{n:["hamster","hamster face"],u:"1f439",a:"0.6",x:11,y:56},{n:["rabbit","rabbit face"],u:"1f430",a:"0.6",x:11,y:47},{n:["rabbit","rabbit2"],u:"1f407",a:"1.0",x:11,y:2},{n:["chipmunk"],u:"1f43f-fe0f",a:"0.7",x:12,y:1},{n:["beaver"],u:"1f9ab",a:"13.0",x:45,y:35},{n:["hedgehog"],u:"1f994",a:"5.0",x:45,y:12},{n:["bat"],u:"1f987",a:"3.0",x:44,y:61},{n:["bear","bear face"],u:"1f43b",a:"0.6",x:11,y:59},{n:["polar bear"],u:"1f43b-200d-2744-fe0f",a:"13.0",x:11,y:58},{n:["koala"],u:"1f428",a:"0.6",x:11,y:39},{n:["panda face"],u:"1f43c",a:"0.6",x:11,y:60},{n:["sloth"],u:"1f9a5",a:"12.0",x:45,y:29},{n:["otter"],u:"1f9a6",a:"12.0",x:45,y:30},{n:["skunk"],u:"1f9a8",a:"12.0",x:45,y:32},{n:["kangaroo"],u:"1f998",a:"11.0",x:45,y:16},{n:["badger"],u:"1f9a1",a:"11.0",x:45,y:25},{n:["feet","paw prints"],u:"1f43e",a:"0.6",x:12,y:0},{n:["turkey"],u:"1f983",a:"1.0",x:44,y:57},{n:["chicken"],u:"1f414",a:"0.6",x:11,y:16},{n:["rooster"],u:"1f413",a:"1.0",x:11,y:15},{n:["hatching chick"],u:"1f423",a:"0.6",x:11,y:32},{n:["baby chick"],u:"1f424",a:"0.6",x:11,y:33},{n:["hatched chick","front-facing baby chick"],u:"1f425",a:"0.6",x:11,y:34},{n:["bird"],u:"1f426",a:"0.6",x:11,y:37},{n:["penguin"],u:"1f427",a:"0.6",x:11,y:38},{n:["dove","dove of peace"],u:"1f54a-fe0f",a:"0.7",x:30,y:56},{n:["eagle"],u:"1f985",a:"3.0",x:44,y:59},{n:["duck"],u:"1f986",a:"3.0",x:44,y:60},{n:["swan"],u:"1f9a2",a:"11.0",x:45,y:26},{n:["owl"],u:"1f989",a:"3.0",x:45,y:1},{n:["dodo"],u:"1f9a4",a:"13.0",x:45,y:28},{n:["feather"],u:"1fab6",a:"13.0",x:55,y:51},{n:["flamingo"],u:"1f9a9",a:"12.0",x:45,y:33},{n:["peacock"],u:"1f99a",a:"11.0",x:45,y:18},{n:["parrot"],u:"1f99c",a:"11.0",x:45,y:20},{n:["wing"],u:"1fabd",a:"15.0",x:55,y:58},{n:["black bird"],u:"1f426-200d-2b1b",a:"15.0",x:11,y:36},{n:["goose"],u:"1fabf",a:"15.0",x:55,y:60},{n:["phoenix"],u:"1f426-200d-1f525",a:"15.1",x:11,y:35},{n:["frog","frog face"],u:"1f438",a:"0.6",x:11,y:55},{n:["crocodile"],u:"1f40a",a:"1.0",x:11,y:6},{n:["turtle"],u:"1f422",a:"0.6",x:11,y:31},{n:["lizard"],u:"1f98e",a:"3.0",x:45,y:6},{n:["snake"],u:"1f40d",a:"0.6",x:11,y:9},{n:["dragon face"],u:"1f432",a:"0.6",x:11,y:49},{n:["dragon"],u:"1f409",a:"1.0",x:11,y:5},{n:["sauropod"],u:"1f995",a:"5.0",x:45,y:13},{n:["t-rex"],u:"1f996",a:"5.0",x:45,y:14},{n:["whale","spouting whale"],u:"1f433",a:"0.6",x:11,y:50},{n:["whale","whale2"],u:"1f40b",a:"1.0",x:11,y:7},{n:["dolphin","flipper"],u:"1f42c",a:"0.6",x:11,y:43},{n:["seal"],u:"1f9ad",a:"13.0",x:45,y:37},{n:["fish"],u:"1f41f",a:"0.6",x:11,y:28},{n:["tropical fish"],u:"1f420",a:"0.6",x:11,y:29},{n:["blowfish"],u:"1f421",a:"0.6",x:11,y:30},{n:["shark"],u:"1f988",a:"3.0",x:45,y:0},{n:["octopus"],u:"1f419",a:"0.6",x:11,y:22},{n:["shell","spiral shell"],u:"1f41a",a:"0.6",x:11,y:23},{n:["coral"],u:"1fab8",a:"14.0",x:55,y:53},{n:["jellyfish"],u:"1fabc",a:"15.0",x:55,y:57},{n:["crab"],u:"1f980",a:"1.0",x:44,y:54},{n:["lobster"],u:"1f99e",a:"11.0",x:45,y:22},{n:["shrimp"],u:"1f990",a:"3.0",x:45,y:8},{n:["squid"],u:"1f991",a:"3.0",x:45,y:9},{n:["oyster"],u:"1f9aa",a:"12.0",x:45,y:34},{n:["snail"],u:"1f40c",a:"0.6",x:11,y:8},{n:["butterfly"],u:"1f98b",a:"3.0",x:45,y:3},{n:["bug"],u:"1f41b",a:"0.6",x:11,y:24},{n:["ant"],u:"1f41c",a:"0.6",x:11,y:25},{n:["bee","honeybee"],u:"1f41d",a:"0.6",x:11,y:26},{n:["beetle"],u:"1fab2",a:"13.0",x:55,y:47},{n:["ladybug","lady beetle"],u:"1f41e",a:"0.6",x:11,y:27},{n:["cricket"],u:"1f997",a:"5.0",x:45,y:15},{n:["cockroach"],u:"1fab3",a:"13.0",x:55,y:48},{n:["spider"],u:"1f577-fe0f",a:"0.7",x:31,y:51},{n:["spider web"],u:"1f578-fe0f",a:"0.7",x:31,y:52},{n:["scorpion"],u:"1f982",a:"1.0",x:44,y:56},{n:["mosquito"],u:"1f99f",a:"11.0",x:45,y:23},{n:["fly"],u:"1fab0",a:"13.0",x:55,y:45},{n:["worm"],u:"1fab1",a:"13.0",x:55,y:46},{n:["microbe"],u:"1f9a0",a:"11.0",x:45,y:24},{n:["bouquet"],u:"1f490",a:"0.6",x:27,y:38},{n:["cherry blossom"],u:"1f338",a:"0.6",x:5,y:49},{n:["white flower"],u:"1f4ae",a:"0.6",x:28,y:36},{n:["lotus"],u:"1fab7",a:"14.0",x:55,y:52},{n:["rosette"],u:"1f3f5-fe0f",a:"0.7",x:10,y:47},{n:["rose"],u:"1f339",a:"0.6",x:5,y:50},{n:["wilted flower"],u:"1f940",a:"3.0",x:43,y:48},{n:["hibiscus"],u:"1f33a",a:"0.6",x:5,y:51},{n:["sunflower"],u:"1f33b",a:"0.6",x:5,y:52},{n:["blossom"],u:"1f33c",a:"0.6",x:5,y:53},{n:["tulip"],u:"1f337",a:"0.6",x:5,y:48},{n:["hyacinth"],u:"1fabb",a:"15.0",x:55,y:56},{n:["seedling"],u:"1f331",a:"0.6",x:5,y:42},{n:["potted plant"],u:"1fab4",a:"13.0",x:55,y:49},{n:["evergreen tree"],u:"1f332",a:"1.0",x:5,y:43},{n:["deciduous tree"],u:"1f333",a:"1.0",x:5,y:44},{n:["palm tree"],u:"1f334",a:"0.6",x:5,y:45},{n:["cactus"],u:"1f335",a:"0.6",x:5,y:46},{n:["ear of rice"],u:"1f33e",a:"0.6",x:5,y:55},{n:["herb"],u:"1f33f",a:"0.6",x:5,y:56},{n:["shamrock"],u:"2618-fe0f",a:"1.0",x:58,y:25},{n:["four leaf clover"],u:"1f340",a:"0.6",x:5,y:57},{n:["maple leaf"],u:"1f341",a:"0.6",x:5,y:58},{n:["fallen leaf"],u:"1f342",a:"0.6",x:5,y:59},{n:["leaves","leaf fluttering in wind"],u:"1f343",a:"0.6",x:5,y:60},{n:["empty nest"],u:"1fab9",a:"14.0",x:55,y:54},{n:["nest with eggs"],u:"1faba",a:"14.0",x:55,y:55},{n:["mushroom"],u:"1f344",a:"0.6",x:6,y:0},{n:["leafless tree"],u:"1fabe",a:"16.0",x:55,y:59}],food_drink=[{n:["grapes"],u:"1f347",a:"0.6",x:6,y:3},{n:["melon"],u:"1f348",a:"0.6",x:6,y:4},{n:["watermelon"],u:"1f349",a:"0.6",x:6,y:5},{n:["tangerine"],u:"1f34a",a:"0.6",x:6,y:6},{n:["lemon"],u:"1f34b",a:"1.0",x:6,y:8},{n:["lime"],u:"1f34b-200d-1f7e9",a:"15.1",x:6,y:7},{n:["banana"],u:"1f34c",a:"0.6",x:6,y:9},{n:["pineapple"],u:"1f34d",a:"0.6",x:6,y:10},{n:["mango"],u:"1f96d",a:"11.0",x:44,y:30},{n:["apple","red apple"],u:"1f34e",a:"0.6",x:6,y:11},{n:["green apple"],u:"1f34f",a:"0.6",x:6,y:12},{n:["pear"],u:"1f350",a:"1.0",x:6,y:13},{n:["peach"],u:"1f351",a:"0.6",x:6,y:14},{n:["cherries"],u:"1f352",a:"0.6",x:6,y:15},{n:["strawberry"],u:"1f353",a:"0.6",x:6,y:16},{n:["blueberries"],u:"1fad0",a:"13.0",x:56,y:23},{n:["kiwifruit"],u:"1f95d",a:"3.0",x:44,y:14},{n:["tomato"],u:"1f345",a:"0.6",x:6,y:1},{n:["olive"],u:"1fad2",a:"13.0",x:56,y:25},{n:["coconut"],u:"1f965",a:"5.0",x:44,y:22},{n:["avocado"],u:"1f951",a:"3.0",x:44,y:2},{n:["eggplant","aubergine"],u:"1f346",a:"0.6",x:6,y:2},{n:["potato"],u:"1f954",a:"3.0",x:44,y:5},{n:["carrot"],u:"1f955",a:"3.0",x:44,y:6},{n:["corn","ear of maize"],u:"1f33d",a:"0.6",x:5,y:54},{n:["hot pepper"],u:"1f336-fe0f",a:"0.7",x:5,y:47},{n:["bell pepper"],u:"1fad1",a:"13.0",x:56,y:24},{n:["cucumber"],u:"1f952",a:"3.0",x:44,y:3},{n:["leafy green"],u:"1f96c",a:"11.0",x:44,y:29},{n:["broccoli"],u:"1f966",a:"5.0",x:44,y:23},{n:["garlic"],u:"1f9c4",a:"12.0",x:46,y:43},{n:["onion"],u:"1f9c5",a:"12.0",x:46,y:44},{n:["peanuts"],u:"1f95c",a:"3.0",x:44,y:13},{n:["beans"],u:"1fad8",a:"14.0",x:56,y:31},{n:["chestnut"],u:"1f330",a:"0.6",x:5,y:41},{n:["ginger root"],u:"1fada",a:"15.0",x:56,y:33},{n:["pea pod"],u:"1fadb",a:"15.0",x:56,y:34},{n:["brown mushroom"],u:"1f344-200d-1f7eb",a:"15.1",x:5,y:61},{n:["root vegetable"],u:"1fadc",a:"16.0",x:56,y:35},{n:["bread"],u:"1f35e",a:"0.6",x:6,y:27},{n:["croissant"],u:"1f950",a:"3.0",x:44,y:1},{n:["baguette bread"],u:"1f956",a:"3.0",x:44,y:7},{n:["flatbread"],u:"1fad3",a:"13.0",x:56,y:26},{n:["pretzel"],u:"1f968",a:"5.0",x:44,y:25},{n:["bagel"],u:"1f96f",a:"11.0",x:44,y:32},{n:["pancakes"],u:"1f95e",a:"3.0",x:44,y:15},{n:["waffle"],u:"1f9c7",a:"12.0",x:46,y:46},{n:["cheese wedge"],u:"1f9c0",a:"1.0",x:46,y:39},{n:["meat on bone"],u:"1f356",a:"0.6",x:6,y:19},{n:["poultry leg"],u:"1f357",a:"0.6",x:6,y:20},{n:["cut of meat"],u:"1f969",a:"5.0",x:44,y:26},{n:["bacon"],u:"1f953",a:"3.0",x:44,y:4},{n:["hamburger"],u:"1f354",a:"0.6",x:6,y:17},{n:["fries","french fries"],u:"1f35f",a:"0.6",x:6,y:28},{n:["pizza","slice of pizza"],u:"1f355",a:"0.6",x:6,y:18},{n:["hotdog","hot dog"],u:"1f32d",a:"1.0",x:5,y:38},{n:["sandwich"],u:"1f96a",a:"5.0",x:44,y:27},{n:["taco"],u:"1f32e",a:"1.0",x:5,y:39},{n:["burrito"],u:"1f32f",a:"1.0",x:5,y:40},{n:["tamale"],u:"1fad4",a:"13.0",x:56,y:27},{n:["stuffed flatbread"],u:"1f959",a:"3.0",x:44,y:10},{n:["falafel"],u:"1f9c6",a:"12.0",x:46,y:45},{n:["egg"],u:"1f95a",a:"3.0",x:44,y:11},{n:["cooking","fried egg"],u:"1f373",a:"0.6",x:6,y:48},{n:["shallow pan of food"],u:"1f958",a:"3.0",x:44,y:9},{n:["stew","pot of food"],u:"1f372",a:"0.6",x:6,y:47},{n:["fondue"],u:"1fad5",a:"13.0",x:56,y:28},{n:["bowl with spoon"],u:"1f963",a:"5.0",x:44,y:20},{n:["green salad"],u:"1f957",a:"3.0",x:44,y:8},{n:["popcorn"],u:"1f37f",a:"1.0",x:6,y:60},{n:["butter"],u:"1f9c8",a:"12.0",x:46,y:47},{n:["salt","salt shaker"],u:"1f9c2",a:"11.0",x:46,y:41},{n:["canned food"],u:"1f96b",a:"5.0",x:44,y:28},{n:["bento","bento box"],u:"1f371",a:"0.6",x:6,y:46},{n:["rice cracker"],u:"1f358",a:"0.6",x:6,y:21},{n:["rice ball"],u:"1f359",a:"0.6",x:6,y:22},{n:["rice","cooked rice"],u:"1f35a",a:"0.6",x:6,y:23},{n:["curry","curry and rice"],u:"1f35b",a:"0.6",x:6,y:24},{n:["ramen","steaming bowl"],u:"1f35c",a:"0.6",x:6,y:25},{n:["spaghetti"],u:"1f35d",a:"0.6",x:6,y:26},{n:["sweet potato","roasted sweet potato"],u:"1f360",a:"0.6",x:6,y:29},{n:["oden"],u:"1f362",a:"0.6",x:6,y:31},{n:["sushi"],u:"1f363",a:"0.6",x:6,y:32},{n:["fried shrimp"],u:"1f364",a:"0.6",x:6,y:33},{n:["fish cake","fish cake with swirl design"],u:"1f365",a:"0.6",x:6,y:34},{n:["moon cake"],u:"1f96e",a:"11.0",x:44,y:31},{n:["dango"],u:"1f361",a:"0.6",x:6,y:30},{n:["dumpling"],u:"1f95f",a:"5.0",x:44,y:16},{n:["fortune cookie"],u:"1f960",a:"5.0",x:44,y:17},{n:["takeout box"],u:"1f961",a:"5.0",x:44,y:18},{n:["icecream","soft ice cream"],u:"1f366",a:"0.6",x:6,y:35},{n:["shaved ice"],u:"1f367",a:"0.6",x:6,y:36},{n:["ice cream"],u:"1f368",a:"0.6",x:6,y:37},{n:["doughnut"],u:"1f369",a:"0.6",x:6,y:38},{n:["cookie"],u:"1f36a",a:"0.6",x:6,y:39},{n:["birthday","birthday cake"],u:"1f382",a:"0.6",x:7,y:1},{n:["cake","shortcake"],u:"1f370",a:"0.6",x:6,y:45},{n:["cupcake"],u:"1f9c1",a:"11.0",x:46,y:40},{n:["pie"],u:"1f967",a:"5.0",x:44,y:24},{n:["chocolate bar"],u:"1f36b",a:"0.6",x:6,y:40},{n:["candy"],u:"1f36c",a:"0.6",x:6,y:41},{n:["lollipop"],u:"1f36d",a:"0.6",x:6,y:42},{n:["custard"],u:"1f36e",a:"0.6",x:6,y:43},{n:["honey pot"],u:"1f36f",a:"0.6",x:6,y:44},{n:["baby bottle"],u:"1f37c",a:"1.0",x:6,y:57},{n:["glass of milk"],u:"1f95b",a:"3.0",x:44,y:12},{n:["coffee","hot beverage"],u:"2615",a:"0.6",x:58,y:24},{n:["teapot"],u:"1fad6",a:"13.0",x:56,y:29},{n:["tea","teacup without handle"],u:"1f375",a:"0.6",x:6,y:50},{n:["sake","sake bottle and cup"],u:"1f376",a:"0.6",x:6,y:51},{n:["champagne","bottle with popping cork"],u:"1f37e",a:"1.0",x:6,y:59},{n:["wine glass"],u:"1f377",a:"0.6",x:6,y:52},{n:["cocktail","cocktail glass"],u:"1f378",a:"0.6",x:6,y:53},{n:["tropical drink"],u:"1f379",a:"0.6",x:6,y:54},{n:["beer","beer mug"],u:"1f37a",a:"0.6",x:6,y:55},{n:["beers","clinking beer mugs"],u:"1f37b",a:"0.6",x:6,y:56},{n:["clinking glasses"],u:"1f942",a:"3.0",x:43,y:50},{n:["tumbler glass"],u:"1f943",a:"3.0",x:43,y:51},{n:["pouring liquid"],u:"1fad7",a:"14.0",x:56,y:30},{n:["cup with straw"],u:"1f964",a:"5.0",x:44,y:21},{n:["bubble tea"],u:"1f9cb",a:"13.0",x:46,y:50},{n:["beverage box"],u:"1f9c3",a:"12.0",x:46,y:42},{n:["mate drink"],u:"1f9c9",a:"12.0",x:46,y:48},{n:["ice cube"],u:"1f9ca",a:"12.0",x:46,y:49},{n:["chopsticks"],u:"1f962",a:"5.0",x:44,y:19},{n:["knife fork plate","fork and knife with plate"],u:"1f37d-fe0f",a:"0.7",x:6,y:58},{n:["fork and knife"],u:"1f374",a:"0.6",x:6,y:49},{n:["spoon"],u:"1f944",a:"3.0",x:43,y:52},{n:["hocho","knife"],u:"1f52a",a:"0.6",x:30,y:35},{n:["jar"],u:"1fad9",a:"14.0",x:56,y:32},{n:["amphora"],u:"1f3fa",a:"1.0",x:10,y:51}],travel_places=[{n:["earth africa","earth globe europe-africa"],u:"1f30d",a:"0.7",x:5,y:8},{n:["earth americas","earth globe americas"],u:"1f30e",a:"0.7",x:5,y:9},{n:["earth asia","earth globe asia-australia"],u:"1f30f",a:"0.6",x:5,y:10},{n:["globe with meridians"],u:"1f310",a:"1.0",x:5,y:11},{n:["world map"],u:"1f5fa-fe0f",a:"0.7",x:32,y:41},{n:["japan","silhouette of japan"],u:"1f5fe",a:"0.6",x:32,y:45},{n:["compass"],u:"1f9ed",a:"11.0",x:54,y:32},{n:["snow-capped mountain","snow capped mountain"],u:"1f3d4-fe0f",a:"0.7",x:10,y:10},{n:["mountain"],u:"26f0-fe0f",a:"0.7",x:59,y:32},{n:["volcano"],u:"1f30b",a:"0.6",x:5,y:6},{n:["mount fuji"],u:"1f5fb",a:"0.6",x:32,y:42},{n:["camping"],u:"1f3d5-fe0f",a:"0.7",x:10,y:11},{n:["beach with umbrella"],u:"1f3d6-fe0f",a:"0.7",x:10,y:12},{n:["desert"],u:"1f3dc-fe0f",a:"0.7",x:10,y:18},{n:["desert island"],u:"1f3dd-fe0f",a:"0.7",x:10,y:19},{n:["national park"],u:"1f3de-fe0f",a:"0.7",x:10,y:20},{n:["stadium"],u:"1f3df-fe0f",a:"0.7",x:10,y:21},{n:["classical building"],u:"1f3db-fe0f",a:"0.7",x:10,y:17},{n:["building construction"],u:"1f3d7-fe0f",a:"0.7",x:10,y:13},{n:["brick","bricks"],u:"1f9f1",a:"11.0",x:54,y:36},{n:["rock"],u:"1faa8",a:"13.0",x:55,y:37},{n:["wood"],u:"1fab5",a:"13.0",x:55,y:50},{n:["hut"],u:"1f6d6",a:"13.0",x:38,y:47},{n:["houses","house buildings"],u:"1f3d8-fe0f",a:"0.7",x:10,y:14},{n:["derelict house","derelict house building"],u:"1f3da-fe0f",a:"0.7",x:10,y:16},{n:["house","house building"],u:"1f3e0",a:"0.6",x:10,y:22},{n:["house with garden"],u:"1f3e1",a:"0.6",x:10,y:23},{n:["office","office building"],u:"1f3e2",a:"0.6",x:10,y:24},{n:["post office","japanese post office"],u:"1f3e3",a:"0.6",x:10,y:25},{n:["european post office"],u:"1f3e4",a:"1.0",x:10,y:26},{n:["hospital"],u:"1f3e5",a:"0.6",x:10,y:27},{n:["bank"],u:"1f3e6",a:"0.6",x:10,y:28},{n:["hotel"],u:"1f3e8",a:"0.6",x:10,y:30},{n:["love hotel"],u:"1f3e9",a:"0.6",x:10,y:31},{n:["convenience store"],u:"1f3ea",a:"0.6",x:10,y:32},{n:["school"],u:"1f3eb",a:"0.6",x:10,y:33},{n:["department store"],u:"1f3ec",a:"0.6",x:10,y:34},{n:["factory"],u:"1f3ed",a:"0.6",x:10,y:35},{n:["japanese castle"],u:"1f3ef",a:"0.6",x:10,y:37},{n:["european castle"],u:"1f3f0",a:"0.6",x:10,y:38},{n:["wedding"],u:"1f492",a:"0.6",x:28,y:3},{n:["tokyo tower"],u:"1f5fc",a:"0.6",x:32,y:43},{n:["statue of liberty"],u:"1f5fd",a:"0.6",x:32,y:44},{n:["church"],u:"26ea",a:"0.6",x:59,y:31},{n:["mosque"],u:"1f54c",a:"1.0",x:30,y:58},{n:["hindu temple"],u:"1f6d5",a:"12.0",x:38,y:46},{n:["synagogue"],u:"1f54d",a:"1.0",x:30,y:59},{n:["shinto shrine"],u:"26e9-fe0f",a:"0.7",x:59,y:30},{n:["kaaba"],u:"1f54b",a:"1.0",x:30,y:57},{n:["fountain"],u:"26f2",a:"0.6",x:59,y:34},{n:["tent"],u:"26fa",a:"0.6",x:59,y:58},{n:["foggy"],u:"1f301",a:"0.6",x:4,y:58},{n:["night with stars"],u:"1f303",a:"0.6",x:4,y:60},{n:["cityscape"],u:"1f3d9-fe0f",a:"0.7",x:10,y:15},{n:["sunrise over mountains"],u:"1f304",a:"0.6",x:4,y:61},{n:["sunrise"],u:"1f305",a:"0.6",x:5,y:0},{n:["city sunset","cityscape at dusk"],u:"1f306",a:"0.6",x:5,y:1},{n:["city sunrise","sunset over buildings"],u:"1f307",a:"0.6",x:5,y:2},{n:["bridge at night"],u:"1f309",a:"0.6",x:5,y:4},{n:["hotsprings","hot springs"],u:"2668-fe0f",a:"0.6",x:58,y:61},{n:["carousel horse"],u:"1f3a0",a:"0.6",x:7,y:31},{n:["playground slide"],u:"1f6dd",a:"14.0",x:38,y:50},{n:["ferris wheel"],u:"1f3a1",a:"0.6",x:7,y:32},{n:["roller coaster"],u:"1f3a2",a:"0.6",x:7,y:33},{n:["barber","barber pole"],u:"1f488",a:"0.6",x:27,y:5},{n:["circus tent"],u:"1f3aa",a:"0.6",x:7,y:41},{n:["steam locomotive"],u:"1f682",a:"1.0",x:35,y:60},{n:["railway car"],u:"1f683",a:"0.6",x:35,y:61},{n:["high-speed train","bullettrain side"],u:"1f684",a:"0.6",x:36,y:0},{n:["bullettrain front","high-speed train with bullet nose"],u:"1f685",a:"0.6",x:36,y:1},{n:["train","train2"],u:"1f686",a:"1.0",x:36,y:2},{n:["metro"],u:"1f687",a:"0.6",x:36,y:3},{n:["light rail"],u:"1f688",a:"1.0",x:36,y:4},{n:["station"],u:"1f689",a:"0.6",x:36,y:5},{n:["tram"],u:"1f68a",a:"1.0",x:36,y:6},{n:["monorail"],u:"1f69d",a:"1.0",x:36,y:25},{n:["mountain railway"],u:"1f69e",a:"1.0",x:36,y:26},{n:["train","tram car"],u:"1f68b",a:"1.0",x:36,y:7},{n:["bus"],u:"1f68c",a:"0.6",x:36,y:8},{n:["oncoming bus"],u:"1f68d",a:"0.7",x:36,y:9},{n:["trolleybus"],u:"1f68e",a:"1.0",x:36,y:10},{n:["minibus"],u:"1f690",a:"1.0",x:36,y:12},{n:["ambulance"],u:"1f691",a:"0.6",x:36,y:13},{n:["fire engine"],u:"1f692",a:"0.6",x:36,y:14},{n:["police car"],u:"1f693",a:"0.6",x:36,y:15},{n:["oncoming police car"],u:"1f694",a:"0.7",x:36,y:16},{n:["taxi"],u:"1f695",a:"0.6",x:36,y:17},{n:["oncoming taxi"],u:"1f696",a:"1.0",x:36,y:18},{n:["car","red car","automobile"],u:"1f697",a:"0.6",x:36,y:19},{n:["oncoming automobile"],u:"1f698",a:"0.7",x:36,y:20},{n:["blue car","recreational vehicle"],u:"1f699",a:"0.6",x:36,y:21},{n:["pickup truck"],u:"1f6fb",a:"13.0",x:39,y:9},{n:["truck","delivery truck"],u:"1f69a",a:"0.6",x:36,y:22},{n:["articulated lorry"],u:"1f69b",a:"1.0",x:36,y:23},{n:["tractor"],u:"1f69c",a:"1.0",x:36,y:24},{n:["racing car"],u:"1f3ce-fe0f",a:"0.7",x:10,y:4},{n:["motorcycle","racing motorcycle"],u:"1f3cd-fe0f",a:"0.7",x:10,y:3},{n:["motor scooter"],u:"1f6f5",a:"3.0",x:39,y:3},{n:["manual wheelchair"],u:"1f9bd",a:"12.0",x:46,y:36},{n:["motorized wheelchair"],u:"1f9bc",a:"12.0",x:46,y:35},{n:["auto rickshaw"],u:"1f6fa",a:"12.0",x:39,y:8},{n:["bike","bicycle"],u:"1f6b2",a:"0.6",x:37,y:1},{n:["scooter"],u:"1f6f4",a:"3.0",x:39,y:2},{n:["skateboard"],u:"1f6f9",a:"11.0",x:39,y:7},{n:["roller skate"],u:"1f6fc",a:"13.0",x:39,y:10},{n:["busstop","bus stop"],u:"1f68f",a:"0.6",x:36,y:11},{n:["motorway"],u:"1f6e3-fe0f",a:"0.7",x:38,y:56},{n:["railway track"],u:"1f6e4-fe0f",a:"0.7",x:38,y:57},{n:["oil drum"],u:"1f6e2-fe0f",a:"0.7",x:38,y:55},{n:["fuelpump","fuel pump"],u:"26fd",a:"0.6",x:59,y:59},{n:["wheel"],u:"1f6de",a:"14.0",x:38,y:51},{n:["rotating light","police cars revolving light"],u:"1f6a8",a:"0.6",x:36,y:53},{n:["traffic light","horizontal traffic light"],u:"1f6a5",a:"0.6",x:36,y:50},{n:["vertical traffic light"],u:"1f6a6",a:"1.0",x:36,y:51},{n:["octagonal sign"],u:"1f6d1",a:"3.0",x:38,y:44},{n:["construction","construction sign"],u:"1f6a7",a:"0.6",x:36,y:52},{n:["anchor"],u:"2693",a:"0.6",x:59,y:4},{n:["ring buoy"],u:"1f6df",a:"14.0",x:38,y:52},{n:["boat","sailboat"],u:"26f5",a:"0.6",x:59,y:37},{n:["canoe"],u:"1f6f6",a:"3.0",x:39,y:4},{n:["speedboat"],u:"1f6a4",a:"0.6",x:36,y:49},{n:["passenger ship"],u:"1f6f3-fe0f",a:"0.7",x:39,y:1},{n:["ferry"],u:"26f4-fe0f",a:"0.7",x:59,y:36},{n:["motor boat"],u:"1f6e5-fe0f",a:"0.7",x:38,y:58},{n:["ship"],u:"1f6a2",a:"0.6",x:36,y:30},{n:["airplane"],u:"2708-fe0f",a:"0.6",x:60,y:0},{n:["small airplane"],u:"1f6e9-fe0f",a:"0.7",x:38,y:59},{n:["airplane departure"],u:"1f6eb",a:"1.0",x:38,y:60},{n:["airplane arriving"],u:"1f6ec",a:"1.0",x:38,y:61},{n:["parachute"],u:"1fa82",a:"12.0",x:55,y:4},{n:["seat"],u:"1f4ba",a:"0.6",x:28,y:48},{n:["helicopter"],u:"1f681",a:"1.0",x:35,y:59},{n:["suspension railway"],u:"1f69f",a:"1.0",x:36,y:27},{n:["mountain cableway"],u:"1f6a0",a:"1.0",x:36,y:28},{n:["aerial tramway"],u:"1f6a1",a:"1.0",x:36,y:29},{n:["satellite"],u:"1f6f0-fe0f",a:"0.7",x:39,y:0},{n:["rocket"],u:"1f680",a:"0.6",x:35,y:58},{n:["flying saucer"],u:"1f6f8",a:"5.0",x:39,y:6},{n:["bellhop bell"],u:"1f6ce-fe0f",a:"0.7",x:38,y:41},{n:["luggage"],u:"1f9f3",a:"11.0",x:54,y:38},{n:["hourglass"],u:"231b",a:"0.6",x:57,y:52},{n:["hourglass flowing sand","hourglass with flowing sand"],u:"23f3",a:"0.6",x:58,y:3},{n:["watch"],u:"231a",a:"0.6",x:57,y:51},{n:["alarm clock"],u:"23f0",a:"0.6",x:58,y:0},{n:["stopwatch"],u:"23f1-fe0f",a:"1.0",x:58,y:1},{n:["timer clock"],u:"23f2-fe0f",a:"1.0",x:58,y:2},{n:["mantelpiece clock"],u:"1f570-fe0f",a:"0.7",x:31,y:24},{n:["clock12","clock face twelve oclock"],u:"1f55b",a:"0.6",x:31,y:10},{n:["clock1230","clock face twelve-thirty"],u:"1f567",a:"0.7",x:31,y:22},{n:["clock1","clock face one oclock"],u:"1f550",a:"0.6",x:30,y:61},{n:["clock130","clock face one-thirty"],u:"1f55c",a:"0.7",x:31,y:11},{n:["clock2","clock face two oclock"],u:"1f551",a:"0.6",x:31,y:0},{n:["clock230","clock face two-thirty"],u:"1f55d",a:"0.7",x:31,y:12},{n:["clock3","clock face three oclock"],u:"1f552",a:"0.6",x:31,y:1},{n:["clock330","clock face three-thirty"],u:"1f55e",a:"0.7",x:31,y:13},{n:["clock4","clock face four oclock"],u:"1f553",a:"0.6",x:31,y:2},{n:["clock430","clock face four-thirty"],u:"1f55f",a:"0.7",x:31,y:14},{n:["clock5","clock face five oclock"],u:"1f554",a:"0.6",x:31,y:3},{n:["clock530","clock face five-thirty"],u:"1f560",a:"0.7",x:31,y:15},{n:["clock6","clock face six oclock"],u:"1f555",a:"0.6",x:31,y:4},{n:["clock630","clock face six-thirty"],u:"1f561",a:"0.7",x:31,y:16},{n:["clock7","clock face seven oclock"],u:"1f556",a:"0.6",x:31,y:5},{n:["clock730","clock face seven-thirty"],u:"1f562",a:"0.7",x:31,y:17},{n:["clock8","clock face eight oclock"],u:"1f557",a:"0.6",x:31,y:6},{n:["clock830","clock face eight-thirty"],u:"1f563",a:"0.7",x:31,y:18},{n:["clock9","clock face nine oclock"],u:"1f558",a:"0.6",x:31,y:7},{n:["clock930","clock face nine-thirty"],u:"1f564",a:"0.7",x:31,y:19},{n:["clock10","clock face ten oclock"],u:"1f559",a:"0.6",x:31,y:8},{n:["clock1030","clock face ten-thirty"],u:"1f565",a:"0.7",x:31,y:20},{n:["clock11","clock face eleven oclock"],u:"1f55a",a:"0.6",x:31,y:9},{n:["clock1130","clock face eleven-thirty"],u:"1f566",a:"0.7",x:31,y:21},{n:["new moon","new moon symbol"],u:"1f311",a:"0.6",x:5,y:12},{n:["waxing crescent moon","waxing crescent moon symbol"],u:"1f312",a:"1.0",x:5,y:13},{n:["first quarter moon","first quarter moon symbol"],u:"1f313",a:"0.6",x:5,y:14},{n:["moon","waxing gibbous moon","waxing gibbous moon symbol"],u:"1f314",a:"0.6",x:5,y:15},{n:["full moon","full moon symbol"],u:"1f315",a:"0.6",x:5,y:16},{n:["waning gibbous moon","waning gibbous moon symbol"],u:"1f316",a:"1.0",x:5,y:17},{n:["last quarter moon","last quarter moon symbol"],u:"1f317",a:"1.0",x:5,y:18},{n:["waning crescent moon","waning crescent moon symbol"],u:"1f318",a:"1.0",x:5,y:19},{n:["crescent moon"],u:"1f319",a:"0.6",x:5,y:20},{n:["new moon with face"],u:"1f31a",a:"1.0",x:5,y:21},{n:["first quarter moon with face"],u:"1f31b",a:"0.6",x:5,y:22},{n:["last quarter moon with face"],u:"1f31c",a:"0.7",x:5,y:23},{n:["thermometer"],u:"1f321-fe0f",a:"0.7",x:5,y:28},{n:["sunny","black sun with rays"],u:"2600-fe0f",a:"0.6",x:58,y:16},{n:["full moon with face"],u:"1f31d",a:"1.0",x:5,y:24},{n:["sun with face"],u:"1f31e",a:"1.0",x:5,y:25},{n:["ringed planet"],u:"1fa90",a:"12.0",x:55,y:13},{n:["star","white medium star"],u:"2b50",a:"0.6",x:60,y:60},{n:["star2","glowing star"],u:"1f31f",a:"0.6",x:5,y:26},{n:["stars","shooting star"],u:"1f320",a:"0.6",x:5,y:27},{n:["milky way"],u:"1f30c",a:"0.6",x:5,y:7},{n:["cloud"],u:"2601-fe0f",a:"0.6",x:58,y:17},{n:["partly sunny","sun behind cloud"],u:"26c5",a:"0.6",x:59,y:22},{n:["thunder cloud and rain","cloud with lightning and rain"],u:"26c8-fe0f",a:"0.7",x:59,y:23},{n:["mostly sunny","sun small cloud","sun behind small cloud"],u:"1f324-fe0f",a:"0.7",x:5,y:29},{n:["barely sunny","sun behind cloud","sun behind large cloud"],u:"1f325-fe0f",a:"0.7",x:5,y:30},{n:["partly sunny rain","sun behind rain cloud"],u:"1f326-fe0f",a:"0.7",x:5,y:31},{n:["rain cloud","cloud with rain"],u:"1f327-fe0f",a:"0.7",x:5,y:32},{n:["snow cloud","cloud with snow"],u:"1f328-fe0f",a:"0.7",x:5,y:33},{n:["lightning","lightning cloud","cloud with lightning"],u:"1f329-fe0f",a:"0.7",x:5,y:34},{n:["tornado","tornado cloud"],u:"1f32a-fe0f",a:"0.7",x:5,y:35},{n:["fog"],u:"1f32b-fe0f",a:"0.7",x:5,y:36},{n:["wind face","wind blowing face"],u:"1f32c-fe0f",a:"0.7",x:5,y:37},{n:["cyclone"],u:"1f300",a:"0.6",x:4,y:57},{n:["rainbow"],u:"1f308",a:"0.6",x:5,y:3},{n:["closed umbrella"],u:"1f302",a:"0.6",x:4,y:59},{n:["umbrella"],u:"2602-fe0f",a:"0.7",x:58,y:18},{n:["umbrella with rain drops"],u:"2614",a:"0.6",x:58,y:23},{n:["umbrella on ground"],u:"26f1-fe0f",a:"0.7",x:59,y:33},{n:["zap","high voltage sign"],u:"26a1",a:"0.6",x:59,y:13},{n:["snowflake"],u:"2744-fe0f",a:"0.6",x:60,y:35},{n:["snowman"],u:"2603-fe0f",a:"0.7",x:58,y:19},{n:["snowman without snow"],u:"26c4",a:"0.6",x:59,y:21},{n:["comet"],u:"2604-fe0f",a:"1.0",x:58,y:20},{n:["fire"],u:"1f525",a:"0.6",x:30,y:30},{n:["droplet"],u:"1f4a7",a:"0.6",x:28,y:24},{n:["ocean","water wave"],u:"1f30a",a:"0.6",x:5,y:5}],activities=[{n:["jack-o-lantern","jack o lantern"],u:"1f383",a:"0.6",x:7,y:2},{n:["christmas tree"],u:"1f384",a:"0.6",x:7,y:3},{n:["fireworks"],u:"1f386",a:"0.6",x:7,y:10},{n:["sparkler","firework sparkler"],u:"1f387",a:"0.6",x:7,y:11},{n:["firecracker"],u:"1f9e8",a:"11.0",x:54,y:27},{n:["sparkles"],u:"2728",a:"0.6",x:60,y:32},{n:["balloon"],u:"1f388",a:"0.6",x:7,y:12},{n:["tada","party popper"],u:"1f389",a:"0.6",x:7,y:13},{n:["confetti ball"],u:"1f38a",a:"0.6",x:7,y:14},{n:["tanabata tree"],u:"1f38b",a:"0.6",x:7,y:15},{n:["bamboo","pine decoration"],u:"1f38d",a:"0.6",x:7,y:17},{n:["dolls","japanese dolls"],u:"1f38e",a:"0.6",x:7,y:18},{n:["flags","carp streamer"],u:"1f38f",a:"0.6",x:7,y:19},{n:["wind chime"],u:"1f390",a:"0.6",x:7,y:20},{n:["rice scene","moon viewing ceremony"],u:"1f391",a:"0.6",x:7,y:21},{n:["red envelope","red gift envelope"],u:"1f9e7",a:"11.0",x:54,y:26},{n:["ribbon"],u:"1f380",a:"0.6",x:6,y:61},{n:["gift","wrapped present"],u:"1f381",a:"0.6",x:7,y:0},{n:["reminder ribbon"],u:"1f397-fe0f",a:"0.7",x:7,y:25},{n:["admission tickets"],u:"1f39f-fe0f",a:"0.7",x:7,y:30},{n:["ticket"],u:"1f3ab",a:"0.6",x:7,y:42},{n:["medal","military medal"],u:"1f396-fe0f",a:"0.7",x:7,y:24},{n:["trophy"],u:"1f3c6",a:"0.6",x:9,y:2},{n:["sports medal"],u:"1f3c5",a:"1.0",x:9,y:1},{n:["first place medal"],u:"1f947",a:"3.0",x:43,y:54},{n:["second place medal"],u:"1f948",a:"3.0",x:43,y:55},{n:["third place medal"],u:"1f949",a:"3.0",x:43,y:56},{n:["soccer","soccer ball"],u:"26bd",a:"0.6",x:59,y:19},{n:["baseball"],u:"26be",a:"0.6",x:59,y:20},{n:["softball"],u:"1f94e",a:"11.0",x:43,y:61},{n:["basketball","basketball and hoop"],u:"1f3c0",a:"0.6",x:8,y:1},{n:["volleyball"],u:"1f3d0",a:"1.0",x:10,y:6},{n:["football","american football"],u:"1f3c8",a:"0.6",x:9,y:9},{n:["rugby football"],u:"1f3c9",a:"1.0",x:9,y:10},{n:["tennis","tennis racquet and ball"],u:"1f3be",a:"0.6",x:7,y:61},{n:["flying disc"],u:"1f94f",a:"11.0",x:44,y:0},{n:["bowling"],u:"1f3b3",a:"0.6",x:7,y:50},{n:["cricket bat and ball"],u:"1f3cf",a:"1.0",x:10,y:5},{n:["field hockey stick and ball"],u:"1f3d1",a:"1.0",x:10,y:7},{n:["ice hockey stick and puck"],u:"1f3d2",a:"1.0",x:10,y:8},{n:["lacrosse","lacrosse stick and ball"],u:"1f94d",a:"11.0",x:43,y:60},{n:["table tennis paddle and ball"],u:"1f3d3",a:"1.0",x:10,y:9},{n:["badminton racquet and shuttlecock"],u:"1f3f8",a:"1.0",x:10,y:49},{n:["boxing glove"],u:"1f94a",a:"3.0",x:43,y:57},{n:["martial arts uniform"],u:"1f94b",a:"3.0",x:43,y:58},{n:["goal net"],u:"1f945",a:"3.0",x:43,y:53},{n:["golf","flag in hole"],u:"26f3",a:"0.6",x:59,y:35},{n:["ice skate"],u:"26f8-fe0f",a:"0.7",x:59,y:39},{n:["fishing pole and fish"],u:"1f3a3",a:"0.6",x:7,y:34},{n:["diving mask"],u:"1f93f",a:"12.0",x:43,y:47},{n:["running shirt with sash"],u:"1f3bd",a:"0.6",x:7,y:60},{n:["ski","ski and ski boot"],u:"1f3bf",a:"0.6",x:8,y:0},{n:["sled"],u:"1f6f7",a:"5.0",x:39,y:5},{n:["curling stone"],u:"1f94c",a:"5.0",x:43,y:59},{n:["dart","direct hit"],u:"1f3af",a:"0.6",x:7,y:46},{n:["yo-yo"],u:"1fa80",a:"12.0",x:55,y:2},{n:["kite"],u:"1fa81",a:"12.0",x:55,y:3},{n:["gun","pistol"],u:"1f52b",a:"0.6",x:30,y:36},{n:["8ball","billiards"],u:"1f3b1",a:"0.6",x:7,y:48},{n:["crystal ball"],u:"1f52e",a:"0.6",x:30,y:39},{n:["magic wand"],u:"1fa84",a:"13.0",x:55,y:6},{n:["video game"],u:"1f3ae",a:"0.6",x:7,y:45},{n:["joystick"],u:"1f579-fe0f",a:"0.7",x:31,y:53},{n:["slot machine"],u:"1f3b0",a:"0.6",x:7,y:47},{n:["game die"],u:"1f3b2",a:"0.6",x:7,y:49},{n:["jigsaw","jigsaw puzzle piece"],u:"1f9e9",a:"11.0",x:54,y:28},{n:["teddy bear"],u:"1f9f8",a:"11.0",x:54,y:43},{n:["pinata"],u:"1fa85",a:"13.0",x:55,y:7},{n:["mirror ball"],u:"1faa9",a:"14.0",x:55,y:38},{n:["nesting dolls"],u:"1fa86",a:"13.0",x:55,y:8},{n:["spades","black spade suit"],u:"2660-fe0f",a:"0.6",x:58,y:57},{n:["hearts","black heart suit"],u:"2665-fe0f",a:"0.6",x:58,y:59},{n:["diamonds","black diamond suit"],u:"2666-fe0f",a:"0.6",x:58,y:60},{n:["clubs","black club suit"],u:"2663-fe0f",a:"0.6",x:58,y:58},{n:["chess pawn"],u:"265f-fe0f",a:"11.0",x:58,y:56},{n:["black joker","playing card black joker"],u:"1f0cf",a:"0.6",x:0,y:15},{n:["mahjong","mahjong tile red dragon"],u:"1f004",a:"0.6",x:0,y:14},{n:["flower playing cards"],u:"1f3b4",a:"0.6",x:7,y:51},{n:["performing arts"],u:"1f3ad",a:"0.6",x:7,y:44},{n:["framed picture","frame with picture"],u:"1f5bc-fe0f",a:"0.7",x:32,y:26},{n:["art","artist palette"],u:"1f3a8",a:"0.6",x:7,y:39},{n:["thread","spool of thread"],u:"1f9f5",a:"11.0",x:54,y:40},{n:["sewing needle"],u:"1faa1",a:"13.0",x:55,y:30},{n:["yarn","ball of yarn"],u:"1f9f6",a:"11.0",x:54,y:41},{n:["knot"],u:"1faa2",a:"13.0",x:55,y:31}],objects=[{n:["eyeglasses"],u:"1f453",a:"0.6",x:13,y:25},{n:["sunglasses","dark sunglasses"],u:"1f576-fe0f",a:"0.7",x:31,y:50},{n:["goggles"],u:"1f97d",a:"11.0",x:44,y:51},{n:["lab coat"],u:"1f97c",a:"11.0",x:44,y:50},{n:["safety vest"],u:"1f9ba",a:"12.0",x:46,y:28},{n:["necktie"],u:"1f454",a:"0.6",x:13,y:26},{n:["shirt","tshirt","t-shirt"],u:"1f455",a:"0.6",x:13,y:27},{n:["jeans"],u:"1f456",a:"0.6",x:13,y:28},{n:["scarf"],u:"1f9e3",a:"5.0",x:54,y:22},{n:["gloves"],u:"1f9e4",a:"5.0",x:54,y:23},{n:["coat"],u:"1f9e5",a:"5.0",x:54,y:24},{n:["socks"],u:"1f9e6",a:"5.0",x:54,y:25},{n:["dress"],u:"1f457",a:"0.6",x:13,y:29},{n:["kimono"],u:"1f458",a:"0.6",x:13,y:30},{n:["sari"],u:"1f97b",a:"12.0",x:44,y:49},{n:["one-piece swimsuit"],u:"1fa71",a:"12.0",x:54,y:52},{n:["briefs"],u:"1fa72",a:"12.0",x:54,y:53},{n:["shorts"],u:"1fa73",a:"12.0",x:54,y:54},{n:["bikini"],u:"1f459",a:"0.6",x:13,y:31},{n:["womans clothes"],u:"1f45a",a:"0.6",x:13,y:32},{n:["folding hand fan"],u:"1faad",a:"15.0",x:55,y:42},{n:["purse"],u:"1f45b",a:"0.6",x:13,y:33},{n:["handbag"],u:"1f45c",a:"0.6",x:13,y:34},{n:["pouch"],u:"1f45d",a:"0.6",x:13,y:35},{n:["shopping bags"],u:"1f6cd-fe0f",a:"0.7",x:38,y:40},{n:["school satchel"],u:"1f392",a:"0.6",x:7,y:22},{n:["thong sandal"],u:"1fa74",a:"13.0",x:54,y:55},{n:["shoe","mans shoe"],u:"1f45e",a:"0.6",x:13,y:36},{n:["athletic shoe"],u:"1f45f",a:"0.6",x:13,y:37},{n:["hiking boot"],u:"1f97e",a:"11.0",x:44,y:52},{n:["flat shoe","womans flat shoe"],u:"1f97f",a:"11.0",x:44,y:53},{n:["high heel","high-heeled shoe"],u:"1f460",a:"0.6",x:13,y:38},{n:["sandal","womans sandal"],u:"1f461",a:"0.6",x:13,y:39},{n:["ballet shoes"],u:"1fa70",a:"12.0",x:54,y:51},{n:["boot","womans boots"],u:"1f462",a:"0.6",x:13,y:40},{n:["hair pick"],u:"1faae",a:"15.0",x:55,y:43},{n:["crown"],u:"1f451",a:"0.6",x:13,y:23},{n:["womans hat"],u:"1f452",a:"0.6",x:13,y:24},{n:["tophat","top hat"],u:"1f3a9",a:"0.6",x:7,y:40},{n:["mortar board","graduation cap"],u:"1f393",a:"0.6",x:7,y:23},{n:["billed cap"],u:"1f9e2",a:"5.0",x:54,y:21},{n:["military helmet"],u:"1fa96",a:"13.0",x:55,y:19},{n:["rescue worker’s helmet","helmet with white cross"],u:"26d1-fe0f",a:"0.7",x:59,y:26},{n:["prayer beads"],u:"1f4ff",a:"1.0",x:29,y:54},{n:["lipstick"],u:"1f484",a:"0.6",x:26,y:24},{n:["ring"],u:"1f48d",a:"0.6",x:27,y:10},{n:["gem","gem stone"],u:"1f48e",a:"0.6",x:27,y:11},{n:["mute","speaker with cancellation stroke"],u:"1f507",a:"1.0",x:30,y:0},{n:["speaker"],u:"1f508",a:"0.7",x:30,y:1},{n:["sound","speaker with one sound wave"],u:"1f509",a:"1.0",x:30,y:2},{n:["loud sound","speaker with three sound waves"],u:"1f50a",a:"0.6",x:30,y:3},{n:["loudspeaker","public address loudspeaker"],u:"1f4e2",a:"0.6",x:29,y:26},{n:["mega","cheering megaphone"],u:"1f4e3",a:"0.6",x:29,y:27},{n:["postal horn"],u:"1f4ef",a:"1.0",x:29,y:39},{n:["bell"],u:"1f514",a:"0.6",x:30,y:13},{n:["no bell","bell with cancellation stroke"],u:"1f515",a:"1.0",x:30,y:14},{n:["musical score"],u:"1f3bc",a:"0.6",x:7,y:59},{n:["musical note"],u:"1f3b5",a:"0.6",x:7,y:52},{n:["notes","multiple musical notes"],u:"1f3b6",a:"0.6",x:7,y:53},{n:["studio microphone"],u:"1f399-fe0f",a:"0.7",x:7,y:26},{n:["level slider"],u:"1f39a-fe0f",a:"0.7",x:7,y:27},{n:["control knobs"],u:"1f39b-fe0f",a:"0.7",x:7,y:28},{n:["microphone"],u:"1f3a4",a:"0.6",x:7,y:35},{n:["headphone","headphones"],u:"1f3a7",a:"0.6",x:7,y:38},{n:["radio"],u:"1f4fb",a:"0.6",x:29,y:51},{n:["saxophone"],u:"1f3b7",a:"0.6",x:7,y:54},{n:["accordion"],u:"1fa97",a:"13.0",x:55,y:20},{n:["guitar"],u:"1f3b8",a:"0.6",x:7,y:55},{n:["musical keyboard"],u:"1f3b9",a:"0.6",x:7,y:56},{n:["trumpet"],u:"1f3ba",a:"0.6",x:7,y:57},{n:["violin"],u:"1f3bb",a:"0.6",x:7,y:58},{n:["banjo"],u:"1fa95",a:"12.0",x:55,y:18},{n:["drum with drumsticks"],u:"1f941",a:"3.0",x:43,y:49},{n:["long drum"],u:"1fa98",a:"13.0",x:55,y:21},{n:["maracas"],u:"1fa87",a:"15.0",x:55,y:9},{n:["flute"],u:"1fa88",a:"15.0",x:55,y:10},{n:["harp"],u:"1fa89",a:"16.0",x:55,y:11},{n:["iphone","mobile phone"],u:"1f4f1",a:"0.6",x:29,y:41},{n:["calling","mobile phone with rightwards arrow at left"],u:"1f4f2",a:"0.6",x:29,y:42},{n:["phone","telephone","black telephone"],u:"260e-fe0f",a:"0.6",x:58,y:21},{n:["telephone receiver"],u:"1f4de",a:"0.6",x:29,y:22},{n:["pager"],u:"1f4df",a:"0.6",x:29,y:23},{n:["fax","fax machine"],u:"1f4e0",a:"0.6",x:29,y:24},{n:["battery"],u:"1f50b",a:"0.6",x:30,y:4},{n:["low battery"],u:"1faab",a:"14.0",x:55,y:40},{n:["electric plug"],u:"1f50c",a:"0.6",x:30,y:5},{n:["computer","personal computer"],u:"1f4bb",a:"0.6",x:28,y:49},{n:["desktop computer"],u:"1f5a5-fe0f",a:"0.7",x:32,y:22},{n:["printer"],u:"1f5a8-fe0f",a:"0.7",x:32,y:23},{n:["keyboard"],u:"2328-fe0f",a:"1.0",x:57,y:53},{n:["computer mouse","three button mouse"],u:"1f5b1-fe0f",a:"0.7",x:32,y:24},{n:["trackball"],u:"1f5b2-fe0f",a:"0.7",x:32,y:25},{n:["minidisc"],u:"1f4bd",a:"0.6",x:28,y:51},{n:["floppy disk"],u:"1f4be",a:"0.6",x:28,y:52},{n:["cd","optical disc"],u:"1f4bf",a:"0.6",x:28,y:53},{n:["dvd"],u:"1f4c0",a:"0.6",x:28,y:54},{n:["abacus"],u:"1f9ee",a:"11.0",x:54,y:33},{n:["movie camera"],u:"1f3a5",a:"0.6",x:7,y:36},{n:["film frames"],u:"1f39e-fe0f",a:"0.7",x:7,y:29},{n:["film projector"],u:"1f4fd-fe0f",a:"0.7",x:29,y:53},{n:["clapper","clapper board"],u:"1f3ac",a:"0.6",x:7,y:43},{n:["tv","television"],u:"1f4fa",a:"0.6",x:29,y:50},{n:["camera"],u:"1f4f7",a:"0.6",x:29,y:47},{n:["camera with flash"],u:"1f4f8",a:"1.0",x:29,y:48},{n:["video camera"],u:"1f4f9",a:"0.6",x:29,y:49},{n:["vhs","videocassette"],u:"1f4fc",a:"0.6",x:29,y:52},{n:["mag","left-pointing magnifying glass"],u:"1f50d",a:"0.6",x:30,y:6},{n:["mag right","right-pointing magnifying glass"],u:"1f50e",a:"0.6",x:30,y:7},{n:["candle"],u:"1f56f-fe0f",a:"0.7",x:31,y:23},{n:["bulb","electric light bulb"],u:"1f4a1",a:"0.6",x:28,y:18},{n:["flashlight","electric torch"],u:"1f526",a:"0.6",x:30,y:31},{n:["lantern","izakaya lantern"],u:"1f3ee",a:"0.6",x:10,y:36},{n:["diya lamp"],u:"1fa94",a:"12.0",x:55,y:17},{n:["notebook with decorative cover"],u:"1f4d4",a:"0.6",x:29,y:12},{n:["closed book"],u:"1f4d5",a:"0.6",x:29,y:13},{n:["book","open book"],u:"1f4d6",a:"0.6",x:29,y:14},{n:["green book"],u:"1f4d7",a:"0.6",x:29,y:15},{n:["blue book"],u:"1f4d8",a:"0.6",x:29,y:16},{n:["orange book"],u:"1f4d9",a:"0.6",x:29,y:17},{n:["books"],u:"1f4da",a:"0.6",x:29,y:18},{n:["notebook"],u:"1f4d3",a:"0.6",x:29,y:11},{n:["ledger"],u:"1f4d2",a:"0.6",x:29,y:10},{n:["page with curl"],u:"1f4c3",a:"0.6",x:28,y:57},{n:["scroll"],u:"1f4dc",a:"0.6",x:29,y:20},{n:["page facing up"],u:"1f4c4",a:"0.6",x:28,y:58},{n:["newspaper"],u:"1f4f0",a:"0.6",x:29,y:40},{n:["rolled-up newspaper","rolled up newspaper"],u:"1f5de-fe0f",a:"0.7",x:32,y:35},{n:["bookmark tabs"],u:"1f4d1",a:"0.6",x:29,y:9},{n:["bookmark"],u:"1f516",a:"0.6",x:30,y:15},{n:["label"],u:"1f3f7-fe0f",a:"0.7",x:10,y:48},{n:["moneybag","money bag"],u:"1f4b0",a:"0.6",x:28,y:38},{n:["coin"],u:"1fa99",a:"13.0",x:55,y:22},{n:["yen","banknote with yen sign"],u:"1f4b4",a:"0.6",x:28,y:42},{n:["dollar","banknote with dollar sign"],u:"1f4b5",a:"0.6",x:28,y:43},{n:["euro","banknote with euro sign"],u:"1f4b6",a:"1.0",x:28,y:44},{n:["pound","banknote with pound sign"],u:"1f4b7",a:"1.0",x:28,y:45},{n:["money with wings"],u:"1f4b8",a:"0.6",x:28,y:46},{n:["credit card"],u:"1f4b3",a:"0.6",x:28,y:41},{n:["receipt"],u:"1f9fe",a:"11.0",x:54,y:49},{n:["chart","chart with upwards trend and yen sign"],u:"1f4b9",a:"0.6",x:28,y:47},{n:["email","envelope"],u:"2709-fe0f",a:"0.6",x:60,y:1},{n:["e-mail","e-mail symbol"],u:"1f4e7",a:"0.6",x:29,y:31},{n:["incoming envelope"],u:"1f4e8",a:"0.6",x:29,y:32},{n:["envelope with arrow","envelope with downwards arrow above"],u:"1f4e9",a:"0.6",x:29,y:33},{n:["outbox tray"],u:"1f4e4",a:"0.6",x:29,y:28},{n:["inbox tray"],u:"1f4e5",a:"0.6",x:29,y:29},{n:["package"],u:"1f4e6",a:"0.6",x:29,y:30},{n:["mailbox","closed mailbox with raised flag"],u:"1f4eb",a:"0.6",x:29,y:35},{n:["mailbox closed","closed mailbox with lowered flag"],u:"1f4ea",a:"0.6",x:29,y:34},{n:["mailbox with mail","open mailbox with raised flag"],u:"1f4ec",a:"0.7",x:29,y:36},{n:["mailbox with no mail","open mailbox with lowered flag"],u:"1f4ed",a:"0.7",x:29,y:37},{n:["postbox"],u:"1f4ee",a:"0.6",x:29,y:38},{n:["ballot box with ballot"],u:"1f5f3-fe0f",a:"0.7",x:32,y:40},{n:["pencil","pencil2"],u:"270f-fe0f",a:"0.6",x:60,y:26},{n:["black nib"],u:"2712-fe0f",a:"0.6",x:60,y:27},{n:["fountain pen","lower left fountain pen"],u:"1f58b-fe0f",a:"0.7",x:32,y:0},{n:["pen","lower left ballpoint pen"],u:"1f58a-fe0f",a:"0.7",x:31,y:61},{n:["paintbrush","lower left paintbrush"],u:"1f58c-fe0f",a:"0.7",x:32,y:1},{n:["crayon","lower left crayon"],u:"1f58d-fe0f",a:"0.7",x:32,y:2},{n:["memo","pencil"],u:"1f4dd",a:"0.6",x:29,y:21},{n:["briefcase"],u:"1f4bc",a:"0.6",x:28,y:50},{n:["file folder"],u:"1f4c1",a:"0.6",x:28,y:55},{n:["open file folder"],u:"1f4c2",a:"0.6",x:28,y:56},{n:["card index dividers"],u:"1f5c2-fe0f",a:"0.7",x:32,y:27},{n:["date","calendar"],u:"1f4c5",a:"0.6",x:28,y:59},{n:["calendar","tear-off calendar"],u:"1f4c6",a:"0.6",x:28,y:60},{n:["spiral notepad","spiral note pad"],u:"1f5d2-fe0f",a:"0.7",x:32,y:31},{n:["spiral calendar","spiral calendar pad"],u:"1f5d3-fe0f",a:"0.7",x:32,y:32},{n:["card index"],u:"1f4c7",a:"0.6",x:28,y:61},{n:["chart with upwards trend"],u:"1f4c8",a:"0.6",x:29,y:0},{n:["chart with downwards trend"],u:"1f4c9",a:"0.6",x:29,y:1},{n:["bar chart"],u:"1f4ca",a:"0.6",x:29,y:2},{n:["clipboard"],u:"1f4cb",a:"0.6",x:29,y:3},{n:["pushpin"],u:"1f4cc",a:"0.6",x:29,y:4},{n:["round pushpin"],u:"1f4cd",a:"0.6",x:29,y:5},{n:["paperclip"],u:"1f4ce",a:"0.6",x:29,y:6},{n:["linked paperclips"],u:"1f587-fe0f",a:"0.7",x:31,y:60},{n:["straight ruler"],u:"1f4cf",a:"0.6",x:29,y:7},{n:["triangular ruler"],u:"1f4d0",a:"0.6",x:29,y:8},{n:["scissors","black scissors"],u:"2702-fe0f",a:"0.6",x:59,y:60},{n:["card file box"],u:"1f5c3-fe0f",a:"0.7",x:32,y:28},{n:["file cabinet"],u:"1f5c4-fe0f",a:"0.7",x:32,y:29},{n:["wastebasket"],u:"1f5d1-fe0f",a:"0.7",x:32,y:30},{n:["lock"],u:"1f512",a:"0.6",x:30,y:11},{n:["unlock","open lock"],u:"1f513",a:"0.6",x:30,y:12},{n:["lock with ink pen"],u:"1f50f",a:"0.6",x:30,y:8},{n:["closed lock with key"],u:"1f510",a:"0.6",x:30,y:9},{n:["key"],u:"1f511",a:"0.6",x:30,y:10},{n:["old key"],u:"1f5dd-fe0f",a:"0.7",x:32,y:34},{n:["hammer"],u:"1f528",a:"0.6",x:30,y:33},{n:["axe"],u:"1fa93",a:"12.0",x:55,y:16},{n:["pick"],u:"26cf-fe0f",a:"0.7",x:59,y:25},{n:["hammer and pick"],u:"2692-fe0f",a:"1.0",x:59,y:3},{n:["hammer and wrench"],u:"1f6e0-fe0f",a:"0.7",x:38,y:53},{n:["dagger","dagger knife"],u:"1f5e1-fe0f",a:"0.7",x:32,y:36},{n:["crossed swords"],u:"2694-fe0f",a:"1.0",x:59,y:5},{n:["bomb"],u:"1f4a3",a:"0.6",x:28,y:20},{n:["boomerang"],u:"1fa83",a:"13.0",x:55,y:5},{n:["bow and arrow"],u:"1f3f9",a:"1.0",x:10,y:50},{n:["shield"],u:"1f6e1-fe0f",a:"0.7",x:38,y:54},{n:["carpentry saw"],u:"1fa9a",a:"13.0",x:55,y:23},{n:["wrench"],u:"1f527",a:"0.6",x:30,y:32},{n:["screwdriver"],u:"1fa9b",a:"13.0",x:55,y:24},{n:["nut and bolt"],u:"1f529",a:"0.6",x:30,y:34},{n:["gear"],u:"2699-fe0f",a:"1.0",x:59,y:9},{n:["clamp","compression"],u:"1f5dc-fe0f",a:"0.7",x:32,y:33},{n:["scales","balance scale"],u:"2696-fe0f",a:"1.0",x:59,y:7},{n:["probing cane"],u:"1f9af",a:"12.0",x:45,y:39},{n:["link","link symbol"],u:"1f517",a:"0.6",x:30,y:16},{n:["broken chain"],u:"26d3-fe0f-200d-1f4a5",a:"15.1",x:59,y:27},{n:["chains"],u:"26d3-fe0f",a:"0.7",x:59,y:28},{n:["hook"],u:"1fa9d",a:"13.0",x:55,y:26},{n:["toolbox"],u:"1f9f0",a:"11.0",x:54,y:35},{n:["magnet"],u:"1f9f2",a:"11.0",x:54,y:37},{n:["ladder"],u:"1fa9c",a:"13.0",x:55,y:25},{n:["shovel"],u:"1fa8f",a:"16.0",x:55,y:12},{n:["alembic"],u:"2697-fe0f",a:"1.0",x:59,y:8},{n:["test tube"],u:"1f9ea",a:"11.0",x:54,y:29},{n:["petri dish"],u:"1f9eb",a:"11.0",x:54,y:30},{n:["dna","dna double helix"],u:"1f9ec",a:"11.0",x:54,y:31},{n:["microscope"],u:"1f52c",a:"1.0",x:30,y:37},{n:["telescope"],u:"1f52d",a:"1.0",x:30,y:38},{n:["satellite antenna"],u:"1f4e1",a:"0.6",x:29,y:25},{n:["syringe"],u:"1f489",a:"0.6",x:27,y:6},{n:["drop of blood"],u:"1fa78",a:"12.0",x:54,y:59},{n:["pill"],u:"1f48a",a:"0.6",x:27,y:7},{n:["adhesive bandage"],u:"1fa79",a:"12.0",x:54,y:60},{n:["crutch"],u:"1fa7c",a:"14.0",x:55,y:1},{n:["stethoscope"],u:"1fa7a",a:"12.0",x:54,y:61},{n:["x-ray"],u:"1fa7b",a:"14.0",x:55,y:0},{n:["door"],u:"1f6aa",a:"0.6",x:36,y:55},{n:["elevator"],u:"1f6d7",a:"13.0",x:38,y:48},{n:["mirror"],u:"1fa9e",a:"13.0",x:55,y:27},{n:["window"],u:"1fa9f",a:"13.0",x:55,y:28},{n:["bed"],u:"1f6cf-fe0f",a:"0.7",x:38,y:42},{n:["couch and lamp"],u:"1f6cb-fe0f",a:"0.7",x:38,y:33},{n:["chair"],u:"1fa91",a:"12.0",x:55,y:14},{n:["toilet"],u:"1f6bd",a:"0.6",x:38,y:19},{n:["plunger"],u:"1faa0",a:"13.0",x:55,y:29},{n:["shower"],u:"1f6bf",a:"1.0",x:38,y:21},{n:["bathtub"],u:"1f6c1",a:"1.0",x:38,y:28},{n:["mouse trap"],u:"1faa4",a:"13.0",x:55,y:33},{n:["razor"],u:"1fa92",a:"12.0",x:55,y:15},{n:["lotion bottle"],u:"1f9f4",a:"11.0",x:54,y:39},{n:["safety pin"],u:"1f9f7",a:"11.0",x:54,y:42},{n:["broom"],u:"1f9f9",a:"11.0",x:54,y:44},{n:["basket"],u:"1f9fa",a:"11.0",x:54,y:45},{n:["roll of paper"],u:"1f9fb",a:"11.0",x:54,y:46},{n:["bucket"],u:"1faa3",a:"13.0",x:55,y:32},{n:["soap","bar of soap"],u:"1f9fc",a:"11.0",x:54,y:47},{n:["bubbles"],u:"1fae7",a:"14.0",x:56,y:44},{n:["toothbrush"],u:"1faa5",a:"13.0",x:55,y:34},{n:["sponge"],u:"1f9fd",a:"11.0",x:54,y:48},{n:["fire extinguisher"],u:"1f9ef",a:"11.0",x:54,y:34},{n:["shopping trolley"],u:"1f6d2",a:"3.0",x:38,y:45},{n:["smoking","smoking symbol"],u:"1f6ac",a:"0.6",x:36,y:57},{n:["coffin"],u:"26b0-fe0f",a:"1.0",x:59,y:17},{n:["headstone"],u:"1faa6",a:"13.0",x:55,y:35},{n:["funeral urn"],u:"26b1-fe0f",a:"1.0",x:59,y:18},{n:["nazar amulet"],u:"1f9ff",a:"11.0",x:54,y:50},{n:["hamsa"],u:"1faac",a:"14.0",x:55,y:41},{n:["moyai"],u:"1f5ff",a:"0.6",x:32,y:46},{n:["placard"],u:"1faa7",a:"13.0",x:55,y:36},{n:["identification card"],u:"1faaa",a:"14.0",x:55,y:39}],symbols=[{n:["atm","automated teller machine"],u:"1f3e7",a:"0.6",x:10,y:29},{n:["put litter in its place","put litter in its place symbol"],u:"1f6ae",a:"1.0",x:36,y:59},{n:["potable water","potable water symbol"],u:"1f6b0",a:"1.0",x:36,y:61},{n:["wheelchair","wheelchair symbol"],u:"267f",a:"0.6",x:59,y:2},{n:["mens","mens symbol"],u:"1f6b9",a:"0.6",x:38,y:15},{n:["womens","womens symbol"],u:"1f6ba",a:"0.6",x:38,y:16},{n:["restroom"],u:"1f6bb",a:"0.6",x:38,y:17},{n:["baby symbol"],u:"1f6bc",a:"0.6",x:38,y:18},{n:["wc","water closet"],u:"1f6be",a:"0.6",x:38,y:20},{n:["passport control"],u:"1f6c2",a:"1.0",x:38,y:29},{n:["customs"],u:"1f6c3",a:"1.0",x:38,y:30},{n:["baggage claim"],u:"1f6c4",a:"1.0",x:38,y:31},{n:["left luggage"],u:"1f6c5",a:"1.0",x:38,y:32},{n:["warning","warning sign"],u:"26a0-fe0f",a:"0.6",x:59,y:12},{n:["children crossing"],u:"1f6b8",a:"1.0",x:38,y:14},{n:["no entry"],u:"26d4",a:"0.6",x:59,y:29},{n:["no entry sign"],u:"1f6ab",a:"0.6",x:36,y:56},{n:["no bicycles"],u:"1f6b3",a:"1.0",x:37,y:2},{n:["no smoking","no smoking symbol"],u:"1f6ad",a:"0.6",x:36,y:58},{n:["do not litter","do not litter symbol"],u:"1f6af",a:"1.0",x:36,y:60},{n:["non-potable water","non-potable water symbol"],u:"1f6b1",a:"1.0",x:37,y:0},{n:["no pedestrians"],u:"1f6b7",a:"1.0",x:38,y:13},{n:["no mobile phones"],u:"1f4f5",a:"1.0",x:29,y:45},{n:["underage","no one under eighteen symbol"],u:"1f51e",a:"0.6",x:30,y:23},{n:["radioactive","radioactive sign"],u:"2622-fe0f",a:"1.0",x:58,y:33},{n:["biohazard","biohazard sign"],u:"2623-fe0f",a:"1.0",x:58,y:34},{n:["arrow up","upwards black arrow"],u:"2b06-fe0f",a:"0.6",x:60,y:56},{n:["north east arrow","arrow upper right"],u:"2197-fe0f",a:"0.6",x:57,y:46},{n:["arrow right","black rightwards arrow"],u:"27a1-fe0f",a:"0.6",x:60,y:50},{n:["south east arrow","arrow lower right"],u:"2198-fe0f",a:"0.6",x:57,y:47},{n:["arrow down","downwards black arrow"],u:"2b07-fe0f",a:"0.6",x:60,y:57},{n:["south west arrow","arrow lower left"],u:"2199-fe0f",a:"0.6",x:57,y:48},{n:["arrow left","leftwards black arrow"],u:"2b05-fe0f",a:"0.6",x:60,y:55},{n:["north west arrow","arrow upper left"],u:"2196-fe0f",a:"0.6",x:57,y:45},{n:["up down arrow","arrow up down"],u:"2195-fe0f",a:"0.6",x:57,y:44},{n:["left right arrow"],u:"2194-fe0f",a:"0.6",x:57,y:43},{n:["leftwards arrow with hook"],u:"21a9-fe0f",a:"0.6",x:57,y:49},{n:["arrow right hook","rightwards arrow with hook"],u:"21aa-fe0f",a:"0.6",x:57,y:50},{n:["arrow heading up","arrow pointing rightwards then curving upwards"],u:"2934-fe0f",a:"0.6",x:60,y:53},{n:["arrow heading down","arrow pointing rightwards then curving downwards"],u:"2935-fe0f",a:"0.6",x:60,y:54},{n:["arrows clockwise","clockwise downwards and upwards open circle arrows"],u:"1f503",a:"0.6",x:29,y:58},{n:["arrows counterclockwise","anticlockwise downwards and upwards open circle arrows"],u:"1f504",a:"1.0",x:29,y:59},{n:["back","back with leftwards arrow above"],u:"1f519",a:"0.6",x:30,y:18},{n:["end","end with leftwards arrow above"],u:"1f51a",a:"0.6",x:30,y:19},{n:["on","on with exclamation mark with left right arrow above"],u:"1f51b",a:"0.6",x:30,y:20},{n:["soon","soon with rightwards arrow above"],u:"1f51c",a:"0.6",x:30,y:21},{n:["top","top with upwards arrow above"],u:"1f51d",a:"0.6",x:30,y:22},{n:["place of worship"],u:"1f6d0",a:"1.0",x:38,y:43},{n:["atom symbol"],u:"269b-fe0f",a:"1.0",x:59,y:10},{n:["om","om symbol"],u:"1f549-fe0f",a:"0.7",x:30,y:55},{n:["star of david"],u:"2721-fe0f",a:"0.7",x:60,y:31},{n:["wheel of dharma"],u:"2638-fe0f",a:"0.7",x:58,y:39},{n:["yin yang"],u:"262f-fe0f",a:"0.7",x:58,y:38},{n:["latin cross"],u:"271d-fe0f",a:"0.7",x:60,y:30},{n:["orthodox cross"],u:"2626-fe0f",a:"1.0",x:58,y:35},{n:["star and crescent"],u:"262a-fe0f",a:"0.7",x:58,y:36},{n:["peace symbol"],u:"262e-fe0f",a:"1.0",x:58,y:37},{n:["menorah with nine branches"],u:"1f54e",a:"1.0",x:30,y:60},{n:["six pointed star","six pointed star with middle dot"],u:"1f52f",a:"0.6",x:30,y:40},{n:["khanda"],u:"1faaf",a:"15.0",x:55,y:44},{n:["aries"],u:"2648",a:"0.6",x:58,y:44},{n:["taurus"],u:"2649",a:"0.6",x:58,y:45},{n:["gemini"],u:"264a",a:"0.6",x:58,y:46},{n:["cancer"],u:"264b",a:"0.6",x:58,y:47},{n:["leo"],u:"264c",a:"0.6",x:58,y:48},{n:["virgo"],u:"264d",a:"0.6",x:58,y:49},{n:["libra"],u:"264e",a:"0.6",x:58,y:50},{n:["scorpius"],u:"264f",a:"0.6",x:58,y:51},{n:["sagittarius"],u:"2650",a:"0.6",x:58,y:52},{n:["capricorn"],u:"2651",a:"0.6",x:58,y:53},{n:["aquarius"],u:"2652",a:"0.6",x:58,y:54},{n:["pisces"],u:"2653",a:"0.6",x:58,y:55},{n:["ophiuchus"],u:"26ce",a:"0.6",x:59,y:24},{n:["twisted rightwards arrows"],u:"1f500",a:"1.0",x:29,y:55},{n:["repeat","clockwise rightwards and leftwards open circle arrows"],u:"1f501",a:"1.0",x:29,y:56},{n:["repeat one","clockwise rightwards and leftwards open circle arrows with circled one overlay"],u:"1f502",a:"1.0",x:29,y:57},{n:["arrow forward","black right-pointing triangle"],u:"25b6-fe0f",a:"0.6",x:58,y:10},{n:["fast forward","black right-pointing double triangle"],u:"23e9",a:"0.6",x:57,y:55},{n:["next track button","black right pointing double triangle with vertical bar"],u:"23ed-fe0f",a:"0.7",x:57,y:59},{n:["play or pause button","black right pointing triangle with double vertical bar"],u:"23ef-fe0f",a:"1.0",x:57,y:61},{n:["arrow backward","black left-pointing triangle"],u:"25c0-fe0f",a:"0.6",x:58,y:11},{n:["rewind","black left-pointing double triangle"],u:"23ea",a:"0.6",x:57,y:56},{n:["last track button","black left pointing double triangle with vertical bar"],u:"23ee-fe0f",a:"0.7",x:57,y:60},{n:["arrow up small","up-pointing small red triangle"],u:"1f53c",a:"0.6",x:30,y:53},{n:["arrow double up","black up-pointing double triangle"],u:"23eb",a:"0.6",x:57,y:57},{n:["arrow down small","down-pointing small red triangle"],u:"1f53d",a:"0.6",x:30,y:54},{n:["arrow double down","black down-pointing double triangle"],u:"23ec",a:"0.6",x:57,y:58},{n:["pause button","double vertical bar"],u:"23f8-fe0f",a:"0.7",x:58,y:4},{n:["stop button","black square for stop"],u:"23f9-fe0f",a:"0.7",x:58,y:5},{n:["record button","black circle for record"],u:"23fa-fe0f",a:"0.7",x:58,y:6},{n:["eject","eject button"],u:"23cf-fe0f",a:"1.0",x:57,y:54},{n:["cinema"],u:"1f3a6",a:"0.6",x:7,y:37},{n:["low brightness","low brightness symbol"],u:"1f505",a:"1.0",x:29,y:60},{n:["high brightness","high brightness symbol"],u:"1f506",a:"1.0",x:29,y:61},{n:["signal strength","antenna with bars"],u:"1f4f6",a:"0.6",x:29,y:46},{n:["wireless"],u:"1f6dc",a:"15.0",x:38,y:49},{n:["vibration mode"],u:"1f4f3",a:"0.6",x:29,y:43},{n:["mobile phone off"],u:"1f4f4",a:"0.6",x:29,y:44},{n:["female sign"],u:"2640-fe0f",a:"4.0",x:58,y:42},{n:["male sign"],u:"2642-fe0f",a:"4.0",x:58,y:43},{n:["transgender symbol"],u:"26a7-fe0f",a:"13.0",x:59,y:14},{n:["heavy multiplication x"],u:"2716-fe0f",a:"0.6",x:60,y:29},{n:["heavy plus sign"],u:"2795",a:"0.6",x:60,y:47},{n:["heavy minus sign"],u:"2796",a:"0.6",x:60,y:48},{n:["heavy division sign"],u:"2797",a:"0.6",x:60,y:49},{n:["heavy equals sign"],u:"1f7f0",a:"14.0",x:39,y:23},{n:["infinity"],u:"267e-fe0f",a:"11.0",x:59,y:1},{n:["bangbang","double exclamation mark"],u:"203c-fe0f",a:"0.6",x:57,y:39},{n:["interrobang","exclamation question mark"],u:"2049-fe0f",a:"0.6",x:57,y:40},{n:["question","black question mark ornament"],u:"2753",a:"0.6",x:60,y:39},{n:["grey question","white question mark ornament"],u:"2754",a:"0.6",x:60,y:40},{n:["grey exclamation","white exclamation mark ornament"],u:"2755",a:"0.6",x:60,y:41},{n:["exclamation","heavy exclamation mark","heavy exclamation mark symbol"],u:"2757",a:"0.6",x:60,y:42},{n:["wavy dash"],u:"3030-fe0f",a:"0.6",x:61,y:0},{n:["currency exchange"],u:"1f4b1",a:"0.6",x:28,y:39},{n:["heavy dollar sign"],u:"1f4b2",a:"0.6",x:28,y:40},{n:["medical symbol","staff of aesculapius"],u:"2695-fe0f",a:"4.0",x:59,y:6},{n:["recycle","black universal recycling symbol"],u:"267b-fe0f",a:"0.6",x:59,y:0},{n:["fleur-de-lis","fleur de lis"],u:"269c-fe0f",a:"1.0",x:59,y:11},{n:["trident","trident emblem"],u:"1f531",a:"0.6",x:30,y:42},{n:["name badge"],u:"1f4db",a:"0.6",x:29,y:19},{n:["beginner","japanese symbol for beginner"],u:"1f530",a:"0.6",x:30,y:41},{n:["o","heavy large circle"],u:"2b55",a:"0.6",x:60,y:61},{n:["white check mark","white heavy check mark"],u:"2705",a:"0.6",x:59,y:61},{n:["ballot box with check"],u:"2611-fe0f",a:"0.6",x:58,y:22},{n:["heavy check mark"],u:"2714-fe0f",a:"0.6",x:60,y:28},{n:["x","cross mark"],u:"274c",a:"0.6",x:60,y:37},{n:["negative squared cross mark"],u:"274e",a:"0.6",x:60,y:38},{n:["curly loop"],u:"27b0",a:"0.6",x:60,y:51},{n:["loop","double curly loop"],u:"27bf",a:"1.0",x:60,y:52},{n:["part alternation mark"],u:"303d-fe0f",a:"0.6",x:61,y:1},{n:["eight spoked asterisk"],u:"2733-fe0f",a:"0.6",x:60,y:33},{n:["eight pointed black star"],u:"2734-fe0f",a:"0.6",x:60,y:34},{n:["sparkle"],u:"2747-fe0f",a:"0.6",x:60,y:36},{n:["copyright","copyright sign"],u:"00a9-fe0f",a:"0.6",x:0,y:12},{n:["registered","registered sign"],u:"00ae-fe0f",a:"0.6",x:0,y:13},{n:["tm","trade mark sign"],u:"2122-fe0f",a:"0.6",x:57,y:41},{n:["splatter"],u:"1fadf",a:"16.0",x:56,y:36},{n:["hash","hash key"],u:"0023-fe0f-20e3",a:"0.6",x:0,y:0},{n:["keycap: *","keycap star"],u:"002a-fe0f-20e3",a:"2.0",x:0,y:1},{n:["zero","keycap 0"],u:"0030-fe0f-20e3",a:"0.6",x:0,y:2},{n:["one","keycap 1"],u:"0031-fe0f-20e3",a:"0.6",x:0,y:3},{n:["two","keycap 2"],u:"0032-fe0f-20e3",a:"0.6",x:0,y:4},{n:["three","keycap 3"],u:"0033-fe0f-20e3",a:"0.6",x:0,y:5},{n:["four","keycap 4"],u:"0034-fe0f-20e3",a:"0.6",x:0,y:6},{n:["five","keycap 5"],u:"0035-fe0f-20e3",a:"0.6",x:0,y:7},{n:["six","keycap 6"],u:"0036-fe0f-20e3",a:"0.6",x:0,y:8},{n:["seven","keycap 7"],u:"0037-fe0f-20e3",a:"0.6",x:0,y:9},{n:["eight","keycap 8"],u:"0038-fe0f-20e3",a:"0.6",x:0,y:10},{n:["nine","keycap 9"],u:"0039-fe0f-20e3",a:"0.6",x:0,y:11},{n:["keycap ten"],u:"1f51f",a:"0.6",x:30,y:24},{n:["capital abcd","input symbol for latin capital letters"],u:"1f520",a:"0.6",x:30,y:25},{n:["abcd","input symbol for latin small letters"],u:"1f521",a:"0.6",x:30,y:26},{n:["1234","input symbol for numbers"],u:"1f522",a:"0.6",x:30,y:27},{n:["symbols","input symbol for symbols"],u:"1f523",a:"0.6",x:30,y:28},{n:["abc","input symbol for latin letters"],u:"1f524",a:"0.6",x:30,y:29},{n:["a","negative squared latin capital letter a"],u:"1f170-fe0f",a:"0.6",x:0,y:16},{n:["ab","negative squared ab"],u:"1f18e",a:"0.6",x:0,y:20},{n:["b","negative squared latin capital letter b"],u:"1f171-fe0f",a:"0.6",x:0,y:17},{n:["cl","squared cl"],u:"1f191",a:"0.6",x:0,y:21},{n:["cool","squared cool"],u:"1f192",a:"0.6",x:0,y:22},{n:["free","squared free"],u:"1f193",a:"0.6",x:0,y:23},{n:["information source"],u:"2139-fe0f",a:"0.6",x:57,y:42},{n:["id","squared id"],u:"1f194",a:"0.6",x:0,y:24},{n:["m","circled latin capital letter m"],u:"24c2-fe0f",a:"0.6",x:58,y:7},{n:["new","squared new"],u:"1f195",a:"0.6",x:0,y:25},{n:["ng","squared ng"],u:"1f196",a:"0.6",x:0,y:26},{n:["o2","negative squared latin capital letter o"],u:"1f17e-fe0f",a:"0.6",x:0,y:18},{n:["ok","squared ok"],u:"1f197",a:"0.6",x:0,y:27},{n:["parking","negative squared latin capital letter p"],u:"1f17f-fe0f",a:"0.6",x:0,y:19},{n:["sos","squared sos"],u:"1f198",a:"0.6",x:0,y:28},{n:["up","squared up with exclamation mark"],u:"1f199",a:"0.6",x:0,y:29},{n:["vs","squared vs"],u:"1f19a",a:"0.6",x:0,y:30},{n:["koko","squared katakana koko"],u:"1f201",a:"0.6",x:4,y:42},{n:["sa","squared katakana sa"],u:"1f202-fe0f",a:"0.6",x:4,y:43},{n:["u6708","squared cjk unified ideograph-6708"],u:"1f237-fe0f",a:"0.6",x:4,y:51},{n:["u6709","squared cjk unified ideograph-6709"],u:"1f236",a:"0.6",x:4,y:50},{n:["u6307","squared cjk unified ideograph-6307"],u:"1f22f",a:"0.6",x:4,y:45},{n:["ideograph advantage","circled ideograph advantage"],u:"1f250",a:"0.6",x:4,y:55},{n:["u5272","squared cjk unified ideograph-5272"],u:"1f239",a:"0.6",x:4,y:53},{n:["u7121","squared cjk unified ideograph-7121"],u:"1f21a",a:"0.6",x:4,y:44},{n:["u7981","squared cjk unified ideograph-7981"],u:"1f232",a:"0.6",x:4,y:46},{n:["accept","circled ideograph accept"],u:"1f251",a:"0.6",x:4,y:56},{n:["u7533","squared cjk unified ideograph-7533"],u:"1f238",a:"0.6",x:4,y:52},{n:["u5408","squared cjk unified ideograph-5408"],u:"1f234",a:"0.6",x:4,y:48},{n:["u7a7a","squared cjk unified ideograph-7a7a"],u:"1f233",a:"0.6",x:4,y:47},{n:["congratulations","circled ideograph congratulation"],u:"3297-fe0f",a:"0.6",x:61,y:2},{n:["secret","circled ideograph secret"],u:"3299-fe0f",a:"0.6",x:61,y:3},{n:["u55b6","squared cjk unified ideograph-55b6"],u:"1f23a",a:"0.6",x:4,y:54},{n:["u6e80","squared cjk unified ideograph-6e80"],u:"1f235",a:"0.6",x:4,y:49},{n:["red circle","large red circle"],u:"1f534",a:"0.6",x:30,y:45},{n:["large orange circle"],u:"1f7e0",a:"12.0",x:39,y:11},{n:["large yellow circle"],u:"1f7e1",a:"12.0",x:39,y:12},{n:["large green circle"],u:"1f7e2",a:"12.0",x:39,y:13},{n:["large blue circle"],u:"1f535",a:"0.6",x:30,y:46},{n:["large purple circle"],u:"1f7e3",a:"12.0",x:39,y:14},{n:["large brown circle"],u:"1f7e4",a:"12.0",x:39,y:15},{n:["black circle","medium black circle"],u:"26ab",a:"0.6",x:59,y:16},{n:["white circle","medium white circle"],u:"26aa",a:"0.6",x:59,y:15},{n:["large red square"],u:"1f7e5",a:"12.0",x:39,y:16},{n:["large orange square"],u:"1f7e7",a:"12.0",x:39,y:18},{n:["large yellow square"],u:"1f7e8",a:"12.0",x:39,y:19},{n:["large green square"],u:"1f7e9",a:"12.0",x:39,y:20},{n:["large blue square"],u:"1f7e6",a:"12.0",x:39,y:17},{n:["large purple square"],u:"1f7ea",a:"12.0",x:39,y:21},{n:["large brown square"],u:"1f7eb",a:"12.0",x:39,y:22},{n:["black large square"],u:"2b1b",a:"0.6",x:60,y:58},{n:["white large square"],u:"2b1c",a:"0.6",x:60,y:59},{n:["black medium square"],u:"25fc-fe0f",a:"0.6",x:58,y:13},{n:["white medium square"],u:"25fb-fe0f",a:"0.6",x:58,y:12},{n:["black medium small square"],u:"25fe",a:"0.6",x:58,y:15},{n:["white medium small square"],u:"25fd",a:"0.6",x:58,y:14},{n:["black small square"],u:"25aa-fe0f",a:"0.6",x:58,y:8},{n:["white small square"],u:"25ab-fe0f",a:"0.6",x:58,y:9},{n:["large orange diamond"],u:"1f536",a:"0.6",x:30,y:47},{n:["large blue diamond"],u:"1f537",a:"0.6",x:30,y:48},{n:["small orange diamond"],u:"1f538",a:"0.6",x:30,y:49},{n:["small blue diamond"],u:"1f539",a:"0.6",x:30,y:50},{n:["small red triangle","up-pointing red triangle"],u:"1f53a",a:"0.6",x:30,y:51},{n:["small red triangle down","down-pointing red triangle"],u:"1f53b",a:"0.6",x:30,y:52},{n:["diamond shape with a dot inside"],u:"1f4a0",a:"0.6",x:28,y:17},{n:["radio button"],u:"1f518",a:"0.6",x:30,y:17},{n:["white square button"],u:"1f533",a:"0.6",x:30,y:44},{n:["black square button"],u:"1f532",a:"0.6",x:30,y:43}],flags=[{n:["chequered flag","checkered flag"],u:"1f3c1",a:"0.6",x:8,y:2},{n:["triangular flag on post"],u:"1f6a9",a:"0.6",x:36,y:54},{n:["crossed flags"],u:"1f38c",a:"0.6",x:7,y:16},{n:["waving black flag"],u:"1f3f4",a:"1.0",x:10,y:46},{n:["white flag","waving white flag"],u:"1f3f3-fe0f",a:"0.7",x:10,y:41},{n:["rainbow flag","rainbow-flag"],u:"1f3f3-fe0f-200d-1f308",a:"4.0",x:10,y:39},{n:["transgender flag"],u:"1f3f3-fe0f-200d-26a7-fe0f",a:"13.0",x:10,y:40},{n:["pirate flag"],u:"1f3f4-200d-2620-fe0f",a:"11.0",x:10,y:42},{n:["flag-ac","ascension island flag"],u:"1f1e6-1f1e8",a:"2.0",x:0,y:31},{n:["flag-ad","andorra flag"],u:"1f1e6-1f1e9",a:"2.0",x:0,y:32},{n:["flag-ae","united arab emirates flag"],u:"1f1e6-1f1ea",a:"2.0",x:0,y:33},{n:["flag-af","afghanistan flag"],u:"1f1e6-1f1eb",a:"2.0",x:0,y:34},{n:["flag-ag","antigua & barbuda flag"],u:"1f1e6-1f1ec",a:"2.0",x:0,y:35},{n:["flag-ai","anguilla flag"],u:"1f1e6-1f1ee",a:"2.0",x:0,y:36},{n:["flag-al","albania flag"],u:"1f1e6-1f1f1",a:"2.0",x:0,y:37},{n:["flag-am","armenia flag"],u:"1f1e6-1f1f2",a:"2.0",x:0,y:38},{n:["flag-ao","angola flag"],u:"1f1e6-1f1f4",a:"2.0",x:0,y:39},{n:["flag-aq","antarctica flag"],u:"1f1e6-1f1f6",a:"2.0",x:0,y:40},{n:["flag-ar","argentina flag"],u:"1f1e6-1f1f7",a:"2.0",x:0,y:41},{n:["flag-as","american samoa flag"],u:"1f1e6-1f1f8",a:"2.0",x:0,y:42},{n:["flag-at","austria flag"],u:"1f1e6-1f1f9",a:"2.0",x:0,y:43},{n:["flag-au","australia flag"],u:"1f1e6-1f1fa",a:"2.0",x:0,y:44},{n:["flag-aw","aruba flag"],u:"1f1e6-1f1fc",a:"2.0",x:0,y:45},{n:["flag-ax","åland islands flag"],u:"1f1e6-1f1fd",a:"2.0",x:0,y:46},{n:["flag-az","azerbaijan flag"],u:"1f1e6-1f1ff",a:"2.0",x:0,y:47},{n:["flag-ba","bosnia & herzegovina flag"],u:"1f1e7-1f1e6",a:"2.0",x:0,y:48},{n:["flag-bb","barbados flag"],u:"1f1e7-1f1e7",a:"2.0",x:0,y:49},{n:["flag-bd","bangladesh flag"],u:"1f1e7-1f1e9",a:"2.0",x:0,y:50},{n:["flag-be","belgium flag"],u:"1f1e7-1f1ea",a:"2.0",x:0,y:51},{n:["flag-bf","burkina faso flag"],u:"1f1e7-1f1eb",a:"2.0",x:0,y:52},{n:["flag-bg","bulgaria flag"],u:"1f1e7-1f1ec",a:"2.0",x:0,y:53},{n:["flag-bh","bahrain flag"],u:"1f1e7-1f1ed",a:"2.0",x:0,y:54},{n:["flag-bi","burundi flag"],u:"1f1e7-1f1ee",a:"2.0",x:0,y:55},{n:["flag-bj","benin flag"],u:"1f1e7-1f1ef",a:"2.0",x:0,y:56},{n:["flag-bl","st. barthélemy flag"],u:"1f1e7-1f1f1",a:"2.0",x:0,y:57},{n:["flag-bm","bermuda flag"],u:"1f1e7-1f1f2",a:"2.0",x:0,y:58},{n:["flag-bn","brunei flag"],u:"1f1e7-1f1f3",a:"2.0",x:0,y:59},{n:["flag-bo","bolivia flag"],u:"1f1e7-1f1f4",a:"2.0",x:0,y:60},{n:["flag-bq","caribbean netherlands flag"],u:"1f1e7-1f1f6",a:"2.0",x:0,y:61},{n:["flag-br","brazil flag"],u:"1f1e7-1f1f7",a:"2.0",x:1,y:0},{n:["flag-bs","bahamas flag"],u:"1f1e7-1f1f8",a:"2.0",x:1,y:1},{n:["flag-bt","bhutan flag"],u:"1f1e7-1f1f9",a:"2.0",x:1,y:2},{n:["flag-bv","bouvet island flag"],u:"1f1e7-1f1fb",a:"2.0",x:1,y:3},{n:["flag-bw","botswana flag"],u:"1f1e7-1f1fc",a:"2.0",x:1,y:4},{n:["flag-by","belarus flag"],u:"1f1e7-1f1fe",a:"2.0",x:1,y:5},{n:["flag-bz","belize flag"],u:"1f1e7-1f1ff",a:"2.0",x:1,y:6},{n:["flag-ca","canada flag"],u:"1f1e8-1f1e6",a:"2.0",x:1,y:7},{n:["flag-cc","cocos (keeling) islands flag"],u:"1f1e8-1f1e8",a:"2.0",x:1,y:8},{n:["flag-cd","congo - kinshasa flag"],u:"1f1e8-1f1e9",a:"2.0",x:1,y:9},{n:["flag-cf","central african republic flag"],u:"1f1e8-1f1eb",a:"2.0",x:1,y:10},{n:["flag-cg","congo - brazzaville flag"],u:"1f1e8-1f1ec",a:"2.0",x:1,y:11},{n:["flag-ch","switzerland flag"],u:"1f1e8-1f1ed",a:"2.0",x:1,y:12},{n:["flag-ci","côte d’ivoire flag"],u:"1f1e8-1f1ee",a:"2.0",x:1,y:13},{n:["flag-ck","cook islands flag"],u:"1f1e8-1f1f0",a:"2.0",x:1,y:14},{n:["flag-cl","chile flag"],u:"1f1e8-1f1f1",a:"2.0",x:1,y:15},{n:["flag-cm","cameroon flag"],u:"1f1e8-1f1f2",a:"2.0",x:1,y:16},{n:["cn","flag-cn","china flag"],u:"1f1e8-1f1f3",a:"0.6",x:1,y:17},{n:["flag-co","colombia flag"],u:"1f1e8-1f1f4",a:"2.0",x:1,y:18},{n:["flag-cp","clipperton island flag"],u:"1f1e8-1f1f5",a:"2.0",x:1,y:19},{n:["sark flag","flag-sark"],u:"1f1e8-1f1f6",a:"16.0",x:1,y:20},{n:["flag-cr","costa rica flag"],u:"1f1e8-1f1f7",a:"2.0",x:1,y:21},{n:["flag-cu","cuba flag"],u:"1f1e8-1f1fa",a:"2.0",x:1,y:22},{n:["flag-cv","cape verde flag"],u:"1f1e8-1f1fb",a:"2.0",x:1,y:23},{n:["flag-cw","curaçao flag"],u:"1f1e8-1f1fc",a:"2.0",x:1,y:24},{n:["flag-cx","christmas island flag"],u:"1f1e8-1f1fd",a:"2.0",x:1,y:25},{n:["flag-cy","cyprus flag"],u:"1f1e8-1f1fe",a:"2.0",x:1,y:26},{n:["flag-cz","czechia flag"],u:"1f1e8-1f1ff",a:"2.0",x:1,y:27},{n:["de","flag-de","germany flag"],u:"1f1e9-1f1ea",a:"0.6",x:1,y:28},{n:["flag-dg","diego garcia flag"],u:"1f1e9-1f1ec",a:"2.0",x:1,y:29},{n:["flag-dj","djibouti flag"],u:"1f1e9-1f1ef",a:"2.0",x:1,y:30},{n:["flag-dk","denmark flag"],u:"1f1e9-1f1f0",a:"2.0",x:1,y:31},{n:["flag-dm","dominica flag"],u:"1f1e9-1f1f2",a:"2.0",x:1,y:32},{n:["flag-do","dominican republic flag"],u:"1f1e9-1f1f4",a:"2.0",x:1,y:33},{n:["flag-dz","algeria flag"],u:"1f1e9-1f1ff",a:"2.0",x:1,y:34},{n:["flag-ea","ceuta & melilla flag"],u:"1f1ea-1f1e6",a:"2.0",x:1,y:35},{n:["flag-ec","ecuador flag"],u:"1f1ea-1f1e8",a:"2.0",x:1,y:36},{n:["flag-ee","estonia flag"],u:"1f1ea-1f1ea",a:"2.0",x:1,y:37},{n:["flag-eg","egypt flag"],u:"1f1ea-1f1ec",a:"2.0",x:1,y:38},{n:["flag-eh","western sahara flag"],u:"1f1ea-1f1ed",a:"2.0",x:1,y:39},{n:["flag-er","eritrea flag"],u:"1f1ea-1f1f7",a:"2.0",x:1,y:40},{n:["es","flag-es","spain flag"],u:"1f1ea-1f1f8",a:"0.6",x:1,y:41},{n:["flag-et","ethiopia flag"],u:"1f1ea-1f1f9",a:"2.0",x:1,y:42},{n:["flag-eu","european union flag"],u:"1f1ea-1f1fa",a:"2.0",x:1,y:43},{n:["flag-fi","finland flag"],u:"1f1eb-1f1ee",a:"2.0",x:1,y:44},{n:["flag-fj","fiji flag"],u:"1f1eb-1f1ef",a:"2.0",x:1,y:45},{n:["flag-fk","falkland islands flag"],u:"1f1eb-1f1f0",a:"2.0",x:1,y:46},{n:["flag-fm","micronesia flag"],u:"1f1eb-1f1f2",a:"2.0",x:1,y:47},{n:["flag-fo","faroe islands flag"],u:"1f1eb-1f1f4",a:"2.0",x:1,y:48},{n:["fr","flag-fr","france flag"],u:"1f1eb-1f1f7",a:"0.6",x:1,y:49},{n:["flag-ga","gabon flag"],u:"1f1ec-1f1e6",a:"2.0",x:1,y:50},{n:["gb","uk","flag-gb","united kingdom flag"],u:"1f1ec-1f1e7",a:"0.6",x:1,y:51},{n:["flag-gd","grenada flag"],u:"1f1ec-1f1e9",a:"2.0",x:1,y:52},{n:["flag-ge","georgia flag"],u:"1f1ec-1f1ea",a:"2.0",x:1,y:53},{n:["flag-gf","french guiana flag"],u:"1f1ec-1f1eb",a:"2.0",x:1,y:54},{n:["flag-gg","guernsey flag"],u:"1f1ec-1f1ec",a:"2.0",x:1,y:55},{n:["flag-gh","ghana flag"],u:"1f1ec-1f1ed",a:"2.0",x:1,y:56},{n:["flag-gi","gibraltar flag"],u:"1f1ec-1f1ee",a:"2.0",x:1,y:57},{n:["flag-gl","greenland flag"],u:"1f1ec-1f1f1",a:"2.0",x:1,y:58},{n:["flag-gm","gambia flag"],u:"1f1ec-1f1f2",a:"2.0",x:1,y:59},{n:["flag-gn","guinea flag"],u:"1f1ec-1f1f3",a:"2.0",x:1,y:60},{n:["flag-gp","guadeloupe flag"],u:"1f1ec-1f1f5",a:"2.0",x:1,y:61},{n:["flag-gq","equatorial guinea flag"],u:"1f1ec-1f1f6",a:"2.0",x:2,y:0},{n:["flag-gr","greece flag"],u:"1f1ec-1f1f7",a:"2.0",x:2,y:1},{n:["flag-gs","south georgia & south sandwich islands flag"],u:"1f1ec-1f1f8",a:"2.0",x:2,y:2},{n:["flag-gt","guatemala flag"],u:"1f1ec-1f1f9",a:"2.0",x:2,y:3},{n:["flag-gu","guam flag"],u:"1f1ec-1f1fa",a:"2.0",x:2,y:4},{n:["flag-gw","guinea-bissau flag"],u:"1f1ec-1f1fc",a:"2.0",x:2,y:5},{n:["flag-gy","guyana flag"],u:"1f1ec-1f1fe",a:"2.0",x:2,y:6},{n:["flag-hk","hong kong sar china flag"],u:"1f1ed-1f1f0",a:"2.0",x:2,y:7},{n:["flag-hm","heard & mcdonald islands flag"],u:"1f1ed-1f1f2",a:"2.0",x:2,y:8},{n:["flag-hn","honduras flag"],u:"1f1ed-1f1f3",a:"2.0",x:2,y:9},{n:["flag-hr","croatia flag"],u:"1f1ed-1f1f7",a:"2.0",x:2,y:10},{n:["flag-ht","haiti flag"],u:"1f1ed-1f1f9",a:"2.0",x:2,y:11},{n:["flag-hu","hungary flag"],u:"1f1ed-1f1fa",a:"2.0",x:2,y:12},{n:["flag-ic","canary islands flag"],u:"1f1ee-1f1e8",a:"2.0",x:2,y:13},{n:["flag-id","indonesia flag"],u:"1f1ee-1f1e9",a:"2.0",x:2,y:14},{n:["flag-ie","ireland flag"],u:"1f1ee-1f1ea",a:"2.0",x:2,y:15},{n:["flag-il","israel flag"],u:"1f1ee-1f1f1",a:"2.0",x:2,y:16},{n:["flag-im","isle of man flag"],u:"1f1ee-1f1f2",a:"2.0",x:2,y:17},{n:["flag-in","india flag"],u:"1f1ee-1f1f3",a:"2.0",x:2,y:18},{n:["flag-io","british indian ocean territory flag"],u:"1f1ee-1f1f4",a:"2.0",x:2,y:19},{n:["flag-iq","iraq flag"],u:"1f1ee-1f1f6",a:"2.0",x:2,y:20},{n:["flag-ir","iran flag"],u:"1f1ee-1f1f7",a:"2.0",x:2,y:21},{n:["flag-is","iceland flag"],u:"1f1ee-1f1f8",a:"2.0",x:2,y:22},{n:["it","flag-it","italy flag"],u:"1f1ee-1f1f9",a:"0.6",x:2,y:23},{n:["flag-je","jersey flag"],u:"1f1ef-1f1ea",a:"2.0",x:2,y:24},{n:["flag-jm","jamaica flag"],u:"1f1ef-1f1f2",a:"2.0",x:2,y:25},{n:["flag-jo","jordan flag"],u:"1f1ef-1f1f4",a:"2.0",x:2,y:26},{n:["jp","flag-jp","japan flag"],u:"1f1ef-1f1f5",a:"0.6",x:2,y:27},{n:["flag-ke","kenya flag"],u:"1f1f0-1f1ea",a:"2.0",x:2,y:28},{n:["flag-kg","kyrgyzstan flag"],u:"1f1f0-1f1ec",a:"2.0",x:2,y:29},{n:["flag-kh","cambodia flag"],u:"1f1f0-1f1ed",a:"2.0",x:2,y:30},{n:["flag-ki","kiribati flag"],u:"1f1f0-1f1ee",a:"2.0",x:2,y:31},{n:["flag-km","comoros flag"],u:"1f1f0-1f1f2",a:"2.0",x:2,y:32},{n:["flag-kn","st. kitts & nevis flag"],u:"1f1f0-1f1f3",a:"2.0",x:2,y:33},{n:["flag-kp","north korea flag"],u:"1f1f0-1f1f5",a:"2.0",x:2,y:34},{n:["kr","flag-kr","south korea flag"],u:"1f1f0-1f1f7",a:"0.6",x:2,y:35},{n:["flag-kw","kuwait flag"],u:"1f1f0-1f1fc",a:"2.0",x:2,y:36},{n:["flag-ky","cayman islands flag"],u:"1f1f0-1f1fe",a:"2.0",x:2,y:37},{n:["flag-kz","kazakhstan flag"],u:"1f1f0-1f1ff",a:"2.0",x:2,y:38},{n:["flag-la","laos flag"],u:"1f1f1-1f1e6",a:"2.0",x:2,y:39},{n:["flag-lb","lebanon flag"],u:"1f1f1-1f1e7",a:"2.0",x:2,y:40},{n:["flag-lc","st. lucia flag"],u:"1f1f1-1f1e8",a:"2.0",x:2,y:41},{n:["flag-li","liechtenstein flag"],u:"1f1f1-1f1ee",a:"2.0",x:2,y:42},{n:["flag-lk","sri lanka flag"],u:"1f1f1-1f1f0",a:"2.0",x:2,y:43},{n:["flag-lr","liberia flag"],u:"1f1f1-1f1f7",a:"2.0",x:2,y:44},{n:["flag-ls","lesotho flag"],u:"1f1f1-1f1f8",a:"2.0",x:2,y:45},{n:["flag-lt","lithuania flag"],u:"1f1f1-1f1f9",a:"2.0",x:2,y:46},{n:["flag-lu","luxembourg flag"],u:"1f1f1-1f1fa",a:"2.0",x:2,y:47},{n:["flag-lv","latvia flag"],u:"1f1f1-1f1fb",a:"2.0",x:2,y:48},{n:["flag-ly","libya flag"],u:"1f1f1-1f1fe",a:"2.0",x:2,y:49},{n:["flag-ma","morocco flag"],u:"1f1f2-1f1e6",a:"2.0",x:2,y:50},{n:["flag-mc","monaco flag"],u:"1f1f2-1f1e8",a:"2.0",x:2,y:51},{n:["flag-md","moldova flag"],u:"1f1f2-1f1e9",a:"2.0",x:2,y:52},{n:["flag-me","montenegro flag"],u:"1f1f2-1f1ea",a:"2.0",x:2,y:53},{n:["flag-mf","st. martin flag"],u:"1f1f2-1f1eb",a:"2.0",x:2,y:54},{n:["flag-mg","madagascar flag"],u:"1f1f2-1f1ec",a:"2.0",x:2,y:55},{n:["flag-mh","marshall islands flag"],u:"1f1f2-1f1ed",a:"2.0",x:2,y:56},{n:["flag-mk","north macedonia flag"],u:"1f1f2-1f1f0",a:"2.0",x:2,y:57},{n:["flag-ml","mali flag"],u:"1f1f2-1f1f1",a:"2.0",x:2,y:58},{n:["flag-mm","myanmar (burma) flag"],u:"1f1f2-1f1f2",a:"2.0",x:2,y:59},{n:["flag-mn","mongolia flag"],u:"1f1f2-1f1f3",a:"2.0",x:2,y:60},{n:["flag-mo","macao sar china flag"],u:"1f1f2-1f1f4",a:"2.0",x:2,y:61},{n:["flag-mp","northern mariana islands flag"],u:"1f1f2-1f1f5",a:"2.0",x:3,y:0},{n:["flag-mq","martinique flag"],u:"1f1f2-1f1f6",a:"2.0",x:3,y:1},{n:["flag-mr","mauritania flag"],u:"1f1f2-1f1f7",a:"2.0",x:3,y:2},{n:["flag-ms","montserrat flag"],u:"1f1f2-1f1f8",a:"2.0",x:3,y:3},{n:["flag-mt","malta flag"],u:"1f1f2-1f1f9",a:"2.0",x:3,y:4},{n:["flag-mu","mauritius flag"],u:"1f1f2-1f1fa",a:"2.0",x:3,y:5},{n:["flag-mv","maldives flag"],u:"1f1f2-1f1fb",a:"2.0",x:3,y:6},{n:["flag-mw","malawi flag"],u:"1f1f2-1f1fc",a:"2.0",x:3,y:7},{n:["flag-mx","mexico flag"],u:"1f1f2-1f1fd",a:"2.0",x:3,y:8},{n:["flag-my","malaysia flag"],u:"1f1f2-1f1fe",a:"2.0",x:3,y:9},{n:["flag-mz","mozambique flag"],u:"1f1f2-1f1ff",a:"2.0",x:3,y:10},{n:["flag-na","namibia flag"],u:"1f1f3-1f1e6",a:"2.0",x:3,y:11},{n:["flag-nc","new caledonia flag"],u:"1f1f3-1f1e8",a:"2.0",x:3,y:12},{n:["flag-ne","niger flag"],u:"1f1f3-1f1ea",a:"2.0",x:3,y:13},{n:["flag-nf","norfolk island flag"],u:"1f1f3-1f1eb",a:"2.0",x:3,y:14},{n:["flag-ng","nigeria flag"],u:"1f1f3-1f1ec",a:"2.0",x:3,y:15},{n:["flag-ni","nicaragua flag"],u:"1f1f3-1f1ee",a:"2.0",x:3,y:16},{n:["flag-nl","netherlands flag"],u:"1f1f3-1f1f1",a:"2.0",x:3,y:17},{n:["flag-no","norway flag"],u:"1f1f3-1f1f4",a:"2.0",x:3,y:18},{n:["flag-np","nepal flag"],u:"1f1f3-1f1f5",a:"2.0",x:3,y:19},{n:["flag-nr","nauru flag"],u:"1f1f3-1f1f7",a:"2.0",x:3,y:20},{n:["flag-nu","niue flag"],u:"1f1f3-1f1fa",a:"2.0",x:3,y:21},{n:["flag-nz","new zealand flag"],u:"1f1f3-1f1ff",a:"2.0",x:3,y:22},{n:["flag-om","oman flag"],u:"1f1f4-1f1f2",a:"2.0",x:3,y:23},{n:["flag-pa","panama flag"],u:"1f1f5-1f1e6",a:"2.0",x:3,y:24},{n:["flag-pe","peru flag"],u:"1f1f5-1f1ea",a:"2.0",x:3,y:25},{n:["flag-pf","french polynesia flag"],u:"1f1f5-1f1eb",a:"2.0",x:3,y:26},{n:["flag-pg","papua new guinea flag"],u:"1f1f5-1f1ec",a:"2.0",x:3,y:27},{n:["flag-ph","philippines flag"],u:"1f1f5-1f1ed",a:"2.0",x:3,y:28},{n:["flag-pk","pakistan flag"],u:"1f1f5-1f1f0",a:"2.0",x:3,y:29},{n:["flag-pl","poland flag"],u:"1f1f5-1f1f1",a:"2.0",x:3,y:30},{n:["flag-pm","st. pierre & miquelon flag"],u:"1f1f5-1f1f2",a:"2.0",x:3,y:31},{n:["flag-pn","pitcairn islands flag"],u:"1f1f5-1f1f3",a:"2.0",x:3,y:32},{n:["flag-pr","puerto rico flag"],u:"1f1f5-1f1f7",a:"2.0",x:3,y:33},{n:["flag-ps","palestinian territories flag"],u:"1f1f5-1f1f8",a:"2.0",x:3,y:34},{n:["flag-pt","portugal flag"],u:"1f1f5-1f1f9",a:"2.0",x:3,y:35},{n:["flag-pw","palau flag"],u:"1f1f5-1f1fc",a:"2.0",x:3,y:36},{n:["flag-py","paraguay flag"],u:"1f1f5-1f1fe",a:"2.0",x:3,y:37},{n:["flag-qa","qatar flag"],u:"1f1f6-1f1e6",a:"2.0",x:3,y:38},{n:["flag-re","réunion flag"],u:"1f1f7-1f1ea",a:"2.0",x:3,y:39},{n:["flag-ro","romania flag"],u:"1f1f7-1f1f4",a:"2.0",x:3,y:40},{n:["flag-rs","serbia flag"],u:"1f1f7-1f1f8",a:"2.0",x:3,y:41},{n:["ru","flag-ru","russia flag"],u:"1f1f7-1f1fa",a:"0.6",x:3,y:42},{n:["flag-rw","rwanda flag"],u:"1f1f7-1f1fc",a:"2.0",x:3,y:43},{n:["flag-sa","saudi arabia flag"],u:"1f1f8-1f1e6",a:"2.0",x:3,y:44},{n:["flag-sb","solomon islands flag"],u:"1f1f8-1f1e7",a:"2.0",x:3,y:45},{n:["flag-sc","seychelles flag"],u:"1f1f8-1f1e8",a:"2.0",x:3,y:46},{n:["flag-sd","sudan flag"],u:"1f1f8-1f1e9",a:"2.0",x:3,y:47},{n:["flag-se","sweden flag"],u:"1f1f8-1f1ea",a:"2.0",x:3,y:48},{n:["flag-sg","singapore flag"],u:"1f1f8-1f1ec",a:"2.0",x:3,y:49},{n:["flag-sh","st. helena flag"],u:"1f1f8-1f1ed",a:"2.0",x:3,y:50},{n:["flag-si","slovenia flag"],u:"1f1f8-1f1ee",a:"2.0",x:3,y:51},{n:["flag-sj","svalbard & jan mayen flag"],u:"1f1f8-1f1ef",a:"2.0",x:3,y:52},{n:["flag-sk","slovakia flag"],u:"1f1f8-1f1f0",a:"2.0",x:3,y:53},{n:["flag-sl","sierra leone flag"],u:"1f1f8-1f1f1",a:"2.0",x:3,y:54},{n:["flag-sm","san marino flag"],u:"1f1f8-1f1f2",a:"2.0",x:3,y:55},{n:["flag-sn","senegal flag"],u:"1f1f8-1f1f3",a:"2.0",x:3,y:56},{n:["flag-so","somalia flag"],u:"1f1f8-1f1f4",a:"2.0",x:3,y:57},{n:["flag-sr","suriname flag"],u:"1f1f8-1f1f7",a:"2.0",x:3,y:58},{n:["flag-ss","south sudan flag"],u:"1f1f8-1f1f8",a:"2.0",x:3,y:59},{n:["flag-st","são tomé & príncipe flag"],u:"1f1f8-1f1f9",a:"2.0",x:3,y:60},{n:["flag-sv","el salvador flag"],u:"1f1f8-1f1fb",a:"2.0",x:3,y:61},{n:["flag-sx","sint maarten flag"],u:"1f1f8-1f1fd",a:"2.0",x:4,y:0},{n:["flag-sy","syria flag"],u:"1f1f8-1f1fe",a:"2.0",x:4,y:1},{n:["flag-sz","eswatini flag"],u:"1f1f8-1f1ff",a:"2.0",x:4,y:2},{n:["flag-ta","tristan da cunha flag"],u:"1f1f9-1f1e6",a:"2.0",x:4,y:3},{n:["flag-tc","turks & caicos islands flag"],u:"1f1f9-1f1e8",a:"2.0",x:4,y:4},{n:["flag-td","chad flag"],u:"1f1f9-1f1e9",a:"2.0",x:4,y:5},{n:["flag-tf","french southern territories flag"],u:"1f1f9-1f1eb",a:"2.0",x:4,y:6},{n:["flag-tg","togo flag"],u:"1f1f9-1f1ec",a:"2.0",x:4,y:7},{n:["flag-th","thailand flag"],u:"1f1f9-1f1ed",a:"2.0",x:4,y:8},{n:["flag-tj","tajikistan flag"],u:"1f1f9-1f1ef",a:"2.0",x:4,y:9},{n:["flag-tk","tokelau flag"],u:"1f1f9-1f1f0",a:"2.0",x:4,y:10},{n:["flag-tl","timor-leste flag"],u:"1f1f9-1f1f1",a:"2.0",x:4,y:11},{n:["flag-tm","turkmenistan flag"],u:"1f1f9-1f1f2",a:"2.0",x:4,y:12},{n:["flag-tn","tunisia flag"],u:"1f1f9-1f1f3",a:"2.0",x:4,y:13},{n:["flag-to","tonga flag"],u:"1f1f9-1f1f4",a:"2.0",x:4,y:14},{n:["flag-tr","türkiye flag"],u:"1f1f9-1f1f7",a:"2.0",x:4,y:15},{n:["flag-tt","trinidad & tobago flag"],u:"1f1f9-1f1f9",a:"2.0",x:4,y:16},{n:["flag-tv","tuvalu flag"],u:"1f1f9-1f1fb",a:"2.0",x:4,y:17},{n:["flag-tw","taiwan flag"],u:"1f1f9-1f1fc",a:"2.0",x:4,y:18},{n:["flag-tz","tanzania flag"],u:"1f1f9-1f1ff",a:"2.0",x:4,y:19},{n:["flag-ua","ukraine flag"],u:"1f1fa-1f1e6",a:"2.0",x:4,y:20},{n:["flag-ug","uganda flag"],u:"1f1fa-1f1ec",a:"2.0",x:4,y:21},{n:["flag-um","u.s. outlying islands flag"],u:"1f1fa-1f1f2",a:"2.0",x:4,y:22},{n:["flag-un","united nations flag"],u:"1f1fa-1f1f3",a:"4.0",x:4,y:23},{n:["us","flag-us","united states flag"],u:"1f1fa-1f1f8",a:"0.6",x:4,y:24},{n:["flag-uy","uruguay flag"],u:"1f1fa-1f1fe",a:"2.0",x:4,y:25},{n:["flag-uz","uzbekistan flag"],u:"1f1fa-1f1ff",a:"2.0",x:4,y:26},{n:["flag-va","vatican city flag"],u:"1f1fb-1f1e6",a:"2.0",x:4,y:27},{n:["flag-vc","st. vincent & grenadines flag"],u:"1f1fb-1f1e8",a:"2.0",x:4,y:28},{n:["flag-ve","venezuela flag"],u:"1f1fb-1f1ea",a:"2.0",x:4,y:29},{n:["flag-vg","british virgin islands flag"],u:"1f1fb-1f1ec",a:"2.0",x:4,y:30},{n:["flag-vi","u.s. virgin islands flag"],u:"1f1fb-1f1ee",a:"2.0",x:4,y:31},{n:["flag-vn","vietnam flag"],u:"1f1fb-1f1f3",a:"2.0",x:4,y:32},{n:["flag-vu","vanuatu flag"],u:"1f1fb-1f1fa",a:"2.0",x:4,y:33},{n:["flag-wf","wallis & futuna flag"],u:"1f1fc-1f1eb",a:"2.0",x:4,y:34},{n:["flag-ws","samoa flag"],u:"1f1fc-1f1f8",a:"2.0",x:4,y:35},{n:["flag-xk","kosovo flag"],u:"1f1fd-1f1f0",a:"2.0",x:4,y:36},{n:["flag-ye","yemen flag"],u:"1f1fe-1f1ea",a:"2.0",x:4,y:37},{n:["flag-yt","mayotte flag"],u:"1f1fe-1f1f9",a:"2.0",x:4,y:38},{n:["flag-za","south africa flag"],u:"1f1ff-1f1e6",a:"2.0",x:4,y:39},{n:["flag-zm","zambia flag"],u:"1f1ff-1f1f2",a:"2.0",x:4,y:40},{n:["flag-zw","zimbabwe flag"],u:"1f1ff-1f1fc",a:"2.0",x:4,y:41},{n:["england flag","flag-england"],u:"1f3f4-e0067-e0062-e0065-e006e-e0067-e007f",a:"5.0",x:10,y:43},{n:["scotland flag","flag-scotland"],u:"1f3f4-e0067-e0062-e0073-e0063-e0074-e007f",a:"5.0",x:10,y:44},{n:["wales flag","flag-wales"],u:"1f3f4-e0067-e0062-e0077-e006c-e0073-e007f",a:"5.0",x:10,y:45}],emojis={custom,smileys_people,animals_nature,food_drink,travel_places,activities,objects,symbols,flags},skinToneVariations=[SkinTones.NEUTRAL,SkinTones.LIGHT,SkinTones.MEDIUM_LIGHT,SkinTones.MEDIUM,SkinTones.MEDIUM_DARK,SkinTones.DARK],skinTonesNamed=Object.entries(SkinTones).reduce(function($,_e){var et=_e[0],tt=_e[1];return $[tt]=et,$},{}),skinTonesMapped=skinToneVariations.reduce(function($,_e){var et;return Object.assign($,(et={},et[_e]=_e,et))},{}),EmojiProperties;(function($){$.name="n",$.unified="u",$.variations="v",$.added_in="a",$.imgUrl="imgUrl",$.sheetX="x",$.sheetY="y"})(EmojiProperties||(EmojiProperties={}));var alphaNumericEmojiIndex={};setTimeout(function(){allEmojis.reduce(function($,_e){return indexEmoji(_e),$},alphaNumericEmojiIndex)});function indexEmoji($){var _e=emojiNames($).flat().join("").toLowerCase().replace(/[^a-zA-Z\d]/g,"").split("");_e.forEach(function(et){var tt;alphaNumericEmojiIndex[et]=(tt=alphaNumericEmojiIndex[et])!=null?tt:{},alphaNumericEmojiIndex[et][emojiUnified($)]=$})}function emojiNames($){var _e;return(_e=$[EmojiProperties.name])!=null?_e:[]}function addedIn($){return parseFloat($[EmojiProperties.added_in])}function sheetX($){return $[EmojiProperties.sheetX]}function sheetY($){return $[EmojiProperties.sheetY]}function emojiName($){return $?emojiNames($)[0]:""}function unifiedWithoutSkinTone($){var _e=$.split("-"),et=_e.splice(1,1),tt=et[0];return skinTonesMapped[tt]?_e.join("-"):$}function emojiUnified($,_e){var et,tt=$[EmojiProperties.unified];return!_e||!emojiHasVariations($)?tt:(et=emojiVariationUnified($,_e))!=null?et:tt}function emojisByCategory($){var _e;return(_e=emojis==null?void 0:emojis[$])!=null?_e:[]}function emojiUrlByUnified($,_e){return""+cdnUrl(_e)+$+".png"}function emojiVariations($){var _e;return(_e=$[EmojiProperties.variations])!=null?_e:[]}function emojiHasVariations($){return emojiVariations($).length>0}function emojiVariationUnified($,_e){return _e?emojiVariations($).find(function(et){return et.includes(_e)}):emojiUnified($)}function emojiByUnified($){if($){if(allEmojisByUnified[$])return allEmojisByUnified[$];var _e=unifiedWithoutSkinTone($);return allEmojisByUnified[_e]}}var allEmojis=Object.values(emojis).flat();function setCustomEmojis($){emojis[Categories.CUSTOM].length=0,$.forEach(function(_e){var et=customToRegularEmoji(_e);emojis[Categories.CUSTOM].push(et),!allEmojisByUnified[et[EmojiProperties.unified]]&&(allEmojis.push(et),allEmojisByUnified[et[EmojiProperties.unified]]=et,indexEmoji(et))})}function customToRegularEmoji($){var _e;return _e={},_e[EmojiProperties.name]=$.names.map(function(et){return et.toLowerCase()}),_e[EmojiProperties.unified]=$.id.toLowerCase(),_e[EmojiProperties.added_in]="0",_e[EmojiProperties.imgUrl]=$.imgUrl,_e[EmojiProperties.sheetX]=0,_e[EmojiProperties.sheetY]=0,_e}var allEmojisByUnified={};setTimeout(function(){allEmojis.reduce(function($,_e){return $[emojiUnified(_e)]=_e,emojiHasVariations(_e)&&emojiVariations(_e).forEach(function(et){$[et]=_e}),$},allEmojisByUnified)});function activeVariationFromUnified($){var _e=$.split("-"),et=_e[1];return skinToneVariations.includes(et)?et:null}var KNOWN_FAILING_EMOJIS=["2640-fe0f","2642-fe0f","2695-fe0f"],DEFAULT_SEARCH_PLACEHOLDER="Search",SEARCH_RESULTS_NO_RESULTS_FOUND="No results found",SEARCH_RESULTS_SUFFIX=" found. Use up and down arrow keys to navigate.",SEARCH_RESULTS_ONE_RESULT_FOUND="1 result"+SEARCH_RESULTS_SUFFIX,SEARCH_RESULTS_MULTIPLE_RESULTS_FOUND="%n results"+SEARCH_RESULTS_SUFFIX;function mergeConfig($){var _e,et;$===void 0&&($={});var tt=basePickerConfig(),rt=Object.assign(tt.previewConfig,(_e=$.previewConfig)!=null?_e:{}),nt=Object.assign(tt,$),at=mergeCategoriesConfig($.categories,{suggestionMode:nt.suggestedEmojisMode});nt.hiddenEmojis.forEach(function(it){nt.unicodeToHide.add(it)}),setCustomEmojis((et=nt.customEmojis)!=null?et:[]);var ot=nt.searchDisabled?SkinTonePickerLocation.PREVIEW:nt.skinTonePickerLocation;return _extends({},nt,{categories:at,previewConfig:rt,skinTonePickerLocation:ot})}function basePickerConfig(){return{autoFocusSearch:!0,categories:baseCategoriesConfig(),className:"",customEmojis:[],defaultSkinTone:SkinTones.NEUTRAL,emojiStyle:EmojiStyle.APPLE,emojiVersion:null,getEmojiUrl:emojiUrlByUnified,height:450,lazyLoadEmojis:!1,previewConfig:_extends({},basePreviewConfig),searchDisabled:!1,searchPlaceHolder:DEFAULT_SEARCH_PLACEHOLDER,searchPlaceholder:DEFAULT_SEARCH_PLACEHOLDER,skinTonePickerLocation:SkinTonePickerLocation.SEARCH,skinTonesDisabled:!1,style:{},suggestedEmojisMode:SuggestionMode.FREQUENT,theme:Theme.LIGHT,unicodeToHide:new Set(KNOWN_FAILING_EMOJIS),width:350,reactionsDefaultOpen:!1,reactions:DEFAULT_REACTIONS,open:!0,allowExpandReactions:!0,hiddenEmojis:[]}}var basePreviewConfig={defaultEmoji:"1f60a",defaultCaption:"What's your mood?",showPreview:!0},_excluded=["children"],ConfigContext=reactExports.createContext(basePickerConfig());function PickerConfigProvider($){var _e=$.children,et=_objectWithoutPropertiesLoose($,_excluded),tt=useSetConfig(et);return reactExports.createElement(ConfigContext.Provider,{value:tt},_e)}function useSetConfig($){var _e,et=reactExports.useState(function(){return mergeConfig($)}),tt=et[0],rt=et[1];return reactExports.useEffect(function(){compareConfig(tt,$)||rt(mergeConfig($))},[(_e=$.customEmojis)==null?void 0:_e.length,$.open,$.emojiVersion,$.reactionsDefaultOpen,$.searchPlaceHolder,$.searchPlaceholder,$.defaultSkinTone,$.skinTonesDisabled,$.autoFocusSearch,$.emojiStyle,$.theme,$.suggestedEmojisMode,$.lazyLoadEmojis,$.className,$.height,$.width,$.searchDisabled,$.skinTonePickerLocation,$.allowExpandReactions]),tt}function usePickerConfig(){return reactExports.useContext(ConfigContext)}var MutableConfigContext=React$2.createContext({});function useMutableConfig(){var $=React$2.useContext(MutableConfigContext);return $}function useDefineMutableConfig($){var _e=React$2.useRef({onEmojiClick:$.onEmojiClick||emptyFunc,onReactionClick:$.onReactionClick||$.onEmojiClick,onSkinToneChange:$.onSkinToneChange||emptyFunc});return React$2.useEffect(function(){_e.current.onEmojiClick=$.onEmojiClick||emptyFunc,_e.current.onReactionClick=$.onReactionClick||$.onEmojiClick},[$.onEmojiClick,$.onReactionClick]),React$2.useEffect(function(){_e.current.onSkinToneChange=$.onSkinToneChange||emptyFunc},[$.onSkinToneChange]),_e}function emptyFunc(){}var MOUSE_EVENT_SOURCE;(function($){$.REACTIONS="reactions",$.PICKER="picker"})(MOUSE_EVENT_SOURCE||(MOUSE_EVENT_SOURCE={}));function useSearchPlaceHolderConfig(){var $,_e=usePickerConfig(),et=_e.searchPlaceHolder,tt=_e.searchPlaceholder;return($=[et,tt].find(function(rt){return rt!==DEFAULT_SEARCH_PLACEHOLDER}))!=null?$:DEFAULT_SEARCH_PLACEHOLDER}function useDefaultSkinToneConfig(){var $=usePickerConfig(),_e=$.defaultSkinTone;return _e}function useAllowExpandReactions(){var $=usePickerConfig(),_e=$.allowExpandReactions;return _e}function useSkinTonesDisabledConfig(){var $=usePickerConfig(),_e=$.skinTonesDisabled;return _e}function useEmojiStyleConfig(){var $=usePickerConfig(),_e=$.emojiStyle;return _e}function useAutoFocusSearchConfig(){var $=usePickerConfig(),_e=$.autoFocusSearch;return _e}function useCategoriesConfig(){var $=usePickerConfig(),_e=$.categories;return _e}function useCustomEmojisConfig(){var $=usePickerConfig(),_e=$.customEmojis;return _e}function useOpenConfig(){var $=usePickerConfig(),_e=$.open;return _e}function useOnEmojiClickConfig($){var _e,et=useMutableConfig(),tt=et.current,rt=(_e=$===MOUSE_EVENT_SOURCE.REACTIONS?tt.onReactionClick:tt.onEmojiClick)!=null?_e:tt.onEmojiClick;return rt||function(){}}function useOnSkinToneChangeConfig(){var $=useMutableConfig(),_e=$.current;return _e.onSkinToneChange||function(){}}function usePreviewConfig(){var $=usePickerConfig(),_e=$.previewConfig;return _e}function useThemeConfig(){var $=usePickerConfig(),_e=$.theme;return _e}function useSuggestedEmojisModeConfig(){var $=usePickerConfig(),_e=$.suggestedEmojisMode;return _e}function useLazyLoadEmojisConfig(){var $=usePickerConfig(),_e=$.lazyLoadEmojis;return _e}function useClassNameConfig(){var $=usePickerConfig(),_e=$.className;return _e}function useStyleConfig(){var $=usePickerConfig(),_e=$.height,et=$.width,tt=$.style;return _extends({height:getDimension(_e),width:getDimension(et)},tt)}function useReactionsOpenConfig(){var $=usePickerConfig(),_e=$.reactionsDefaultOpen;return _e}function useEmojiVersionConfig(){var $=usePickerConfig(),_e=$.emojiVersion;return _e}function useSearchDisabledConfig(){var $=usePickerConfig(),_e=$.searchDisabled;return _e}function useSkinTonePickerLocationConfig(){var $=usePickerConfig(),_e=$.skinTonePickerLocation;return _e}function useUnicodeToHide(){var $=usePickerConfig(),_e=$.unicodeToHide;return _e}function useReactionsConfig(){var $=usePickerConfig(),_e=$.reactions;return _e}function useGetEmojiUrlConfig(){var $=usePickerConfig(),_e=$.getEmojiUrl;return _e}function getDimension($){return typeof $=="number"?$+"px":$}function useSearchResultsConfig($){var _e=$>0,et=$>1;return _e?et?SEARCH_RESULTS_MULTIPLE_RESULTS_FOUND.replace("%n",$.toString()):SEARCH_RESULTS_ONE_RESULT_FOUND:SEARCH_RESULTS_NO_RESULTS_FOUND}function useDebouncedState($,_e){_e===void 0&&(_e=0);var et=reactExports.useState($),tt=et[0],rt=et[1],nt=reactExports.useRef(null);function at(ot){return new Promise(function(it){var ft;nt.current&&clearTimeout(nt.current),nt.current=(ft=window)==null?void 0:ft.setTimeout(function(){rt(ot),it(ot)},_e)})}return[tt,at]}function useIsUnicodeHidden(){var $=useUnicodeToHide();return function(_e){return $.has(_e)}}function useDisallowedEmojis(){var $=reactExports.useRef({}),_e=useEmojiVersionConfig();return reactExports.useMemo(function(){var et=parseFloat(""+_e);return!_e||Number.isNaN(et)?$.current:allEmojis.reduce(function(tt,rt){return addedInNewerVersion(rt,et)&&(tt[emojiUnified(rt)]=!0),tt},$.current)},[_e])}function useIsEmojiDisallowed(){var $=useDisallowedEmojis(),_e=useIsUnicodeHidden();return function(tt){var rt=unifiedWithoutSkinTone(emojiUnified(tt));return!!($[rt]||_e(rt))}}function addedInNewerVersion($,_e){return addedIn($)>_e}function useMarkInitialLoad($){reactExports.useEffect(function(){$(!0)},[$])}function PickerContextProvider($){var _e=$.children,et=useDisallowedEmojis(),tt=useDefaultSkinToneConfig(),rt=useReactionsOpenConfig(),nt=reactExports.useRef(alphaNumericEmojiIndex),at=reactExports.useRef(!1),ot=reactExports.useRef(!1),it=reactExports.useRef(et),ft=useDebouncedState(Date.now(),200),st=useDebouncedState("",100),lt=reactExports.useState(!1),ut=reactExports.useState(tt),ct=reactExports.useState(null),gt=reactExports.useState(new Set),mt=reactExports.useState(null),ht=reactExports.useState(rt),pt=reactExports.useState(!1),dt=pt[0],yt=pt[1];return useMarkInitialLoad(yt),reactExports.createElement(PickerContext.Provider,{value:{activeCategoryState:ct,activeSkinTone:ut,disallowClickRef:at,disallowMouseRef:ot,disallowedEmojisRef:it,emojiVariationPickerState:mt,emojisThatFailedToLoadState:gt,filterRef:nt,isPastInitialLoad:dt,searchTerm:st,skinToneFanOpenState:lt,suggestedUpdateState:ft,reactionsModeState:ht}},_e)}var PickerContext=reactExports.createContext({activeCategoryState:[null,function(){}],activeSkinTone:[SkinTones.NEUTRAL,function(){}],disallowClickRef:{current:!1},disallowMouseRef:{current:!1},disallowedEmojisRef:{current:{}},emojiVariationPickerState:[null,function(){}],emojisThatFailedToLoadState:[new Set,function(){}],filterRef:{current:{}},isPastInitialLoad:!0,searchTerm:["",function(){return new Promise(function(){})}],skinToneFanOpenState:[!1,function(){}],suggestedUpdateState:[Date.now(),function(){}],reactionsModeState:[!1,function(){}]});function useFilterRef(){var $=reactExports.useContext(PickerContext),_e=$.filterRef;return _e}function useDisallowClickRef(){var $=reactExports.useContext(PickerContext),_e=$.disallowClickRef;return _e}function useDisallowMouseRef(){var $=reactExports.useContext(PickerContext),_e=$.disallowMouseRef;return _e}function useReactionsModeState(){var $=reactExports.useContext(PickerContext),_e=$.reactionsModeState;return _e}function useSearchTermState(){var $=reactExports.useContext(PickerContext),_e=$.searchTerm;return _e}function useActiveSkinToneState(){var $=reactExports.useContext(PickerContext),_e=$.activeSkinTone;return _e}function useEmojisThatFailedToLoadState(){var $=reactExports.useContext(PickerContext),_e=$.emojisThatFailedToLoadState;return _e}function useIsPastInitialLoad(){var $=reactExports.useContext(PickerContext),_e=$.isPastInitialLoad;return _e}function useEmojiVariationPickerState(){var $=reactExports.useContext(PickerContext),_e=$.emojiVariationPickerState;return _e}function useSkinToneFanOpenState(){var $=reactExports.useContext(PickerContext),_e=$.skinToneFanOpenState;return _e}function useUpdateSuggested(){var $=reactExports.useContext(PickerContext),_e=$.suggestedUpdateState,et=_e[0],tt=_e[1];return[et,function(){tt(Date.now())}]}function useIsSearchMode(){var $=useSearchTermState(),_e=$[0];return!!_e}function focusElement($){$&&requestAnimationFrame(function(){$.focus()})}function focusPrevElementSibling($){if($){var _e=$.previousElementSibling;focusElement(_e)}}function focusNextElementSibling($){if($){var _e=$.nextElementSibling;focusElement(_e)}}function focusFirstElementChild($){if($){var _e=$.firstElementChild;focusElement(_e)}}function getActiveElement(){return document.activeElement}function ElementRefContextProvider($){var _e=$.children,et=reactExports.useRef(null),tt=reactExports.useRef(null),rt=reactExports.useRef(null),nt=reactExports.useRef(null),at=reactExports.useRef(null),ot=reactExports.useRef(null),it=reactExports.useRef(null),ft=reactExports.useRef(null);return reactExports.createElement(ElementRefContext.Provider,{value:{AnchoredEmojiRef:tt,BodyRef:rt,CategoryNavigationRef:ot,PickerMainRef:et,SearchInputRef:nt,SkinTonePickerRef:at,VariationPickerRef:it,ReactionsRef:ft}},_e)}var ElementRefContext=reactExports.createContext({AnchoredEmojiRef:reactExports.createRef(),BodyRef:reactExports.createRef(),CategoryNavigationRef:reactExports.createRef(),PickerMainRef:reactExports.createRef(),SearchInputRef:reactExports.createRef(),SkinTonePickerRef:reactExports.createRef(),VariationPickerRef:reactExports.createRef(),ReactionsRef:reactExports.createRef()});function useElementRef(){return reactExports.useContext(ElementRefContext)}function usePickerMainRef(){return useElementRef().PickerMainRef}function useAnchoredEmojiRef(){return useElementRef().AnchoredEmojiRef}function useSetAnchoredEmojiRef(){var $=useAnchoredEmojiRef();return function(_e){_e===null&&$.current!==null&&focusElement($.current),$.current=_e}}function useBodyRef(){return useElementRef().BodyRef}function useReactionsRef(){return useElementRef().ReactionsRef}function useSearchInputRef(){return useElementRef().SearchInputRef}function useSkinTonePickerRef(){return useElementRef().SkinTonePickerRef}function useCategoryNavigationRef(){return useElementRef().CategoryNavigationRef}function useVariationPickerRef(){return useElementRef().VariationPickerRef}function scrollTo($,_e){_e===void 0&&(_e=0);var et=queryScrollBody($);et&&requestAnimationFrame(function(){et.scrollTop=_e})}function scrollBy($,_e){var et=queryScrollBody($);et&&requestAnimationFrame(function(){et.scrollTop=et.scrollTop+_e})}function useScrollTo(){var $=useBodyRef();return reactExports.useCallback(function(_e){requestAnimationFrame(function(){$.current&&($.current.scrollTop=_e)})},[$])}function scrollEmojiAboveLabel($){if(!(!$||!isEmojiBehindLabel($))&&!$.closest(asSelectors(ClassNames.variationPicker))){var _e=closestScrollBody($),et=emojiDistanceFromScrollTop($);scrollBy(_e,-(categoryLabelHeight(closestCategory($))-et))}}function focusFirstVisibleEmoji($){var _e=firstVisibleEmoji($);focusElement(_e),scrollEmojiAboveLabel(_e)}function focusAndClickFirstVisibleEmoji($){var _e=firstVisibleEmoji($);focusElement(_e),_e==null||_e.click()}function focusLastVisibleEmoji($){focusElement(lastVisibleEmoji($))}function focusNextVisibleEmoji($){if($){var _e=nextVisibleEmoji($);if(!_e)return focusFirstVisibleEmoji(nextCategory($));focusElement(_e),scrollEmojiAboveLabel(_e)}}function focusPrevVisibleEmoji($){if($){var _e=prevVisibleEmoji($);if(!_e)return focusLastVisibleEmoji(prevCategory($));focusElement(_e),scrollEmojiAboveLabel(_e)}}function focusVisibleEmojiOneRowUp($,_e){if($){var et=visibleEmojiOneRowUp($);if(!et)return _e();focusElement(et),scrollEmojiAboveLabel(et)}}function focusVisibleEmojiOneRowDown($){if($){var _e=visibleEmojiOneRowDown($);return focusElement(_e)}}function visibleEmojiOneRowUp($){if(!$)return null;var _e=closestCategoryContent($),et=closestCategory(_e),tt=elementIndexInRow(_e,$),rt=rowNumber(_e,$),nt=elementCountInRow(_e,$);if(rt===0){var at=prevCategory(et);return at?getElementInRow(allVisibleEmojis(at),-1,nt,tt):null}return getElementInPrevRow(allVisibleEmojis(_e),rt,nt,tt)}function visibleEmojiOneRowDown($){if(!$)return null;var _e=closestCategoryContent($),et=closestCategory(_e),tt=elementIndexInRow(_e,$),rt=rowNumber(_e,$),nt=elementCountInRow(_e,$);if(!hasNextRow(_e,$)){var at=nextCategory(et);return at?getElementInRow(allVisibleEmojis(at),0,nt,tt):null}var ot=getElementInNextRow(allVisibleEmojis(_e),rt,nt,tt);return ot}function useCloseAllOpenToggles(){var $=useEmojiVariationPickerState(),_e=$[0],et=$[1],tt=useSkinToneFanOpenState(),rt=tt[0],nt=tt[1],at=reactExports.useCallback(function(){_e&&et(null),rt&&nt(!1)},[_e,rt,et,nt]);return at}function useHasOpenToggles(){var $=useEmojiVariationPickerState(),_e=$[0],et=useSkinToneFanOpenState(),tt=et[0];return function(){return!!_e||tt}}function useDisallowMouseMove(){var $=useDisallowMouseRef();return function(){$.current=!0}}function useAllowMouseMove(){var $=useDisallowMouseRef();return function(){$.current=!1}}function useIsMouseDisallowed(){var $=useDisallowMouseRef();return function(){return $.current}}function useOnMouseMove(){var $=useBodyRef(),_e=useAllowMouseMove(),et=useIsMouseDisallowed();reactExports.useEffect(function(){var tt=$.current;tt==null||tt.addEventListener("mousemove",rt,{passive:!0});function rt(){et()&&_e()}return function(){tt==null||tt.removeEventListener("mousemove",rt)}},[$,_e,et])}function useFocusSearchInput(){var $=useSearchInputRef();return reactExports.useCallback(function(){focusElement($.current)},[$])}function useFocusSkinTonePicker(){var $=useSkinTonePickerRef();return reactExports.useCallback(function(){$.current&&focusFirstElementChild($.current)},[$])}function useFocusCategoryNavigation(){var $=useCategoryNavigationRef();return reactExports.useCallback(function(){$.current&&focusFirstElementChild($.current)},[$])}function useSetFilterRef(){var $=useFilterRef();return function _e(et){if(typeof et=="function")return _e(et($.current));$.current=et}}function useClearSearch(){var $=useApplySearch(),_e=useSearchInputRef(),et=useFocusSearchInput();return function(){_e.current&&(_e.current.value=""),$(""),et()}}function useAppendSearch(){var $=useSearchInputRef(),_e=useApplySearch();return function(tt){$.current?($.current.value=""+$.current.value+tt,_e(getNormalizedSearchTerm($.current.value))):_e(getNormalizedSearchTerm(tt))}}function useFilter(){var $=useSearchInputRef(),_e=useFilterRef(),et=useSetFilterRef(),tt=useApplySearch(),rt=useSearchTermState(),nt=rt[0],at=getStatusSearchResults(_e.current,nt);return{onChange:ot,searchTerm:nt,SearchInputRef:$,statusSearchResults:at};function ot(it){var ft=_e.current,st=it.toLowerCase();if(ft!=null&&ft[st]||st.length<=1)return tt(st);var lt=findLongestMatch(st,ft);if(!lt)return tt(st);et(function(ut){var ct;return Object.assign(ut,(ct={},ct[st]=filterEmojiObjectByKeyword(lt,st),ct))}),tt(st)}}function useApplySearch(){var $=useSearchTermState(),_e=$[1],et=usePickerMainRef();return function(rt){requestAnimationFrame(function(){_e(rt&&(rt==null?void 0:rt.toLowerCase())).then(function(){scrollTo(et.current,0)})})}}function filterEmojiObjectByKeyword($,_e){var et={};for(var tt in $){var rt=$[tt];hasMatch(rt,_e)&&(et[tt]=rt)}return et}function hasMatch($,_e){return emojiNames($).some(function(et){return et.includes(_e)})}function useIsEmojiFiltered(){var $=useFilterRef(),_e=$.current,et=useSearchTermState(),tt=et[0];return function(rt){return isEmojiFilteredBySearchTerm(rt,_e,tt)}}function isEmojiFilteredBySearchTerm($,_e,et){var tt;return!_e||!et?!1:!((tt=_e[et])!=null&&tt[$])}function findLongestMatch($,_e){if(!_e)return null;if(_e[$])return _e[$];var et=Object.keys(_e).sort(function(tt,rt){return rt.length-tt.length}).find(function(tt){return $.includes(tt)});return et?_e[et]:null}function getNormalizedSearchTerm($){return!$||typeof $!="string"?"":$.trim().toLowerCase()}function getStatusSearchResults($,_e){var et;if(!($!=null&&$[_e]))return"";var tt=((et=Object.entries($==null?void 0:$[_e]))==null?void 0:et.length)||0;return useSearchResultsConfig(tt)}function useSetVariationPicker(){var $=useSetAnchoredEmojiRef(),_e=useEmojiVariationPickerState(),et=_e[1];return function(rt){var nt=emojiFromElement(rt),at=nt[0];at&&($(rt),et(at))}}function useIsSkinToneInSearch(){var $=useSkinTonePickerLocationConfig();return $===SkinTonePickerLocation.SEARCH}function useIsSkinToneInPreview(){var $=useSkinTonePickerLocationConfig();return $===SkinTonePickerLocation.PREVIEW}var KeyboardEvents;(function($){$.ArrowDown="ArrowDown",$.ArrowUp="ArrowUp",$.ArrowLeft="ArrowLeft",$.ArrowRight="ArrowRight",$.Escape="Escape",$.Enter="Enter",$.Space=" "})(KeyboardEvents||(KeyboardEvents={}));function useKeyboardNavigation(){usePickerMainKeyboardEvents(),useSearchInputKeyboardEvents(),useSkinTonePickerKeyboardEvents(),useCategoryNavigationKeyboardEvents(),useBodyKeyboardEvents()}function usePickerMainKeyboardEvents(){var $=usePickerMainRef(),_e=useClearSearch(),et=useScrollTo(),tt=useSearchInputRef(),rt=useFocusSearchInput(),nt=useHasOpenToggles(),at=useDisallowMouseMove(),ot=useCloseAllOpenToggles(),it=reactExports.useMemo(function(){return function(st){var lt=st.key;switch(at(),lt){case KeyboardEvents.Escape:if(st.preventDefault(),nt()){ot();return}_e(),et(0),rt();break}}},[et,_e,ot,rt,nt,at]);reactExports.useEffect(function(){var ft=$.current;if(ft)return ft.addEventListener("keydown",it),function(){ft.removeEventListener("keydown",it)}},[$,tt,et,it])}function useSearchInputKeyboardEvents(){var $=useFocusSkinTonePicker(),_e=usePickerMainRef(),et=useBodyRef(),tt=useSearchInputRef(),rt=useSkinToneFanOpenState(),nt=rt[1],at=useGoDownFromSearchInput(),ot=useIsSkinToneInSearch(),it=reactExports.useMemo(function(){return function(st){var lt=st.key;switch(lt){case KeyboardEvents.ArrowRight:if(!ot)return;st.preventDefault(),nt(!0),$();break;case KeyboardEvents.ArrowDown:st.preventDefault(),at();break;case KeyboardEvents.Enter:st.preventDefault(),focusAndClickFirstVisibleEmoji(et.current);break}}},[$,at,nt,et,ot]);reactExports.useEffect(function(){var ft=tt.current;if(ft)return ft.addEventListener("keydown",it),function(){ft.removeEventListener("keydown",it)}},[_e,tt,it])}function useSkinTonePickerKeyboardEvents(){var $=useSkinTonePickerRef(),_e=useFocusSearchInput(),et=useSearchInputRef(),tt=useGoDownFromSearchInput(),rt=useSkinToneFanOpenState(),nt=rt[0],at=rt[1],ot=useIsSkinToneInPreview(),it=useIsSkinToneInSearch(),ft=useOnType(),st=reactExports.useMemo(function(){return function(ut){var ct=ut.key;if(it)switch(ct){case KeyboardEvents.ArrowLeft:if(ut.preventDefault(),!nt)return _e();focusNextSkinTone(_e);break;case KeyboardEvents.ArrowRight:if(ut.preventDefault(),!nt)return _e();focusPrevSkinTone();break;case KeyboardEvents.ArrowDown:ut.preventDefault(),nt&&at(!1),tt();break;default:ft(ut);break}if(ot)switch(ct){case KeyboardEvents.ArrowUp:if(ut.preventDefault(),!nt)return _e();focusNextSkinTone(_e);break;case KeyboardEvents.ArrowDown:if(ut.preventDefault(),!nt)return _e();focusPrevSkinTone();break;default:ft(ut);break}}},[nt,_e,at,tt,ft,ot,it]);reactExports.useEffect(function(){var lt=$.current;if(lt)return lt.addEventListener("keydown",st),function(){lt.removeEventListener("keydown",st)}},[$,et,nt,st])}function useCategoryNavigationKeyboardEvents(){var $=useFocusSearchInput(),_e=useCategoryNavigationRef(),et=useBodyRef(),tt=useOnType(),rt=reactExports.useMemo(function(){return function(at){var ot=at.key;switch(ot){case KeyboardEvents.ArrowUp:at.preventDefault(),$();break;case KeyboardEvents.ArrowRight:at.preventDefault(),focusNextElementSibling(getActiveElement());break;case KeyboardEvents.ArrowLeft:at.preventDefault(),focusPrevElementSibling(getActiveElement());break;case KeyboardEvents.ArrowDown:at.preventDefault(),focusFirstVisibleEmoji(et.current);break;default:tt(at);break}}},[et,$,tt]);reactExports.useEffect(function(){var nt=_e.current;if(nt)return nt.addEventListener("keydown",rt),function(){nt.removeEventListener("keydown",rt)}},[_e,et,rt])}function useBodyKeyboardEvents(){var $=useBodyRef(),_e=useGoUpFromBody(),et=useSetVariationPicker(),tt=useHasOpenToggles(),rt=useCloseAllOpenToggles(),nt=useOnType(),at=reactExports.useMemo(function(){return function(it){var ft=it.key,st=buttonFromTarget(getActiveElement());switch(ft){case KeyboardEvents.ArrowRight:it.preventDefault(),focusNextVisibleEmoji(st);break;case KeyboardEvents.ArrowLeft:it.preventDefault(),focusPrevVisibleEmoji(st);break;case KeyboardEvents.ArrowDown:if(it.preventDefault(),tt()){rt();break}focusVisibleEmojiOneRowDown(st);break;case KeyboardEvents.ArrowUp:if(it.preventDefault(),tt()){rt();break}focusVisibleEmojiOneRowUp(st,_e);break;case KeyboardEvents.Space:it.preventDefault(),et(it.target);break;default:nt(it);break}}},[_e,nt,et,tt,rt]);reactExports.useEffect(function(){var ot=$.current;if(ot)return ot.addEventListener("keydown",at),function(){ot.removeEventListener("keydown",at)}},[$,at])}function useGoDownFromSearchInput(){var $=useFocusCategoryNavigation(),_e=useIsSearchMode(),et=useBodyRef();return reactExports.useCallback(function(){return _e?focusFirstVisibleEmoji(et.current):$()},[et,$,_e])}function useGoUpFromBody(){var $=useFocusSearchInput(),_e=useFocusCategoryNavigation(),et=useIsSearchMode();return reactExports.useCallback(function(){return et?$():_e()},[$,et,_e])}function focusNextSkinTone($){var _e=getActiveElement();_e&&(hasNextElementSibling(_e)||$(),focusNextElementSibling(_e))}function focusPrevSkinTone(){var $=getActiveElement();$&&focusPrevElementSibling($)}function useOnType(){var $=useAppendSearch(),_e=useFocusSearchInput(),et=useSearchDisabledConfig(),tt=useCloseAllOpenToggles();return function(nt){var at=nt.key;hasModifier(nt)||et||at.match(/(^[a-zA-Z0-9]$){1}/)&&(nt.preventDefault(),tt(),_e(),$(at))}}function hasModifier($){var _e=$.metaKey,et=$.ctrlKey,tt=$.altKey;return _e||et||tt}function preloadEmoji($,_e,et){if(_e&&et!==EmojiStyle.NATIVE){var tt=emojiUnified(_e);preloadedEmojs.has(tt)||(emojiVariations(_e).forEach(function(rt){var nt=$(rt,et);preloadImage(nt)}),preloadedEmojs.add(tt))}}var preloadedEmojs=new Set;function preloadImage($){var _e=new Image;_e.src=$}function useOnFocus(){var $=useBodyRef(),_e=useEmojiStyleConfig(),et=useGetEmojiUrlConfig();reactExports.useEffect(function(){if(_e===EmojiStyle.NATIVE)return;var tt=$.current;return tt==null||tt.addEventListener("focusin",rt),function(){tt==null||tt.removeEventListener("focusin",rt)};function rt(nt){var at=buttonFromTarget(nt.target);if(at){var ot=emojiFromElement(at),it=ot[0];it&&emojiHasVariations(it)&&preloadEmoji(et,it,_e)}}},[$,_e,et])}var _excluded$1=["width","height"],DEFAULT_LABEL_HEIGHT=40;function PickerMain($){var _e=$.children;return reactExports.createElement(PickerContextProvider,null,reactExports.createElement(PickerRootElement,null,_e))}function PickerRootElement($){var _e,et=$.children,tt=useReactionsModeState(),rt=tt[0],nt=useThemeConfig(),at=useIsSearchMode(),ot=usePickerMainRef(),it=useClassNameConfig(),ft=useStyleConfig();useKeyboardNavigation(),useOnFocus();var st=ft||{},lt=st.width,ut=st.height,ct=_objectWithoutPropertiesLoose(st,_excluded$1);return reactExports.createElement("aside",{className:cx(styles$a.main,styles$a.baseVariables,nt===Theme.DARK&&styles$a.darkTheme,nt===Theme.AUTO&&styles$a.autoThemeDark,(_e={},_e[ClassNames.searchActive]=at,_e),rt&&styles$a.reactionsMenu,it),ref:ot,style:_extends({},ct,!rt&&{height:ut,width:lt})},et)}var DarkTheme={"--epr-emoji-variation-picker-bg-color":"var(--epr-dark-emoji-variation-picker-bg-color)","--epr-hover-bg-color-reduced-opacity":"var(--epr-dark-hover-bg-color-reduced-opacity)","--epr-highlight-color":"var(--epr-dark-highlight-color)","--epr-text-color":"var(--epr-dark-text-color)","--epr-hover-bg-color":"var(--epr-dark-hover-bg-color)","--epr-focus-bg-color":"var(--epr-dark-focus-bg-color)","--epr-search-input-bg-color":"var(--epr-dark-search-input-bg-color)","--epr-category-label-bg-color":"var(--epr-dark-category-label-bg-color)","--epr-picker-border-color":"var(--epr-dark-picker-border-color)","--epr-bg-color":"var(--epr-dark-bg-color)","--epr-reactions-bg-color":"var(--epr-dark-reactions-bg-color)","--epr-search-input-bg-color-active":"var(--epr-dark-search-input-bg-color-active)","--epr-emoji-variation-indicator-color":"var(--epr-dark-emoji-variation-indicator-color)","--epr-category-icon-active-color":"var(--epr-dark-category-icon-active-color)","--epr-skin-tone-picker-menu-color":"var(--epr-dark-skin-tone-picker-menu-color)"},styles$a=stylesheet.create({main:{".":["epr-main",ClassNames.emojiPicker],position:"relative",display:"flex",flexDirection:"column",borderWidth:"1px",borderStyle:"solid",borderRadius:"var(--epr-picker-border-radius)",borderColor:"var(--epr-picker-border-color)",backgroundColor:"var(--epr-bg-color)",overflow:"hidden",transition:"all 0.3s ease-in-out, background-color 0.1s ease-in-out","*":{boxSizing:"border-box",fontFamily:"sans-serif"}},baseVariables:{"--":{"--epr-highlight-color":"#007aeb","--epr-hover-bg-color":"#f1f8ff","--epr-hover-bg-color-reduced-opacity":"#f1f8ff80","--epr-focus-bg-color":"#e0f0ff","--epr-text-color":"#858585","--epr-search-input-bg-color":"#f6f6f6","--epr-picker-border-color":"#e7e7e7","--epr-bg-color":"#fff","--epr-reactions-bg-color":"#ffffff90","--epr-category-icon-active-color":"#6aa8de","--epr-skin-tone-picker-menu-color":"#ffffff95","--epr-horizontal-padding":"10px","--epr-picker-border-radius":"8px","--epr-search-border-color":"var(--epr-highlight-color)","--epr-header-padding":"15px var(--epr-horizontal-padding)","--epr-active-skin-tone-indicator-border-color":"var(--epr-highlight-color)","--epr-active-skin-hover-color":"var(--epr-hover-bg-color)","--epr-search-input-bg-color-active":"var(--epr-search-input-bg-color)","--epr-search-input-padding":"0 30px","--epr-search-input-border-radius":"8px","--epr-search-input-height":"40px","--epr-search-input-text-color":"var(--epr-text-color)","--epr-search-input-placeholder-color":"var(--epr-text-color)","--epr-search-bar-inner-padding":"var(--epr-horizontal-padding)","--epr-category-navigation-button-size":"30px","--epr-emoji-variation-picker-height":"45px","--epr-emoji-variation-picker-bg-color":"var(--epr-bg-color)","--epr-preview-height":"70px","--epr-preview-text-size":"14px","--epr-preview-text-padding":"0 var(--epr-horizontal-padding)","--epr-preview-border-color":"var(--epr-picker-border-color)","--epr-preview-text-color":"var(--epr-text-color)","--epr-category-padding":"0 var(--epr-horizontal-padding)","--epr-category-label-bg-color":"#ffffffe6","--epr-category-label-text-color":"var(--epr-text-color)","--epr-category-label-padding":"0 var(--epr-horizontal-padding)","--epr-category-label-height":DEFAULT_LABEL_HEIGHT+"px","--epr-emoji-size":"30px","--epr-emoji-padding":"5px","--epr-emoji-fullsize":"calc(var(--epr-emoji-size) + var(--epr-emoji-padding) * 2)","--epr-emoji-hover-color":"var(--epr-hover-bg-color)","--epr-emoji-variation-indicator-color":"var(--epr-picker-border-color)","--epr-emoji-variation-indicator-color-hover":"var(--epr-text-color)","--epr-header-overlay-z-index":"3","--epr-emoji-variations-indictator-z-index":"1","--epr-category-label-z-index":"2","--epr-skin-variation-picker-z-index":"5","--epr-preview-z-index":"6","--epr-dark":"#000","--epr-dark-emoji-variation-picker-bg-color":"var(--epr-dark)","--epr-dark-highlight-color":"#c0c0c0","--epr-dark-text-color":"var(--epr-highlight-color)","--epr-dark-hover-bg-color":"#363636f6","--epr-dark-hover-bg-color-reduced-opacity":"#36363680","--epr-dark-focus-bg-color":"#474747","--epr-dark-search-input-bg-color":"#333333","--epr-dark-category-label-bg-color":"#222222e6","--epr-dark-picker-border-color":"#151617","--epr-dark-bg-color":"#222222","--epr-dark-reactions-bg-color":"#22222290","--epr-dark-search-input-bg-color-active":"var(--epr-dark)","--epr-dark-emoji-variation-indicator-color":"#444","--epr-dark-category-icon-active-color":"#3271b7","--epr-dark-skin-tone-picker-menu-color":"#22222295"}},autoThemeDark:{".":ClassNames.autoTheme,"@media (prefers-color-scheme: dark)":{"--":DarkTheme}},darkTheme:{".":ClassNames.darkTheme,"--":DarkTheme},reactionsMenu:{".":"epr-reactions",height:"50px",display:"inline-flex",backgroundColor:"var(--epr-reactions-bg-color)",backdropFilter:"blur(8px)","--":{"--epr-picker-border-radius":"50px"}}});function elementCountInRow($,_e){if(!$||!_e)return 0;var et=$.getBoundingClientRect().width,tt=_e.getBoundingClientRect().width;return Math.floor(et/tt)}function elementIndexInRow($,_e){if(!$||!_e)return 0;var et=_e.getBoundingClientRect().width,tt=_e.getBoundingClientRect().left,rt=$.getBoundingClientRect().left;return Math.floor((tt-rt)/et)}function rowNumber($,_e){if(!$||!_e)return 0;var et=_e.getBoundingClientRect().height,tt=_e.getBoundingClientRect().top,rt=$.getBoundingClientRect().top;return Math.round((tt-rt)/et)}function hasNextRow($,_e){if(!$||!_e)return!1;var et=_e.getBoundingClientRect().height,tt=_e.getBoundingClientRect().top,rt=$.getBoundingClientRect().top,nt=$.getBoundingClientRect().height;return Math.round(tt-rt+et)$.length?[]:getRowElements($,tt,et)}function getElementInRow($,_e,et,tt){var rt=getRowElements($,_e,et);return rt[tt]||rt[rt.length-1]||null}function getElementInNextRow($,_e,et,tt){var rt=getNextRowElements($,_e,et);return rt[tt]||rt[rt.length-1]||null}function getElementInPrevRow($,_e,et,tt){var rt=getRowElements($,_e-1,et);return rt[tt]||rt[rt.length-1]||null}function firstVisibleElementInContainer($,_e,et){if(et===void 0&&(et=0),!$||!_e.length)return null;var tt=$.getBoundingClientRect().top,rt=$.getBoundingClientRect().bottom,nt=tt+getLabelHeight($),at=_e.find(function(ot){var it=ot.getBoundingClientRect().top,ft=ot.getBoundingClientRect().bottom,st=ot.clientHeight*et,lt=it+st,ut=ft-st;return lt=tt&<<=rt||ut>=tt&&ut<=rt});return at||null}function hasNextElementSibling($){return!!$.nextElementSibling}function getLabelHeight($){for(var _e=Array.from($.querySelectorAll(asSelectors(ClassNames.label))),et=0,tt=_e;et0)return nt}return DEFAULT_LABEL_HEIGHT}var EmojiButtonSelector="button"+asSelectors(ClassNames.emoji),VisibleEmojiSelector=[EmojiButtonSelector,asSelectors(ClassNames.visible),":not("+asSelectors(ClassNames.hidden)+")"].join("");function buttonFromTarget($){var _e;return(_e=$==null?void 0:$.closest(EmojiButtonSelector))!=null?_e:null}function emojiFromElement($){var _e=originalUnifiedFromEmojiElement($),et=unifiedFromEmojiElement($);if(!_e)return[];var tt=emojiByUnified(et??_e);return tt?[tt,et]:[]}function isEmojiElement($){var _e;return!!($!=null&&$.matches(EmojiButtonSelector)||!($==null||(_e=$.parentElement)==null)&&_e.matches(EmojiButtonSelector))}function elementHeight($){var _e;return(_e=$==null?void 0:$.clientHeight)!=null?_e:0}function emojiTrueOffsetTop($){if(!$)return 0;var _e=buttonFromTarget($),et=closestCategory(_e),tt=categoryLabelHeight(et);return elementOffsetTop(_e)+elementOffsetTop(et)+tt}function categoryLabelHeight($){var _e,et;if(!$)return 0;var tt=$.querySelector(asSelectors(ClassNames.categoryContent));return((_e=$==null?void 0:$.clientHeight)!=null?_e:0)-((et=tt==null?void 0:tt.clientHeight)!=null?et:0)}function isEmojiBehindLabel($){return $?emojiDistanceFromScrollTop($)0?[]:emojisByCategory(_e);ct.length>0&&tt.current++;var gt=0,mt=ct.map(function(ht){var pt=emojiUnified(ht,ft),dt=rt(ht),yt=dt.failedToLoad,vt=dt.filteredOut,bt=dt.hidden,xt=st(ht);return(bt||xt)&>++,xt?null:reactExports.createElement(ClickableEmoji,{showVariations:ut,key:pt,emoji:ht,unified:pt,hidden:yt,hiddenOnSearch:vt,emojiStyle:at,lazyLoad:nt,getEmojiUrl:lt})});return reactExports.createElement(EmojiCategory,{categoryConfig:et,hidden:gt===mt.length},mt)}var styles$8$1=stylesheet.create({emojiList:{".":ClassNames.emojiList,listStyle:"none",margin:"0",padding:"0"}}),SVGTriangle="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDI2LjMuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiIHdpZHRoPSI1MHB4IgoJIGhlaWdodD0iMTVweCIgdmlld0JveD0iMCAwIDUwIDE1IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MCAxNSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxnIGlkPSJMYXllcl8xIj4KPC9nPgo8ZyBpZD0iTGF5ZXJfMiI+Cgk8cGF0aCBmaWxsPSIjRkZGRkZGIiBzdHJva2U9IiNFOEU3RTciIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgZD0iTTEuODYtMC40M2w5LjgzLDExLjUzYzAuNTksMC42OSwxLjU2LDAuNjksMi4xNCwwbDkuODMtMTEuNTMiLz4KCTxwYXRoIGZpbGw9IiMwMTAyMDIiIHN0cm9rZT0iIzE1MTYxNyIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiBkPSJNMjYuODYtMC40M2w5LjgzLDExLjUzYzAuNTksMC42OSwxLjU2LDAuNjksMi4xNCwwbDkuODMtMTEuNTMiLz4KPC9nPgo8L3N2Zz4=",Direction;(function($){$[$.Up=0]="Up",$[$.Down=1]="Down"})(Direction||(Direction={}));function EmojiVariationPicker(){var $=useAnchoredEmojiRef(),_e=useVariationPickerRef(),et=useEmojiVariationPickerState(),tt=et[0],rt=useEmojiStyleConfig(),nt=useVariationPickerTop(_e),at=nt.getTop,ot=nt.getMenuDirection,it=useSetAnchoredEmojiRef(),ft=usePointerStyle(_e),st=useGetEmojiUrlConfig(),lt=buttonFromTarget($.current),ut=!!(tt&<&&emojiHasVariations(tt)&<.classList.contains(ClassNames.emojiHasVariations));reactExports.useEffect(function(){ut&&focusFirstVisibleEmoji(_e.current)},[_e,ut,$]);var ct,gt;return!ut&&$.current?it(null):(ct=at(),gt=ft()),reactExports.createElement("div",{ref:_e,className:cx(styles$9$1.variationPicker,ot()===Direction.Down&&styles$9$1.pointingUp,ut&&styles$9$1.visible),style:{top:ct}},ut&&tt?[emojiUnified(tt)].concat(emojiVariations(tt)).slice(0,6).map(function(mt){return reactExports.createElement(ClickableEmoji,{key:mt,emoji:tt,unified:mt,emojiStyle:rt,showVariations:!1,getEmojiUrl:st})}):null,reactExports.createElement("div",{className:cx(styles$9$1.pointer),style:gt}))}function usePointerStyle($){var _e=useAnchoredEmojiRef();return function(){var tt={};if(!$.current)return tt;if(_e.current){var rt=buttonFromTarget(_e.current),nt=emojiTruOffsetLeft(rt);if(!rt)return tt;tt.left=nt+(rt==null?void 0:rt.clientWidth)/2}return tt}}function useVariationPickerTop($){var _e=useAnchoredEmojiRef(),et=useBodyRef(),tt=Direction.Up;return{getMenuDirection:rt,getTop:nt};function rt(){return tt}function nt(){tt=Direction.Up;var at=0;if(!$.current)return 0;var ot=elementHeight($.current);if(_e.current){var it,ft=et.current,st=buttonFromTarget(_e.current),lt=elementHeight(st);at=emojiTrueOffsetTop(st);var ut=(it=ft==null?void 0:ft.scrollTop)!=null?it:0;ut>at-ot&&(tt=Direction.Down,at+=lt+ot)}return at-ot}}var styles$9$1=stylesheet.create(_extends({variationPicker:{".":ClassNames.variationPicker,position:"absolute",right:"15px",left:"15px",padding:"5px",boxShadow:"0px 2px 5px rgba(0, 0, 0, 0.2)",borderRadius:"3px",display:"flex",alignItems:"center",justifyContent:"space-around",opacity:"0",visibility:"hidden",pointerEvents:"none",top:"-100%",border:"1px solid var(--epr-picker-border-color)",height:"var(--epr-emoji-variation-picker-height)",zIndex:"var(--epr-skin-variation-picker-z-index)",background:"var(--epr-emoji-variation-picker-bg-color)",transform:"scale(0.9)",transition:"transform 0.1s ease-out, opacity 0.2s ease-out"},visible:{opacity:"1",visibility:"visible",pointerEvents:"all",transform:"scale(1)"},pointingUp:{".":"pointing-up",transformOrigin:"center 0%",transform:"scale(0.9)"},".pointing-up":{pointer:{top:"0",transform:"rotate(180deg) translateY(100%) translateX(18px)"}},pointer:{".":"epr-emoji-pointer",content:"",position:"absolute",width:"25px",height:"15px",backgroundRepeat:"no-repeat",backgroundPosition:"0 0",backgroundSize:"50px 15px",top:"100%",transform:"translateX(-18px)",backgroundImage:"url("+SVGTriangle+")"}},darkMode("pointer",{backgroundPosition:"-25px 0"})));function Body(){var $=useBodyRef();return useOnScroll($),useMouseDownHandlers($,MOUSE_EVENT_SOURCE.PICKER),useOnMouseMove(),reactExports.createElement("div",{className:cx(styles$a$1.body,commonInteractionStyles.hiddenOnReactions),ref:$},reactExports.createElement(EmojiVariationPicker,null),reactExports.createElement(EmojiList,null))}var styles$a$1=stylesheet.create({body:{".":ClassNames.scrollBody,flex:"1",overflowY:"scroll",overflowX:"hidden",position:"relative"}});function detectEmojyPartiallyBelowFold($,_e){if(!$||!_e)return 0;var et=$.getBoundingClientRect(),tt=_e.getBoundingClientRect();return tt.height-(et.y-tt.y)}function useEmojiPreviewEvents($,_e){var et=useBodyRef(),tt=useIsMouseDisallowed(),rt=useAllowMouseMove();reactExports.useEffect(function(){if(!$)return;var nt=et.current;nt==null||nt.addEventListener("keydown",it,{passive:!0}),nt==null||nt.addEventListener("mouseover",ft,!0),nt==null||nt.addEventListener("focus",at,!0),nt==null||nt.addEventListener("mouseout",ot,{passive:!0}),nt==null||nt.addEventListener("blur",ot,!0);function at(st){var lt=buttonFromTarget(st.target);if(!lt)return ot();var ut=allUnifiedFromEmojiElement(lt),ct=ut.unified,gt=ut.originalUnified;if(!ct||!gt)return ot();_e({unified:ct,originalUnified:gt})}function ot(st){if(st){var lt=st.relatedTarget;if(!buttonFromTarget(lt))return _e(null)}_e(null)}function it(st){st.key==="Escape"&&_e(null)}function ft(st){if(!tt()){var lt=buttonFromTarget(st.target);if(lt){var ut=detectEmojyPartiallyBelowFold(lt,nt),ct=lt.getBoundingClientRect().height;if(ut button":{width:"var(--epr-skin-tone-size)",display:"block",cursor:"pointer",borderRadius:"4px",height:"var(--epr-skin-tone-size)",position:"absolute",right:"0",transition:"transform 0.3s ease-in-out, opacity 0.35s ease-in-out",zIndex:"0",boxShadow:"0 0 0 0px var(--epr-active-skin-hover-color)"}}});function Preview(){var $=usePreviewConfig(),_e=useIsSkinToneInPreview();return $.showPreview?reactExports.createElement(Flex,{className:cx(styles$e.preview,commonInteractionStyles.hiddenOnReactions)},reactExports.createElement(PreviewBody,null),reactExports.createElement(Space,null),_e?reactExports.createElement(SkinTonePickerMenu,null):null):null}function PreviewBody(){var $,_e=usePreviewConfig(),et=reactExports.useState(null),tt=et[0],rt=et[1],nt=useEmojiStyleConfig(),at=useEmojiVariationPickerState(),ot=at[0],it=useGetEmojiUrlConfig();useEmojiPreviewEvents(_e.showPreview,rt);var ft=emojiByUnified(($=tt==null?void 0:tt.unified)!=null?$:tt==null?void 0:tt.originalUnified),st=ft!=null&&tt!=null;return reactExports.createElement(lt,null);function lt(){var ut=ot??emojiByUnified(_e.defaultEmoji);if(!ut)return null;var ct=ot?emojiName(ot):_e.defaultCaption;return reactExports.createElement(reactExports.Fragment,null,reactExports.createElement("div",null,st?reactExports.createElement(ViewOnlyEmoji,{unified:tt==null?void 0:tt.unified,emoji:ft,emojiStyle:nt,size:45,getEmojiUrl:it,className:cx(styles$e.emoji)}):ut?reactExports.createElement(ViewOnlyEmoji,{unified:emojiUnified(ut),emoji:ut,emojiStyle:nt,size:45,getEmojiUrl:it,className:cx(styles$e.emoji)}):null),reactExports.createElement("div",{className:cx(styles$e.label)},st?emojiName(ft):ct))}}var styles$e=stylesheet.create({preview:{alignItems:"center",borderTop:"1px solid var(--epr-preview-border-color)",height:"var(--epr-preview-height)",padding:"0 var(--epr-horizontal-padding)",position:"relative",zIndex:"var(--epr-preview-z-index)"},label:{color:"var(--epr-preview-text-color)",fontSize:"var(--epr-preview-text-size)",padding:"var(--epr-preview-text-padding)",textTransform:"capitalize"},emoji:{padding:"0"}});function categoryNameFromDom($){var _e;return(_e=$==null?void 0:$.getAttribute("data-name"))!=null?_e:null}function useActiveCategoryScrollDetection($){var _e=useBodyRef();reactExports.useEffect(function(){var et=new Map,tt=_e.current,rt=new IntersectionObserver(function(nt){if(tt){for(var at=_createForOfIteratorHelperLoose(nt),ot;!(ot=at()).done;){var it=ot.value,ft=categoryNameFromDom(it.target);et.set(ft,it.intersectionRatio)}var st=Array.from(et),lt=st[st.length-1];if(lt[1]==1)return $(lt[0]);for(var ut=0,ct=st;ut .epr-icn-clear-search":{backgroundPositionY:"-60px"}}},styles$h=stylesheet.create(_extends({btnClearSearch:{".":"epr-btn-clear-search",position:"absolute",right:"var(--epr-search-bar-inner-padding)",height:"30px",width:"30px",display:"flex",alignItems:"center",justifyContent:"center",top:"50%",transform:"translateY(-50%)",padding:"0",borderRadius:"50%",":hover":{background:"var(--epr-hover-bg-color)"},":focus":{background:"var(--epr-hover-bg-color)"}},icnClearnSearch:{".":"epr-icn-clear-search",backgroundColor:"transparent",backgroundRepeat:"no-repeat",backgroundSize:"20px",height:"20px",width:"20px",backgroundImage:"url("+SVGTimes+")",":hover":{backgroundPositionY:"-20px"},":focus":{backgroundPositionY:"-20px"}}},darkMode("icnClearnSearch",{backgroundPositionY:"-40px"}),darkMode("btnClearSearch",HoverDark))),SCOPE=asSelectors(ClassNames.emojiPicker)+" "+asSelectors(ClassNames.emojiList),EMOJI_BUTTON=["button",asSelectors(ClassNames.emoji)].join(""),CATEGORY=asSelectors(ClassNames.category);function CssSearch($){var _e=$.value;if(!_e)return null;var et=genQuery(_e);return reactExports.createElement("style",null,` `+SCOPE+" "+EMOJI_BUTTON+` { display: none; } `+SCOPE+" "+et+` { display: flex; } `+SCOPE+" "+CATEGORY+":not(:has("+et+`)) { display: none; } `)}function genQuery($){return[EMOJI_BUTTON,'[data-full-name*="',getNormalizedSearchTerm($),'"]'].join("")}var SVGMagnifier="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDI2LjMuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHdpZHRoPSIyMHB4IiBoZWlnaHQ9IjQwcHgiIHZpZXdCb3g9IjAgMCAyMCA0MCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMjAgNDAiIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iIzg2ODY4NiIgZD0iTTEyLDguODFjMCwyLjA4LTEuNjgsMy43Ni0zLjc2LDMuNzZjLTIuMDgsMC0zLjc2LTEuNjgtMy43Ni0zLjc2CgljMC0yLjA4LDEuNjgtMy43NiwzLjc2LTMuNzZDMTAuMzIsNS4wNSwxMiw2LjczLDEyLDguODF6IE0xMS4yMywxMi43MmMtMC44MywwLjY0LTEuODcsMS4wMS0yLjk5LDEuMDFjLTIuNzIsMC00LjkyLTIuMi00LjkyLTQuOTIKCWMwLTIuNzIsMi4yLTQuOTIsNC45Mi00LjkyYzIuNzIsMCw0LjkyLDIuMiw0LjkyLDQuOTJjMCwxLjEzLTAuMzgsMi4xNi0xLjAxLDIuOTlsMy45NCwzLjkzYzAuMjUsMC4yNSwwLjI1LDAuNjYsMCwwLjkyCgljLTAuMjUsMC4yNS0wLjY2LDAuMjUtMC45MiwwTDExLjIzLDEyLjcyeiIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0MwQzBCRiIgZD0iTTEyLDI4LjgxYzAsMi4wOC0xLjY4LDMuNzYtMy43NiwzLjc2Yy0yLjA4LDAtMy43Ni0xLjY4LTMuNzYtMy43NgoJYzAtMi4wOCwxLjY4LTMuNzYsMy43Ni0zLjc2QzEwLjMyLDI1LjA1LDEyLDI2LjczLDEyLDI4LjgxeiBNMTEuMjMsMzIuNzJjLTAuODMsMC42NC0xLjg3LDEuMDEtMi45OSwxLjAxCgljLTIuNzIsMC00LjkyLTIuMi00LjkyLTQuOTJjMC0yLjcyLDIuMi00LjkyLDQuOTItNC45MmMyLjcyLDAsNC45MiwyLjIsNC45Miw0LjkyYzAsMS4xMy0wLjM4LDIuMTYtMS4wMSwyLjk5bDMuOTQsMy45MwoJYzAuMjUsMC4yNSwwLjI1LDAuNjYsMCwwLjkyYy0wLjI1LDAuMjUtMC42NiwwLjI1LTAuOTIsMEwxMS4yMywzMi43MnoiLz4KPC9zdmc+";function IcnSearch(){return reactExports.createElement("div",{className:cx(styles$i.icnSearch)})}var styles$i=stylesheet.create(_extends({icnSearch:{".":"epr-icn-search",content:"",position:"absolute",top:"50%",left:"var(--epr-search-bar-inner-padding)",transform:"translateY(-50%)",width:"20px",height:"20px",backgroundRepeat:"no-repeat",backgroundPosition:"0 0",backgroundSize:"20px",backgroundImage:"url("+SVGMagnifier+")"}},darkMode("icnSearch",{backgroundPositionY:"-20px"})));function SearchContainer(){var $=useSearchDisabledConfig(),_e=useIsSkinToneInSearch();return $?null:reactExports.createElement(Flex,{className:cx(styles$j.overlay)},reactExports.createElement(Search,null),_e?reactExports.createElement(SkinTonePicker,null):null)}function Search(){var $=reactExports.useState(0),_e=$[0],et=$[1],tt=useCloseAllOpenToggles(),rt=useSearchInputRef(),nt=useSearchPlaceHolderConfig(),at=useAutoFocusSearchConfig(),ot=useFilter(),it=ot.statusSearchResults,ft=ot.searchTerm,st=ot.onChange,lt=rt==null?void 0:rt.current,ut=lt==null?void 0:lt.value;return reactExports.createElement(Relative,{className:cx(styles$j.searchContainer)},reactExports.createElement(CssSearch,{value:ut}),reactExports.createElement("input",{autoFocus:at,"aria-label":"Type to search for an emoji",onFocus:tt,className:cx(styles$j.search),type:"text","aria-controls":"epr-search-id",placeholder:nt,onChange:function(gt){et(_e+1),setTimeout(function(){var mt,ht;st((mt=gt==null||(ht=gt.target)==null?void 0:ht.value)!=null?mt:ut)})},ref:rt}),ft?reactExports.createElement("div",{role:"status",className:cx("epr-status-search-results",styles$j.visuallyHidden),"aria-live":"polite",id:"epr-search-id","aria-atomic":"true"},it):null,reactExports.createElement(IcnSearch,null),reactExports.createElement(BtnClearSearch,null))}var styles$j=stylesheet.create(_extends({overlay:{padding:"var(--epr-header-padding)",zIndex:"var(--epr-header-overlay-z-index)"},searchContainer:{".":"epr-search-container",flex:"1",display:"block",minWidth:"0"},visuallyHidden:{clip:"rect(0 0 0 0)",clipPath:"inset(50%)",height:"1px",overflow:"hidden",position:"absolute",whiteSpace:"nowrap",width:"1px"},search:{outline:"none",transition:"all 0.2s ease-in-out",color:"var(--epr-search-input-text-color)",borderRadius:"var(--epr-search-input-border-radius)",padding:"var(--epr-search-input-padding)",height:"var(--epr-search-input-height)",backgroundColor:"var(--epr-search-input-bg-color)",border:"1px solid var(--epr-search-input-bg-color)",width:"100%",":focus":{backgroundColor:"var(--epr-search-input-bg-color-active)",border:"1px solid var(--epr-search-border-color)"},"::placeholder":{color:"var(--epr-search-input-placeholder-color)"}},btnClearSearch:{".":"epr-btn-clear-search",position:"absolute",right:"var(--epr-search-bar-inner-padding)",height:"30px",width:"30px",display:"flex",alignItems:"center",justifyContent:"center",top:"50%",transform:"translateY(-50%)",padding:"0",borderRadius:"50%",":hover":{background:"var(--epr-hover-bg-color)"},":focus":{background:"var(--epr-hover-bg-color)"}},icnClearnSearch:{".":"epr-icn-clear-search",backgroundColor:"transparent",backgroundRepeat:"no-repeat",backgroundSize:"20px",height:"20px",width:"20px",backgroundImage:"url("+SVGTimes+")",":hover":{backgroundPositionY:"-20px"},":focus":{backgroundPositionY:"-20px"}}},darkMode("icnClearnSearch",{backgroundPositionY:"-40px"}),darkMode("btnClearSearch",{":hover > .epr-icn-clear-search":{backgroundPositionY:"-60px"}})));function Header(){return reactExports.createElement(Relative,{className:cx("epr-header",commonInteractionStyles.hiddenOnReactions)},reactExports.createElement(SearchContainer,null),reactExports.createElement(CategoryNavigation,null))}function EmojiPicker$1($){return reactExports.createElement(ElementRefContextProvider,null,reactExports.createElement(PickerStyleTag,null),reactExports.createElement(PickerConfigProvider,Object.assign({},$),reactExports.createElement(ContentControl,null)))}function ContentControl(){var $=useReactionsModeState(),_e=$[0],et=useAllowExpandReactions(),tt=reactExports.useState(!_e),rt=tt[0],nt=tt[1],at=useOpenConfig();return reactExports.useEffect(function(){_e&&!et||rt||nt(!0)},[rt,et,_e]),at?reactExports.createElement(PickerMain,null,reactExports.createElement(Reactions,null),reactExports.createElement(ExpandedPickerContent,{renderAll:rt})):null}function ExpandedPickerContent($){var _e=$.renderAll;return _e?reactExports.createElement(reactExports.Fragment,null,reactExports.createElement(Header,null),reactExports.createElement(Body,null),reactExports.createElement(Preview,null)):null}var EmojiPickerReact=reactExports.memo(EmojiPicker$1,compareConfig),ErrorBoundary=function($){function _e(tt){var rt;return rt=$.call(this,tt)||this,rt.state={hasError:!1},rt}_inheritsLoose(_e,$),_e.getDerivedStateFromError=function(){return{hasError:!0}};var et=_e.prototype;return et.componentDidCatch=function(rt,nt){console.error("Emoji Picker React failed to render:",rt,nt)},et.render=function(){return this.state.hasError?null:this.props.children},_e}(reactExports.Component);function EmojiPicker$1$1($){var _e=useDefineMutableConfig({onEmojiClick:$.onEmojiClick,onReactionClick:$.onReactionClick,onSkinToneChange:$.onSkinToneChange});return reactExports.createElement(ErrorBoundary,null,reactExports.createElement(MutableConfigContext.Provider,{value:_e},reactExports.createElement(EmojiPickerReact,Object.assign({},$))))}const EMOJI_PREVIEW_CONFIG={showPreview:!1};function getEmojiUrl(){return"../../images/emoji-sheet-64.webp"}function EmojiPicker({onEmojiClick:$}){const _e=useI18n(),et=React$2.useMemo(()=>[Categories.SMILEYS_PEOPLE,Categories.ANIMALS_NATURE,Categories.FOOD_DRINK,Categories.TRAVEL_PLACES,Categories.ACTIVITIES,Categories.OBJECTS,Categories.SYMBOLS,Categories.FLAGS].map(tt=>({category:tt,name:_e(`EmojiPicker--category--${tt}`)})),[_e]);return jsx(EmojiPicker$1$1,{skinTonesDisabled:!0,theme:Theme.AUTO,emojiStyle:EmojiStyle.APPLE,getEmojiUrl,onEmojiClick:$,searchPlaceHolder:_e("EmojiPicker--search-placeholder"),categories:et,previewConfig:EMOJI_PREVIEW_CONFIG})}function Emoji({name:$,sheetX:_e,sheetY:et}){const tt=rt=>{rt&&(rt.style.setProperty("--sheet-x",_e.toString()),rt.style.setProperty("--sheet-y",et.toString()))};return jsx("img",{alt:$,src:"../../images/emoji-sheet-64.webp",className:artFrameStyles.emoji,ref:tt})}const ArtFrame=React$2.memo(function({id:_e,artType:et,emoji:tt,image:rt,showGuide:nt,mode:at,onRemove:ot,onPickEmoji:it,onDrop:ft}){const st=useI18n(),[lt,ut]=React$2.useState(!1),ct=reactExports.useRef(null),[gt,mt]=React$2.useState(!1),ht=reactExports.useRef(null),pt=React$2.useRef(),dt=React$2.useCallback(()=>{ut(jt=>!jt)},[ut]),yt=React$2.useCallback(jt=>{var Nt,Tt;if(_e){if(!it)throw new Error("ArtFrame/handlePickEmoji: onPickEmoji was not provided!");it({id:_e,emoji:{emoji:jt.emoji,sheetX:jt.sheetX,sheetY:jt.sheetY,name:((Tt=(Nt=jt.names[0])==null?void 0:Nt.replace(/\s+/g,"_"))==null?void 0:Tt.replace(/[^a-zA-Z_]/g,""))??""}}),ut(!1)}},[_e,it,ut]),vt=React$2.useCallback(()=>{if(_e){if(!ot)throw new Error("ArtFrame/handleRemove: onRemove was not provided!");ot(_e)}},[ot,_e]),bt=React$2.useCallback(()=>{window.clearTimeout(pt.current),pt.current=window.setTimeout(()=>{mt(!0)},500)},[pt,mt]),xt=React$2.useCallback(()=>{clearTimeout(pt.current),mt(!1)},[pt,mt]);React$2.useEffect(()=>()=>{clearTimeout(pt.current)},[pt]),$e0b6e0b68ec7f50f$export$872b660ac5a1ff98({ref:ct,onInteractOutside(){ut(!1)}}),$e0b6e0b68ec7f50f$export$872b660ac5a1ff98({ref:ht,onInteractOutside(){mt(!1)}});const[wt,Et]=React$2.useState(!1),Lt=jsxs("div",{className:artFrameStyles.sizeContainer,"data-art-type":et,"data-drag-active":wt,children:[at!=="add"?rt?jsx("img",{className:artFrameStyles.image,"data-art-type":et,src:rt,alt:et}):jsx("div",{className:artFrameStyles.spinner,children:jsx(Spinner,{size:56})}):null,nt&&at!=="add"?jsx("div",{className:artFrameStyles.guide,"data-art-type":et}):null,at==="removable"?jsx("button",{type:"button","aria-label":st("StickerCreator--DropStage--removeSticker"),className:artFrameStyles.closeButton,onClick:vt,onMouseEnter:xt,onMouseLeave:bt}):null,at==="add"&&ft?jsx(DropZone,{label:st(`StickerCreator--DropStage--dragDrop--${et}`),onDrop:ft,inner:!0,onDragActive:Et}):null,at==="pick-emoji"?jsxs(Manager,{children:[jsx(Reference,{children:({ref:jt})=>jsx("button",{type:"button",ref:jt,className:artFrameStyles.emojiButton,onClick:dt,children:tt!=null&&tt.emoji?jsx(Emoji,{...tt}):jsx(AddEmoji,{})})}),lt?reactDomExports.createPortal(jsx(Popper,{innerRef:ct,placement:"bottom-start",children:({ref:jt,style:Nt})=>jsx("div",{ref:jt,style:{...Nt,marginTop:"8px"},children:jsx(EmojiPicker,{onEmojiClick:yt})})}),document.body):null]}):null,at!=="pick-emoji"&&rt&>?reactDomExports.createPortal(jsx(Popper,{innerRef:ht,placement:"bottom",modifiers:[{name:"offset",options:{offset:[void 0,8]}}],children:({ref:jt,style:Nt,arrowProps:Tt,placement:Rt})=>(assert(et===ArtType.Sticker,"Unexpected art type"),jsx(StickerPreview,{ref:jt,style:Nt,image:rt,arrowProps:Tt,placement:Rt}))}),document.body):null]}),St=classnames$1(artFrameStyles.container,at==="add"&&artFrameStyles.nonDraggable);return jsx(Manager,{children:jsx(Reference,{children:({ref:jt})=>jsx("div",{className:St,onMouseEnter:bt,onMouseLeave:xt,ref:jt,children:Lt})})})});var base64Js={};base64Js.byteLength=byteLength;base64Js.toByteArray=toByteArray;base64Js.fromByteArray=fromByteArray;var lookup=[],revLookup=[],Arr=typeof Uint8Array<"u"?Uint8Array:Array,code="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";for(var i=0,len=code.length;i0)throw new Error("Invalid string. Length must be a multiple of 4");var et=$.indexOf("=");et===-1&&(et=_e);var tt=et===_e?0:4-et%4;return[et,tt]}function byteLength($){var _e=getLens($),et=_e[0],tt=_e[1];return(et+tt)*3/4-tt}function _byteLength($,_e,et){return(_e+et)*3/4-et}function toByteArray($){var _e,et=getLens($),tt=et[0],rt=et[1],nt=new Arr(_byteLength($,tt,rt)),at=0,ot=rt>0?tt-4:tt,it;for(it=0;it>16&255,nt[at++]=_e>>8&255,nt[at++]=_e&255;return rt===2&&(_e=revLookup[$.charCodeAt(it)]<<2|revLookup[$.charCodeAt(it+1)]>>4,nt[at++]=_e&255),rt===1&&(_e=revLookup[$.charCodeAt(it)]<<10|revLookup[$.charCodeAt(it+1)]<<4|revLookup[$.charCodeAt(it+2)]>>2,nt[at++]=_e>>8&255,nt[at++]=_e&255),nt}function tripletToBase64($){return lookup[$>>18&63]+lookup[$>>12&63]+lookup[$>>6&63]+lookup[$&63]}function encodeChunk($,_e,et){for(var tt,rt=[],nt=_e;ntot?ot:at+nt));return tt===1?(_e=$[et-1],rt.push(lookup[_e>>2]+lookup[_e<<4&63]+"==")):tt===2&&(_e=($[et-2]<<8)+$[et-1],rt.push(lookup[_e>>10]+lookup[_e>>4&63]+lookup[_e<<2&63]+"=")),rt.join("")}const PNG_SIGNATURE=new Uint8Array([137,80,78,71,13,10,26,10]),ACTL_CHUNK_BYTES=new TextEncoder().encode("acTL"),IDAT_CHUNK_BYTES=new TextEncoder().encode("IDAT"),MAX_BYTES_TO_READ=1024*1024;function getAnimatedPngDataIfExists($){if(!hasPngSignature($))return null;let _e;const et=new DataView($.buffer,$.byteOffset,$.byteLength);let tt=PNG_SIGNATURE.length;for(;tt<$.byteLength&&tt<=MAX_BYTES_TO_READ;){const rt=$.slice(tt+4,tt+8);if(areBytesEqual(rt,ACTL_CHUNK_BYTES))return _e=et.getUint32(tt+12),_e===0&&(_e=1/0),{numPlays:_e};if(areBytesEqual(rt,IDAT_CHUNK_BYTES))return null;tt+=12+et.getUint32(tt)}return null}function hasPngSignature($){return areBytesEqual($.slice(0,8),PNG_SIGNATURE)}function areBytesEqual($,_e){if($.byteLength!==_e.byteLength)return!1;for(let et=0;et<$.byteLength;et+=1)if($[et]!==_e[et])return!1;return!0}function loadImage($){return new Promise((_e,et)=>{const tt=new Image;tt.addEventListener("load",()=>_e(tt)),tt.addEventListener("error",()=>et(new Error("Bad image"))),tt.src=`data:image/jpeg;base64,${base64Js.fromByteArray($)}`})}const WEBP_QUALITY=.8;async function convertCanvasToWebp($){return $.convertToBlob({type:"image/webp",quality:WEBP_QUALITY})}class ProcessImageError extends Error{constructor(_e,et){super(_e),this.errorMessageI18nKey=et}}async function processImage($,_e){const et=new Uint8Array(await $.arrayBuffer()),tt=await loadImage(et),{naturalWidth:rt,naturalHeight:nt}=tt;if(!rt||!nt)throw new ProcessImageError("Image height or width were falsy","StickerCreator--Toasts--errorProcessing");let at,ot;assert(_e===ArtType.Sticker,"Unexpected ArtType");const it=MAX_STICKER_BYTE_SIZE,ft=STICKER_SIZE,st=getAnimatedPngDataIfExists(et);if(st){if(rt!==nt)throw new ProcessImageError("Image must be square","StickerCreator--Toasts--APNG--notSquare");if(et.length>it)throw new ProcessImageError("Image file was too large","StickerCreator--Toasts--tooLarge");if(rtft)throw new ProcessImageError("Image dimensions are too large","StickerCreator--Toasts--APNG--dimensionsTooLarge");if(st.numPlays!==1/0)throw new ProcessImageError("Animated images must loop forever","StickerCreator--Toasts--mustLoopForever");at="image/png",ot=et}else{const lt=new OffscreenCanvas(ft,ft),ut=lt.getContext("2d");if(!ut)throw new Error("Failed to get 2d context of canvas");const ct=ft/Math.max(rt,nt),gt=rt*ct,mt=nt*ct,ht=(ft-gt)/2,pt=(ft-mt)/2;ut.drawImage(tt,ht,pt,gt,mt);const dt=await convertCanvasToWebp(lt);if(at=dt.type,ot=new Uint8Array(await dt.arrayBuffer()),!ot||ot.length>it)throw new ProcessImageError("Sticker file was too large","StickerCreator--Toasts--tooLarge")}return{path:getFilePath($)||$.name,buffer:ot,src:`data:${at};base64,${base64Js.fromByteArray(ot)}`,contentType:at}}const debug$2=createDebug("signal:components:ArtGrid");function SmartArtFrame({artType:$,id:_e,showGuide:et,mode:tt}){const rt=useDispatch(),nt=useArtData(_e);if(!nt)return null;const at=nt.imageData?nt.imageData.src:void 0;return jsx(ArtFrame,{id:_e,artType:$,showGuide:et,mode:tt,image:at,onRemove:(...ot)=>rt(removeImage(...ot)),onPickEmoji:(...ot)=>rt(setEmoji(...ot)),onEmojiNameChange:ot=>rt(setEmojiName({id:_e,name:ot})),emoji:nt.emoji})}function ArtGrid({mode:$,showGuide:_e}){const et=useArtOrder(),tt=useI18n(),rt=useDispatch(),nt=useArtType(),at=React$2.useMemo(()=>{assert(nt===ArtType.Sticker,"Unexpected art type");const lt=MAX_STICKERS,ut=et.map(ct=>({id:ct,filtered:!1}));return $==="add"&&et.length!==0&&et.length{const ut=lt.filter(ct=>!ct.filtered).map(ct=>ct.id).filter(ct=>typeof ct=="string");rt(setOrder(ut))},[rt]),ft=React$2.useCallback(async lt=>{rt(initializeImages(lt.map(ut=>getFilePath(ut)||ut.name))),await Promise.all(lt.map(async ut=>{try{const ct=await processImage(ut,nt);rt(addImageData(ct))}catch(ct){debug$2("Error processing image:",ct),rt(removeImage(getFilePath(ut)));const gt=ct instanceof ProcessImageError?ct.errorMessageI18nKey:"StickerCreator--Toasts--errorProcessing";rt(addToast({key:gt}))}}))},[rt,nt]);if(at.length===0)return jsx("div",{className:styles$q.drop,children:jsx(DropZone,{label:tt("StickerCreator--DropStage--dragDrop"),onDrop:ft})});const st=at.map(({id:lt,filtered:ut})=>ut?jsx(ArtFrame,{artType:nt,showGuide:_e,mode:"add",onDrop:ft},"new"):jsx(SmartArtFrame,{artType:nt,id:lt,showGuide:_e,mode:ot},`id:${lt}`));return jsx(distExports.ReactSortable,{className:styles$q.grid,list:at,filter:`.${artFrameStyles.nonDraggable}`,preventOnFilter:!1,setList:it,children:st})}function DropStage(){const $=useI18n(),_e=useDispatch(),et=useArtType(),tt=useArtReady(),[rt,nt]=React$2.useState(!0);return React$2.useEffect(()=>{_e(resetStatus())},[_e]),jsxs(AppStage,{next:"/art/add-emojis",nextActive:tt,noScroll:!0,showGuide:rt,setShowGuide:nt,children:[jsx(H2,{children:$(`icu:StickerCreator--DropStage--title--${et}`)}),jsx("div",{className:styles$r.info,children:jsx(Text,{className:styles$r.message,children:$(`StickerCreator--DropStage--help--${et}`)})}),jsx("div",{className:styles$r.main,children:jsx(ArtGrid,{mode:"add",showGuide:rt})})]})}function EmojiStage(){const $=useI18n(),_e=useArtType(),et=useEmojisReady();return jsxs(AppStage,{next:"/art/add-meta",prev:"/art/drop",nextActive:et,children:[jsx(H2,{children:$(`StickerCreator--EmojiStage--title--${_e}`)}),jsx("div",{className:styles$r.info,children:jsx(Text,{className:styles$r.message,children:$(`StickerCreator--EmojiStage--help--${_e}`)})}),jsx("div",{className:styles$r.main,children:jsx(ArtGrid,{mode:"pick-emoji"})})]})}const base$2="_base_1ii7b_1",subtitle="_subtitle_1ii7b_9",progress="_progress_1ii7b_23",styles$9={base:base$2,subtitle,progress},base$1="_base_6bkta_1",bar="_bar_6bkta_15",styles$8={base:base$1,bar},ProgressBar=React$2.memo(function({className:_e,count:et,total:tt}){return jsx("div",{className:classnames$1(styles$8.base,_e),children:jsx("div",{className:styles$8.bar,style:{width:`${Math.floor(et/tt*100)}%`}})})});var indexMinimal={},minimal$1={},aspromise=asPromise;function asPromise($,_e){for(var et=new Array(arguments.length-1),tt=0,rt=2,nt=!0;rt1&&ot.charAt(it)==="=";)++ft;return Math.ceil(ot.length*3)/4-ft};for(var et=new Array(64),tt=new Array(123),rt=0;rt<64;)tt[et[rt]=rt<26?rt+65:rt<52?rt+71:rt<62?rt-4:rt-59|43]=rt++;_e.encode=function(ot,it,ft){for(var st=null,lt=[],ut=0,ct=0,gt;it>2],gt=(mt&3)<<4,ct=1;break;case 1:lt[ut++]=et[gt|mt>>4],gt=(mt&15)<<2,ct=2;break;case 2:lt[ut++]=et[gt|mt>>6],lt[ut++]=et[mt&63],ct=0;break}ut>8191&&((st||(st=[])).push(String.fromCharCode.apply(String,lt)),ut=0)}return ct&&(lt[ut++]=et[gt],lt[ut++]=61,ct===1&&(lt[ut++]=61)),st?(ut&&st.push(String.fromCharCode.apply(String,lt.slice(0,ut))),st.join("")):String.fromCharCode.apply(String,lt.slice(0,ut))};var nt="invalid encoding";_e.decode=function(ot,it,ft){for(var st=ft,lt=0,ut,ct=0;ct1)break;if((gt=tt[gt])===void 0)throw Error(nt);switch(lt){case 0:ut=gt,lt=1;break;case 1:it[ft++]=ut<<2|(gt&48)>>4,ut=gt,lt=2;break;case 2:it[ft++]=(ut&15)<<4|(gt&60)>>2,ut=gt,lt=3;break;case 3:it[ft++]=(ut&3)<<6|gt,lt=0;break}}if(lt===1)throw Error(nt);return ft-st},_e.test=function(ot){return/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(ot)}})(base64$1);var eventemitter=EventEmitter;function EventEmitter(){this._listeners={}}EventEmitter.prototype.on=function(_e,et,tt){return(this._listeners[_e]||(this._listeners[_e]=[])).push({fn:et,ctx:tt||this}),this};EventEmitter.prototype.off=function(_e,et){if(_e===void 0)this._listeners={};else if(et===void 0)this._listeners[_e]=[];else for(var tt=this._listeners[_e],rt=0;rt0?0:2147483648,nt,at);else if(isNaN(rt))tt(2143289344,nt,at);else if(rt>34028234663852886e22)tt((ot<<31|2139095040)>>>0,nt,at);else if(rt<11754943508222875e-54)tt((ot<<31|Math.round(rt/1401298464324817e-60))>>>0,nt,at);else{var it=Math.floor(Math.log(rt)/Math.LN2),ft=Math.round(rt*Math.pow(2,-it)*8388608)&8388607;tt((ot<<31|it+127<<23|ft)>>>0,nt,at)}}$.writeFloatLE=_e.bind(null,writeUintLE),$.writeFloatBE=_e.bind(null,writeUintBE);function et(tt,rt,nt){var at=tt(rt,nt),ot=(at>>31)*2+1,it=at>>>23&255,ft=at&8388607;return it===255?ft?NaN:ot*(1/0):it===0?ot*1401298464324817e-60*ft:ot*Math.pow(2,it-150)*(ft+8388608)}$.readFloatLE=et.bind(null,readUintLE),$.readFloatBE=et.bind(null,readUintBE)}(),typeof Float64Array<"u"?function(){var _e=new Float64Array([-0]),et=new Uint8Array(_e.buffer),tt=et[7]===128;function rt(it,ft,st){_e[0]=it,ft[st]=et[0],ft[st+1]=et[1],ft[st+2]=et[2],ft[st+3]=et[3],ft[st+4]=et[4],ft[st+5]=et[5],ft[st+6]=et[6],ft[st+7]=et[7]}function nt(it,ft,st){_e[0]=it,ft[st]=et[7],ft[st+1]=et[6],ft[st+2]=et[5],ft[st+3]=et[4],ft[st+4]=et[3],ft[st+5]=et[2],ft[st+6]=et[1],ft[st+7]=et[0]}$.writeDoubleLE=tt?rt:nt,$.writeDoubleBE=tt?nt:rt;function at(it,ft){return et[0]=it[ft],et[1]=it[ft+1],et[2]=it[ft+2],et[3]=it[ft+3],et[4]=it[ft+4],et[5]=it[ft+5],et[6]=it[ft+6],et[7]=it[ft+7],_e[0]}function ot(it,ft){return et[7]=it[ft],et[6]=it[ft+1],et[5]=it[ft+2],et[4]=it[ft+3],et[3]=it[ft+4],et[2]=it[ft+5],et[1]=it[ft+6],et[0]=it[ft+7],_e[0]}$.readDoubleLE=tt?at:ot,$.readDoubleBE=tt?ot:at}():function(){function _e(tt,rt,nt,at,ot,it){var ft=at<0?1:0;if(ft&&(at=-at),at===0)tt(0,ot,it+rt),tt(1/at>0?0:2147483648,ot,it+nt);else if(isNaN(at))tt(0,ot,it+rt),tt(2146959360,ot,it+nt);else if(at>17976931348623157e292)tt(0,ot,it+rt),tt((ft<<31|2146435072)>>>0,ot,it+nt);else{var st;if(at<22250738585072014e-324)st=at/5e-324,tt(st>>>0,ot,it+rt),tt((ft<<31|st/4294967296)>>>0,ot,it+nt);else{var lt=Math.floor(Math.log(at)/Math.LN2);lt===1024&&(lt=1023),st=at*Math.pow(2,-lt),tt(st*4503599627370496>>>0,ot,it+rt),tt((ft<<31|lt+1023<<20|st*1048576&1048575)>>>0,ot,it+nt)}}}$.writeDoubleLE=_e.bind(null,writeUintLE,0,4),$.writeDoubleBE=_e.bind(null,writeUintBE,4,0);function et(tt,rt,nt,at,ot){var it=tt(at,ot+rt),ft=tt(at,ot+nt),st=(ft>>31)*2+1,lt=ft>>>20&2047,ut=4294967296*(ft&1048575)+it;return lt===2047?ut?NaN:st*(1/0):lt===0?st*5e-324*ut:st*Math.pow(2,lt-1075)*(ut+4503599627370496)}$.readDoubleLE=et.bind(null,readUintLE,0,4),$.readDoubleBE=et.bind(null,readUintBE,4,0)}(),$}function writeUintLE($,_e,et){_e[et]=$&255,_e[et+1]=$>>>8&255,_e[et+2]=$>>>16&255,_e[et+3]=$>>>24}function writeUintBE($,_e,et){_e[et]=$>>>24,_e[et+1]=$>>>16&255,_e[et+2]=$>>>8&255,_e[et+3]=$&255}function readUintLE($,_e){return($[_e]|$[_e+1]<<8|$[_e+2]<<16|$[_e+3]<<24)>>>0}function readUintBE($,_e){return($[_e]<<24|$[_e+1]<<16|$[_e+2]<<8|$[_e+3])>>>0}var inquire_1=inquire;function inquire(moduleName){try{var mod=eval("quire".replace(/^/,"re"))(moduleName);if(mod&&(mod.length||Object.keys(mod).length))return mod}catch($){}return null}var utf8$2={};(function($){var _e=$;_e.length=function(tt){for(var rt=0,nt=0,at=0;at191&&st<224?it[ft++]=(st&31)<<6|tt[rt++]&63:st>239&&st<365?(st=((st&7)<<18|(tt[rt++]&63)<<12|(tt[rt++]&63)<<6|tt[rt++]&63)-65536,it[ft++]=55296+(st>>10),it[ft++]=56320+(st&1023)):it[ft++]=(st&15)<<12|(tt[rt++]&63)<<6|tt[rt++]&63,ft>8191&&((ot||(ot=[])).push(String.fromCharCode.apply(String,it)),ft=0);return ot?(ft&&ot.push(String.fromCharCode.apply(String,it.slice(0,ft))),ot.join("")):String.fromCharCode.apply(String,it.slice(0,ft))},_e.write=function(tt,rt,nt){for(var at=nt,ot,it,ft=0;ft>6|192,rt[nt++]=ot&63|128):(ot&64512)===55296&&((it=tt.charCodeAt(ft+1))&64512)===56320?(ot=65536+((ot&1023)<<10)+(it&1023),++ft,rt[nt++]=ot>>18|240,rt[nt++]=ot>>12&63|128,rt[nt++]=ot>>6&63|128,rt[nt++]=ot&63|128):(rt[nt++]=ot>>12|224,rt[nt++]=ot>>6&63|128,rt[nt++]=ot&63|128);return nt-at}})(utf8$2);var pool_1=pool;function pool($,_e,et){var tt=et||8192,rt=tt>>>1,nt=null,at=tt;return function(it){if(it<1||it>rt)return $(it);at+it>tt&&(nt=$(tt),at=0);var ft=_e.call(nt,at,at+=it);return at&7&&(at=(at|7)+1),ft}}var longbits,hasRequiredLongbits;function requireLongbits(){if(hasRequiredLongbits)return longbits;hasRequiredLongbits=1,longbits=_e;var $=requireMinimal();function _e(nt,at){this.lo=nt>>>0,this.hi=at>>>0}var et=_e.zero=new _e(0,0);et.toNumber=function(){return 0},et.zzEncode=et.zzDecode=function(){return this},et.length=function(){return 1};var tt=_e.zeroHash="\0\0\0\0\0\0\0\0";_e.fromNumber=function(at){if(at===0)return et;var ot=at<0;ot&&(at=-at);var it=at>>>0,ft=(at-it)/4294967296>>>0;return ot&&(ft=~ft>>>0,it=~it>>>0,++it>4294967295&&(it=0,++ft>4294967295&&(ft=0))),new _e(it,ft)},_e.from=function(at){if(typeof at=="number")return _e.fromNumber(at);if($.isString(at))if($.Long)at=$.Long.fromString(at);else return _e.fromNumber(parseInt(at,10));return at.low||at.high?new _e(at.low>>>0,at.high>>>0):et},_e.prototype.toNumber=function(at){if(!at&&this.hi>>>31){var ot=~this.lo+1>>>0,it=~this.hi>>>0;return ot||(it=it+1>>>0),-(ot+it*4294967296)}return this.lo+this.hi*4294967296},_e.prototype.toLong=function(at){return $.Long?new $.Long(this.lo|0,this.hi|0,!!at):{low:this.lo|0,high:this.hi|0,unsigned:!!at}};var rt=String.prototype.charCodeAt;return _e.fromHash=function(at){return at===tt?et:new _e((rt.call(at,0)|rt.call(at,1)<<8|rt.call(at,2)<<16|rt.call(at,3)<<24)>>>0,(rt.call(at,4)|rt.call(at,5)<<8|rt.call(at,6)<<16|rt.call(at,7)<<24)>>>0)},_e.prototype.toHash=function(){return String.fromCharCode(this.lo&255,this.lo>>>8&255,this.lo>>>16&255,this.lo>>>24,this.hi&255,this.hi>>>8&255,this.hi>>>16&255,this.hi>>>24)},_e.prototype.zzEncode=function(){var at=this.hi>>31;return this.hi=((this.hi<<1|this.lo>>>31)^at)>>>0,this.lo=(this.lo<<1^at)>>>0,this},_e.prototype.zzDecode=function(){var at=-(this.lo&1);return this.lo=((this.lo>>>1|this.hi<<31)^at)>>>0,this.hi=(this.hi>>>1^at)>>>0,this},_e.prototype.length=function(){var at=this.lo,ot=(this.lo>>>28|this.hi<<4)>>>0,it=this.hi>>>24;return it===0?ot===0?at<16384?at<128?1:2:at<2097152?3:4:ot<16384?ot<128?5:6:ot<2097152?7:8:it<128?9:10},longbits}var hasRequiredMinimal;function requireMinimal(){return hasRequiredMinimal||(hasRequiredMinimal=1,function($){var _e=$;_e.asPromise=aspromise,_e.base64=base64$1,_e.EventEmitter=eventemitter,_e.float=float,_e.inquire=inquire_1,_e.utf8=utf8$2,_e.pool=pool_1,_e.LongBits=requireLongbits(),_e.isNode=!!(typeof commonjsGlobal<"u"&&commonjsGlobal&&commonjsGlobal.process&&commonjsGlobal.process.versions&&commonjsGlobal.process.versions.node),_e.global=_e.isNode&&commonjsGlobal||typeof window<"u"&&window||typeof self<"u"&&self||commonjsGlobal,_e.emptyArray=Object.freeze?Object.freeze([]):[],_e.emptyObject=Object.freeze?Object.freeze({}):{},_e.isInteger=Number.isInteger||function(nt){return typeof nt=="number"&&isFinite(nt)&&Math.floor(nt)===nt},_e.isString=function(nt){return typeof nt=="string"||nt instanceof String},_e.isObject=function(nt){return nt&&typeof nt=="object"},_e.isset=_e.isSet=function(nt,at){var ot=nt[at];return ot!=null&&nt.hasOwnProperty(at)?typeof ot!="object"||(Array.isArray(ot)?ot.length:Object.keys(ot).length)>0:!1},_e.Buffer=function(){try{var rt=_e.inquire("buffer").Buffer;return rt.prototype.utf8Write?rt:null}catch{return null}}(),_e._Buffer_from=null,_e._Buffer_allocUnsafe=null,_e.newBuffer=function(nt){return typeof nt=="number"?_e.Buffer?_e._Buffer_allocUnsafe(nt):new _e.Array(nt):_e.Buffer?_e._Buffer_from(nt):typeof Uint8Array>"u"?nt:new Uint8Array(nt)},_e.Array=typeof Uint8Array<"u"?Uint8Array:Array,_e.Long=_e.global.dcodeIO&&_e.global.dcodeIO.Long||_e.global.Long||_e.inquire("long"),_e.key2Re=/^true|false|0|1$/,_e.key32Re=/^-?(?:0|[1-9][0-9]*)$/,_e.key64Re=/^(?:[\\x00-\\xff]{8}|-?(?:0|[1-9][0-9]*))$/,_e.longToHash=function(nt){return nt?_e.LongBits.from(nt).toHash():_e.LongBits.zeroHash},_e.longFromHash=function(nt,at){var ot=_e.LongBits.fromHash(nt);return _e.Long?_e.Long.fromBits(ot.lo,ot.hi,at):ot.toNumber(!!at)};function et(rt,nt,at){for(var ot=Object.keys(nt),it=0;it-1;--ft)if(at[it[ft]]===1&&this[it[ft]]!==void 0&&this[it[ft]]!==null)return it[ft]}},_e.oneOfSetter=function(nt){return function(at){for(var ot=0;ot127;)_e[et++]=$&127|128,$>>>=7;_e[et]=$}function VarintOp($,_e){this.len=$,this.next=void 0,this.val=_e}VarintOp.prototype=Object.create(Op.prototype);VarintOp.prototype.fn=writeVarint32;Writer$1.prototype.uint32=function $(_e){return this.len+=(this.tail=this.tail.next=new VarintOp((_e=_e>>>0)<128?1:_e<16384?2:_e<2097152?3:_e<268435456?4:5,_e)).len,this};Writer$1.prototype.int32=function $(_e){return _e<0?this._push(writeVarint64,10,LongBits$1.fromNumber(_e)):this.uint32(_e)};Writer$1.prototype.sint32=function $(_e){return this.uint32((_e<<1^_e>>31)>>>0)};function writeVarint64($,_e,et){for(;$.hi;)_e[et++]=$.lo&127|128,$.lo=($.lo>>>7|$.hi<<25)>>>0,$.hi>>>=7;for(;$.lo>127;)_e[et++]=$.lo&127|128,$.lo=$.lo>>>7;_e[et++]=$.lo}Writer$1.prototype.uint64=function $(_e){var et=LongBits$1.from(_e);return this._push(writeVarint64,et.length(),et)};Writer$1.prototype.int64=Writer$1.prototype.uint64;Writer$1.prototype.sint64=function $(_e){var et=LongBits$1.from(_e).zzEncode();return this._push(writeVarint64,et.length(),et)};Writer$1.prototype.bool=function $(_e){return this._push(writeByte,1,_e?1:0)};function writeFixed32($,_e,et){_e[et]=$&255,_e[et+1]=$>>>8&255,_e[et+2]=$>>>16&255,_e[et+3]=$>>>24}Writer$1.prototype.fixed32=function $(_e){return this._push(writeFixed32,4,_e>>>0)};Writer$1.prototype.sfixed32=Writer$1.prototype.fixed32;Writer$1.prototype.fixed64=function $(_e){var et=LongBits$1.from(_e);return this._push(writeFixed32,4,et.lo)._push(writeFixed32,4,et.hi)};Writer$1.prototype.sfixed64=Writer$1.prototype.fixed64;Writer$1.prototype.float=function $(_e){return this._push(util$4.float.writeFloatLE,4,_e)};Writer$1.prototype.double=function $(_e){return this._push(util$4.float.writeDoubleLE,8,_e)};var writeBytes=util$4.Array.prototype.set?function $(_e,et,tt){et.set(_e,tt)}:function $(_e,et,tt){for(var rt=0;rt<_e.length;++rt)et[tt+rt]=_e[rt]};Writer$1.prototype.bytes=function $(_e){var et=_e.length>>>0;if(!et)return this._push(writeByte,1,0);if(util$4.isString(_e)){var tt=Writer$1.alloc(et=base64.length(_e));base64.decode(_e,tt,0),_e=tt}return this.uint32(et)._push(writeBytes,et,_e)};Writer$1.prototype.string=function $(_e){var et=utf8$1.length(_e);return et?this.uint32(et)._push(utf8$1.write,et,_e):this._push(writeByte,1,0)};Writer$1.prototype.fork=function $(){return this.states=new State(this),this.head=this.tail=new Op(noop,0,0),this.len=0,this};Writer$1.prototype.reset=function $(){return this.states?(this.head=this.states.head,this.tail=this.states.tail,this.len=this.states.len,this.states=this.states.next):(this.head=this.tail=new Op(noop,0,0),this.len=0),this};Writer$1.prototype.ldelim=function $(){var _e=this.head,et=this.tail,tt=this.len;return this.reset().uint32(tt),tt&&(this.tail.next=_e.next,this.tail=et,this.len+=tt),this};Writer$1.prototype.finish=function $(){for(var _e=this.head.next,et=this.constructor.alloc(this.len),tt=0;_e;)_e.fn(_e.val,et,tt),tt+=_e.len,_e=_e.next;return et};Writer$1._configure=function($){BufferWriter$1=$,Writer$1.create=create$1(),BufferWriter$1._configure()};var writer_buffer=BufferWriter,Writer=writer;(BufferWriter.prototype=Object.create(Writer.prototype)).constructor=BufferWriter;var util$3=requireMinimal();function BufferWriter(){Writer.call(this)}BufferWriter._configure=function(){BufferWriter.alloc=util$3._Buffer_allocUnsafe,BufferWriter.writeBytesBuffer=util$3.Buffer&&util$3.Buffer.prototype instanceof Uint8Array&&util$3.Buffer.prototype.set.name==="set"?function(_e,et,tt){et.set(_e,tt)}:function(_e,et,tt){if(_e.copy)_e.copy(et,tt,0,_e.length);else for(var rt=0;rt<_e.length;)et[tt++]=_e[rt++]}};BufferWriter.prototype.bytes=function $(_e){util$3.isString(_e)&&(_e=util$3._Buffer_from(_e,"base64"));var et=_e.length>>>0;return this.uint32(et),et&&this._push(BufferWriter.writeBytesBuffer,et,_e),this};function writeStringBuffer($,_e,et){$.length<40?util$3.utf8.write($,_e,et):_e.utf8Write?_e.utf8Write($,et):_e.write($,et)}BufferWriter.prototype.string=function $(_e){var et=util$3.Buffer.byteLength(_e);return this.uint32(et),et&&this._push(writeStringBuffer,et,_e),this};BufferWriter._configure();var reader=Reader$1,util$2=requireMinimal(),BufferReader$1,LongBits=util$2.LongBits,utf8=util$2.utf8;function indexOutOfRange($,_e){return RangeError("index out of range: "+$.pos+" + "+(_e||1)+" > "+$.len)}function Reader$1($){this.buf=$,this.pos=0,this.len=$.length}var create_array=typeof Uint8Array<"u"?function $(_e){if(_e instanceof Uint8Array||Array.isArray(_e))return new Reader$1(_e);throw Error("illegal buffer")}:function $(_e){if(Array.isArray(_e))return new Reader$1(_e);throw Error("illegal buffer")},create=function $(){return util$2.Buffer?function(et){return(Reader$1.create=function(rt){return util$2.Buffer.isBuffer(rt)?new BufferReader$1(rt):create_array(rt)})(et)}:create_array};Reader$1.create=create();Reader$1.prototype._slice=util$2.Array.prototype.subarray||util$2.Array.prototype.slice;Reader$1.prototype.uint32=function $(){var _e=4294967295;return function(){if(_e=(this.buf[this.pos]&127)>>>0,this.buf[this.pos++]<128||(_e=(_e|(this.buf[this.pos]&127)<<7)>>>0,this.buf[this.pos++]<128)||(_e=(_e|(this.buf[this.pos]&127)<<14)>>>0,this.buf[this.pos++]<128)||(_e=(_e|(this.buf[this.pos]&127)<<21)>>>0,this.buf[this.pos++]<128)||(_e=(_e|(this.buf[this.pos]&15)<<28)>>>0,this.buf[this.pos++]<128))return _e;if((this.pos+=5)>this.len)throw this.pos=this.len,indexOutOfRange(this,10);return _e}}();Reader$1.prototype.int32=function $(){return this.uint32()|0};Reader$1.prototype.sint32=function $(){var _e=this.uint32();return _e>>>1^-(_e&1)|0};function readLongVarint(){var $=new LongBits(0,0),_e=0;if(this.len-this.pos>4){for(;_e<4;++_e)if($.lo=($.lo|(this.buf[this.pos]&127)<<_e*7)>>>0,this.buf[this.pos++]<128)return $;if($.lo=($.lo|(this.buf[this.pos]&127)<<28)>>>0,$.hi=($.hi|(this.buf[this.pos]&127)>>4)>>>0,this.buf[this.pos++]<128)return $;_e=0}else{for(;_e<3;++_e){if(this.pos>=this.len)throw indexOutOfRange(this);if($.lo=($.lo|(this.buf[this.pos]&127)<<_e*7)>>>0,this.buf[this.pos++]<128)return $}return $.lo=($.lo|(this.buf[this.pos++]&127)<<_e*7)>>>0,$}if(this.len-this.pos>4){for(;_e<5;++_e)if($.hi=($.hi|(this.buf[this.pos]&127)<<_e*7+3)>>>0,this.buf[this.pos++]<128)return $}else for(;_e<5;++_e){if(this.pos>=this.len)throw indexOutOfRange(this);if($.hi=($.hi|(this.buf[this.pos]&127)<<_e*7+3)>>>0,this.buf[this.pos++]<128)return $}throw Error("invalid varint encoding")}Reader$1.prototype.bool=function $(){return this.uint32()!==0};function readFixed32_end($,_e){return($[_e-4]|$[_e-3]<<8|$[_e-2]<<16|$[_e-1]<<24)>>>0}Reader$1.prototype.fixed32=function $(){if(this.pos+4>this.len)throw indexOutOfRange(this,4);return readFixed32_end(this.buf,this.pos+=4)};Reader$1.prototype.sfixed32=function $(){if(this.pos+4>this.len)throw indexOutOfRange(this,4);return readFixed32_end(this.buf,this.pos+=4)|0};function readFixed64(){if(this.pos+8>this.len)throw indexOutOfRange(this,8);return new LongBits(readFixed32_end(this.buf,this.pos+=4),readFixed32_end(this.buf,this.pos+=4))}Reader$1.prototype.float=function $(){if(this.pos+4>this.len)throw indexOutOfRange(this,4);var _e=util$2.float.readFloatLE(this.buf,this.pos);return this.pos+=4,_e};Reader$1.prototype.double=function $(){if(this.pos+8>this.len)throw indexOutOfRange(this,4);var _e=util$2.float.readDoubleLE(this.buf,this.pos);return this.pos+=8,_e};Reader$1.prototype.bytes=function $(){var _e=this.uint32(),et=this.pos,tt=this.pos+_e;if(tt>this.len)throw indexOutOfRange(this,_e);if(this.pos+=_e,Array.isArray(this.buf))return this.buf.slice(et,tt);if(et===tt){var rt=util$2.Buffer;return rt?rt.alloc(0):new this.buf.constructor(0)}return this._slice.call(this.buf,et,tt)};Reader$1.prototype.string=function $(){var _e=this.bytes();return utf8.read(_e,0,_e.length)};Reader$1.prototype.skip=function $(_e){if(typeof _e=="number"){if(this.pos+_e>this.len)throw indexOutOfRange(this,_e);this.pos+=_e}else do if(this.pos>=this.len)throw indexOutOfRange(this);while(this.buf[this.pos++]&128);return this};Reader$1.prototype.skipType=function($){switch($){case 0:this.skip();break;case 1:this.skip(8);break;case 2:this.skip(this.uint32());break;case 3:for(;($=this.uint32()&7)!==4;)this.skipType($);break;case 5:this.skip(4);break;default:throw Error("invalid wire type "+$+" at offset "+this.pos)}return this};Reader$1._configure=function($){BufferReader$1=$,Reader$1.create=create(),BufferReader$1._configure();var _e=util$2.Long?"toLong":"toNumber";util$2.merge(Reader$1.prototype,{int64:function(){return readLongVarint.call(this)[_e](!1)},uint64:function(){return readLongVarint.call(this)[_e](!0)},sint64:function(){return readLongVarint.call(this).zzDecode()[_e](!1)},fixed64:function(){return readFixed64.call(this)[_e](!0)},sfixed64:function(){return readFixed64.call(this)[_e](!1)}})};var reader_buffer=BufferReader,Reader=reader;(BufferReader.prototype=Object.create(Reader.prototype)).constructor=BufferReader;var util$1=requireMinimal();function BufferReader($){Reader.call(this,$)}BufferReader._configure=function(){util$1.Buffer&&(BufferReader.prototype._slice=util$1.Buffer.prototype.slice)};BufferReader.prototype.string=function $(){var _e=this.uint32();return this.buf.utf8Slice?this.buf.utf8Slice(this.pos,this.pos=Math.min(this.pos+_e,this.len)):this.buf.toString("utf-8",this.pos,this.pos=Math.min(this.pos+_e,this.len))};BufferReader._configure();var rpc={},service=Service,util=requireMinimal();(Service.prototype=Object.create(util.EventEmitter.prototype)).constructor=Service;function Service($,_e,et){if(typeof $!="function")throw TypeError("rpcImpl must be a function");util.EventEmitter.call(this),this.rpcImpl=$,this.requestDelimited=!!_e,this.responseDelimited=!!et}Service.prototype.rpcCall=function $(_e,et,tt,rt,nt){if(!rt)throw TypeError("request must be specified");var at=this;if(!nt)return util.asPromise($,at,_e,et,tt,rt);if(!at.rpcImpl){setTimeout(function(){nt(Error("already ended"))},0);return}try{return at.rpcImpl(_e,et[at.requestDelimited?"encodeDelimited":"encode"](rt).finish(),function(it,ft){if(it)return at.emit("error",it,_e),nt(it);if(ft===null){at.end(!0);return}if(!(ft instanceof tt))try{ft=tt[at.responseDelimited?"decodeDelimited":"decode"](ft)}catch(st){return at.emit("error",st,_e),nt(st)}return at.emit("data",ft,_e),nt(null,ft)})}catch(ot){at.emit("error",ot,_e),setTimeout(function(){nt(ot)},0);return}};Service.prototype.end=function $(_e){return this.rpcImpl&&(_e||this.rpcImpl(null,null,null),this.rpcImpl=null,this.emit("end").off()),this};(function($){var _e=$;_e.Service=service})(rpc);var roots={};(function($){var _e=$;_e.build="minimal",_e.Writer=writer,_e.BufferWriter=writer_buffer,_e.Reader=reader,_e.BufferReader=reader_buffer,_e.util=requireMinimal(),_e.rpc=rpc,_e.roots=roots,_e.configure=et;function et(){_e.util._configure(),_e.Writer._configure(_e.BufferWriter),_e.Reader._configure(_e.BufferReader)}et()})(indexMinimal);var minimal=indexMinimal;const $Reader=minimal.Reader,$Writer=minimal.Writer,$util=minimal.util,$root=minimal.roots.default||(minimal.roots.default={});$root.ProvisioningToken=(()=>{function $(et){if(et)for(let tt=Object.keys(et),rt=0;rt>>3){case 1:{at.token=tt.string();break}default:tt.skipType(ot&7);break}}return at},$})();$root.ProvisioningEnvelope=(()=>{function $(et){if(et)for(let tt=Object.keys(et),rt=0;rt>>3){case 1:{at.publicKey=tt.bytes();break}case 2:{at.ciphertext=tt.bytes();break}default:tt.skipType(ot&7);break}}return at},$})();$root.ProvisioningMessage=(()=>{function $(et){if(et)for(let tt=Object.keys(et),rt=0;rt>>3){case 1:{at.username=tt.string();break}case 2:{at.password=tt.string();break}default:tt.skipType(ot&7);break}}return at},$})();const StickerPack=$root.StickerPack=(()=>{function $(et){if(this.stickers=[],et)for(let tt=Object.keys(et),rt=0;rt>>3){case 1:{at.title=tt.string();break}case 2:{at.author=tt.string();break}case 3:{at.cover=$root.StickerPack.Sticker.decode(tt,tt.uint32());break}case 4:{at.stickers&&at.stickers.length||(at.stickers=[]),at.stickers.push($root.StickerPack.Sticker.decode(tt,tt.uint32()));break}default:tt.skipType(ot&7);break}}return at},$.Sticker=function(){function et(rt){if(rt)for(let nt=Object.keys(rt),at=0;at>>3){case 1:{it.id=nt.uint32();break}case 2:{it.emoji=nt.string();break}default:nt.skipType(ft&7);break}}return it},et}(),$})(),encoder=new TextEncoder,PACK_KEY_SALT=new Uint8Array(32),PACK_KEY_SIZE=32,PACK_KEY_STICKER_INFO=encoder.encode("Sticker Pack"),PACK_KEY_AES_KEY_SIZE=32,PACK_KEY_MAC_KEY_SIZE=32,IV_SIZE=16,BITS_PER_BYTE=8;async function deriveKeys({info:$,secret:_e}){const tt=await crypto.subtle.importKey("raw",_e,"HKDF",!1,["deriveBits"]),rt=await crypto.subtle.deriveBits({name:"hkdf",hash:"SHA-256",salt:PACK_KEY_SALT,info:$},tt,BITS_PER_BYTE*(PACK_KEY_AES_KEY_SIZE+PACK_KEY_MAC_KEY_SIZE)),nt=new Uint8Array(rt,0,PACK_KEY_AES_KEY_SIZE),at=new Uint8Array(rt,PACK_KEY_AES_KEY_SIZE,PACK_KEY_MAC_KEY_SIZE),ot=await crypto.subtle.importKey("raw",nt,"AES-CBC",!1,["encrypt","decrypt"]),it=await crypto.subtle.importKey("raw",at,{name:"HMAC",hash:"SHA-256"},!1,["sign","verify"]);return{aesKey:ot,macKey:it}}function toHex($){let _e="";for(const et of $){let tt=et.toString(16);tt.length<2&&(tt=`0${tt}`),_e+=tt}return _e}async function encrypt({artType:$,manifest:_e,images:et,cover:tt}){const rt=new Uint8Array(PACK_KEY_SIZE);crypto.getRandomValues(rt),assert($===ArtType.Sticker,"Unexpected art type");const at=await deriveKeys({info:PACK_KEY_STICKER_INFO,secret:rt}),ot=new Array,it=new Map,ft=new Map;for(const{emoji:ht,buffer:pt}of et){const dt=toHex(pt);it.get(dt)||(it.set(dt,ot.length),ft.set(dt,ht),ot.push(pt))}const st=toHex(tt.buffer);let lt=it.get(st),ut;lt===void 0?(lt=ot.length,ot.push(tt.buffer)):ut=ft.get(st);const ct=StickerPack.encode({title:_e.title,author:_e.author,stickers:et.map(({emoji:ht},pt)=>({emoji:ht.emoji,id:pt})),cover:{id:lt,emoji:ut==null?void 0:ut.emoji}}).finish(),gt=await encryptAttachment(ct,at),mt=await Promise.all(ot.map(ht=>encryptAttachment(ht,at)));return{encryptedManifest:gt,encryptedImages:mt,key:toHex(rt)}}async function encryptAttachment($,{aesKey:_e,macKey:et}){const tt=new Uint8Array(IV_SIZE);crypto.getRandomValues(tt);const rt=new Uint8Array(await crypto.subtle.encrypt({name:"AES-CBC",iv:tt},_e,$)),nt=new Uint8Array([...tt,...rt]),at=new Uint8Array(await crypto.subtle.sign({name:"HMAC"},et,nt));return new Uint8Array([...nt,...at])}const debug$1=createDebug("signal:routes:stickers:UploadStage");function UploadStage(){const $=useI18n(),_e=useDispatch(),et=useNavigate(),tt=useArtType(),rt=useCover(),nt=useTitle(),at=useAuthor(),ot=useSelectOrderedData(),it=ot.length,[ft,st]=React$2.useState(0),lt=React$2.useCallback(()=>{et("/art/add-meta")},[et]);return React$2.useEffect(()=>((async()=>{const ut=()=>{st(ct=>ct+1)};try{if(!rt)throw new Error("UploadStage: Cover was missing on upload!");const ct=await encrypt({artType:tt,manifest:{title:nt,author:at},images:ot.map(({emoji:mt,imageData:ht})=>(assert(mt&&ht,"Can't have partial data at this stage!"),{emoji:mt,contentType:ht.contentType,buffer:ht.buffer})),cover:rt}),gt=await upload(ct,{artType:tt,onProgress:ut});_e(setPackMeta(gt)),et("/art/share")}catch(ct){assert(ct instanceof Error,"Expected Error"),debug$1("Error uploading pack:",ct),ct instanceof APIError?_e(addToast({key:ct.errorMessageI18nKey})):_e(addToast({key:"StickerCreator--Toasts--errorUploading",subs:{message:ct.message}})),et("/art/add-meta")}})(),noop$2),[_e,et,tt,nt,at,rt,ot]),jsx(AppStage,{empty:!0,children:jsxs("div",{className:styles$9.base,children:[jsx(H2,{children:$(`StickerCreator--UploadStage--title--${tt}`)}),jsx(Text,{className:styles$9.subtitle,children:$("StickerCreator--UploadStage-uploaded",{count:String(ft),total:String(it)})}),jsx(ProgressBar,{count:ft,total:it,className:styles$9.progress}),jsx(Button$1,{onClick:lt,children:$("cancel")})]})})}const container$3="_container_1s6hi_1",label$1="_label_1s6hi_9",input$1="_input_1s6hi_16",styles$7={container:container$3,label:label$1,input:input$1},LabeledInput=React$2.memo(function $({children:_e,value:et,placeholder:tt,onChange:rt}){const nt=React$2.useCallback(at=>{rt!==void 0&&rt(at.currentTarget.value)},[rt]);return jsxs("label",{className:styles$7.container,children:[jsx(Inline,{className:styles$7.label,children:_e}),jsx("input",{type:"text",className:styles$7.input,placeholder:tt,value:et,onChange:nt})]})}),facade="_facade_v402v_1",styles$6={facade},base="_base_1bg00_1",grow="_grow_1bg00_21",text$2="_text_1bg00_25",title="_title_1bg00_39 _text_1bg00_25",bottom="_bottom_1bg00_53",pill="_pill_1bg00_61 _base_1bg00_1",pillPrimary="_pill-primary_1bg00_81 _pill_1bg00_61 _base_1bg00_1",styles$5={base,grow,text:text$2,title,bottom,pill,pillPrimary},ConfirmDialog=reactExports.forwardRef(function $({title:_e,children:et,confirm:tt,cancel:rt,onConfirm:nt,onCancel:at},ot){const it=useI18n(),ft=rt||it("StickerCreator--ConfirmDialog--cancel");return jsxs("div",{ref:ot,className:styles$5.base,children:[jsx("h1",{className:styles$5.title,children:_e}),jsx("p",{className:styles$5.text,children:et}),jsx("div",{className:styles$5.grow}),jsxs("div",{className:styles$5.bottom,children:[jsx(Button$1,{onClick:at,children:ft}),jsx(Button$1,{primary:!0,onClick:nt,children:tt})]})]})});function ConfirmModal($){const{onCancel:_e}=$,et=reactExports.useRef(null);return $e0b6e0b68ec7f50f$export$872b660ac5a1ff98({ref:et,onInteractOutside:_e}),reactDomExports.createPortal(jsx("div",{className:styles$6.facade,children:jsx(ConfirmDialog,{ref:et,...$})}),document.body)}const main$1="_main_ig821_1",row$1="_row_ig821_7",coverContainer="_cover-container_ig821_13",label="_label_ig821_21",coverImage="_cover-image_ig821_37",coverFrame="_cover-frame_ig821_46",editButton="_edit-button_ig821_76",styles$4={main:main$1,row:row$1,coverContainer,label,coverImage,coverFrame,editButton};function MetaStage(){const $=useI18n(),_e=useNavigate(),et=useDispatch(),tt=useArtType(),rt=useAllDataValid(),nt=useCover(),at=useTitle(),ot=useAuthor(),[it,ft]=React$2.useState(!1),st=React$2.useCallback(async([pt])=>{try{const dt=await processImage(pt,tt);et(setCover(dt))}catch{et(removeImage(getFilePath(pt)||pt.name))}},[et,tt]),{getRootProps:lt,getInputProps:ut,isDragActive:ct}=useStickerDropzone(st),gt=React$2.useCallback(()=>{ft(!0)},[]),mt=React$2.useCallback(()=>{ft(!1)},[]),ht=React$2.useCallback(()=>{_e("/art/upload")},[_e]);return jsxs(AppStage,{onNext:gt,nextActive:rt,noMessage:!0,prev:"/art/add-emojis",children:[it?jsx(ConfirmModal,{title:$(`StickerCreator--MetaStage--ConfirmDialog--title--${tt}`),confirm:$("StickerCreator--MetaStage--ConfirmDialog--confirm"),onCancel:mt,onConfirm:ht,children:$(`StickerCreator--MetaStage--ConfirmDialog--text--${tt}`)}):null,jsx(H2,{children:$("StickerCreator--MetaStage--title")}),jsxs("div",{className:styles$4.main,children:[jsx("div",{className:styles$4.row,children:jsx(LabeledInput,{value:at,onChange:pt=>et(setTitle(pt)),placeholder:$("StickerCreator--MetaStage--Field--title-placeholder"),children:$("StickerCreator--MetaStage--Field--title")})}),jsx("div",{className:styles$4.row,children:jsx(LabeledInput,{value:ot,onChange:pt=>et(setAuthor(pt)),placeholder:$("StickerCreator--MetaStage--Field--author-placeholder"),children:$("StickerCreator--MetaStage--Field--author")})}),jsxs("div",{className:styles$4.row,children:[jsx("h3",{className:styles$4.label,children:$("StickerCreator--MetaStage--Field--cover")}),jsx(Text,{children:$(`StickerCreator--MetaStage--Field--cover--help--${tt}`)}),jsx("div",{className:styles$4.coverContainer,children:jsxs("div",{...lt(),className:styles$4.coverFrame,"data-drag-active":ct,children:[jsx("div",{className:styles$4.editButton}),nt!=null&&nt.src?jsx("img",{className:styles$4.coverImage,"data-art-type":tt,src:nt.src,alt:"Cover"}):null,jsx("input",{...ut()})]})})]})]})]})}const main="_main_1i6n4_1",message="_message_1i6n4_7",callToAction="_call-to-action_1i6n4_12",row="_row_1i6n4_16",styles$3={main,message,callToAction,row},container$2="_container_1a0r0_1",input="_input_1a0r0_10",styles$2={container:container$2,input},CopyText=React$2.memo(function $({label:_e,onCopy:et,value:tt}){const rt=useI18n(),nt=React$2.useCallback(()=>{navigator.clipboard.writeText(tt),et&&et()},[et,tt]);return jsxs("div",{className:styles$2.container,children:[jsx("input",{type:"text",className:styles$2.input,value:tt,"aria-label":_e,readOnly:!0}),jsx(Button$1,{onClick:nt,children:rt("StickerCreator--CopyText--button")})]})}),container$1="_container_15baj_1",text$1="_text_15baj_7",button="_button_15baj_18",styles$1={container:container$1,text:text$1,button},ShareButtons=React$2.memo(function $({value:_e}){const et=useI18n(),tt=React$2.useMemo(()=>{const rt=encodeURIComponent(_e),nt=encodeURIComponent(`${et("StickerCreator--ShareStage--socialMessage")} ${_e}`);return[[et("StickerCreator--ShareButtons--facebook"),"#4267B2","M20.155 10.656l-1.506.001c-1.181 0-1.41.561-1.41 1.384v1.816h2.817l-.367 2.845h-2.45V24h-2.937v-7.298h-2.456v-2.845h2.456V11.76c0-2.435 1.487-3.76 3.658-3.76 1.04 0 1.934.077 2.195.112v2.544z",`https://www.facebook.com/sharer/sharer.php?u=${rt}`],[et("StickerCreator--ShareButtons--twitter"),"#000000","M17.49 14.775 23.313 8h-1.38l-5.058 5.883L12.836 8h-4.66l6.109 8.895L8.176 24h1.38l5.342-6.212L19.165 24h4.659zm-1.892 2.2-.62-.887-4.923-7.048h2.12l3.975 5.688.618.887 5.166 7.393h-2.12z",`https://x.com/intent/post?text=${nt}`],[et("StickerCreator--ShareButtons--whatsapp"),"#25D366","M16.033 23.862h-.003a7.914 7.914 0 01-3.79-.965L8.035 24l1.126-4.109a7.907 7.907 0 01-1.059-3.964C8.104 11.556 11.661 8 16.033 8c2.121 0 4.113.826 5.61 2.325a7.878 7.878 0 012.321 5.609c-.002 4.371-3.56 7.928-7.931 7.928zm3.88-5.101c-.165.463-.957.885-1.338.942a2.727 2.727 0 01-1.248-.078 11.546 11.546 0 01-1.13-.418c-1.987-.858-3.286-2.859-3.385-2.991-.1-.132-.81-1.074-.81-2.049 0-.975.513-1.455.695-1.653a.728.728 0 01.528-.248c.132 0 .264.001.38.007.122.006.285-.046.446.34.165.397.56 1.372.61 1.471.05.099.083.215.017.347-.066.132-.1.215-.198.331-.1.115-.208.258-.297.347-.1.098-.203.206-.087.404.116.198.513.847 1.102 1.372.757.675 1.396.884 1.594.984.198.099.314.082.429-.05.116-.132.496-.578.628-.777.132-.198.264-.165.446-.099.18.066 1.156.545 1.354.645.198.099.33.148.38.231.049.083.049.479-.116.942zm-3.877-9.422c-3.636 0-6.594 2.956-6.595 6.589 0 1.245.348 2.458 1.008 3.507l.157.249-.666 2.432 2.495-.654.24.142a6.573 6.573 0 003.355.919h.003a6.6 6.6 0 006.592-6.59 6.55 6.55 0 00-1.93-4.662 6.549 6.549 0 00-4.66-1.932z",`https://wa.me?text=${nt}`]]},[et,_e]);return jsx("div",{className:styles$1.container,children:tt.map(([rt,nt,at,ot])=>jsx("button",{type:"button","aria-label":rt,className:styles$1.button,onClick:()=>window.open(ot),children:jsxs("svg",{width:32,height:32,children:[jsx("circle",{cx:"16",cy:"16",r:"16",fill:nt}),jsx("path",{d:at,fill:"#FFF",fillRule:"evenodd"})]})},at))})}),container="_container_1qcao_1",titleBar="_title-bar_1qcao_20",scroller="_scroller_1qcao_49",grid="_grid_1qcao_54",art="_art_1qcao_69",meta="_meta_1qcao_74",metaText="_meta-text_1qcao_88",text="_text_1qcao_95",metaTitle="_meta-title_1qcao_99 _text_1qcao_95",metaAuthor="_meta-author_1qcao_114 _text_1qcao_95",styles={container,titleBar,scroller,grid,art,meta,metaText,text,metaTitle,metaAuthor},ArtPackPreview=React$2.memo(function $({artType:_e,images:et,title:tt,author:rt}){const nt=useI18n();return jsxs("div",{className:styles.container,children:[jsx("div",{className:styles.titleBar,children:nt(`StickerCreator--Preview--title--${_e}`)}),jsx("div",{className:styles.scroller,children:jsx("div",{className:styles.grid,children:et.map(at=>jsx("img",{className:styles.art,src:at,alt:at},at))})}),jsx("div",{className:styles.meta,children:jsxs("div",{className:styles.metaText,children:[jsx("div",{className:styles.metaTitle,children:tt}),jsx("div",{className:styles.metaAuthor,children:rt})]})})]})}),debug=createDebug("signal:components:Intl"),defaultRenderText=({text:$,key:_e})=>jsx(React$2.Fragment,{children:$},_e);let Intl$1=class extends React$2.Component{getComponent(_e,et,tt){const{id:rt,components:nt}=this.props;if(!nt)return debug(`Error: Intl component prop not provided; Metadata: id '${rt}', index ${_e}, placeholder '${et}'`),null;if(Array.isArray(nt))return!nt||!nt.length||nt.length<=_e?(debug(`Error: Intl missing provided component for id '${rt}', index ${_e}`),null):jsx(React$2.Fragment,{children:nt[_e]},tt);const at=nt[et];return at?jsx(React$2.Fragment,{children:at},tt):(debug(`Error: Intl missing provided component for id '${rt}', placeholder '${et}'`),null)}render(){const{components:_e,id:et,i18n:tt,renderText:rt=defaultRenderText}=this.props;if(!et)return debug("Error: Intl id prop not provided"),null;if(!tt.isLegacyFormat(et))return assert(!Array.isArray(_e),`components cannot be an array for ICU message ${et}`),tt.getIntl().formatMessage({id:et},_e);const nt=tt(et),at=[],ot=/\$([^$]+)\$/g;if(Array.isArray(_e)&&_e.length>1)throw new Error("Array syntax is not supported with more than one placeholder");let it=0,ft=0,st=0,lt=ot.exec(nt);if(!lt)return rt({text:nt,key:0});for(;lt;){if(st{ft(!0)},[ft]),lt=React$2.useCallback(()=>{ft(!1)},[ft]),ut=React$2.useCallback(()=>{_e(reset(tt)),et("/")},[_e,tt,et]);return jsx(AppStage,{nextActive:!0,prevText:$("StickerCreator--ShareStage--createAnother"),onPrev:ut,children:ot?jsxs(Fragment,{children:[jsx(H2,{children:$("StickerCreator--ShareStage--title")}),jsx(Text,{className:styles$3.message,children:$("StickerCreator--ShareStage--help")}),jsxs("div",{className:styles$3.main,children:[jsx("div",{className:styles$3.row,children:jsx(ArtPackPreview,{artType:tt,title:rt,author:nt,images:at})}),jsx("div",{className:styles$3.row,children:jsx(CopyText,{value:ot,label:$("StickerCreator--ShareStage--copyTitle"),onCopy:st})}),jsx("div",{className:styles$3.row,children:jsx(Text,{className:styles$3.callToAction,center:!0,children:jsx(Intl$1,{i18n:$,id:"StickerCreator--ShareStage--callToAction",components:{hashtag:jsx("strong",{children:"#makeprivacystick"},"hashtag")}})})}),jsx("div",{className:styles$3.row,children:jsx(ShareButtons,{value:ot})})]}),it?jsx("div",{className:appStyles.toaster,children:jsx(Toast,{onClick:lt,children:$("StickerCreator--Toasts--linkedCopied")})}):null]}):null})}const artTypeBySearchParam=new Map([["sticker",ArtType.Sticker]]),startFlow=({request:$})=>{const _e=new URL($.url),et=artTypeBySearchParam.get(_e.searchParams.get("artType")??"");if(et===void 0)throw new Error("Unsupported art type");return{artType:et}};function Index(){const $=useDispatch(),{artType:_e}=useLoaderData();return $(reset(_e)),jsx(Navigate,{to:"/art/drop",replace:!0})}function createArtRoutes(){return jsxs(Route,{path:"/art",children:[jsx(Route,{index:!0,loader:startFlow,element:jsx(Index,{})}),jsx(Route,{path:"/art/drop",element:jsx(DropStage,{})}),jsx(Route,{path:"/art/add-emojis",element:jsx(EmojiStage,{})}),jsx(Route,{path:"/art/add-meta",element:jsx(MetaStage,{})}),jsx(Route,{path:"/art/upload",element:jsx(UploadStage,{})}),jsx(Route,{path:"/art/share",element:jsx(ShareStage,{})}),jsx(Route,{path:"/art/*",element:jsx(Navigate,{to:"/",replace:!0})})]})}const router=createMemoryRouter(createRoutesFromChildren(jsxs(Route,{path:"/",loader:()=>loadLocale(),element:jsx(Root,{}),children:[jsx(Route,{index:!0,element:jsx(Navigate,{to:"/art/?artType=sticker",replace:!0})}),createArtRoutes()]})));client.createRoot(document.getElementById("root")).render(jsx(Provider$1,{store,children:jsx(RouterProvider,{router})})); const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"Utzi"},a={message:"$minutes$ min",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},r={message:"Emojia",description:"Label for emoji button"},i={message:"Pertsonalizatu erreakzioak",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},o={smartling:e,"index--title":{message:"Eranskailuen sortzailea"},"index--create-sticker-pack":{message:"Sortu eranskailu-pakete bat"},"SignIn--title":{message:"Sortu eranskailu-pakete bat",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Signal-eko beste guztia bezala, eranskailuak ere enkriptatuta daude. Erabili tresna hau zeure eranskailu-pakete pertsonalizatuak sortzeko.",description:"A body of SignIn page"},"SignIn--qr":{message:"Saioa hasteko kodea",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"Hasteko, ireki Signal ordenagailuan",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"Zure arakatzailea ez da onartzen. Ireki esteka hau Firefox edo Chrome-n.",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:a,"EmojiPicker--empty":{message:"Ez da emojirik aurkitu",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"Bilatu emojiak",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"Azalaren kolorea: $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"Emojiak eta jendea",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"Animaliak eta natura",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"Janaria eta edaria",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"Bidaiak eta tokiak",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"Jarduerak",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"Objektuak",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"Ikurrak",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"Banderak",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Eranskailuen sortzailea",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Signal-eko eranskailu-paketeen sortzailea",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Signal-en logoa",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Signal-eko eranskailu-paketeen gidalerroak",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"Irudiak hemen gehitzeko, egin klik edo arrasta itzazu honaino",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"Arrastatu irudiak honaino",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"Eranskailu-paketea",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"Eranskailu-paketea",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"Utzi",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"Kopiatu",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"Hurrengoa",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"Atzera",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"Gehitu zeure eranskailuak",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"Kendu irudia",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"Eranskailu bat gehitzeko, egin klik edo arrastatu/jaregin fitxategi bat",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"Eranskailuek baldintza hauek bete behar dituzte: PNG, APNG edo WebP formatua izan; atzeko plano gardena izan; eta 512 × 512 pixel izan. 16 px-ko marjina izatea gomendatzen da.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"Ikusi marjinak",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"Gehitu emoji bat eranskailu bakoitzari",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"Honen bidez, eranskailuak iradoki ahalko dizkizugu mezuak bidaltzen dituzun bitartean.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"Xehetasun batzuk baino ez dira falta…",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"Izena",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"Jarri izena eranskailu-paketeari",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"Egilea",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"Idatzi izen bat eranskailuak bidaltzeko",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"Azaleko irudia",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"Eranskailu-paketea partekatzen duzunean, irudi hau agertuko da",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"Ziur zaude eranskailu-paketea kargatu nahi duzula?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"Kargatu",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"Eranskailu-pakete bat sortu ondoren, ezingo duzu editatu edo ezabatu.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"Eranskailu-paketea sortzen",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$count$/$total$ kargatuta",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"Zorionak! Eranskailu-pakete bat sortu duzu.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"Atzitu eranskailu berriak eranskailuen ikonoa erabiliz, edo parteka itzazu lagunekin beheko estekaren bidez.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"Beste pertsona batzuek partekatu nahi dituzun eranskailu-pakete pertsonalizatuen URLak aurkitu ahal izan ditzaten, erabili $hashtag$ hashtaga.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"Eranskailu-paketearen URLa",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"Instalatu",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"Sortu beste eranskailu-pakete bat",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Eman begiratu bat sortu dudan eranskailu-pakete berriari. #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {1 irudi gehitu da} other {{count,number} irudi gehitu dira}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"Une honetan ez dira onartzen animazioak",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"Jaregindako irudia handiegia da",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"Errore bat izan da irudia prozesatzean",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"Animatutako PNG irudiek karratuak izan behar dute",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"Irudi animatuak etengabe errepikatu behar dira",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"Animatutako PNG irudia handiegia da",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"Animatutako PNG irudia txikiegia da",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"Errore bat gertatu da irudiak kargatzean: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"Ezin da konektatu zerbitzarira: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"Kredentzialak iraungita daudenez, ezin izan dira kargatu irudiak. Joan Signal-era ordenagailuan eta ireki webgunea berriro.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"Kopiatu da esteka",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"Nire eranskailua, gai argiarekin",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"Nire eranskailua, gai ilunarekin",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"Eranskailu-paketeen sortzailea erabili ahal izateko, konfiguratu Signal telefonoan eta ordenagailuan.",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:r,CustomizingPreferredReactions__title:i,"ArtFrame--emoji-name-placeholder":{message:"Emojiaren aliasa",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{i as CustomizingPreferredReactions__title,r as EmojiButton__label,t as cancel,o as default,a as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"ۋاز كەچ"},r={message:"$minutes$ مىنۇت",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},o={message:"چىراي بەلگە",description:"Label for emoji button"},i={message:"ئىختىيارىچە ئىنكاس",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},a={smartling:e,"index--title":{message:"چاپلاق سەنئەت قۇرغۇچى"},"index--create-sticker-pack":{message:"يېڭى چاپلاق بوغچىسى قۇرۇش"},"SignIn--title":{message:"چاپلاق بوغچىسى قۇرۇش",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Signal دىكى باشقا نەرسىلەرگە ئوخشاش چاپلاقلارمۇ مەخپىيلەشتۈرۈلگەن. بۇ قورال ئارقىلىق ئۆزىڭىزگە خاس چاپلاق بوغچىسىنى قۇرالايسىز.",description:"A body of SignIn page"},"SignIn--qr":{message:"تىزىملاپ كىرىش كودى",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"Signal ئۈستەليۈزى نەشرىنى ئېچىپ باشلاڭ",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"كەچۈرۈڭ، تور كۆرگۈچىڭىز قوللىمايدۇ. بۇ ئۇلىنىشنى Firefox ياكى Chrome دا ئېچىڭ",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"emoji تېپىلمىدى",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"چىراي بەلگە ئىزدە",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"تېرە رەڭگى $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"كۈلۈمسىرەش& كىشىلەر",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"ھايۋاناتلار & تەبىئەت",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"يېمەك-ئىچمەك",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"ساياھەت & يەرلەر",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"پائالىيەت",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"نەرسە",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"بەلگە",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"بايراق",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"چاپلاق سەنئەت قۇرغۇچى",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Signal چاپلاق بوغچىسى قۇرغۇچى",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Signal لوگوسى",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"چاپلاق بوغچىسى قۇرغۇچى كۆرسەتمىسى",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"رەسىم قوشۇش ئۈچۈن بۇ يەرنى چېكىڭ ياكى رەسىمنى سۆرەپ كىرىڭ",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"رەسىمنى بۇ يەرگە تاشلاڭ",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"چاپلاق بوغچىسى",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"چاپلاق بوغچىسى",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"ۋاز كەچ",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"كۆچۈر",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"كېيىنكى",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"قايت",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"چاپلاقلىرىمنى قوشىمەن",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"رەسىمنى ئۆچۈرۈش",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"چاپلاققا قوشۇش ئۈچۈن چېكىڭ ياكى ھۆججەتنى تاشلاڭ ياكى سۆرەپ كىرىڭ",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"چاپلاقلار چوقۇم PNG، APNG ياكى WebP فورماتىدا بولۇشى، تەگلىكى سۈزۈك بولۇشى ۋە 512x512 پىكسېل بولۇشى كېرەك. گىرۋەكنىڭ 16px بولۇشى تەۋسىيە قىلىنىدۇ.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"گىرۋەكنى كۆرۈش",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"ھەر بىر چاپلاققا بىر emoji قوشۇش",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"شۇنىڭ بىلەن سىز ئۇچۇر يوللاۋاتقاندا سىزگە چاپلاق تەۋسىيە قىلالايمىز.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"يەنە بەزى تەپسىلاتلارنى قوشۇڭ...",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"ماۋزۇ",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"چاپلاق بوغچىڭىزغا ئىسىم قويۇڭ",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"يازغۇچى",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"تاپشۇرىدىغان چاپلاقلىرىڭىزغا بىر ئىسىم قويۇڭ",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"مۇقاۋا رەسىم",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"چاپلاق بوغچىڭىزنى ئورتاقلاشقاندا بۇ رەسىم مۇقاۋا بولۇپ كۆرۈنىدۇ",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"چاپلاق بوغچىڭىزنى يۈكلەمسىز؟",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"يۈكلەش",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"چاپلاق بوغچىسى قۇرۇلۇپ بولغاندىن كېيىن ئۇنىڭغا تەھرىرلەش ۋە ئۆچۈرۈش مەشغۇلاتى ئېلىپ بارالمايسىز.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"چاپلاق بوغچىڭىز قۇرۇلۇۋاتىدۇ",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$total$/$count$ يۈكلەندى",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"مۇبارەك بولسۇن! بىر چاپلاق بوغچىسى قۇردىڭىز.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"چاپلاق سىنبەلگىسى ئارقىلىق يېڭى چاپلاقلىرىڭىزنى كۆرەلەيسىز ياكى تۆۋەندىكى ئۇلانما ئارقىلىق ئۇلارنى دوستلىرىڭىز بىلەن ئورتاقلىشالايسىز.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"خەتكۈچ $hashtag$ ئىشلىتىپ، باشقىلارنىڭ سىز ئاشكارا ئېلان قىلماقچى بولغان خاس چاپلاق بوغچىسىنىڭ URL ئۇلانمىلىرىنى تېپىشىغا ياردەم قىلالايسىز.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"چاپلاق بوغچىسى URL ئۇلانمىسى",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"ئورنات",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"يەنە بىر چاپلاق بوغچىسى قۇرۇش",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"مەن Signal ئۈچۈن قۇرغان بۇ چاپلاق بوغچىسىنى كۆرۈپ بېقىڭ. #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, other {{count,number} رەسىم قوشۇلدى}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"ھازىرچە كارتون ئۇسلۇبىنى قوللىمايدۇ",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"تاشلىغان رەسىم بەك چوڭ",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"رەسىم بىر تەرەپ قىلىشتا خاتالىق كۆرۈلدى",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"كارتون PNG رەسىملىرى چوقۇم تىك تۆتبۇلۇڭ شەكلىدە بولۇشى كېرەك",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"كارتون رەسىملەر چوقۇم توختىماي تەكرار مىدىرلىشى كېرەك",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"كارتون PNG رەسىمنىڭ ئۆلچىمى بەك چوڭ",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"كارتون PNG رەسىمنىڭ ئۆلچىمى بەك كىچىك",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"رەسىم يۈكلەش خاتالىقى: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"مۇلازىمىتېرغا ئۇلىنالمىدى: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"سالاھىيەت ئۇچۇرلىرىنىڭ ۋاقتى ئۆتكەچكە رەسىملەر يۈكلەنمىدى. تور بەتنى Signal ئۈستەليۈزى نەشرىدە قايتا ئېچىڭ.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"ئۇلانما كۆچۈرۈلدى",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"ئوچۇق ئۇسلۇبدىكى چاپلاقلىرىم",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"قاراڭغۇ ئۇسلۇبدىكى چاپلاقلىرىم",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"چاپلاق بوغچىسى قۇرغۇچىنى ئىشلىتىش ئۈچۈن تېلېفونىڭىز ۋە كومپيۇتېرىڭىزغا Signal نى سەپلەڭ",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:o,CustomizingPreferredReactions__title:i,"ArtFrame--emoji-name-placeholder":{message:"Emoji ئىسمى",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{i as CustomizingPreferredReactions__title,o as EmojiButton__label,t as cancel,a as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"Annulla"},i={message:"$minutes$ min",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},r={message:"Emoji",description:"Label for emoji button"},o={message:"Personalizza reazioni",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},a={smartling:e,"index--title":{message:"Creatore di sticker"},"index--create-sticker-pack":{message:"Crea un nuovo pacchetto di sticker"},"SignIn--title":{message:"Crea un pacchetto di sticker",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Come qualsiasi contenuto su Signal, anche gli sticker sono crittografati. Usa questo strumento per creare dei pacchetti di sticker personalizzati.",description:"A body of SignIn page"},"SignIn--qr":{message:"Codice per l'accesso",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"Apri Signal sul desktop per iniziare",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"Spiacenti, il tuo browser non è supportato. Apri il link in Firefox o Chrome",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:i,"EmojiPicker--empty":{message:"Nessuna emoji trovata",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"Cerca emoji",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"Tonalità pelle $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"Faccine e Persone",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"Animali e Natura",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"Cibo e Bevande",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"Viaggi e Luoghi",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"Attività",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"Oggetti",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"Simboli",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"Bandiere",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Creatore di Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Creatore di pacchetti di adesivi di Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Logo Signal",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Linee guida per la creazione di pacchetti di sticker",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"Fai clic per aggiungere o rilascia le immagini qui",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"Rilascia le immagini qui",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"Pacchetto di sticker",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"Pacchetto di sticker",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"Annulla",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"Copia",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"Avanti",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"Indietro",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"Aggiungi i tuoi sticker",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"Rimuovi immagine",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"Clicca o trascina un file per aggiungere uno sticker",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"Gli sticker devono essere in formato PNG, APNG o WebP con uno sfondo trasparente e 512x512 pixel. Il margine consigliato è di 16px.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"Visualizza i margini",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"Aggiungi un'emoji a ogni sticker",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"Questo ci permette di suggerirti gli adesivi mentre stai inviando messaggi.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"Solo qualche altro dettaglio…",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"Titolo",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"Dai un nome al tuo pacchetto di sticker",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"Autore",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"Inserisci un nome per salvare gli sticker come",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"Immagine di copertina",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"Questa è l'immagine che apparirà quando condividi il tuo pacchetto di adesivi",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"Confermi di voler caricare il tuo pacchetto di sticker?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"Carica",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"Dopo la creazione del pacchetto di sticker, non sarà più possibile eliminare nulla o effettuare modifiche.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"Creazione del tuo pacchetto di sticker in corso",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$count$ di $total$ caricati",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"Congratulazioni! Hai creato un pacchetto di sticker.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"Accedi ai tuoi nuovi sticker tramite l'apposita icona o condividili con i tuoi amici con il link in basso.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"Usa l'hashtag $hashtag$ per aiutare altre persone a trovare gli URL per ogni pacchetto di sticker personalizzato che vuoi rendere pubblico.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"URL pacchetto sticker",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"Installa",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"Crea un altro pacchetto di sticker",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Dai un'occhiata a questo nuovo pacchetto di adesivi che ho creato per Signal. #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {Aggiunta 1 immagine} other {Aggiunte {count,number} immagini}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"I contenuti animati non sono supportati al momento",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"L'immagine caricata è troppo grande",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"Errore nell'elaborazione dell'immagine",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"Le immagini animate in PNG devono essere quadrate",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"Le immagini animate devono essere in loop",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"Le dimensioni dell'immagine animata in PNG sono troppo grandi",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"Le dimensioni dell'immagine animata in PNG sono troppo piccole",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"Errore nel caricamento delle immagini: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"Impossibile connettersi al server: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"Non è stato possibile caricare le immagini a causa delle credenziali scadute. Entra di nuovo sul sito dall'app per desktop di Signal.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"Link copiato",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"Il mio sticker con tema chiaro",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"Il mio sticker con tema scuro",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"Installa Signal sul tuo telefono e sul desktop per usare il creatore di pacchetti di adesivi",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:r,CustomizingPreferredReactions__title:o,"ArtFrame--emoji-name-placeholder":{message:"Nome emoji",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{o as CustomizingPreferredReactions__title,r as EmojiButton__label,t as cancel,a as default,i as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"ביטול"},r={message:"$minutes$ דק׳",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},o={message:"אימוג'י",description:"Label for emoji button"},i={message:"תגובות מותאמות אישית",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},a={smartling:e,"index--title":{message:"צייר הסטיקרים"},"index--create-sticker-pack":{message:"יצירת חבילת סטיקרים חדשה"},"SignIn--title":{message:"יצירת חבילת סטיקרים",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"ממש כמו עם כל דבר אחר ב–Signal, גם הסטיקרים מוצפנים. אפשר להשתמש בכלי הזה כדי ליצור חבילות סטיקרים משלך.",description:"A body of SignIn page"},"SignIn--qr":{message:"קוד התחברות",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"פתיחת Signal לשולחן עבודה כדי להתחיל",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"מצטערים, הדפדפן שלך לא נתמך. צריך לפתוח את הלינק הזה ב–Firefox או Chrome",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"לא נמצא אימוג׳י",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"חיפוש אמוג'י",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"גוון עור $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"סמיילים ואנשים",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"חיות וטבע",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"אוכל ושתייה",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"טיול ומקומות",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"פעילויות",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"חפצים",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"סמלים",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"דגלים",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"הצייר של Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"יוצר חבילות הסטיקרים של Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"לוגו Signal",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"הנחיות של יוצר חבילות הסטיקרים",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"אפשר ללחוץ כדי להוסיף או לגרור תמונות לכאן",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"אפשר לגרור תמונות לכאן",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"חבילת סטיקרים",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"חבילת סטיקרים",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"ביטול",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"העתקה",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"המשך",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"חזרה",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"הוספת הסטיקרים שלך",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"הסרת תמונה",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"צריך ללחוץ או לגרור ולשחרר קובץ כדי להוסיף סטיקר",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"סטיקרים חייבים להיות בפורמט PNG, APNG, או WebP עם רקע שקוף וברזולוציה של 512x512 פיקסלים. אנחנו ממליצים על שוליים של 16 פיקסלים.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"הצגת שוליים",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"הוספת אימוג'י לכל סטיקר",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"זה מאפשר לנו להציע לך סטיקרים במהלך ההתכתבות.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"רק עוד כמה פרטים…",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"כותרת",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"שם חבילת הסטיקרים שלך",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"יוצר/ת",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"יש להכניס שם שתחתיו יפורסמו הסטיקרים",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"תמונת נושא",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"זאת התמונה שתופיע בזמן שיתוף חבילת הסטיקרים שלך",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"בטוח שבא לך להעלות את חבילת הסטיקרים שלך?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"העלאה",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"לא תהיה לך יותר אפשרות לערוך או למחוק לאחר יצירת חבילת סטיקרים.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"יוצרים את חבילת הסטיקרים שלך",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$count$ מתוך $total$ הועלו",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"מזל טוב! יצרת חבילת סטיקרים.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"אפשר לגשת לסטיקרים החדשים שלך דרך סמל הסטיקר, או לשתף עם חברים באמצעות שימוש בקישור שלמטה.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"אפשר להשתמש בהאשטג $hashtag$ כדי לעזור לאנשים אחרים למצוא את כתובות ה–URL של חבילות הסטיקרים שלך שבא לך להפוך לציבוריות.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"כתובת URL של חבילת הסטיקרים",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"התקן",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"יצירת חבילת סטיקרים נוספת",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"תראו את חבילת הסטיקרים החדשה הזאת שיצרתי ל–Signal. #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {נוספה תמונה 1} two {נוספו {count,number} תמונות} many {נוספו {count,number} תמונות} other {נוספו {count,number} תמונות}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"אנימציה לא נתמכת כרגע",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"התמונה שנגררה גדולה מדי",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"שגיאה בעיבוד תמונה",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"תמונות PNG מונפשות חייבות להיות בצורת ריבוע",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"תמונות מונפשות צריכות להיות בלופ אינסופי",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"הממדים של תמונת PNG מונפשת גדולים מדי",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"הממדים של תמונת PNG מונפשת קטנים מדי",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"שגיאה בהעלאת תמונות: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"לא ניתן להתחבר לשרת: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"העלאת התמונות נכשלה עקב אישורים שאינם בתוקף. יש לפתוח את האתר מחדש מתוך Signal לשולחן עבודה.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"לינק הועתק",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"הסטיקר שלי בערכת נושא בהירה",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"הסטיקר שלי בערכת נושא כהה",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"צריך להגדיר את Signal בטלפון שלך ובשולחן העבודה כדי להשתמש ביוצר חבילות הסטיקרים",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:o,CustomizingPreferredReactions__title:i,"ArtFrame--emoji-name-placeholder":{message:"שם אימוג׳י",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{i as CustomizingPreferredReactions__title,o as EmojiButton__label,t as cancel,a as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"Otkaži"},a={message:"$minutes$m",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},i={message:"Emoji sličice",description:"Label for emoji button"},r={message:"Prilagodi reakcije",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},o={smartling:e,"index--title":{message:"Sticker Art Creator"},"index--create-sticker-pack":{message:"Kreirajte novi paket naljepnica"},"SignIn--title":{message:"Kreirajte paket naljepnica",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Kao i sve ostalo u Signalu, i naljepnice su šifrirane. Koristite ovaj alat da kreirate vlastite prilagođene pakete naljepnica.",description:"A body of SignIn page"},"SignIn--qr":{message:"Kȏd za prijavu",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"Da počnete, otvorite Signal Desktop",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"Žao nam je, vaš pretraživač nije podržan. Otvorite ovu vezu u Firefoxu ili Chrome-u",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:a,"EmojiPicker--empty":{message:"Nije pronađena nijedna emoji sličica",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"Pretražite emoji sličice",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"Boja kože $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"Smješko i osobe",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"Životinje i priroda",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"Hrana i piće",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"Putovanje i mjesta",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"Aktivnosti",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"Predmeti",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"Simboli",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"Zastave",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Signal Art kreator",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Signal kreator paketa naljepnica",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Logotip Signala",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Smjernice za kreator paketa naljepnica",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"Kliknite da dodate ili ispustite slike ovdje",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"Ispustite slike ovdje",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"Paket naljepnica",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"Paket naljepnica",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"Otkaži",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"Kopiraj",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"Dalje",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"Natrag",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"Dodajte svoje naljepnice",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"Ukloni sliku",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"Kliknite ili prevucite/ispustite datoteku da dodate naljepnicu",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"Naljepnice moraju biti u PNG, APNG ili WebP formatu s providnom pozadinom i 512x512 piksela. Preporučena margina je 16px.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"Prikaži margine",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"Dodajte emoji sličicu na svaku naljepnicu",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"Na taj način vam možemo predložiti naljepnice dok razmjenjujete poruke.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"Još samo nekoliko detalja…",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"Naslov",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"Dajte naziv paketu naljepnica",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"Autor",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"Unesite naziv pod kojim ćete poslati svoje naljepnice",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"Naslovna slika",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"Ova slika će se pojaviti kada podijelite paket naljepnica",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"Jeste li sigurni da želite preuzeti paket naljepnica?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"Preuzmi",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"Kada kreirate paket naljepnica više nećete moći uređivati niti brisati naljepnice.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"Kreiranje paketa naljepnica",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"Preuzeto: $count$ od $total$",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"Čestitamo! Kreirali ste paket naljepnica.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"Pristupite novim naljepnicama pomoću ikone naljepnice, ili ih dijelite s prijateljima pomoću linka u nastavku.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"Koristite hashtag $hashtag$ da druge osobe lakše pronađu URL-ove za bilo koji prilagođeni paket naljepnica za koji želite da bude javno dostupan.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"URL paketa naljepnica",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"Instaliraj",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"Kreirajte drugi paket naljepnica",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Pogledaj ovaj novi paket naljepnica koji sam kreirao/la za Signal. #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {Dodana je 1 slika} few {Dodane su {count,number} slike} many {Dodano je {count,number} slika} other {Dodano je {count,number} slika}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"Animirana umjetnost trenutno nije podržana",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"Slika koju ste ispustili je prevelika",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"Greška prilikom obrade slike",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"Animirane PNG slike moraju biti kvadratnog oblika",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"Animirane slike moraju se stalno ponavljati",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"Dimenzije animirane PNG slike su prevelike",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"Dimenzije animirane PNG slike su premale",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"Greška prilikom otpremanja slika: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"Nije moguće povezati se sa serverom: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"Otpremanje slika nije uspjelo zbog isteklih akreditiva. Ponovo otvorite web stranicu sa Signal Desktopa.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"Link je kopiran",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"Moja naljepnica u svijetloj temi",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"Moja naljepnica u tamnoj temi",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"Postavite Signal na telefonu i računaru da koristite Kreator paketa naljepnica",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:i,CustomizingPreferredReactions__title:r,"ArtFrame--emoji-name-placeholder":{message:"Pseudonim emoji sličice",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{r as CustomizingPreferredReactions__title,i as EmojiButton__label,t as cancel,o as default,a as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"取消"},r={message:"$minutes$ 分鐘前",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},o={message:"表情符號",description:"Label for emoji button"},i={message:"自訂心情回應",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},a={smartling:e,"index--title":{message:"貼圖包藝術製作器"},"index--create-sticker-pack":{message:"建立新嘅貼圖包"},"SignIn--title":{message:"建立貼圖包",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"同其他 Signal 內容一樣,貼圖都有經過加密。你可以用呢個工具嚟建立自訂貼圖包。",description:"A body of SignIn page"},"SignIn--qr":{message:"登入代碼",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"打開 Signal 桌面版就可以開始",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"唔好意思,系統唔支援你嘅瀏覽器。請你用 Firefox 或者 Chrome 開啟呢條連結",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"搵唔到表情符號",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"搵表情符號",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"膚色 $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"公仔同人像",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"動物同大自然",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"飲飲食食",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"出行",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"活動",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"物件",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"符號",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"旗幟",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Signal 藝術製作器",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Signal 貼圖包製作器",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Signal 標誌",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"貼圖包製作器指南",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"㩒一吓喺呢度加入或者放置圖像",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"喺呢度放置圖像",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"貼圖包",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"貼圖包",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"取消",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"複製",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"下一步",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"返轉頭",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"加入你嘅貼圖",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"移除圖片",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"㩒一吓或者拖放檔案嚟加入貼圖",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"貼圖一定要用 512x512 像素同埋透明背景嘅 PNG、APNG 或者 WebP 格式。建議邊界係 16 像素。",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"檢視邊距",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"幫每個貼圖加一個表情符號",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"咁我哋就可以喺你傳送訊息嘅時候建議貼圖俾你喇。",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"要多少少細節...",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"標題",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"為你嘅貼圖包命名",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"作者",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"輸入名稱嚟提交你嘅貼圖",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"封面圖片",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"呢張圖片會喺你分享貼圖包嘅時候顯示",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"你係咪確定要上載貼圖包?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"上載",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"建立咗貼圖包之後,你就唔可以再編輯或者刪除佢㗎喇。",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"建立緊你嘅貼圖包",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"上載咗 $total$ 個貼圖,總共有 $count$ 個",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"恭喜你!你已經成功建立咗貼圖包喇。",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"你可以喺貼圖圖示度搵到你嘅新貼圖,或者用下面條連結同朋友分享。",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"如果你想公開俾人用自訂嘅貼圖包,可以加個 $hashtag$ 主題標籤,方便其他人搵到貼圖包嘅 URL。",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"貼圖包網址",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"安裝",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"建立另一個貼圖包",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"嚟睇吓我新製作嘅 Signal 貼圖包啦。#makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, other {加入咗 {count,number} 張圖片}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"系統目前唔支援動態藝術",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"你放置嘅圖像太大喇",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"處理唔到圖像",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"動態 PNG 圖片一定要係正方形",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"動態圖片一定要循環播放",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"動態 PNG 圖片尺寸太大",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"動態 PNG 圖片尺寸太細",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"圖片上載錯誤:$message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"連接唔到伺服器:$message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"由於憑證過期,所以上載唔到圖片。請你喺 Signal 桌面版重新開啟網站。",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"複製咗連結",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"淺色主題嘅貼圖效果",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"深色主題嘅貼圖效果",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"如果要用貼圖包製作工具嘅話,請你喺手機同桌面電腦設定 Signal。",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:o,CustomizingPreferredReactions__title:i,"ArtFrame--emoji-name-placeholder":{message:"表情符號別名",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{i as CustomizingPreferredReactions__title,o as EmojiButton__label,t as cancel,a as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"لغو"},r={message:"$minutes$ دقیقه پیش",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},o={message:"ایموجی",description:"Label for emoji button"},i={message:"سفارشی‌سازی واکنش‌ها",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},a={smartling:e,"index--title":{message:"سازنده استیکر هنری"},"index--create-sticker-pack":{message:"بسته استیکر جدیدی بسازید"},"SignIn--title":{message:"ساختن یک بسته استیکر",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"مانند هر چیز دیگری در سیگنال، استیکرها هم رمزگذاری‌شده هستند. با استفاده از این ابزار، بسته‌های استیکر سفارشی خودتان را بسازید.",description:"A body of SignIn page"},"SignIn--qr":{message:"کد ورود",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"برای شروع، سیگنال دسکتاپ را باز کنید",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"متأسفانه مرورگر شما پشتیبانی نمی‌شود. لطفاً این پیوند را در فایرفاکس یا کروم باز کنید",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"ایموجی پیدا نشد",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"جستجوی ایموجی",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"رنگ پوست $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"لبخندها و آدم‌ها",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"حیوانات و طبیعت",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"غذا و نوشیدنی",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"سفر و مکان‌ها",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"فعالیت‌ها",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"اشیا",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"نمادها",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"پرچم‌ها",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"سازنده هنری سیگنال",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"سازنده بسته استیکر سیگنال",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"لوگوی سیگنال",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"راهنمای سازنده بسته استیکر",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"برای افزودن عکس‌ها کلیک کنید یا آن‌ها را اینجا رها کنید",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"عکس‌ها را اینجا رها کنید",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"بسته استیکر",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"بسته استیکر",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"لغو",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"کپی",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"فیس‌بوک",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"توییتر",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"پینترست",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"واتس‌اپ",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"بعدی",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"بازگشت",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"استیکرهای خود را اضافه کنید",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"حذف تصویر",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"برای افزودن استیکر، کلیک کنید یا فایل را اینجا بکشید/رها کنید",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"استیکرها باید در قالب PNG، APNG، یا WebP با پس‌زمینه شفاف و ۵۱۲ در ۵۱۲ پیکسل باشند. حاشیه توصیه‌شده ۱۶ پیکسل است.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"مشاهده حاشیه‌ها",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"یک ایموجی به هر استیکر اضافه کنید",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"این کار به ما امکان می‌دهد که وقتی در حال ارسال پیام هستید، استیکرها را به شما پیشنهاد کنیم.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"فقط چند جزئیات دیگر...",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"عنوان",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"بسته استیکر خود را نام‌گذاری کنید",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"سازنده",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"یک نام وارد کنید تا استیکرهایتان تحت آن ارسال شوند",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"تصویر جلد",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"این تصویری است که وقتی بسته استیکرتان را به اشتراک می‌گذارید نشان داده خواهد شد",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"مطمئن هستید که می‌خواهید بسته استیکر خود را بارگذاری کنید؟",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"بارگذاری",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"پس از ساختن بسته استیکر، دیگر قادر به ویرایش و حذف آن نخواهید بود.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"در حال ساختن بسته استیکر شما",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$count$ از $total$ بارگذاری شد",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"تبریک! یک بسته استیکر ساختید.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"از طریق نماد استیکر به استیکرهای جدیدتان دسترسی پیدا کنید، یا آن‌ها را از طریق پیوند زیر با دوستانتان به اشتراک بگذارید.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"با استفاده از هشتگ $hashtag$ به دیگران در پیدا کردن نشانی اینترنتی بسته‌های استیکر سفارشی که می‌خواهید در دسترس عموم باشد کمک کنید.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"نشانی اینترنتی بسته استیکر",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"نصب",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"یک بسته استیکر دیگر بسازید",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"این بسته استیکر جدید که برای سیگنال ساختم را ببینید. #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {۱ تصویر اضافه شد} other {{count,number} تصویر اضافه شد}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"هنر پویانمایی در حال حاضر پشتیبانی نمی‌شود",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"تصویر رهاشده بیش‌ازحد بزرگ است",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"خطا در پردازش تصویر",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"تصاویر متحرک PNG باید مربع باشند",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"تصاویر متحرک باید پیوسته و ابدی تکرار شوند",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"ابعاد تصویر متحرک PNG بیش‌ازحد بزرگ است",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"ابعاد تصویر متحرک PNG بیش‌ازحد کوچک است",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"خطا در بارگذاری تصاویر: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"اتصال به سرور امکان‌پذیر نیست: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"به دلیل منقضی شدن مشخصات ورود، بارگذاری تصویر انجام نشد. لطفاً وب‌سایت را دوباره از سیگنال دسکتاپ باز کنید.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"پیوند کپی شد",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"استیکر من در طرح زمینه روشن",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"استیکر من در طرح زمینه تیره",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"برای استفاده از سازنده بسته استیکر، لطفاً سیگنال را روی تلفن و دسکتاپ خود راه‌اندازی کنید",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:o,CustomizingPreferredReactions__title:i,"ArtFrame--emoji-name-placeholder":{message:"نام مستعار ایموجی",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{i as CustomizingPreferredReactions__title,o as EmojiButton__label,t as cancel,a as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"Бас тарту"},r={message:"$minutes$ мин",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},o={message:"Эмодзи",description:"Label for emoji button"},i={message:"Реакцияларды бейімдеу",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},a={smartling:e,"index--title":{message:"Стикерлер өнерінің авторы"},"index--create-sticker-pack":{message:"Жаңа стикерлер жинағын жасау"},"SignIn--title":{message:"Стикерлер жинағын жасау",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Signal-дағы барлық ақпарат сияқты стикерлер де шифрланған. Осы құрал көмегімен өзіңіздің қалаған стикерлер жинағыңызды жасаңыз.",description:"A body of SignIn page"},"SignIn--qr":{message:"Кіру коды",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"Бастау үшін Signal-дың компьютерлік нұсқасын ашыңыз",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"Кешіріңіз, браузеріңізге қолдау көрсетілмейді. Бұл сілтемені Firefox немесе Chrome браузерінен ашыңыз",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"Эмодзи табылмады",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"Эмодзиді іздеу",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"Тері реңкі $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"Смайлдар және адамдар",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"Жан-жануарлар және табиғат",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"Тағамдар мен сусындар",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"Саяхат және қызықты жерлер",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"Іс-әрекет",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"Заттар",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"Белгілер",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"Тулар",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Signal-дағы өнер туындылары авторы",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Signal стикерлер жинағының авторы",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Signal логотипі",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Стикерлер жинағының авторына арналған нұсқаулар",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"Суреттерді осы жерге қосу немесе сүйреп әкелу үшін басыңыз",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"Суреттерді осы жерге сүйреп әкеліңіз",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"Стикерлер жинағы",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"Стикерлер жинағы",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"Бас тарту",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"Көшіру",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"Келесі",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"Артқа",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"Стикерлер қосу",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"Суретті өшіру",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"Стикер қосу үшін файлды басыңыз немесе сүйреп әкеліңіз",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"Стикерлер PNG, APNG немесе WebP форматында фонсыз және 512x512 пиксель болуы керек. Ұсынылатын жиек – 16 пиксель.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"Жиектерді көру",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"Әрбір стикерге эмодзи қосу",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"Бұл хат алмасу кезінде сізге стикерлер ұсынуға мүмкіндік береді.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"Тағы бірнеше мәлімет...",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"Тақырып",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"Стикерлер жинағыңызға ат беріңіз",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"Автор",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"Стикерлерді қандай атпен жіберетініңізді енгізіңіз",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"Мұқаба суреті",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"Бұл – стикерлер жинағын бөліскен кезде көрсетілетін сурет",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"Стикерлер жинағыңызды жүктеп салуға сенімдісіз бе?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"Жүктеп салу",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"Стикерлер жинағын жасағаннан кейін өңдей немесе жоя алмайсыз.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"Стикерлер жинағын жасау",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$count$ / $total$ жүктеп салынды",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"Құттықтаймыз! Сіз стикерлер жинағын жасадыңыз.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"Стикер белгішесін басып, жаңа стикерлерді көріңіз немесе төменгі сілтеме арқылы достарыңызбен бөлісіңіз.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"Басқа адамдар да сіздің жалпыға қолжетімді еткіңіз келетін кез келген реттелмелі стикер жинақтарының URL мекенжайларын табуы үшін $hashtag$ хэштегін пайдаланыңыз.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"Стикерлер жинағының URL мекенжайы",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"Орнату",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"Басқа стикерлер жинағын жасау",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Мен Signal үшін жасаған жаңа стикерлер жинағымды көріңіз. #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {1 сурет қосылды} other {{count,number} сурет қосылды}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"Анимациялық өнер туындысына қазір қолдау көрсетілмейді",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"Сүйреп қойылған сурет тым үлкен",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"Суретті өңдеу кезінде қате шықты",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"Анимациялық PNG суретері шаршы пішіндес болуы тиіс",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"Анимациялық суреттер тоқтамай ойнап тұруы керек",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"Анимациялық PNG суреттерінің өлшемдері тым үлкен",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"Анимациялық PNG суреттерінің өлшемдері тым кішкентай",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"Суреттерді жүктеп салу кезінде қате шықты: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"Серверге қосылу мүмкін емес: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"Жүйеге кіру деректерінің мерзімі өтіп кеткендіктен, суреттер жүктеп салынбады. Signal-дың компьютердегі нұсқасымен веб-сайтты қайта ашыңыз.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"Сілтеме көшірілді",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"Жарық тақырыбындағы менің стикерім",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"Күңгірт тақырыбындағы менің стикерім",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"Стикерлер жинағының генераторын пайдалану үшін телефоныңыз бен компьютеріңізге Signal қолданбасын орнатыңыз",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:o,CustomizingPreferredReactions__title:i,"ArtFrame--emoji-name-placeholder":{message:"Эмодзидің лақап аты",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{i as CustomizingPreferredReactions__title,o as EmojiButton__label,t as cancel,a as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"Mégsem"},a={message:"$minutes$ p",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},r={message:"Hangulatjel",description:"Label for emoji button"},o={message:"Egyedi reakciók",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},i={smartling:e,"index--title":{message:"Matricakészítő"},"index--create-sticker-pack":{message:"Új matricacsomag létrehozása"},"SignIn--title":{message:"Hozz létre egy matricacsomagot",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Csakúgy, mint minden másnál a Signalban, a matricák is titkosítottak. Ezzel az eszközzel saját egyéni matricacsomagokat hozhatsz létre.",description:"A body of SignIn page"},"SignIn--qr":{message:"Bejelentkezési kód",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"A kezdéshez nyisd meg a Signal asztali gépről elérhető alkalmazását",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"Sajnáljuk, a böngésződ nem támogatott. Kérjük, nyisd meg ezt a hivatkozást Firefoxban vagy Chrome-ban",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:a,"EmojiPicker--empty":{message:"Nem található hangulatjel",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"Hangulatjel keresése",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"Bőrszín: $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"Smiley-k és emberek",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"Állatok és természet",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"Étel-ital",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"Utazás és helyek",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"Tevékenységek",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"Tárgyak",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"Szimbólumok",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"Zászlók",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Signal Matricakészítő",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Signal matricacsomag-készítő",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Signal-logó",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Matricacsomag-készítési útmutató",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"A hozzáadáshoz kattints ide, vagy húzd be a képeket",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"Húzd ide a képeket",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"Matricacsomag",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"Matricacsomag",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"Mégse",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"Másolás",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"Következő",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"Vissza",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"Add hozzá a saját matricáidat",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"Kép eltávolítása",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"Matrica hozzáadásához kattints ide, vagy húzz be egy fájlt",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"A matricáknak PNG, APNG vagy WebP formátumúnak kell lenniük, és átlátszó háttérrel, valamint 512x512 pixeles mérettel kell rendelkezniük. A margó javasolt mérete 16px.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"Margók megtekintése",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"Adj hangulatjelet az összes matricához",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"Ez lehetővé teszi számunkra, hogy beszélgetés közben matricákat javasoljunk neked.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"Már csak néhány dolog hiányzik…",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"Cím",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"Nevezd el a matricacsomagod",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"Alkotó",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"Adj meg egy nevet a matricák beküldéséhez",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"Borítókép",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"Ez a kép fog megjelenni a matricacsomag megosztása során",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"Biztosan fel szeretnéd tölteni a matricacsomagodat?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"Feltöltés",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"A matricacsomag létrehozását követően már nem lesz lehetőséged szerkesztésre vagy törlésre.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"Matricacsomag létrehozása",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$count$/$total$ feltöltve",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"Gratulálunk! Létrehoztál egy matricacsomagot.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"Az új matricákhoz a matrica ikonnal férhetsz hozzá, de megoszthatod a lenti hivatkozás segítségével is.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"Használd a(z) $hashtag$ hashtaget, hogy mások is megtalálják az olyan egyéni matricacsomagjaidat, amelyeket nyilvánosan meg szeretnél osztani.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"Matricacsomag URL",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"Telepítés",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"Újabb matricacsomag létrehozása",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Nézd meg az új Signal-matricacsomagomat! #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {1 kép hozzáadva} other {{count,number} kép hozzáadva}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"Az animált kép jelenleg nem támogatott",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"A behúzott kép mérete túl nagy",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"Hiba történt a kép feldolgozása során",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"Az animált PNG-képeknek négyzet alakúaknak kell lenniük",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"Az animált képeknek folyamatosan kell futniuk",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"Az animált PNG-kép méretei túl nagyok",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"Az animált PNG-kép méretei túl kicsik",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"Hiba a képek feltöltésekor: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"Nem lehet csatlakozni a következő szerverhez: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"A lejárt hitelesítő adatok miatt nem sikerült feltölteni a képeket. Nyisd meg újra a weboldalt a Signal Desktopból.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"Hivatkozás másolva",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"Matricám a világos témában",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"Matricám a sötét témában",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"A Signal matricacsomag-készítő használatához állítsd be a Signalt a telefonodon, valamint az asztali alkalmazáson is",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:r,CustomizingPreferredReactions__title:o,"ArtFrame--emoji-name-placeholder":{message:"Hangulatjel név",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{o as CustomizingPreferredReactions__title,r as EmojiButton__label,t as cancel,i as default,a as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"Cancelar"},r={message:"$minutes$ min",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},a={message:"Emoji",description:"Label for emoji button"},o={message:"Personalizar reações",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},i={smartling:e,"index--title":{message:"Criador de figurinhas"},"index--create-sticker-pack":{message:"Criar novo pacote de figurinhas"},"SignIn--title":{message:"Crie um pacote de figurinhas",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"As figurinhas também são criptografadas, como tudo no Signal. Use essa ferramenta para criar seus próprios pacotes personalizados de figurinhas.",description:"A body of SignIn page"},"SignIn--qr":{message:"Código de login",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"Abrir Signal Desktop para começar",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"Desculpe, seu navegador não é compatível. Abra este link no Firefox ou no Chrome",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"Nenhum emoji encontrado",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"Pesquisar emojis",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"Tom de pele $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"Emojis e pessoas",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"Animais e Natureza",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"Comidas e Bebidas",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"Viagens e Lugares",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"Atividades",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"Objetos",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"Símbolos",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"Bandeiras",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Criador de arte do Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Criador de pacotes de figurinhas do Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Logotipo do Signal",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Diretrizes de Criação de pacotes de figurinhas",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"Clique para adicionar imagens ou solte-as aqui",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"Solte imagens aqui",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"Pacote de figurinhas",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"Pacote de figurinhas",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"Cancelar",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"Copiar",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"Avançar",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"Voltar",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"Adicionar suas figurinhas",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"Remover imagem",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"Clique para adicionar uma figurinha ou arraste e solte-a aqui",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"As figurinhas precisam estar no formato PNG, APNG ou WebP com um fundo transparente e tamanho de 512x512 pixels. A margem recomendada é de 16px.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"Ver margens",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"Adicione um emoji para cada figurinha",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"Assim, poderemos sugerir figurinhas pra você no chat.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"Só mais alguns detalhes…",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"Título",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"Dê um nome ao seu pacote de figurinhas",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"Autor",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"Digite um nome para ficar associado quando enviar suas figurinhas",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"Cobrir imagem",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"Essa será a imagem exibida quando você compartilhar seu pacote de figurinhas",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"Tem certeza que deseja carregar seu pacote de figurinhas?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"Carregar",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"Você não poderá mais editar ou excluir depois de criar o pacote de figurinhas.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"Criando seu pacote de figurinhas",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$count$ de $total$ enviadas",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"Parabéns! Você criou um pacote de figurinhas.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"Acesse suas novas figurinhas por meio do ícone de figurinha, ou compartilhe com seus amigos pelo link abaixo.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"Use a hashtag $hashtag$ para ajudar outras pessoas a encontrar as URLs para qualquer pacote de figurinhas personalizado que você gostaria de tornar acessível ao público.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"URL do pacote de figurinhas",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"Instalar",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"Criar outro pacote de figurinhas",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Dê uma olhada nesse novo pacote de figurinhas que criei para o Signal. #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {1 imagem adicionada} other {{count,number} imagens adicionadas}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"No momento, ainda não suportamos animação",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"A imagem enviada é muito grande",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"Erro ao processar imagem",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"As imagens PNG animadas precisam ser quadradas",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"As imagens animadas precisam ter uma repetição constante",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"As dimensões da imagem PNG são muito grandes",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"As dimensões da imagem PNG são muito pequenas",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"Erro ao carregar imagem: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"Não foi possível conectar ao servidor: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"Falha ao carregar imagens devido a credenciais expiradas. Abra novamente o site no Signal Desktop.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"Link copiado",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"Minha figurinha no tema claro",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"Minha figurinha no tema escuro",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"Configure o Signal no seu telefone e desktop para usar o Criador de pacote de figurinhas",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:a,CustomizingPreferredReactions__title:o,"ArtFrame--emoji-name-placeholder":{message:"Nome do emoji",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{o as CustomizingPreferredReactions__title,a as EmojiButton__label,t as cancel,i as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"Ləğv et"},r={message:"$minutes$dəq",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},i={message:"Emoji",description:"Label for emoji button"},a={message:"Reaksiyaları fərdiləşdirin",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},o={smartling:e,"index--title":{message:"Stiker təsvir yaradıcısı"},"index--create-sticker-pack":{message:"Yeni stiker paketi yarat"},"SignIn--title":{message:"Bir stiker paketi yarat",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Signal-dakı hər şeydə olduğu kimi, stikerlər də şifrəlidir. Sizə məxsus fərdi stiker paketləri yaratmaq üçün bu alətdən istifadə edin.",description:"A body of SignIn page"},"SignIn--qr":{message:"Giriş kodu",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"Başlamaq üçün Signal Desktop-u açın",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"Üzr istəyirik, brauzeriniz dəstəklənmir. Bu keçidi Firefox və ya Chrome-da açın",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"Heç bir emoji tapılmadı",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"Emoji axtar",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"Dəri tonu $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"Təbəssüm və insanlar",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"Heyvanlar və təbiət",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"Qida və içki",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"Səyahət və məkanlar",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"Fəaliyyətlər",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"Obyektlər",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"Simvollar",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"Bayraqlar",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Signal təsvir yaradıcısı",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Signal stiker paketi yaratma",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Signal loqosu",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Stiker paketi yaratma təlimatları",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"Əlavə etmək üçün klikləyin və ya təsvirləri dartaraq buraya buraxın",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"Təsvirləri bura gətir",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"Stiker paketi",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"Stiker paketi",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"Ləğv et",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"Kopyala",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"Növbəti",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"Geri",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"Stikerlərinizi əlavə edin",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"Şəkli sil",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"Bir stiker əlavə etmək üçün klikləyin və ya faylı dartaraq buraya buraxın",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"Stikerlər, 512x512 pikselində şəffaf bir arxa planda, PNG, APNG və ya WebP formatlarından birində olmalıdır. Tövsiyə edilən kənar boşluq 16 pikseldir.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"Kənar boşluqlarına bax",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"Hər stikerə bir emoji əlavə edin",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"Bu, mesajlaşmağa başladığınız zaman stikerlər təklif etməyimizə imkan verir.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"Çox az qaldı...",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"Başlıq",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"Stiker paketinizi adlandırın",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"Müəllif",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"Stikerlərinizi hansı ad altında təqdim edəcəyinizi seçin",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"Örtük şəkli",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"Bu, stiker paketinizi paylaşarkən görünəcək təsvirdir.",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"Stiker paketinizi yükləmək istədiyinizə əminsiniz?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"Yüklə",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"Bir stiker paketi yaratdıqdan sonra düzəliş edə və ya silə bilməyəcəksiniz.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"Stiker paketiniz yaradılır",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$count$ /$total$ yükləndi",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"Təbriklər! Bir stiker paketi yaratdınız.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"Yeni stikerlərinizə stiker piktoqramı vasitəsilə daxil olun və ya aşağıdakı bağlantıdan istifadə edərək dostlarınızla paylaşın.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"İctimaiyyətə açmaq istədiyiniz istənilən xüsusi stiker paketi URL-lərini hər kəsin tapa bilməsi üçün $hashtag$ heşteq etiketlərindən istifadə edin.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"Stiker paketinin URL-i",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"Quraşdır",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"Başqa stiker paketi yarat",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Signal üçün yaratdığım yeni stiker paketinə nəzər salın. #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {1 təsvir əlavə edildi} other {{count,number} təsvir əlavə edildi}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"Animasiyalı təsvirlər hazırda dəstəklənmir",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"Yükləmək istədiyiniz təsvir çox böyükdür",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"Təsvir emalı xətası",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"Animasiyalı PNG təsvirləri kvadrat olmalıdır",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"Animasiyalı təsvirlər hər tərəfə çevrilə bilməlidir",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"Animasiyalı PNG təsvirin ölçüləri çox böyükdür",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"Animasiyalı PNG təsvirin ölçüləri çox kiçikdir",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"Şəkilləri yükləyərkən xəta baş verdi: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"Serverə qoşulmaq mümkün deyil: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"İdentifikasiya göstəricilərinin müddəti bitdiyi üçün təsvirlər yüklənmədi. Signal Desktop-dan veb-saytı yenidən açın.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"Keçid kopyalandı",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"Stikerim açıq rəngli temadadır",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"Stikerim tünd rəngli temadadır",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"Stiker paket yaradıcısından istifadə etmək üçün Signal-ı telefonunuzda və masaüstündə quraşdırın",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:i,CustomizingPreferredReactions__title:a,"ArtFrame--emoji-name-placeholder":{message:"Emojinin şərti adı",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{a as CustomizingPreferredReactions__title,i as EmojiButton__label,t as cancel,o as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"రద్దు చేయండి"},r={message:"$minutes$ ని",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},o={message:"ఎమోజీ",description:"Label for emoji button"},i={message:"ప్రతిస్పందనలను అనుకూలపరచండి",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},a={smartling:e,"index--title":{message:"స్టిక్కర్ ఆర్ట్ క్రియేటర్"},"index--create-sticker-pack":{message:"కొత్త స్టిక్కర్ ప్యాక్‌ను సృష్టించండి"},"SignIn--title":{message:"స్టిక్కర్ ప్యాక్ సృష్టించండి",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Signal లో మిగతావాటి వలే, స్టిక్కర్‌లు కూడా ఎన్‌క్రిప్ట్ చేయబడ్డాయి. మీ స్వంత అనుకూల స్టిక్కర్ ప్యాక్‌లను సృష్టించడానికి ఈ సాధనాన్ని ఉపయోగించండి.",description:"A body of SignIn page"},"SignIn--qr":{message:"సైన్ ఇన్ కోడ్",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"ప్రారంభించడానికి Signal Desktop తెరవండి",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"క్షమించండి, మీ బ్రౌజర్‌కు మద్దతు ఇవ్వబడలేదు. దయచేసి ఈ లింక్‌ను Firefox లేదా Chrome లో తెరవండి",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"ఏ ఎమోజీ కనుగొనబడలేదు",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"ఎమోజీని వెతకండి",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"స్కిన్ టోన్ $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"స్మైలీస్ & ప్రజలు",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"జంతువులు & ప్రకృతి",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"ఆహారం & పానీయం",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"ప్రయాణం & ప్రదేశాలు",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"కార్యకలాపాలు",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"వస్తువులు",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"చిహ్నాలు",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"జెండాలు",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Signal ఆర్ట్ క్రియేటర్",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Signal స్టిక్కర్ ప్యాక్ క్రియేటర్",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Signal లోగో",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"స్టిక్కర్ ప్యాక్ క్రియేటర్ మార్గదర్శకాలు",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"చిత్రాలను ఇక్కడ జోడించడానికి లేదా డ్రాప్ చేయడానికి క్లిక్ చేయండి",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"చిత్రాలను ఇక్కడ డ్రాప్ చేయండి",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"స్టిక్కర్ ప్యాక్",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"స్టిక్కర్ ప్యాక్",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"రద్దు చేయండి",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"నకలు",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"తరువాత",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"వెనక్కు",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"మీ స్టిక్కర్‌లను జోడించండి",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"చిత్రాన్ని తొలగించండి",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"స్టిక్కర్ జోడించడానికి ఒక ఫైల్‌ను క్లిక్ చేయండి లేదా డ్రాగ్/డ్రాప్ చేయండి",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"స్టిక్కర్‌లు పారదర్శక బ్యాక్‌గ్రౌండ్ మరియు 512x512 పిక్సెల్‌లతో PNG, APNG లేదా WebP ఫార్మాట్‌లో తప్పనిసరిగా ఉండాలి. సిఫార్సు చేసిన మార్జిన్ 16px.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"మార్జిన్‌లను వీక్షించండి",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"ప్రతి స్టిక్కర్‌కు ఎమోజీని జోడించండి",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"మీరు సందేశం పంపేటప్పుడు మీకు స్టిక్కర్‌లను సూచించడానికి ఇది మమ్మల్ని అనుమతిస్తుంది.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"కేవలం మరికొన్ని వివరాలు...",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"శీర్షిక",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"మీ స్టిక్కర్ ప్యాక్‌కు పేరు పెట్టండి",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"రచయిత",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"కింద మీ స్టిక్కర్‌లను సమర్పించడానికి పేరును నమోదు చేయండి",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"కవర్ చిత్రం",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"మీరు మీ స్టిక్కర్ ప్యాక్‌ను పంచుకున్నప్పుడు చూపించబడే చిత్రం ఇది",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"మీరు ఖచ్చితంగా మీ స్టిక్కర్ ప్యాక్‌ను అప్‌లోడ్ చేయాలనుకుంటున్నారా?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"అప్‌లోడ్ చేయండి",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"స్టిక్కర్ ప్యాక్‌ను సృష్టించిన తర్వాత మీరు ఇకపై సవరణలు చేయలేరు లేదా తొలగించలేరు.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"మీ స్టిక్కర్ ప్యాక్‌ను సృష్టిస్తోంది",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$total$ లో $count$ అప్‌లోడ్ చేయబడింది",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"అభినందనలు! మీరు స్టిక్కర్ ప్యాక్‌ను సృష్టించారు.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"స్టిక్కర్ ఐకాన్ ద్వారా మీ కొత్త స్టిక్కర్‌లను యాక్సెస్ చేసుకోండి లేదా క్రింది లింక్‌ను ఉపయోగించి మీ స్నేహితులతో పంచుకోండి.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"మీరు బహిరంగంగా యాక్సెస్ చేసుకునేలా చేయాలని కోరుకునే ఏదైనా అనుకూల స్టిక్కర్ ప్యాక్‌ల కొరకు URLలను కనుగొనడంలో ఇతరులకు సహాయపడటానికి $hashtag$ అనే హ్యాష్‌ట్యాగ్‌ను ఉపయోగించండి.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"స్టిక్కర్ ప్యాక్ URL",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"ఇన్‌స్టాల్ చేయండి",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"మరొక స్టిక్కర్ ప్యాక్‌ను సృష్టించండి",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Signal కోసం నేను సృష్టించిన ఈ కొత్త స్టిక్కర్ ప్యాక్‌ను చూడండి. #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {1 చిత్రం జోడించబడింది} other {{count,number} చిత్రాలు జోడించబడ్డాయి}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"యానిమేటెడ్ ఆర్ట్‌కు ప్రస్తుతం మద్దతు ఇవ్వబడలేదు",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"డ్రాప్ చేయబడిన చిత్రం చాలా పెద్దదిగా ఉంది",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"చిత్రాన్ని ప్రాసెస్ చేయడంలో లోపం",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"యానిమేటెడ్ PNG చిత్రాలు తప్పనిసరిగా చతురస్రాకారంలో ఉండాలి",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"యానిమేటెడ్ చిత్రాలు ఎప్పటికీ తప్పనిసరిగా లూప్ చేయాలి",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"యానిమేటెడ్ PNG చిత్రం కొలతలు చాలా పెద్దవిగా ఉన్నాయి",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"యానిమేటెడ్ PNG చిత్రం కొలతలు చాలా చిన్నవిగా ఉన్నాయి",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"చిత్రాలను అప్‌లోడ్ చేయడంలో లోపం: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"సర్వర్‌కు కనెక్ట్ చేయలేము: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"క్రెడెన్షియల్స్ గడువు తీరడం వల్ల చిత్రాలను అప్‌లోడ్ చేయడం విఫలమైంది. దయచేసి Signal Desktop నుండి వెబ్‌సైట్‌ను మళ్లీ తెరవండి.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"లింక్ కాపీ చేయబడింది",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"తేలికపాటి థీమ్‌లో నా స్టిక్కర్",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"డార్క్ థీమ్‌లో నా స్టిక్కర్",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"స్టిక్కర్ ప్యాక్ క్రియేటర్‌ను ఉపయోగించడానికి దయచేసి మీ ఫోన్ మరియు డెస్క్‌టాప్‌లో Signal ను సెటప్ చేయండి",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:o,CustomizingPreferredReactions__title:i,"ArtFrame--emoji-name-placeholder":{message:"ఎమోజీ అలియాస్",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{i as CustomizingPreferredReactions__title,o as EmojiButton__label,t as cancel,a as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"Cancelar"},a={message:"$minutes$m",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},o={message:"Emoji",description:"Label for emoji button"},r={message:"Personalizar reações",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},i={smartling:e,"index--title":{message:"Criador de arte de autocolantes"},"index--create-sticker-pack":{message:"Criar novo pacote de autocolantes"},"SignIn--title":{message:"Criar um pacote de autocolantes",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Tal como tudo o resto no Signal, os autocolantes também estão encriptados. Use esta ferramenta para criar os seus próprios pacotes de autocolantes.",description:"A body of SignIn page"},"SignIn--qr":{message:"Código de login",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"Abra o Signal Desktop para começar",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"Lamentamos, o seu navegador não é suportado. Abra este link no Firefox ou Chrome",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:a,"EmojiPicker--empty":{message:"Nenhum emoji encontrado",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"Procurar emoji",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"Tom de pele $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"Smileys e pessoas",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"Animais e natureza",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"Comida e bebida",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"Viagens e locais",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"Atividades",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"Objetos",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"Símbolos",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"Bandeiras",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Criador de arte do Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Criador de pacotes de autocolantes do Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Logo do Signal",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Diretrizes do criador de pacotes de autocolantes",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"Clique para adicionar ou largar imagens aqui",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"Largar imagens aqui",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"Pacote de autocolantes",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"Pacote de autocolantes",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"Cancelar",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"Copiar",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"Seguinte",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"Voltar",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"Adicione os seus autocolantes",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"Remover imagem",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"Clique ou arraste/largue um ficheiro para adicionar um autocolante",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"Os autocolantes deverão estar no formato PNG, APNG ou WebP, com um fundo transparente e 512x512 pixeis. A margem recomendada é de 16px.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"Ver margens",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"Adicionar um emoji para cada autocolante",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"Isto permite-nos sugerir autocolantes quando envia mensagens.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"Apenas mais alguns detalhes...",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"Título",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"Dá um nome ao pacote de autocolantes",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"Autor",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"Insira um nome de autor para os autocolantes",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"Imagem da capa",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"Esta é a imagem que será exibida quando partilhar o seu pacote de autocolantes",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"Tem a certeza que deseja carregar o seu pacote de autocolantes?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"Carregar",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"Deixará de poder editar ou eliminar depois de criar um pacote de autocolantes.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"A criar o seu pacote de autocolantes",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"Carregado(s) $count$ de $total$",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"Parabéns! Criou um pacote de autocolantes.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"Aceda aos seus novos autocolantes através do ícone de autocolante, ou partilhe-os com os seus amigos utilizando a ligação abaixo.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"Utilize o hastag $hashtag$ para ajudar outras pessoas a encontrarem os URLs para qualquer pacote de autocolantes que deseja tornar publicamente acessíveis.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"URL do pacote de autocolantes",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"Instalar",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"Criar outro pacote de autocolantes",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Veja este autocolante que eu criei para o Signal. #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {1 imagem adicionada} other {{count,number} imagens adicionadas}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"Arte com animações não é atualmente suportada",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"A imagem largada é demasiado grande",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"Erro ao processar imagem",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"As imagens PNG animadas têm de ser quadradas",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"As imagens animadas têm de fazer loop infinito",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"As dimensões da imagem PNG animada são demasiado grandes",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"As dimensões da imagem PNG animada são demasiado pequenas",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"Erro ao carregar imagens: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"Não foi possível ligar ao servidor: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"Falha ao carregar imagens devido a credenciais expiradas. Volte a abrir o website a partir do Signal Desktop.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"Ligação copiada",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"O meu autocolante no tema claro",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"O meu autocolante no tema escuro",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"Configure o Signal no seu telemóvel e desktop para utilizar o Criador de pacotes de autocolantes",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:o,CustomizingPreferredReactions__title:r,"ArtFrame--emoji-name-placeholder":{message:"Nome do emoji",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{r as CustomizingPreferredReactions__title,o as EmojiButton__label,t as cancel,i as default,a as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"રદ કરો"},r={message:"$minutes$મિ",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},o={message:"ઇમોજી",description:"Label for emoji button"},i={message:"પ્રતિક્રિયાઓ કસ્ટમાઇઝ કરો",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},a={smartling:e,"index--title":{message:"સ્ટીકર આર્ટ સર્જક"},"index--create-sticker-pack":{message:"નવું સ્ટીકર પેક બનાવો"},"SignIn--title":{message:"સ્ટીકર પેક બનાવો",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"અન્ય દરેક વસ્તુની જેમ જ Signalમાં, સ્ટીકર પણ એન્ક્રિપ્ટેડ છે. તમારા પોતાના કસ્ટમ સ્ટીકર પેક બનાવવા માટે આ ટૂલનો ઉપયોગ કરો.",description:"A body of SignIn page"},"SignIn--qr":{message:"સાઇન ઇન કોડ",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"શરૂ કરવા માટે Signal ડેસ્કટોપ ઍપ ખોલો",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"માફ કરશો, તમારું બ્રાઉઝર સપોર્ટ કરતું નથી. કૃપા કરીને આ લિંકને Firefox અથવા Chromeમાં ખોલો",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"કોઈ ઇમોજી મળ્યું નથી",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"ઇમોજી શોધો",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"સ્કીન ટોન $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"સ્માઇલીઝ અને લોકો",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"પ્રાણીઓ અને કુદરત",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"ખોરાક અને પીણું",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"મુસાફરી અને સ્થળો",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"પ્રવત્તિઓ",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"વસ્તુઓ",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"ચિહ્નો",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"ફ્લેગ",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Signal આર્ટ સર્જક",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Signal સ્ટીકર પેક સર્જક",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Signal લોગો",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"સ્ટીકર પેક સર્જક માર્ગદર્શિકા",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"અહીં ફોટા ઉમેરવા કે ડ્રોપ કરવા માટે ક્લિક કરો",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"ફોટા અહીં ડ્રોપ કરો",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"સ્ટીકર પેક",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"સ્ટીકર પેક",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"રદ કરો",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"કૉપિ કરો",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"આગળ",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"પાછળ",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"તમારા સ્ટીકર ઉમેરો",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"ફોટો દૂર કરો",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"સ્ટીકર ઉમેરવા માટે ક્લિક કરો અથવા ફાઇલ ડ્રેગ/ડ્રોપ કરો",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"પારદર્શક બૅકગ્રાઉન્ડ અને 512x512 પિક્સેલવાળા સ્ટીકર PNG, APNG અથવા WebP ફોર્મેટમાં હોવા આવશ્યક છે. ભલામણ કરેલું માર્જિન 16px છે.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"માર્જિન જુઓ",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"દરેક સ્ટીકરમાં ઇમોજી ઉમેરો",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"તમે મેસેજ કરી રહ્યા હો ત્યારે આ અમને સ્ટીકર સૂચવવાની મંજૂરી આપે છે.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"માત્ર થોડી વધુ વિગતો...",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"શીર્ષક",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"તમારા સ્ટીકર પેકને નામ આપો",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"લેખક",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"તમારા સ્ટિકરને જે નામ હેઠળ સબમિટ કરવા હોય તે નામ દાખલ કરો",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"કવર ફોટો",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"આ તે ફોટો છે જે જ્યારે તમે તમારા સ્ટીકર પેકને શેર કરશો ત્યારે દેખાશે",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"શું તમે ખરેખર તમારું સ્ટીકર પેક અપલોડ કરવા માંગો છો?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"અપલોડ કરો",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"સ્ટીકર પેક બનાવ્યા પછી તમે તેમાં ફેરફાર કરી શકશો નહીં અથવા તેને ડિલીટ કરી શકશો નહીં.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"તમારું સ્ટીકર પેક બનાવવું",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$total$માંથી $count$ અપલોડ થયું",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"અભિનંદન! તમે એક સ્ટીકર પેક બનાવ્યું છે.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"સ્ટીકર આઇકન દ્વારા તમારા નવા સ્ટીકરને ઍક્સેસ કરો અથવા નીચેની લિંકનો ઉપયોગ કરીને તમારા મિત્રો સાથે શેર કરો.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"હેશટેગ $hashtag$નો ઉપયોગ કરો જે અન્ય લોકોને કોઈ પણ કસ્ટમ સ્ટીકર પેક માટે URL શોધવા માટે મદદ કરે છે જેને તમે સાર્વજનિક રીતે સુલભ બનાવવા માંગો છો.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"સ્ટીકર પેક URL",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"ઇન્સ્ટોલ",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"અન્ય સ્ટીકર પેક બનાવો",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Signal માટે મેં બનાવેલ આ નવું સ્ટીકર પેક તપાસો. #પ્રાઇવસીઅકબંધરાખો",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {1 ફોટો ઉમેર્યો} other {{count,number} ફોટા ઉમેર્યા}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"એનિમેટેડ આર્ટ હાલમાં સપોર્ટ કરતી નથી",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"ડ્રોપ કરેલી ઇમેજ ખૂબ મોટી છે",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"ફોટા પર પ્રક્રિયા કરવામાં ભૂલ",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"એનિમેટેડ PNG ફોટા ચોરસ હોવા જોઈએ",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"એનિમેટેડ ફોટા કાયમ માટે ફરતા હોવા જોઈએ",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"એનિમેટેડ PNG ફોટાના પરિમાણો ખૂબ મોટા છે",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"એનિમેટેડ PNG ફોટાના પરિમાણો ખૂબ નાના છે",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"ફોટા અપલોડ કરવામાં ભૂલ: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"સર્વર સાથે કનેક્ટ કરી શકાતું નથી: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"સમાપ્ત થઈ ગયેલ ઓળખપત્રોને કારણે ફોટો અપલોડ કરવામાં નિષ્ફળ. કૃપા કરીને Signal ડેસ્કટોપ પરથી વેબસાઇટ ફરીથી ખોલો.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"લિંક કૉપિ કરી",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"લાઇટ થીમમાં મારું સ્ટીકર",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"ડાર્ક થીમમાં મારું સ્ટીકર",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"સ્ટીકર પેક સર્જકનો ઉપયોગ કરવા માટે કૃપા કરીને તમારા ફોન અને ડેસ્કટોપ પર Signal સેટ કરો",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:o,CustomizingPreferredReactions__title:i,"ArtFrame--emoji-name-placeholder":{message:"ઇમોજીનું ઉપનામ",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{i as CustomizingPreferredReactions__title,o as EmojiButton__label,t as cancel,a as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"キャンセル"},r={message:"$minutes$分前",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},o={message:"絵文字",description:"Label for emoji button"},i={message:"リアクションのカスタマイズ",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},a={smartling:e,"index--title":{message:"ステッカーアートクリエーター"},"index--create-sticker-pack":{message:"新しいステッカーパックを作成します"},"SignIn--title":{message:"ステッカーパックを作成する",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Signalが提供するすべての通信機能と同様に、ステッカーも暗号化されています。このツールを使って、自分だけのオリジナルステッカーパックを作りましょう。",description:"A body of SignIn page"},"SignIn--qr":{message:"パスワードでサインインする",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"Signal Desktopを開いて開始",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"申し訳ありませんが、お使いのブラウザはサポートされていません。このリンクは、FirefoxもしくはChromeで開いてください",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"該当する絵文字はありません",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"絵文字を検索",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"肌色: $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"顔文字と人",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"動物と自然",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"食べ物と飲み物",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"旅行と場所",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"活動",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"オブジェクト",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"記号",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"旗",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Signalアートクリエーター",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Signalステッカーパッククリエーター",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Signalのロゴ",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"ステッカーパッククリエイターのガイドライン",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"クリックで追加するかここに画像をドロップ",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"ここに画像をドロップしてください",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"ステッカーパック",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"ステッカーパック",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"キャンセル",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"コピー",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"次へ",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"戻る",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"ステッカーを追加",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"画像を削除する",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"ファイルをクリックまたはドラッグ/ドロップしてステッカーを追加します",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"ステッカーは、背景が透明で512x512ピクセルの、PNG、APNGまたはWebP形式の画像である必要があります。推奨マージンは16pxです。",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"マージンを表示",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"各ステッカーに絵文字を追加",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"これを設定すると、メッセージ入力中にステッカーを表示することができます。",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"詳細情報の入力",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"タイトル",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"ステッカーパックの名前を付けます",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"制作者",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"送信するステッカーの制作者名を入力します",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"カバー画像",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"このステッカーパックを共有した時に表示される画像です",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"本当にステッカーパックをアップロードしますか?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"アップロード",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"ステッカーパックは作成後に、編集や削除を行うことができません。",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"ステッカーパックを作成中",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$total$件のうち$count$件がアップロード済み",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"おめでとうございます。ステッカーパックの作成が完了しました。",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"ステッカーアイコンからこのステッカーを使用したり、以下のリンクを友達と共有することができます。",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"ハッシュタグ $hashtag$ を使って、公開したいと思うカスタムステッカーパックの URL を他の人が見つけられるようにしましょう。",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"ステッカーパックのURL",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"インストール",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"別のステッカーパックを作成する",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Signalのステッカーパックを作成しましたので、ご覧ください。 #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, other {{count,number} 件の画像を追加しました}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"アニメーションアートは現在サポートされていません",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"追加された画像のサイズが制限を超えています。",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"画像の処理中にエラーが発生しました。",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"正方形でないアニメーションPNG画像はサポートしていません",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"アニメーション画像は永続的にループするように設定してください",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"アニメーションPNG画像が大きすぎます",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"アニメーションPNG画像が小さすぎます",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"画像のアップロード中にエラーが発生しました:$message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"サーバーに接続できませんでした: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"認証情報の期限切れのため、画像をアップロードできませんでした。再度、Signal Desktopからウェブサイトを開き直してください。",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"リンクをコピーしました",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"ライトテーマでのステッカー",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"ダークテーマでのステッカー",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"Sticker Pack Creatorを使うには、Signalを携帯電話とデスクトップで設定してください。",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:o,CustomizingPreferredReactions__title:i,"ArtFrame--emoji-name-placeholder":{message:"絵文字の別名",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{i as CustomizingPreferredReactions__title,o as EmojiButton__label,t as cancel,a as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"Abbrechen"},r={message:"$minutes$ Min.",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},i={message:"Emoji",description:"Label for emoji button"},o={message:"Reaktionen anpassen",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},a={smartling:e,"index--title":{message:"Sticker-Art-Creator"},"index--create-sticker-pack":{message:"Ein neues Sticker-Set erstellen"},"SignIn--title":{message:"Erstelle ein Sticker-Set",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Genau wie alles andere in Signal sind auch die Sticker verschlüsselt. Mit diesem Tool kannst du deine eigenen Sticker-Sets erstellen.",description:"A body of SignIn page"},"SignIn--qr":{message:"Anmelde-Code",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"Öffne zuerst Signal Desktop",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"Sorry, dein Browser wird nicht unterstützt. Bitte öffne diesen Link in Firefox oder Chrome",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"Keine Emojis gefunden",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"Emojis suchen",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"Hautfarbe $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"Smileys & Menschen",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"Tiere & Natur",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"Essen & Trinken",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"Reisen & Orte",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"Aktivitäten",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"Objekte",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"Symbole",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"Flaggen",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Signal Art-Creator",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Signal Sticker-Set-Creator",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Signal Logo",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Leitfaden für den Sticker-Set-Creator",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"Zum Hinzufügen anklicken oder Bilder hier ablegen",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"Bilder hier ablegen",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"Sticker-Set",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"Sticker-Set",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"Abbrechen",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"Kopieren",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"Weiter",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"Zurück",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"Füge deine Sticker hinzu",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"Bild entfernen",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"Klicke auf eine Datei oder nutze Ziehen und Ablegen, um einen Sticker hinzuzufügen.",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"Sticker müssen das PNG-, APNG- oder WebP-Format mit transparentem Hintergrund und 512 x 512 Pixeln besitzen. Der empfohlene Rand beträgt 16 px.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"Ränder ansehen",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"Füge jedem Sticker ein Emoji hinzu",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"Dies ermöglicht uns, dir während deiner Unterhaltungen Sticker vorzuschlagen.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"Nur noch einige Details …",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"Titel",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"Gib deinem Sticker-Set einen Namen",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"Autor",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"Gib einen Namen ein, um deine Sticker einzusenden unter",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"Coverbild",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"Dieses Bild wird angezeigt, wenn du dein Sticker-Set teilst.",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"Möchtest du dein Sticker-Set wirklich hochladen?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"Hochladen",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"Du wirst nach dem Erstellen eines Sticker-Sets nichts mehr ändern oder löschen können.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"Erstellen deines Sticker-Sets",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$count$ von $total$ hochgeladen",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"Gratulation! Du hast ein Sticker-Set erstellt.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"Greife über das Stickersymbol auf deine neuen Sticker zu oder teile sie mit deinen Freunden über den unten genannten Link.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"Verwende den Hashtag $hashtag$, um anderen Leuten dabei zu helfen, die URLs deiner selbst erstellten und veröffentlichten Sticker-Sets zu finden.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"Sticker-Set-URL",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"Installieren",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"Weiteres Sticker-Set erstellen",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Schau dir dieses neue Sticker-Set an, das ich für Signal erstellt habe. #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {1 Bild hinzugefügt} other {{count,number} Bilder hinzugefügt}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"Animierte Kunst wird derzeit nicht unterstützt",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"Abgelegtes Bild ist zu groß",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"Fehler beim Verarbeiten des Bildes",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"Animierte PNG-Bilder müssen quadratisch sein",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"Animierte Bilder müssen sich unendlich wiederholen",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"Die Abmessungen des animierten PNG-Bildes sind zu groß",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"Die Abmessungen des animierten PNG-Bildes sind zu klein",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"Fehler beim Hochladen von Bildern: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"Kann keine Verbindung zum Server herstellen: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"Das Hochladen von Bildern ist aufgrund von abgelaufenen Anmeldeinformationen fehlgeschlagen. Bitte öffne die Website erneut über Signal Desktop.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"Link kopiert",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"Mein Sticker im hellen Design",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"Mein Sticker im dunklen Design",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"Bitte richte Signal auf deinem Mobiltelefon und deinem Computer ein, um den Sticker-Set-Creator zu verwenden",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:i,CustomizingPreferredReactions__title:o,"ArtFrame--emoji-name-placeholder":{message:"Emoji-Alias",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{o as CustomizingPreferredReactions__title,i as EmojiButton__label,t as cancel,a as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"Kanselleer"},r={message:"$minutes$m",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},o={message:"Emoji",description:"Label for emoji button"},a={message:"Pasmaking van reaksies",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},i={smartling:e,"index--title":{message:"Plakkerpakket-skepper"},"index--create-sticker-pack":{message:"Skep 'n nuwe plakkerpakket"},"SignIn--title":{message:"Skep 'n plakkerpakket",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Net soos met alles verder in Signal, is plakkers ook geënkripteer. Gebruik hierdie hulpmiddel om jou eie pasgemaakte plakkerpakkette te skep.",description:"A body of SignIn page"},"SignIn--qr":{message:"Aantekenkode",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"Maak Signal Desktop oop om te begin",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"Jammer, jou blaaier word nie ondersteun nie. Maak asseblief hierdie skakel in Firefox of Chrome oop",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"Geen emoji gevind nie",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"Soek emoji",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"Velkleur $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"Gesiggies & mense",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"Diere & die natuur",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"Kos & drank",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"Reis & plekke",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"Aktiwiteite",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"Voorwerpe",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"Simbole",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"Vlae",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Signal-kunswerk-skepper",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Signal-plakkerpakket-skepper",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Signal-logo",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Riglyne vir Plakkerpakket-skepper",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"Klik hier om beelde by te voeg of neer te laat",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"Laat beelde hier neer",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"Plakkerpakket",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"Plakkerpakket",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"Kanselleer",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"Kopieer",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"Volgende",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"Terug",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"Voeg jou plakkers by",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"Verwyder beeld",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"Klik of sleep/laat 'n lêer hier neer om 'n plakker by te voeg",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"Plakkers moet in PNG-, APNG- of WebP-formaat wees met 'n deursigtige agtergrond en 512x512 pixels. Die aanbevole kantruimte is 16 px.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"Bekyk kantruimtes",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"Voeg 'n emoji by elke plakker",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"Dit stel ons in staat om vir jou plakkers voor te stel terwyl jy boodskappe stuur.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"Net nog 'n paar besonderhede…",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"Titel",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"Benoem jou plakkerpakket",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"Outeur",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"Voer 'n naam in waaronder jy jou plakkers kan indien",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"Voorbladbeeld",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"Dit is die beeld wat gesien sal word wanneer jy jou plakkerpakket deel",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"Is jy seker jy wil jou plakkerpakket oplaai?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"Laai op",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"Jy sal nie meer in staat wees om veranderinge te maak of te skrap na jy 'n plakkerpakket gemaak het nie.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"Skep tans jou plakkerpakket",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$count$ van $total$ opgelaai",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"Baie geluk! Jy het 'n plakkerpakket geskep.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"Kry toegang tot jou nuwe plakkers deur die plakkerikoon, of deel met jou vriende met behulp van die skakel hieronder.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"Gebruik die hutsetiket $hashtag$ om ander mense te help om die URLs vir enige persoonlike plakkerpakkette wat jy vir almal toeganklik wil maak, te vind.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"Plakkerpakket-URL",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"Installeer",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"Skep 'n ander plakkerpakket",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Kyk na hierdie nuwe plakkerpakket wat ek vir Signal geskep het. #maakprivaatheidplak",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {1 beeld bygevoeg} other {{count,number} prent(e) bygevoeg}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"Geanimeerde kunswerk word nie tans ondersteun nie",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"Die foto wat neergelaat is, is te groot",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"Beeldverwerking-fout",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"Geanimeerde PNG-beelde moet vierkantig wees",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"Geanimeerde PNG-beelde moet permanent in 'n lus aanhou loop",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"Geanimeerde PNG-beeld se afmetings is te groot",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"Geanimeerde PNG-beeld se afmetings is te klein",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"Beeldoplaaifout: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"Kan nie aan bediener koppel nie: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"Kon nie beelde oplaai nie weens verifiëringsbesonderhede wat verval het. Maak asseblief die webwerf weer oop uit Signal Desktop.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"Skakel gekopieer",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"My plakker in ligte tema",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"My plakker in donker tema",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"Stel asseblief Signal op jou foon en tuisskerm in om die Plakkerpakket-skepper te gebruik",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:o,CustomizingPreferredReactions__title:a,"ArtFrame--emoji-name-placeholder":{message:"Emoji-alias",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{a as CustomizingPreferredReactions__title,o as EmojiButton__label,t as cancel,i as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"Anuluj"},o={message:"$minutes$ min",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},r={message:"Emoji",description:"Label for emoji button"},a={message:"Dostosuj reakcje",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},i={smartling:e,"index--title":{message:"Kreator pakietów naklejek"},"index--create-sticker-pack":{message:"Utwórz nowy pakiet naklejek"},"SignIn--title":{message:"Utwór pakiet naklejek",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Naklejki, podobnie jak całość komunikacji w Signal, są szyfrowane. Użyj tego narzędzia, aby utworzyć własne niestandardowe pakiety naklejek.",description:"A body of SignIn page"},"SignIn--qr":{message:"Kod rejestracji",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"Aby rozpocząć, otwórz Signal Desktop",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"Przykro nam, ale Twoja przeglądarka nie jest obsługiwana. Otwórz ten link w przeglądarce Firefox lub Chrome",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:o,"EmojiPicker--empty":{message:"Nie znaleziono emoji",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"Szukaj emoji",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"Odcień skóry $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"Buźki i ludzie",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"Zwierzęta i przyroda",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"Jedzenie i napoje",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"Podróże i miejsca",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"Aktywności",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"Obiekty",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"Symbole",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"Flagi",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Kreator grafik Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Kreator pakietów naklejek Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Logo Signal",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Wskazówki dla twórców pakietów naklejek",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"Kliknij lub przeciągnij tutaj obrazy, aby je dodać",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"Upuść obrazy tutaj",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"Pakiet naklejek",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"Pakiet naklejek",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"Anuluj",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"Kopiuj",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"Dalej",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"Wróć",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"Dodaj swoje naklejki",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"Usuń obraz",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"Kliknij lub przeciągnij i upuść, aby dodać naklejkę",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"Naklejki muszą być w formacie PNG, APNG lub WebP, mieć przezroczyste tło i rozmiar 512x512 pikseli. Zalecany margines to 16 pikseli.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"Wyświetl marginesy",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"Dodaj emoji do każdej naklejki",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"Dzięki temu będziemy mogli proponować Ci naklejki podczas pisania.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"Jeszcze tylko kilka drobiazgów…",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"Tytuł",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"Nadaj nazwę swojemu pakietowi naklejek",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"Autor",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"Podpisz się pod swoim dziełem",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"Obraz poglądowy",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"To ten obraz pojawi się, gdy udostępnisz swój pakiet naklejek",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"Czy na pewno chcesz wysłać swój pakiet naklejek?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"Wyślij",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"Po utworzeniu pakietu naklejek stracisz możliwość jego edycji lub usunięcia.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"Tworzenie pakietu naklejek",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"Wysłano $count$ z $total$",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"Gratulacje! Stworzyłeś(-aś) pakiet naklejek.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"Użyj swoich nowych naklejek, korzystając z ikony naklejki, lub udostępnij je znajomym za pośrednictwem poniższego linku.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"Użyj hasztagu $hashtag$, aby ułatwić użytkownikom odnajdywanie adresów URL Twoich upublicznionych pakietów naklejek.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"Adres URL do pakietu naklejek",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"Zainstaluj",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"Stwórz kolejny pakiet naklejek",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Rzuć okiem na ten nowy pakiet naklejek, który stworzyłem(-am) dla Signal. #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {Dodano 1 obraz} few {Dodano {count,number} obrazy} many {Dodano {count,number} obrazów} other {Dodano {count,number} obrazów}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"Obecnie nie obsługujemy animowanej grafiki",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"Dodany obraz jest zbyt duży",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"Błąd przetwarzania obrazu",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"Animowane obrazy PNG muszą być kwadratowe",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"Animowane obrazy muszą być zapętlone",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"Animowany obraz PNG jest zbyt duży",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"Animowany obraz PNG jest zbyt mały",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"Błąd przesyłania obrazów: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"Nie można połączyć się z serwerem: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"Nie udało się przesłać obrazów z powodu wygasłych danych uwierzytelniających. Otwórz ponownie stronę z Signal Desktop.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"Skopiowano link",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"Moja naklejka w motywie jasnym",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"Moja naklejka w motywie ciemnym",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"Aby móc używać kreatora pakietów naklejek, połącz konto Signal na swoim telefonie z tym na komputerze",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:r,CustomizingPreferredReactions__title:a,"ArtFrame--emoji-name-placeholder":{message:"Alias emoji",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{a as CustomizingPreferredReactions__title,r as EmojiButton__label,t as cancel,i as default,o as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"বাতিল করুন"},r={message:"$minutes$মি.",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},o={message:"ইমোজি",description:"Label for emoji button"},i={message:"প্রতিক্রিয়া কাস্টমাইজ করুন",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},a={smartling:e,"index--title":{message:"স্টিকার আর্ট ক্রিয়েটর"},"index--create-sticker-pack":{message:"নতুন স্টিকার প্যাক তৈরি করুন"},"SignIn--title":{message:"একটি স্টিকার প্যাক তৈরি করুন",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Signal-এর অন্য সব কিছুর মতোই, স্টিকারগুলোও এনক্রিপ্ট করা। আপনার নিজস্ব কাস্টম স্টিকার প্যাক তৈরি করতে এই টুলটি ব্যবহার করুন।",description:"A body of SignIn page"},"SignIn--qr":{message:"সাইন ইন কোড",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"শুরু করতে Signal ডেস্কটপ খুলুন",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"দুঃখিত, আপনার ব্রাউজার এটি সমর্থন করে না। অনুগ্রহ করে এই লিংকটি Firefox বা Chrome-এ খুলুন",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"কোনো ইমোজি পাওয়া যায়নি",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"ইমোজি অনুসন্ধান করুন",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"স্কিনের বর্ণ $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"স্মাইলি এবং মানুষ",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"প্রাণী ও প্রকৃতি",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"খাবার ও পানীয়",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"ভ্রমণ ও স্থান",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"কার্যক্রম",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"বস্তু",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"প্রতীক",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"পতাকা",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Signal আর্ট ক্রিয়েটর",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Signal স্টিকার প্যাক ক্রিয়েটর",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Signal লোগো",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"স্টিকার প্যাক ক্রিয়েটর সম্পর্কিত নির্দেশিকা",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"ছবি যোগ করতে বা ড্রপ করতে এখানে ক্লিক করুন",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"এখানে ছবি ড্রপ করুন",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"স্টিকার প্যাক",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"স্টিকার প্যাক",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"বাতিল করুন",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"কপি করুন",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"পরবর্তী",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"ফিরে যান",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"আপনার স্টিকার যোগ করুন",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"ছবি মুছে ফেলুন",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"একটি স্টিকার যোগ করতে একটি ফাইল ক্লিক করুন বা টেনে আনুন/ড্রপ করুন",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"স্টিকারগুলো অবশ্যই PNG, APNG, বা WebP ফরম্যাটে থাকতে হবে এবং স্বচ্ছ ব্যাকগ্রাউন্ড ও 512x512 পিক্সেল বিশিষ্ট হতে হবে। সুপারিশকৃত মার্জিন 16px।",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"মার্জিন দেখুন",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"প্রতিটি স্টিকারে একটি ইমোজি যোগ করুন",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"আপনি ম্যাসেজ করার সময় এটি আপনাকে স্টিকারের পরামর্শ দেওয়ার জন্য আমাদেকে অনুমতি দেয়।",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"আর অল্প কিছু বিবরণ...",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"শিরোনাম",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"আপনার স্টিকার প্যাকের নাম দিন",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"প্রস্তুতকারক",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"নিচে আপনার স্টিকার জমা দিতে একটি নাম লিখুন",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"কভার ছবি",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"আপনি আপনার স্টিকার প্যাক শেয়ার করার সময় এই ছবিটি প্রদর্শিত হবে",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"আপনি কি আপনার স্টিকার প্যাক আপলোড করতে চাওয়ার ব্যাপারে নিশ্চিত?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"আপলোড করুন",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"স্টিকার প্যাক তৈরি করার পর আপনি আর সেটি এডিট করতে বা মুছতে পারবেন না।",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"আপনার স্টিকার প্যাক তৈরি করা",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$total$টির মধ্যে $count$টি আপলোড হয়েছে",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"অভিনন্দন! আপনি একটি স্টিকার প্যাক তৈরি করেছেন।",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"স্টিকার আইকন দিয়ে আপনার নতুন স্টিকারগুলো অ্যাক্সেস করুন অথবা নিচের লিংকটি ব্যবহার করে আপনার বন্ধুদের সাথে এটি শেয়ার করুন।",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"আপনি যেসব কাস্টম স্টিকার প্যাক সকলের জন্য অ্যাক্সেসযোগ্য করতে চান সেগুলোর URL যাতে অন্যরা খুঁজে পায় সেজন্য $hashtag$ হ্যাশট্যাগটি ব্যবহার করুন।",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"স্টিকার প্যাকের URL",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"ইনস্টল করুন",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"অন্য একটি স্টিকার প্যাক তৈরি করুন",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Signal-এর জন্য তৈরি করা আমার এই নতুন স্টিকার প্যাকটি দেখুন। #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {1টি ছবি যোগ করা হয়েছে} other {{count,number}টি ছবি যোগ করা হয়েছে}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"অ্যানিমেট করা আর্ট বর্তমানে সমর্থন করে না",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"ড্রপ করা ছবিটি অনেক বেশি বড়",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"ছবিটি প্রক্রিয়াকরণে ত্রুটি হয়েছে",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"অ্যানিমেট করা PNG ছবি অবশ্যই বর্গাকার হতে হবে",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"অ্যানিমেট করা ছবিগুলো অবশ্যই সবসময়ের জন্য লুপ হতে থাকবে",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"অ্যানিমেট করা PNG ছবিগুলোর মাত্রা অনেক বেশি বড়",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"অ্যানিমেট করা PNG ছবিগুলোর মাত্রা অনেক বেশি ছোট",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"ছবি আপলোড করার সময় ত্রুটি হয়েছে: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"সার্ভারের সাথে সংযোগ করা যাচ্ছে না: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"মেয়াদ উত্তীর্ণ পরিচয়ের তথ্যের কারণে ছবি আপলোড করা সফল হয়নি। অনুগ্রহ করে Signal ডেস্কটপ থেকে ওয়েবসাইটটি আবারো খুলুন।",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"লিংক কপি করা হয়েছে",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"আমার স্টিকার লাইট থিমে রয়েছে",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"আমার স্টিকার গাঢ় থিমে রয়েছে",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"স্টিকার প্যাক ক্রিয়েটর ব্যবহার করতে অনুগ্রহ করে আপনার ফোন ও ডেস্কটপে Signal সেট আপ করুন",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:o,CustomizingPreferredReactions__title:i,"ArtFrame--emoji-name-placeholder":{message:"ছদ্মনামের ইমোজি",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{i as CustomizingPreferredReactions__title,o as EmojiButton__label,t as cancel,a as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"Cuir ar ceal"},a={message:"$minutes$n",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},r={message:"Emoji",description:"Label for emoji button"},i={message:"Saincheap freagairtí",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},o={smartling:e,"index--title":{message:"Cruthaitheoir Ealaíne Greamán"},"index--create-sticker-pack":{message:"Cruthaigh beart greamán nua"},"SignIn--title":{message:"Cruthaigh Beart Greamán",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Díreach mar an gcéanna le gach uile rud in Signal, tá na greamáin criptithe freisin. Úsáid an uirlis seo le do bhearta greamán saincheaptha féin a chruthú.",description:"A body of SignIn page"},"SignIn--qr":{message:"Cód Sínithe Isteach",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"Oscail Deasc Signal le Tosú Air",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"Ár leithscéal, ní tacaíocht le do bhrabhsálaí ann. Oscail an nasc in Firefox nó Chrome",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:a,"EmojiPicker--empty":{message:"Níor aimsíodh emoji",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"Cuardaigh Emoji",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"Ton craicinn $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"Straoiseoga agus Daoine",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"Ainmhithe agus an Nádúr",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"Bia agus Deochanna",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"Taisteal agus Áiteanna",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"Gníomhaíochtaí",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"Oibiachtaí",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"Siombailí",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"Bratacha",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Cruthaitheoir Ealaíne Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Cruthaitheoir Beart Greamán Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Lógó Signal",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Treoirlínte do Chruthaitheoirí Beart Greamán",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"Cliceáil chun íomhánna a chur leis nó a scaoileadh anseo",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"Scaoil íomhánna anseo",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"Beart greamán",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"Beart greamán",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"Cuir ar ceal",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"Cóipeáil",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"Ar aghaidh",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"Siar",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"Cuir do ghreamáin leis",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"Bain íomhá",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"Cliceáil nó tarraing/scaoil comhad chun greamán a chur leis",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"Ní mór go mbeidh na greamáin i bhformáid PNG, APNG nó WebP le cúlra trédhearcach agus 512 × 512 picteilín. Is í an chiumhais mholta ná 16px.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"Féach ar na ciumhaiseanna",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"Cuir emoji le gach greamán",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"Ligeann sé seo dúinn greamáin a mholadh duit agus tú ag cur teachtaireachtaí.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"Cúpla sonra eile...",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"Teideal",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"Ainmnigh do bheart greamán",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"Údar",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"Cuir ainm isteach faoina gcuirfear do ghreamáin isteach",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"Íomhá an chlúdaigh",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"Seo an íomhá a thaispeánfar nuair a chomhroinnfidh tú do bheart greamán",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"Cinnte gur mhaith leat do bheart greamán a uaslódáil?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"Uaslódáil",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"Ní bheidh tú in ann athruithe a dhéanamh ar ghreamáin ná iad a scriosadh a thuilleadh tar éis duit beart greamán a chruthú.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"Do bheart greamán a chruthú",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$count$ as $total$ uaslódáilte",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"Comhghairdeas! Chruthaigh tú beart greamán.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"Faigh rochtain ar do ghreamáin nua tríd an íocón greamán, nó comhroinn le do chairde leis an nasc thíos.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"Úsáid an haischlib $hashtag$ chun cabhrú le daoine eile na URLanna a aimsiú le haghaidh aon bheart greamán saincheaptha ar mhaith leat é a chur ar fáil go poiblí.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"URL don Bheart Greamán",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"Suiteáil",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"Chruthaigh beart eile greamán",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Féach an beart greamán nua a chruthaigh mé le haghaidh Signal. #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {1 íomhá curtha leis} two {{count,number} íomhá curtha leis} few {{count,number} íomhá curtha leis} many {{count,number} n-íomhá curtha leis} other {{count,number} íomhá curtha leis}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"Níl tacaíocht le healaín bheoite ann faoi láthair",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"Tá an íomhá a scaoileadh rómhór",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"Earráid le próiseáil na híomhá",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"Ní mór go mbeidh cruth cearnógach ar íomhánna PNG beoite",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"Ní mór go mbeidh íomhánna beoite ar lúb de shíor",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"Tá toisí na híomhá PNG beoite rómhór",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"Tá toisí na híomhá PNG beoite róbheag",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"Earráid le huaslódáil íomhánna: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"Ní féidir nascadh le freastalaí: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"Theip ar uaslódáil íomhánna de dheasca faisnéis aitheantais atá as feidhm. Oscail an suíomh gréasáin ó Dheasc Signal arís.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"Nasc cóipeáilte",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"Mo ghreamán i dtéama éadrom",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"Mo ghreamán i dtéama dorcha",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"Socraigh Signal ar do ghuthán agus ríomhaire deisce leis an gCruthaitheoir Beart Greamán a úsáid",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:r,CustomizingPreferredReactions__title:i,"ArtFrame--emoji-name-placeholder":{message:"Ailias emoji",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{i as CustomizingPreferredReactions__title,r as EmojiButton__label,t as cancel,o as default,a as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"Откажи"},r={message:"$minutes$мин.",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},o={message:"Емотикон",description:"Label for emoji button"},i={message:"Прилагоди реакции",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},a={smartling:e,"index--title":{message:"Креатор на налепници"},"index--create-sticker-pack":{message:"Создајте нов пакет налепници"},"SignIn--title":{message:"Создајте пакет налепници",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Како и сè друго на Signal, налепниците се исто така шифрирани. Употребете ја оваа алатка за да создадете ваши персонализирани пакет налепници.",description:"A body of SignIn page"},"SignIn--qr":{message:"Код за најава",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"Отворете го Signal за Desktop за да започнете",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"За жал, вашиот веб-прелистувач не е поддржан. Ве молиме отворете го овој линк во Firefox или Chrome",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"Не е пронајден ниеден емотикон",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"Пребарај емотикони",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"Боја на кожа $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"Смешко-емотикони и луѓе",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"Животни и природа",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"Храна и пијалаци",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"Патување и места",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"Активности",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"Предмети",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"Симболи",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"Знамиња",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Креатор на слики на Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Креатор на пакет налепници на Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Signal лого",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Упатства за креаторот на пакет налепници",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"Кликнете за да ги додадете или испуштите сликите тука",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"Испуштете ги сликите тука",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"Пакет налепници",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"Пакет налепници",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"Откажи",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"Копирај",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"Следно",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"Назад",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"Додајте ги вашите налепници",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"Отстранете ја сликата",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"Кликнете или повлечете/испуштете ја датотеката за да додадете налепница",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"Налепниците мора да се во PNG, APNG или WebP формат со провидна позадина и 512x512 пиксели. Препорачаната маргина е 16px.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"Прикажи маргини",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"Додајте емотикон на секоја налепница",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"Ова ни овозможува да ви предлагаме налепници додека се допишувате.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"Само уште неколку детали…",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"Наслов",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"Именувајте го вашиот пакет налепници",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"Автор",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"Внесете име под кое сакате да ги поднесете налепниците",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"Насловна слика",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"Ова е сликата која што ќе се прикаже кога ќе го споделите пакетот налепници",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"Дали сте сигурни дека сакате да го внесете вашиот пакет налепници?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"Внеси",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"Повеќе нема да можете да правите измени или да бришете откако ќе создадете пакет налепници.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"Се создава вашиот пакет налепници",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$count$ од $total$ се внесени",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"Честитки! Создадовте пакет налепници.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"Отворете ги новите налепници преку иконата налепница, или споделете ги со вашите пријатели со помош на линкот подолу.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"Употребете го хаштагот $hashtag$ за да им помогнете на другите луѓе да ја најдат URL адресата на персонализираните пакети налепници кои би сакале да бидат достапни јавно.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"URL на пакет налепници",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"Инсталирај",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"Создајте друг пакет налепници",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Видете го новиов пакет налепници што го создадов за Signal. #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {Додадена е 1 слика} other {Додадени се {count,number} слики}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"Анимираните слики не се поддржани во моментов",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"Испуштената слика е преголема",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"Грешка при процесирање на сликата",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"Анимираните слики во PNG формат треба да бидат квадратни",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"Анимираните слики треба да имаат непрекинат циклус",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"Димензиите на анимираните слики во PNG формат се преголеми",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"Димензиите на анимираните слики во PNG формат се премали",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"Грешка при внесување на сликите: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"Не може да се поврзе со серверот: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"Внесувањето на сликите не беше успешно поради истечени креденцијали. Ве молиме одново отворете ја веб-локацијата преку Signal Desktop.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"Линкот е копиран",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"Мојата налепница во светла тема",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"Мојата налепница во темна тема",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"Ве молиме поставете го Signal на вашиот телефон и десктоп компјутер за да го користите креаторот на пакет налепници",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:o,CustomizingPreferredReactions__title:i,"ArtFrame--emoji-name-placeholder":{message:"Алиас за емотикон",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{i as CustomizingPreferredReactions__title,o as EmojiButton__label,t as cancel,a as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"Loobu"},i={message:"$minutes$ m",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},a={message:"Emoji",description:"Label for emoji button"},o={message:"Kohanda reaktsioone",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},r={smartling:e,"index--title":{message:"Kleebiste komplekti looja"},"index--create-sticker-pack":{message:"Loo uus kleebiste komplekt"},"SignIn--title":{message:"Loo kleebiste komplekt",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Just nagu kõik muu Signalis, ka meie kleebised on krüptitud. Kasuta seda tööriista, et luua oma isikupärastatud kleebiste komplekt.",description:"A body of SignIn page"},"SignIn--qr":{message:"Sisselogimiskood",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"Alustamiseks ava Signal Desktop",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"Vabandust, sinu brauser ei ole toetatud. Palun ava see link Firefoxis või Chrome'is",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:i,"EmojiPicker--empty":{message:"Ühtegi emojit ei leitud",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"Otsi emojit",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"$tone$ nahatoon",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"Emotikonid ja inimesed",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"Loomad ja loodus",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"Toit ja jook",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"Reisimine ja kohad",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"Hobitegevused",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"Objektid",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"Sümbolid",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"Lipud",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Signali kleebiste looja",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Signali kleebiste komplekti loomiskeskkond",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Signali logo",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Signali kleebiste komplekti loomiskeskkonna suunised",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"Piltide lisamiseks klõpsa või kukuta pildid siia",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"Kukuta pildid siia",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"Kleebiste komplekt",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"Kleebiste komplekt",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"Loobu",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"Kopeeri",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"Edasi",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"Tagasi",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"Lisa enda kleebised",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"Eemalda pilt",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"Kleebise lisamiseks klõpsa või lohista/kukuta fail siia",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"Kleebised peavad olema PNG, APNG või WebP vormingus, läbipaistva taustaga ja suurusega 512x512 pikslit. Soovitatav veeris on 16 pikslit.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"Näita veeriseid",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"Lisa igale kleebisele emoji",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"See võimaldab meil sulle sõnumite saatmise ajal kleebiseid soovitada.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"Lihtsalt mõned detailid veel …",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"Pealkiri",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"Anna oma kleebiste komplektile nimi",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"Autor",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"Lisa nimi, mille alt oma kleebised avaldada",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"Kaanepilt",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"See pilt kuvatakse siis, kui jagate oma kleebiste komplekti",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"Kas sa soovid kindlasti oma kleebiste komplekti üles laadida?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"Laadi üles",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"Pärast kleebiste komplekti loomist ei saa enam muudatusi teha ega kustutada.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"Kleebiste komplekti loomine",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$count$ koguarvust $total$ üles laaditud",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"Palju õnne! Sa lõid uue kleebiste komplekti.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"Kasuta uutele kleebistele ligipääsuks kleebiste ikooni või jaga neid oma sõpradega alloleva lingi kaudu.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"Kasuta räsi $hashtag$, et aidata teistel leida kohandatud kleebiste komplektide URLe, mida soovid avalikult kättesaadavaks teha.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"Kleebiste komplekti URL",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"Paigalda",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"Loo veel üks kleebiste komplekt",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Vaata seda uut kleebiste komplekti, mille ma Signali jaoks tegin. #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {1 pilt lisatud} other {{count,number} pilti lisatud}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"Animeeritud kleebised pole hetkel toetatud",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"Kukutatud pilt on liiga suur",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"Pildi töötlemisel tekkis tõrge",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"Animeeritud PNG pildid peavad olema ruudukujulised",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"Animeeritud piltidel peab olems lõputu tsükkel",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"Animeeritud PNG pildi mõõtmed on liiga suured",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"Animeeritud PNG pildi mõõtmed on liiga väikesed",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"Kleebiste üleslaadimisel tekkis tõrge: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"Serveriga ei saa ühendust: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"Aegunud volituste tõttu ei saanud pilte üles laadida. Palun ava veebileht Signal Desktopi alt uuesti.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"Link kopeeritud",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"Minu kleebis heledas teemas",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"Minu kleebis tumedas teemas",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"Kleebiste komplekti loomiskeskkonna kasutamiseks pead seadistama Signali nii enda telefonis kui ka arvutis",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:a,CustomizingPreferredReactions__title:o,"ArtFrame--emoji-name-placeholder":{message:"Emoji nimi",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{o as CustomizingPreferredReactions__title,a as EmojiButton__label,t as cancel,r as default,i as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"Atcelt"},i={message:"$minutes$min",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},r={message:"Emocijzīme",description:"Label for emoji button"},a={message:"Pielāgot emociju izpausmes",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},o={smartling:e,"index--title":{message:"Uzlīmju mākslas izveides programma"},"index--create-sticker-pack":{message:"Izveidot jaunu uzlīmju komplektu"},"SignIn--title":{message:"Izveidot uzlīmju komplektu",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Tāpat kā viss cits vietnē Signal, arī uzlīmes ir šifrētas. Izmantojiet šo rīku, lai izveidotu savus pielāgotus uzlīmju komplektus.",description:"A body of SignIn page"},"SignIn--qr":{message:"Pieteikšanās kods",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"Atveriet Signal Desktop versiju, lai sāktu",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"Diemžēl jūsu pārlūks netiek atbalstīts. Atveriet šo saiti Firefox vai Chrome pārlūkā",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:i,"EmojiPicker--empty":{message:"Neviena emocijzīme netika atrasta",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"Meklēt emocijzīmes",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"Apdares tonis $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"Smaidiņi; Cilvēki",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"Dzīvnieki un Daba",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"Ēdieni un dzērieni",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"Ceļojumi un vietas",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"Aktivitātes",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"Objekti",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"Simboli",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"Karogi",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Signal mākslas izveides programma",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Signal uzlīmju komplekta izveides programma",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Signal logotips",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Uzlīmju komplekta izveides programmas vadlīnijas",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"Noklikšķiniet, lai šeit pievienotu vai nomestu attēlus",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"Nomest attēlus šeit",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"Uzlīmju komplekts",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"Uzlīmju komplekts",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"Atcelt",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"Kopēt",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"Tālāk",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"Atpakaļ",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"Pievienot uzlīmes",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"Noņemt attēlu",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"Noklikšķiniet vai velciet/nometiet failu, lai pievienotu uzlīmi",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"Uzlīmēm jābūt PNG, APNG vai WebP formātā ar caurspīdīgu fonu un 512x512 pikseļiem. Ieteicamā piemale ir 16px.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"Skatīt piemales",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"Pievienot emocijzīmi katrai uzlīmei",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"Tādējādi ziņapmaiņas laikā mēs varam ieteikt uzlīmes.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"Vēl tikai dažas lietas…",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"Virsraksts",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"Nosauciet savu uzlīmju komplektu",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"Autors",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"Apakšā ievadiet vārdu, lai iesniegtu savas uzlīmes",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"Titulattēls",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"Šis ir attēls, kas tiks parādīts, kopīgojot uzlīmes",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"Vai tiešām vēlaties augšupielādēt savu uzlīmju komplektu?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"Augšupielādēt",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"Pēc uzlīmju komplekta izveides vairs nevarēs veikt labojumus vai dzēst.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"Uzlīmju komplekta izveide",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"Augšupielādēti $count$ no $total$",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"Apsveicam! Jūs izveidojāt uzlīmju komplektu.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"Piekļūstiet savām jaunajām uzlīmēm, izmantojot uzlīmju ikonu, vai kopīgojiet uzlīmes ar draugiem, izmantojot zemāk esošo saiti.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"Izmantojiet atsauces birku $hashtag$, lai palīdzētu citiem cilvēkiem atrast URL visiem pielāgotajiem uzlīmju komplektiem, kurus vēlaties padarīt publiski pieejamus.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"Uzlīmju komplekta URL",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"Instalēt",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"Izveidot citu uzlīmju komplektu",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Apskatiet šo jauno Signal paredzēto uzlīmju komplektu, ko es izveidoju. #izveideprivātiuzlīme",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, zero {Pievienoti {count,number} attēli} one {Pievienots 1 attēls} other {Pievienoti {count,number} attēli}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"Animēta māksla šobrīd netiek atbalstīta",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"Nomestais attēls ir pārāk liels",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"Attēla apstrādes kļūda",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"Animētiem PNG attēliem jābūt kvadrāta formā",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"Animētiem attēliem cikliski jāatkārtojas",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"Animēta PNG attēla izmēri ir pārāk lieli",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"Animēta PNG attēla izmēri ir pārāk mazi",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"Augšupielādējot attēlu, radās kļūda:$message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"Neizdevās pieslēgties serverim: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"Neizdevās augšupielādēt attēlus, jo beidzās akreditācijas datu derīguma termiņš. Lūdzu, vēlreiz atveriet vietni no Signal Desktop versijas.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"Saite nokopēta",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"Mana uzlīme gaišajā dizainā",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"Mana uzlīme tumšajā dizainā",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"Lai izmantotu uzlīmju komplekta veidotāju, iestatiet Signal savā tālrunī un datorā",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:r,CustomizingPreferredReactions__title:a,"ArtFrame--emoji-name-placeholder":{message:"Emocijzīmes aizstājvārds",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{a as CustomizingPreferredReactions__title,r as EmojiButton__label,t as cancel,o as default,i as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"റദ്ദാക്കുക"},r={message:"$minutes$മി",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},o={message:"ഇമോജി",description:"Label for emoji button"},i={message:"പ്രതികരണങ്ങൾ ഇഷ്ടാനുസൃതമാക്കുക",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},a={smartling:e,"index--title":{message:"സ്റ്റിക്കർ ആർട്ട് ക്രിയേറ്റർ"},"index--create-sticker-pack":{message:"പുതിയ സ്റ്റിക്കർ പായ്ക്ക് സൃഷ്ടിക്കുക"},"SignIn--title":{message:"ഒരു സ്റ്റിക്കർ പായ്ക്ക് സൃഷ്ടിക്കൂ",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Signal-ൽ ലഭ്യമായ മറ്റ് ഫീച്ചറുകൾ പോലെ തന്നെ സ്റ്റിക്കറുകളും എൻക്രിപ്റ്റ് ചെയ്തിട്ടുണ്ട്. നിങ്ങളുടെ ഇഷ്ടാനുസൃത സ്റ്റിക്കറ്റർ പായ്ക്കുകൾ സൃഷ്ടിക്കാൻ ഈ ടൂൾ ഉപയോഗിക്കുക.",description:"A body of SignIn page"},"SignIn--qr":{message:"സൈൻ ഇൻ ചെയ്യൽ കോഡ്",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"തുടങ്ങാനായി Signal ഡെസ്‌ക്ടോപ്പ് തുറക്കുക",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"ക്ഷമിക്കണം, നിങ്ങളുടെ ബ്രൗസറിന് പിന്തുണയില്ല. ഈ ലിങ്ക് Firefox-ലോ Chrome-ലോ തുറക്കുക",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"ഇമോജിയൊന്നും കണ്ടെത്താനായില്ല",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"ഇമോജി തിരയുക",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"ചർമ്മത്തിന്റെ നിറം $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"സ്മൈലികളും ആളുകളും",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"മൃഗങ്ങളും പ്രകൃതിയും",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"ഭക്ഷണവും പാനീയവും",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"യാത്രയും സ്ഥലങ്ങളും",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"പ്രവർത്തനങ്ങൾ",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"വസ്തുക്കൾ",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"ചിഹ്നങ്ങൾ",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"പതാകകൾ",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Signal ആർട്ട് ക്രിയേറ്റർ",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Signal സ്റ്റിക്കർ പായ്ക്ക് ക്രിയേറ്റർ",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Signal ലോഗോ",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"സ്റ്റിക്കർ പായ്ക്ക് ക്രിയേറ്റർ മാർഗ്ഗനിർദ്ദേശങ്ങൾ",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"ഇവിടെ ചിത്രങ്ങൾ ചേർക്കാനോ ഡ്രോപ്പ് ചെയ്യാനോ ക്ലിക്ക് ചെയ്യുക",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"ചിത്രങ്ങൾ ഇവിടെ ഡ്രോപ്പ് ചെയുക",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"സ്റ്റിക്കർ പായ്ക്ക്",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"സ്റ്റിക്കർ പായ്ക്ക്",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"റദ്ദാക്കുക",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"കോപ്പി ചെയ്യുക",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"അടുത്തത്",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"തിരികെ പോകുക",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"നിങ്ങളുടെ സ്റ്റിക്കറുകൾ ചേർക്കുക",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"ചിത്രം നീക്കം ചെയ്യുക",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"സ്റ്റിക്കർ ചേർക്കാൻ ഒരു ഫയലിൽ ക്ലിക്ക് ചെയ്യുക അല്ലെങ്കിൽ അത് വലിച്ചിടുക",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"സുതാര്യമായ പശ്ചാത്തലവും 512x512 പിക്സലുകളും ഉള്ള PNG, APNG, WebP ഫോർമാറ്റുകളിലായിരിക്കണം സ്റ്റിക്കറുകൾ. ശുപാർശ ചെയ്യുന്ന മാർജിൻ 16px ആണ്.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"മാർജിനുകൾ കാണുക",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"ഓരോ സ്റ്റിക്കറിലും ഒരു ഇമോജി ചേർക്കുക",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"നിങ്ങൾ സന്ദേശങ്ങൾ അയയ്ക്കുമ്പോൾ സ്റ്റിക്കറുകൾ നിർദ്ദേശിക്കാൻ ഇത് ഞങ്ങളെ അനുവദിക്കുന്നു.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"കുറച്ച് വിശദാംശങ്ങൾ കൂടി മാത്രം...",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"പേര്",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"നിങ്ങളുടെ സ്റ്റിക്കർ പായ്ക്കിന്‍റെ പേര്",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"സൃഷ്ടാവ്",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"നിങ്ങളുടെ സ്റ്റിക്കറുകൾ ആര് സൃഷ്ടിച്ചതായി അറിയപ്പെടണോ അവരുടെ പേര് നൽകുക",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"കവർ ചിത്രം",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"നിങ്ങളുടെ സ്റ്റിക്കർ പായ്ക്ക് പങ്കിടുമ്പോൾ കാണിക്കുന്ന ചിത്രമാണിത്",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"നിങ്ങളുടെ സ്റ്റിക്കർ പായ്ക്ക് അപ്‌ലോഡ് ചെയ്യണമെന്ന് ഉറപ്പാണോ?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"അപ്‌ലോഡ്",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"സ്റ്റിക്കർ പായ്ക്ക് സൃഷ്ടിച്ചതിന് ശേഷം നിങ്ങൾക്ക് ഇനി എഡിറ്റുകൾ വരുത്താനോ ഇല്ലാതാക്കാനോ കഴിയില്ല.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"നിങ്ങളുടെ സ്റ്റിക്കർ പായ്ക്ക് സൃഷ്ടിക്കുന്നു",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$total$-ൽ $count$ അപ്‌ലോഡ് ചെയ്തു",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"അഭിനന്ദനങ്ങൾ! നിങ്ങൾ ഒരു സ്റ്റിക്കർ പായ്ക്ക് സൃഷ്ടിച്ചു.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"സ്റ്റിക്കർ ഐക്കണിലൂടെ നിങ്ങളുടെ പുതിയ സ്റ്റിക്കറുകൾ ആക്സസ് ചെയ്യുക, അല്ലെങ്കിൽ താഴെയുള്ള ലിങ്ക് ഉപയോഗിച്ച് നിങ്ങളുടെ സുഹൃത്തുക്കളുമായി പങ്കിടുക.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"നിങ്ങൾ പൊതുവായി ആക്സസ് ചെയ്യാൻ ആഗ്രഹിക്കുന്ന ഏതെങ്കിലും ഇഷ്ടാനുസൃത സ്റ്റിക്കർ പായ്ക്കുകൾക്കായി യുആർഎല്ലുകൾ കണ്ടെത്താൻ മറ്റ് ആളുകളെ സഹായിക്കുന്നതിന് $hashtag$ എന്ന ഹാഷ് ടാഗ് ഉപയോഗിക്കുക.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"സ്റ്റിക്കർ പായ്ക്ക് URL",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"ഇൻസ്റ്റാൾ",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"മറ്റൊരു സ്റ്റിക്കർ പായ്ക്ക് സൃഷ്ടിക്കുക",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Signal-നായി സൃഷ്ടിച്ച ഈ പുതിയ സ്റ്റിക്കർ പായ്ക്ക് I പരിശോധിക്കുക. #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {1 ചിത്രം ചേർത്തു} other {{count,number} ചിത്രങ്ങൾ ചേർത്തു}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"ആനിമേറ്റ് ചെയ്‌ത ആർട്ടിന് നിലവിൽ പിന്തുണയില്ല",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"ഡ്രോപ്പ് ചെയ്ത ചിത്രം വളരെ വലുതാണ്",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"ചിത്രം പ്രോസസ്സ് ചെയ്യുന്നതിൽ പിശക്",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"ആനിമേറ്റ് ചെയ്‌ത PNG ചിത്രങ്ങൾ ചതുരത്തിലായിരിക്കണം",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"ആനിമേറ്റ് ചെയ്ത ചിത്രങ്ങൾ തുടർച്ചയായി ലൂപ്പിലായിരിക്കണം",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"ആനിമേറ്റ് ചെയ്‌ത PNG ചിത്രത്തിന്‍റെ ഡൈമെൻഷനുകൾ വളരെ വലുതാണ്",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"ആനിമേറ്റ് ചെയ്‌ത PNG ചിത്രത്തിന്‍റെ ഡൈമെൻഷനുകൾ വളരെ ചെറുതാണ്",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"ചിത്രങ്ങൾ അപ്‌ലോഡ് ചെയ്യുന്നതിൽ പിശക്: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"സെർവറിലേക്ക് കണക്റ്റ് ചെയ്യാനായില്ല: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"കാലഹരണപ്പെട്ട ക്രെഡെൻഷ്യലുകൾ കാരണം ചിത്രങ്ങൾ അപ്‍ലോഡ് ചെയ്യാനായില്ല. Signal ഡെസ്‌ക്ടോപ്പിൽ നിന്ന് വെബ്സൈറ്റ് വീണ്ടും തുറക്കുക.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"ലിങ്ക് പകർത്തി",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"ലൈറ്റ് തീമിൽ എന്‍റെ സ്റ്റിക്കർ",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"ഇരുണ്ട തീമിൽ എന്റെ സ്റ്റിക്കർ",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"സ്റ്റിക്കർ പായ്ക്ക് ക്രിയേറ്റർ ഉപയോഗിക്കുന്നതിന് നിങ്ങളുടെ ഫോണിലും ഡെസ്ക്ടോപ്പിലും Signal സജ്ജീകരിക്കുക",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:o,CustomizingPreferredReactions__title:i,"ArtFrame--emoji-name-placeholder":{message:"ഇമോജിയുടെ മറ്റൊരു പേര്",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{i as CustomizingPreferredReactions__title,o as EmojiButton__label,t as cancel,a as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"ยกเลิก"},r={message:"$minutes$ นาที",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},o={message:"อีโมจิ",description:"Label for emoji button"},i={message:"ปรับแต่งการแสดงความรู้สึก",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},a={smartling:e,"index--title":{message:"ศูนย์สร้างสรรค์ Sticker Art"},"index--create-sticker-pack":{message:"สร้างชุดสติกเกอร์ใหม่"},"SignIn--title":{message:"สร้างสรรค์ชุดสติกเกอร์",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"ก็เหมือนกับทุกอย่างบน Signal สติกเกอร์ของเรามีการเข้ารหัสด้วยเช่นกัน ใช้เครื่องมือนี้เพื่อสร้างชุดสติกเกอร์ของคุณเองได้เลย",description:"A body of SignIn page"},"SignIn--qr":{message:"รหัสลงชื่อเข้าใช้",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"เปิด Signal สำหรับเดสก์ท็อปเพื่อเริ่มต้น",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"ขออภัย เบราว์เซอร์ของคุณไม่รองรับบริการนี้ กรุณาเปิดลิงก์นี้ใน Firefox หรือ Chrome",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"ไม่พบอีโมจิ",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"ค้นหาอีโมจิ",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"สีผิว $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"หน้ายิ้มและผู้คน",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"สัตว์และธรรมชาติ",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"อาหารและเครื่องดื่ม",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"เดินทางและสถานที่",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"กิจกรรม",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"วัตถุ",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"สัญลักษณ์",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"ธง",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"ศูนย์สร้างสรรค์ Signal Art",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"ศูนย์สร้างสรรค์ชุดสติกเกอร์ Signal (Sticker Pack Creator)",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"โลโก้ Signal",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"คำแนะนำสำหรับผู้สร้างชุดสติกเกอร์",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"คลิกเพื่อเพิ่ม หรือวางภาพลงตรงนี้",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"วางภาพลงตรงนี้",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"ชุดสติกเกอร์",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"ชุดสติกเกอร์",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"ยกเลิก",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"คัดลอก",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"ถัดไป",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"กลับ",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"เพิ่มสติกเกอร์ของคุณ",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"ลบรูปภาพ",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"คลิกหรือใช้การลากแล้ววางไฟล์เพื่อเพิ่มสติกเกอร์",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"สติกเกอร์ต้องอยู่ในรูปแบบ PNG, APNG หรือ WebP ที่มีพื้นหลังโปร่งใส และมีขนาด 512x512 พิกเซล ระยะเว้นขอบที่แนะนำคือ 16 พิกเซล",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"ดูระยะเว้นขอบ",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"เพิ่มอีโมจิในสติกเกอร์แต่ละอัน",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"นี่จะอนุญาตให้เราแนะนำสติกเกอร์ในระหว่างที่คุณพิมพ์ข้อความได้",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"เพิ่มรายละเอียดอีกสักเล็กน้อย…",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"ชื่อ",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"ตั้งชื่อชุดสติกเกอร์ของคุณ",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"ผู้สร้าง",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"ระบุชื่อผู้สร้างที่จะปรากฏในสติกเกอร์ของคุณ",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"ภาพปก",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"นี่จะเป็นภาพที่แสดงตอนที่คุณแชร์ชุดสติกเกอร์",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"แน่ใจหรือไม่ว่าต้องการอัปโหลดชุดสติกเกอร์ของคุณ",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"อัปโหลด",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"คุณจะไม่สามารถแก้ไขหรือลบอะไรได้อีกหลังสร้างชุดสติกเกอร์แล้ว",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"กำลังสร้างชุดสติกเกอร์ของคุณ",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"อัปโหลดแล้ว $count$ จาก $total$",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"ยินดีด้วย! คุณสร้างชุดสติกเกอร์แล้ว",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"เข้าถึงสติกเกอร์ใหม่ของคุณผ่านไอคอนสติกเกอร์ หรือแชร์ให้เพื่อนโดยใช้ลิงก์ด้านล่างนี้",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"ใช้แฮชแท็ก $hashtag$ เพื่อให้ผู้ใช้คนอื่นๆ เจอ URL ของชุดสติกเกอร์ใดก็ตามที่คุณอยากให้สาธารณะเข้าถึงได้",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"URL ชุดสติกเกอร์",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"ติดตั้ง",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"สร้างชุดสติกเกอร์อีกชุด",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"ลองดูชุดสติกเกอร์ใหม่ที่ฉันสร้างสรรค์ให้ Signal สิ! #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, other {เพิ่มแล้ว {count,number} ภาพ}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"ยังไม่รองรับภาพเคลื่อนไหว",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"ภาพที่วางมามีขนาดใหญ่เกินไป",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"พบข้อผิดพลาดระหว่างประมวลผลรูปภาพ",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"ภาพเคลื่อนไหวไฟล์ PNG ต้องเป็นสี่เหลี่ยมจัตุรัส",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"ภาพเคลื่อนไหวต้องวนไม่รู้จบ",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"ภาพเคลื่อนไหวไฟล์ PNG มีขนาดใหญ่เกินไป",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"ภาพเคลื่อนไหวไฟล์ PNG มีขนาดเล็กเกินไป",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"พบข้อผิดพลาดระหว่างอัปโหลดรูปภาพ: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ได้: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"อัปโหลดรูปภาพไม่สำเร็จเนื่องจากหมดเวลาในระบบแล้ว กรุณาเปิดเว็บไซต์นี้จาก Signal สำหรับเดส์กท็อปอีกครั้ง",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"คัดลอกลิงก์แล้ว",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"สติกเกอร์ของฉันในธีมสว่าง",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"สติกเกอร์ของฉันในธีมมืด",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"กรุณาติดตั้ง Signal บนมือถือและเดสก์ท็อป เพื่อใช้งานศูนย์สร้างสรรค์ชุดสติกเกอร์ (Sticker Pack Creator)",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:o,CustomizingPreferredReactions__title:i,"ArtFrame--emoji-name-placeholder":{message:"นามแฝงของอีโมจิ",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{i as CustomizingPreferredReactions__title,o as EmojiButton__label,t as cancel,a as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"Annuler"},r={message:"Il y a $minutes$ min",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},o={message:"Émoji",description:"Label for emoji button"},a={message:"Personnaliser les réactions",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},i={smartling:e,"index--title":{message:"Outil de création d’autocollants artistiques"},"index--create-sticker-pack":{message:"Créer un nouveau pack d’autocollants"},"SignIn--title":{message:"Créer un pack d’autocollants",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Comme pour tous les éléments Signal, les stickers sont également cryptés. Utilisez cet outil pour créer vos packs d’autocollants personnalisés.",description:"A body of SignIn page"},"SignIn--qr":{message:"Code d’inscription",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"Pour commencer, ouvrez Signal sur votre ordinateur",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"Désolé, votre navigateur n’est pas pris en charge. Veuillez ouvrir ce lien avec Firefox ou Chrome",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"Aucun émoji n’a été trouvé",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"Chercher un émoji",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"Teint $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"Smiley et personnes",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"Animaux et nature",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"Nourriture et boissons",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"Voyages et lieux",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"Activités",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"Objets",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"Symboles",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"Drapeaux",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Outil de création Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Outil de création de packs d’autocollants Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Logo Signal",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Instructions pour l’outil de création de packs d’autocollants",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"Cliquez pour ajouter ou déposer des images ici",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"Déposez les images ici",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"Pack d’autocollants",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"Pack d’autocollants",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"Annuler",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"Copier",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"Suivant",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"Retour",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"Ajoutez vos autocollants",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"Retirez l’image",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"Cliquez ou déposez un fichier pour ajouter un autocollant",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"Les autocollants doivent être au format PNG, APNG ou WebP avec un arrière-plan transparent et 512 x 512 pixels. La marge recommandée est de 16 px.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"Voir les marges",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"Ajoutez un émoji pour chaque autocollant",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"Cela nous permet de vous suggérer des autocollants lorsque vous composez un message.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"Quelques détails de plus...",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"Titre",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"Nommer votre pack d’autocollants",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"Auteur",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"Saisir un nom pour soumettre vos autocollants",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"Image de couverture",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"L’image qui s’affichera quand vous partagerez votre pack d’autocollants",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"Voulez-vous vraiment importer votre pack d’autocollants ?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"Importer",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"Vous ne pourrez plus effectuer de modifications ni de suppressions après avoir créé le pack d’autocollants.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"Création de votre pack d’autocollants",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$count$ sur $total$ ont été importés",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"Félicitations ! Vous avez créé un pack d’autocollants.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"Accédez à vos nouveaux autocollants à partir de l’icône autocollants ou partagez avec vos amis en utilisant le lien ci-dessous.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"Utilisez le hashtag $hashtag$ pour aider d’autres personnes à trouver les URL de tout pack d’autocollants personnalisé que vous souhaiteriez rendre publique.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"URL du pack d’autocollants",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"Installer",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"Créer un autre pack d’autocollants",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Découvrez ce nouveau pack d’autocollants que j’ai créé pour Signal. #makeprivacystick #respecterlavieprivée",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {1 image ajoutée} other {{count,number} images ajoutées}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"Les créations animées ne sont pas prises en charge",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"L’image déposée est trop grande",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"Erreur de traitement de l’image",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"Les images animées au format PNG doivent être carrées",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"Les images animées doivent se répéter indéfiniment",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"Les dimensions de l’image animée PNG sont trop grandes",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"Les dimensions de l’image animée PNG sont trop petites",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"Erreur d’importation des images :$message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"Échec de connexion au serveur : $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"Connexion expirée : Impossible d’importer des images. Veuillez rouvrir le site web depuis la version Desktop de Signal.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"Le lien a été copié",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"Mon autocollant en thème clair",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"Mon autocollant en thème sombre",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"Veuillez configurer Signal sur votre téléphone et votre ordinateur pour utiliser l’outil de création de packs d’autocollants",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:o,CustomizingPreferredReactions__title:a,"ArtFrame--emoji-name-placeholder":{message:"Alias d’émoji",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{a as CustomizingPreferredReactions__title,o as EmojiButton__label,t as cancel,i as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"İptal"},r={message:"$minutes$ d",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},a={message:"Emoji",description:"Label for emoji button"},i={message:"Tepkileri özelleştir",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},o={smartling:e,"index--title":{message:"Çıkartma Görseli Oluşturucu"},"index--create-sticker-pack":{message:"Yeni çıkartma paketi oluştur"},"SignIn--title":{message:"Çıkartma Paketi Oluştur",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Signal'deki diğer her şeyde olduğu gibi çıkartmalar da şifrelidir. Kendi özel çıkartma paketlerini oluşturmak için bu aracı kullan.",description:"A body of SignIn page"},"SignIn--qr":{message:"Giriş Kodu",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"Başlamak için Signal Desktop'ı aç",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"Üzgünüz, tarayıcın desteklenmiyor. Lütfen bu bağlantıyı Firefox veya Chrome'da aç",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"Emoji bulunamadı",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"Emoji ara",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"Ten rengi $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"Gülenyüzler ve Kişiler",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"Hayvanlar ve Doğa",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"Yeme İçme",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"Seyahat ve Mekânlar",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"Etkinlikler",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"Nesneler",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"Semboller",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"Bayraklar",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Signal Görsel Oluşturucu",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Signal Çıkartma Paketi Oluşturucu",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Signal Logosu",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Çıkartma Paketi Oluşturucu Kılavuzu",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"Görüntü eklemek için buraya tıkla veya sürükle",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"Görselleri buraya bırak",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"Çıkartma paketi",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"Çıkartma paketi",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"İptal",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"Kopyala",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"İleri",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"Geri",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"Çıkartmalarını ekle",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"Görseli kaldır",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"Çıkartma eklemek için tıkla veya dosyayı sürükle/bırak",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"Çıkartmalar şeffaf bir arka plana ve 512x512 piksele sahip PNG, APNG veya WebP biçiminde olmalıdır. Önerilen kenar boşluğu 16 pikseldir.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"Kenar boşluklarını görüntüle",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"Her çıkartmaya bir emoji ekle",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"Bu özellik sen mesajlaşırken sana çıkartma önerebilmemizi sağlar.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"Yalnızca birkaç detay daha...",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"Başlık",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"Çıkartma paketinin adı",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"Yaratıcı",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"Çıkartmanın yaratıcısı için bir ad gir",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"Kapak görseli",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"Çıkartma paketini paylaştığında bu görsel görüntülenecektir",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"Çıkartma paketini yüklemek istediğinden emin misin?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"Yükle",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"Çıkartma paketini oluşturduktan sonra düzenleme yapamayacak veya silemeyeceksin.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"Çıkartma paketin oluşturuluyor",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$count$/$total$ yüklendi",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"Tebrikler! Bir çıkartma paketi oluşturdun.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"Yeni çıkartmalarına çıkartma simgesinden ulaşabilir veya aşağıdaki bağlantıyı kullanarak arkadaşlarınla paylaşabilirsin.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"Herkes tarafından erişilebilir olmasını istediğin özel çıkartma paketlerinin bağlantı adreslerinin diğer kişiler tarafından bulunabilmesini kolaylaştırmak için $hashtag$ konu etiketini kullan.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"Çıkartma Paketi Bağlantı Adresi",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"Yükle",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"Farklı bir çıkartma paketi oluştur",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Signal için oluşturduğum bu yeni çıkartma paketine göz at. #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {1 görsel eklendi} other {{count,number} görsel eklendi}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"Animasyonlu görsel şu anda desteklenmiyor",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"Bırakılan görüntü çok büyük",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"Görüntü işlenirken hata oluştu",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"Animasyonlu PNG resimleri kare şeklinde olmalıdır",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"Animasyonlu resimler sonsuz döngüde olmalıdır",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"Animasyonlu PNG resim boyutları çok büyük",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"Animasyonlu PNG resim boyutları çok küçük",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"Görseller yüklenirken hata oluştu: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"Sunucuya bağlanılamıyor: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"Kimlik bilgilerinin süresi dolduğundan görseller yüklenemedi. Lütfen web sitesini Signal Desktop'tan yeniden aç.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"Bağlantı kopyalandı",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"Aydınlık temada çıkartma görüntüsü",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"Karanlık temada çıkartma görüntüsü",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"Çıkartma Paketi Oluşturucu'yu kullanmak için lütfen Signal'i telefonunda ve bilgisayarında kur",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:a,CustomizingPreferredReactions__title:i,"ArtFrame--emoji-name-placeholder":{message:"Emoji takma adı",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{i as CustomizingPreferredReactions__title,a as EmojiButton__label,t as cancel,o as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"रद्द करें"},r={message:"$minutes$ मिनट",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},o={message:"इमोजी",description:"Label for emoji button"},i={message:"प्रतिक्रियाएँ कस्टमाइज़ करें",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},a={smartling:e,"index--title":{message:"स्टिकर आर्ट क्रिएटर"},"index--create-sticker-pack":{message:"नया स्टिकर पैक बनाएँ"},"SignIn--title":{message:"कोई स्टिकर पैक बनाएँ",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"जैसा कि Signal में बाकी सभी चीजें होती हैं, स्टिकर भी एन्क्रिप्टेड होते हैं। अपने खुद के कस्टम स्टिकर पैक बनाने के लिए इस टूल का उपयोग करें।",description:"A body of SignIn page"},"SignIn--qr":{message:"साइन इन कोड",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"शुरू करने के लिए Signal डेस्कटॉप खोलें",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"माफ करें, आपका ब्राउजर समर्थित नहीं है। कृपया इस लिंक को Firefox या Chrome में खोलें",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"इमोजी नहीं मिला",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"इमोजी खोजें",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"स्किन टोन $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"स्माइली और लोग",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"जानवर और प्रकृति",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"भोजन और ड्रिंक",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"सफर और जगहें",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"गतिविधियाँ",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"वस्तुएँ",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"चिन्ह",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"झंडे",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Signal आर्ट क्रिएटर",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Signal स्टिकर पैक क्रिएटर",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Signal लोगो",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"स्टिकर पैक क्रिएटर संबंधी दिशानिर्देश",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"यहाँ तस्वीरें जोड़ने या ड्रॉप करने के लिए क्लिक करें",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"यहाँ तस्वीरें ड्रॉप करें",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"स्टिकर पैक",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"स्टिकर पैक",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"रद्द करें",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"कॉपी",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"फेसबुक",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"पिंटेरेस्ट",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"व्हॉट्सऐप",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"अगला",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"पीछे जाएं",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"अपने स्टिकर जोडे़ं",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"छवि हटाएँ",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"स्टिकर लगाने के लिए किसी फ़ाइल को क्लिक या ड्रैग/ड्रॉप करें",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"स्टिकर PNG, APNG, या WebP फॉर्मैट में होने चाहिए और उनका बैकग्राउंड पारदर्शी होना चाहिए 512x512 पिक्सल के होने चाहिए। सिफारिश किया हुआ मार्जिन है 16px.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"मार्जिन देखें",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"प्रत्येक स्टिकर में एक इमोजी जोड़ें",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"इससे हम जब आप मेसेज करते हैं, तब आपको स्टिकर का सुझाव दे सकते हैं।",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"बस कुछ और विवरण...",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"शीर्षक",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"अपने स्टिकर पैक को नाम दें",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"लेखक",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"अपने स्टिकर निम्न के अंतर्गत सबमिट करने के लिए कोई नाम दर्ज करें",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"कवर तस्वीर",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"यह वह तस्वीर है जो तब दिखाई देगी जब आप अपना स्टिकर पैक शेयर करेंगे",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"क्या आप वाकई में अपना स्टिकर पैक अपलोड करना चाहते हैं?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"अपलोड करें",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"आप फिर स्टिकर पैक बनाने के बाद उसे एडिट या मिटा नहीं पाएँगे।",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"आपका स्टिकर पैक बनाया जा रहा है",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$total$ का $count$ अपलोड हो गया",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"बधाई हो! आपने एक स्टिकर पैक बना लिया।",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"स्टिकर आइकन के ज़रिए अपने नए स्टिकर्स को एक्सेस करें, या नीचे दिए लिंक का उपयोग करते हुए इसे अपने दोस्तों के साथ शेयर करें।",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"अन्य लोगों को किसी भी कस्टम स्टिकर पैक के लिए URLs खोजने में मदद करने के लिए हैशटैग$hashtag$ का उपयोग करें जिसे आप सार्वजनिक रूप से सुलभ बनाना चाहते हैं।",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"स्टिकर पैक URL",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"इंस्टॉल करें",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"एक और स्टिकर पैक बनाएँ",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"ये नया स्टिकर पैक देखें जो मैंने Signal के लिए बनाया है। #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {1 इमेज जोड़ी गई} other {{count,number} इमेज जोड़ी गईं}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"वर्तमान में एनिमेटेड आर्ट समर्थित नहीं है",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"ड्रॉप की गई तस्वीर बहुत बड़ी है",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"तस्वीर प्रोसेस करने में त्रुटि",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"एनिमेटेड PNG तस्वीर चौरस होने चाहिए",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"एनिमेटेड तस्वीर हमेशा लूप में रहने चाहिए",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"एनिमेटेड PNG तस्वीर का आकार बहुत बड़ा है",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"एनिमेटेड PNG तस्वीर का आकार बहुत छोटा है",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"तस्वीर अपलोड करने में त्रुटि: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"सर्वर से कनेक्ट नहीं हो सकता: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"एक्सपायर हो चुके क्रेडेंशियल्स के कारण छवियां अपलोड करने में विफल। कृपया Signal डेस्कटॉप से वेबसाइट दोबारा फिर से खोलें।",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"लिंक कॉपी गिया",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"लाइट थीम में मेरा स्टिकर",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"डार्क थीम में मेरा स्टिकर",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"स्टिकर पैक क्रिएटर का उपयोग करने के लिए कृपया अपने फोन और डेस्कटॉप पर Signal को सेट अप करें",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:o,CustomizingPreferredReactions__title:i,"ArtFrame--emoji-name-placeholder":{message:"इमोजी उपनाम",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{i as CustomizingPreferredReactions__title,o as EmojiButton__label,t as cancel,a as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"Отменить"},r={message:"$minutes$м",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},o={message:"Эмодзи",description:"Label for emoji button"},i={message:"Настроить реакции",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},a={smartling:e,"index--title":{message:"Художественный редактор стикеров"},"index--create-sticker-pack":{message:"Создать новый набор стикеров"},"SignIn--title":{message:"Создать набор стикеров",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Как и всё остальное в Signal, стикеры тоже зашифрованы. Используйте этот инструмент для создания собственных наборов стикеров.",description:"A body of SignIn page"},"SignIn--qr":{message:"Код для входа",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"Откройте Signal Desktop, чтобы начать",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"Извините, ваш браузер не поддерживается. Пожалуйста, откройте эту ссылку в Firefox или Chrome",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"Эмодзи не найдено",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"Поиск эмодзи",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"Оттенок кожи $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"Смайлики и люди",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"Животные и растения",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"Еда и напитки",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"Путешествия и места",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"Активность",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"Предметы",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"Символы",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"Флаги",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Художественный редактор Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Редактор наборов стикеров Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Логотип Signal",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Руководство по редактору наборов стикеров",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"Нажмите, чтобы добавить изображения, или перетащите их сюда",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"Отпустите изображения здесь",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"Набор стикеров",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"Набор стикеров",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"Отменить",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"Копировать",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"Далее",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"Назад",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"Добавьте ваши стикеры",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"Удалить изображение",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"Нажмите или перетащите файл, чтобы добавить стикер",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"Стикеры должны быть в формате PNG, APNG или WebP с прозрачным фоном, размером 512 x 512 пикселей. Рекомендуемое поле (margin) — 16 пикселей.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"Посмотреть поля (margin)",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"Назначьте эмодзи каждому стикеру",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"Это позволит нам предлагать вам стикеры, когда вы общаетесь.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"Ещё несколько деталей…",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"Название",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"Назовите свой набор стикеров",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"Автор",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"Введите имя, под которым будут представлены ваши стикеры",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"Изображение обложки",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"Это изображение, которое будет показано, когда вы делитесь вашим набором стикеров",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"Вы действительно хотите загрузить свой набор стикеров?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"Загрузить на сервер",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"Вы больше не сможете внести изменения в этот набор стикеров (или удалить его) после создания.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"Создаём ваш набор стикеров",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$count$ из $total$ загружено",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"Поздравляем! Вы создали набор стикеров.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"Получите доступ к вашим новым стикерам через значок стикеров или поделитесь ими с друзьями, используя ссылку ниже.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"Используйте хэштег $hashtag$, чтобы помочь другим людям найти ссылки на любые пользовательские наборы стикеров, которые вы хотите сделать общедоступными.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"Ссылка на набор стикеров",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"Установить",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"Создать ещё один набор стикеров",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Посмотрите на этот новый набор стикеров, созданных мною для Signal. #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {1 изображение добавлено} few {{count,number} изображения добавлено} many {{count,number} изображений добавлено} other {{count,number} изображения добавлено}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"Анимация в данный момент не поддерживаются",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"Изображение, которое вы используете, слишком большое",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"Ошибка обработки изображения",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"Анимированные PNG-изображения должны быть квадратными",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"Анимированные изображения должны повторяться бесконечно",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"Размеры анимированного PNG-изображения слишком большие",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"Размеры анимированного PNG-изображения слишком маленькие",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"Ошибка выгрузки изображений: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"Не удалось подключиться к серверу: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"Не удалось загрузить изображения из-за истёкших учётных данных. Откройте веб-сайт снова из Signal Desktop.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"Ссылка скопирована",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"Мой стикер в светлой теме",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"Мой стикер в тёмной теме",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"Пожалуйста, настройте Signal на вашем телефоне и ПК, чтобы использовать редактор наборов стикеров",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:o,CustomizingPreferredReactions__title:i,"ArtFrame--emoji-name-placeholder":{message:"Псевдоним эмодзи",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{i as CustomizingPreferredReactions__title,o as EmojiButton__label,t as cancel,a as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"Отказ"},r={message:"$minutes$ минути",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},o={message:"Емотикони",description:"Label for emoji button"},i={message:"Персонализирайте реакциите",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},a={smartling:e,"index--title":{message:"Създател на изкуство за стикери"},"index--create-sticker-pack":{message:"Създайте нов пакет стикери"},"SignIn--title":{message:"Създайте пакет със стикери",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Точно както с всичко останало в Signal, стикерите също са криптирани. Използвайте този инструмент, за да създадете свои собствени персонализирани пакети стикери.",description:"A body of SignIn page"},"SignIn--qr":{message:"Код за вписване",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"Отворете уебсайта Signal, за да започнете",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"За съжаление вашият браузър не се поддържа. Моля, отворете този линк във Firefox или Chrome",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"Не бяха открити емотикони",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"Търсете емотикони",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"Цвят на кожата $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"Усмивки и хора",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"Животни и природа",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"Храни и напитки",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"Пътуване и места",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"Дейности",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"Обекти",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"Символи",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"Знамена",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Създател на изкуство за Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Създаване на пакет със Signal стикери",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Лого на Signal",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Указания за създаване на пакет стикери",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"Натиснете, за да добавите или пуснете изображения тук",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"Пуснете изображения тук",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"Пакет със стикери",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"Пакет със стикери",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"Отказ",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"Копирайте",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"Напред",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"Обратно",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"Добавете стикери",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"Премахване на изображението",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"Кликнете или плъзнете/пуснете файл, за да добавите стикер",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"Стикерите трябва да са в PNG, APNG или WebP формат, с прозрачен фон и 512x512 пиксела. Препоръчителният отстъп е 16px.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"Преглед на отстъпите",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"Добави емотикона към всеки стикер",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"Това ни позволява да предлагаме стикери докато чатите.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"Още няколко детайла…",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"Заглавие",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"Дайте име на вашия пакет стикери",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"Автор",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"Въведете име, с което да запазите стикерите си",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"Изображение на корицата",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"Това е изображението, което ще се показва, когато споделяте вашия пакет със стикери",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"Сигурни ли сте, че искате да качите пакета със стикери?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"Качване",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"След създаването на пакета със стикери вече няма да можете да редактирате или изтривате.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"Вашият пакет със стикери се създава",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$count$ от $total$ качени",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"Честито! Вие създадохте пакет със стикери.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"Отворете новите ви стикери от иконата за стикери или споделете с вашите приятели чрез линка по-долу.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"Използвайте хаштага $hashtag$, за да помогнете на хората да намерят адресите на пакети със стикери, които искате да споделите публично.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"URL на пакета със стикери",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"Инсталирай",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"Създайте друг пакет със стикери",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Разгледай новия пакет със стикери, който създадох за Signal. #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {1 изображение е добавено} other {{count,number} изображения са добавени}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"В момента не се поддържат анимирани стикери",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"Пуснатото изображение е твърде голямо",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"Грешка при обработката на изображението",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"Анимираните PNG изображения трябва да са квадратни",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"Анимираните изображения трябва да се повтарят постоянно",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"Размерите на анимираното PNG изображение са твърде големи",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"Размерите на анимираното PNG изображение са твърде малки",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"Грешка при качване на изображения: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"Неуспешна връзка със сървъра: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"Неуспешно качване на изображения поради изтекла идентификация. Моля, отворете уебсайта от Signal Desktop отново.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"Линкът е копиран",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"Моят стикер в светла тема",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"Моят стикер в тъмна тема",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"Моля, настройте Signal на вашия телефон и настолен компютър, за да създавате пакети със стикери",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:o,CustomizingPreferredReactions__title:i,"ArtFrame--emoji-name-placeholder":{message:"Псевдоним на емотикон",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{i as CustomizingPreferredReactions__title,o as EmojiButton__label,t as cancel,a as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"Ακύρωση"},r={message:"$minutes$λ",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},o={message:"Emoji",description:"Label for emoji button"},i={message:"Προσαρμογή αντιδράσεων",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},a={smartling:e,"index--title":{message:"Δημιουργός αυτοκόλλητων"},"index--create-sticker-pack":{message:"Δημιούργησε ένα νέο πακέτο αυτοκόλλητων"},"SignIn--title":{message:"Δημιούργησε ένα πακέτο αυτοκόλλητων",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Όπως και οτιδήποτε άλλο στο Signal, τα αυτοκόλλητα είναι κρυπτογραφημένα. Χρησιμοποίησε αυτό το εργαλείο για να δημιουργήσεις τα δικά σου εξατομικευμένα πακέτα αυτοκόλλητων.",description:"A body of SignIn page"},"SignIn--qr":{message:"Κωδικός σύνδεσης",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"Άνοιξε το Signal Desktop για να ξεκινήσεις",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"Δυστυχώς, το πρόγραμμα περιήγησης που χρησιμοποιείς δεν υποστηρίζεται. Άνοιξε αυτόν τον σύνδεσμο σε Firefox ή Chrome",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"Δεν βρέθηκε emoji",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"Αναζήτηση emoji",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"Χρώμα δέρματος $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"Φατσούλες και άνθρωποι",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"Ζώα και φύση",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"Φαγητό και ποτό",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"Ταξίδι και τοποθεσίες",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"Δραστηριότητες",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"Αντικείμενα",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"Σύμβολα",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"Σημαίες",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Δημιουργός αυτοκόλλητων Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Δημιουργός πακέτου αυτοκόλλητων Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Λογότυπο Signal",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Οδηγίες δημιουργίας πακέτου αυτοκόλλητων",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"Πάτα για προσθήκη ή σύρε εικόνες εδώ",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"Σύρε εικόνες εδώ",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"Πακέτο αυτοκόλλητων",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"Πακέτο αυτοκόλλητων",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"Ακύρωση",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"Αντιγραφή",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"Επόμενο",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"Πίσω",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"Πρόσθεσε τα αυτοκόλλητά σου",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"Αφαίρεση εικόνας",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"Κάνε κλικ ή σύρε ένα αρχείο εδώ για να προσθέσεις αυτοκόλλητο",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"Τα αυτοκόλλητα πρέπει να είναι τύπου PNG, APNG ή WebP, με διαφανές φόντο και διαστάσεις 512x512 pixel. Προτείνεται περιθώριο 16px.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"Προβολή περιθωρίων",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"Προσθήκη emoji σε κάθε αυτοκόλλητο",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"Αυτό μας επιτρέπει να προτείνουμε αυτοκόλλητα καθώς συνομιλείς.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"Μερικές ακόμα λεπτομέρειες…",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"Τίτλος",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"Δώσε όνομα στο πακέτο αυτοκόλλητων",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"Εκδότης",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"Γράψε ένα όνομα για να υποβάλεις τα αυτοκόλλητά σου",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"Εικόνα εξωφύλλου",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"Αυτή η εικόνα θα φαίνεται όταν μοιράζεσαι το πακέτο αυτοκόλλητων",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"Θέλεις σίγουρα να ανεβάσεις το πακέτο αυτοκόλλητων;",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"Ανέβασμα",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"Δεν θα μπορείς πλέον να επεξεργαστείς ή να διαγράψεις στοιχεία, αφού δημιουργήσεις το πακέτο αυτοκόλλητων.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"Δημιουργείται το πακέτο αυτοκόλλητων",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"Ανέβηκαν $count$ από τα $total$",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"Συγχαρητήρια! Δημούργησες ένα πακέτο αυτοκόλλητων.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"Πάτα στο εικονίδιο για τα αυτοκόλλητα για να δεις τα νέα δικά σου ή χρησιμοποίησε τον παρακάτω σύνδεσμο για να τα μοιραστείς με φίλους.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"Χρησιμοποίησε το hashtag $hashtag$ για να βοηθήσεις άλλους χρήστες να βρουν συνδέσμους με πακέτα αυτοκόλλητων που θέλεις να είναι προσβάσιμα στο κοινό.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"Σύνδεσμος πακέτου αυτοκόλλητων",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"Εγκατάσταση",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"Δημιούργησε ένα νέο πακέτο αυτοκόλλητων",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Δες το νέο πακέτο αυτοκόλλητων που έφτιαξα για το Signal. #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {προστέθηκε 1 εικόνα} other {προστέθηκαν {count,number} εικόνες}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"Οι κινούμενες εικόνες δεν υποστηρίζονται προς το παρόν",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"Η εικόνα που έσυρες είναι πολύ μεγάλη",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"Σφάλμα κατά την επεξεργασία της εικόνας",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"Οι κινούμενες εικόνες PNG πρέπει να είναι τετράγωνες",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"Οι κινούμενες εικόνες πρέπει να κινούνται επαναλαμβανόμενα συνέχεια",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"Οι διαστάσεις της κινούμενης εικόνας PNG είναι πολύ μεγάλες",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"Οι διαστάσεις της κινούμενης εικόνας PNG είναι πολύ μικρές",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"Σφάλμα κατά το ανέβασμα των εικόνων: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"Αδυναμία σύνδεσης με τον διακομιστή: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"Η μεταφόρτωση εικόνων απέτυχε επειδή τα διαπιστευτήριά σου έχουν λήξει. Άνοιξε ξανά τον ιστότοπο από το Signal Desktop.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"Ο σύνδεσμος αντιγράφτηκε",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"Το αυτοκόλλητό μου σε ανοιχτόχρωμο θέμα",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"Το αυτοκόλλητό μου σε σκοτεινό θέμα",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"Ρύθμισε το Signal στο τηλέφωνο και τον υπολογιστή σου για να χρησιμοποιήσεις τον δημιουργό πακέτων με αυτοκόλλητα",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:o,CustomizingPreferredReactions__title:i,"ArtFrame--emoji-name-placeholder":{message:"Ψευδώνυμο emoji",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{i as CustomizingPreferredReactions__title,o as EmojiButton__label,t as cancel,a as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"إلغاء"},r={message:"منذ $minutes$ دقائق",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},o={message:"وجه مُعبِّر",description:"Label for emoji button"},i={message:"تخصيص التفاعلات",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},a={smartling:e,"index--title":{message:"مُنشئ فن الملصقات"},"index--create-sticker-pack":{message:"إنشاء حزمة ملصقات جديدة"},"SignIn--title":{message:"إنشاء حزمة ملصقات",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"تمامًا كما هو الحال مع كل شيء آخر في Signal، يتم تشفير الملصقات أيضًا. استعِن بهذه الأداة لتُنشأ حزمة الملصقات الخاصة بك.",description:"A body of SignIn page"},"SignIn--qr":{message:"رمز تسجيل الدخول",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"افتح تطبيق Signal Desktop للبدء",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"عذرًا، متصفحك غير مدعوم. يُرجى فتح هذا الرابط في Firefox أو Chrome",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"لم يعثر على أية وجوه تعبيرية",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"البحث عن وجه مُعبِّر",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"لون البشرة $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"الرموز التعبيرية والأشخاص",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"الحيوانات والطبيعة",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"الطعام والشراب",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"السفر والأماكن",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"الأنشطة",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"الأشياء",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"الرموز",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"الأعلام",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"مُنشئ فن Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"مُنشيء حزمة الملصقات لـ Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"شعار Signal",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"إرشادات حول مُنشيء حزمة الملصقات",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"يُرجى إضافة الصور أو إلقاءها هنا",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"يُرجى إلقاء الصور هنا",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"حزمة الملصقات",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"حزمة الملصقات",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"إلغاء",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"نسخ",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"فيسبوك",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"تويتر",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"واتساب",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"التالي",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"رجوع",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"أضف ملصقاتك",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"إزالة الصورة",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"انقر أو اسحب/ألقى ملفًا لإضافة ملصق",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"يَجب أن تكون الملصقات بصيغة PNG أو APNG أو WebP وبخلفية شفافة ومقاس 512×512 بِكْسل. طول الهامش المُوصى بها هو 16 بِكْسل.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"عرض الهوامش",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"إضافة وجه مُعبِّر لكل ملصق",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"يسمح لنا هذا باقتراح ملصقات لك أثناء التراسُل.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"تبقّت فقط بعض التفاصيل الإضافية…",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"العنوان",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"إعطاء اسم لحزمة ملصقاتك",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"المؤلف",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"أدخل اسمًا لإرسال ملصقاتك تحته",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"صورة الغلاف",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"هذه هي الصورة التي ستظهر عند مشاركة حزمة ملصقاتك",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"أأنت على يقين من رغبتك رفع حزمة ملصقاتك؟",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"رفع",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"سَيتعذر عليك التعديل أو الحذف بعد إنشاء حزمة الملصقات.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"يَجري إنشاء حزمة ملصقاتك",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"تم رفع $count$ من $total$",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"تهانينا! لقد أنشأت حزمة ملصقات.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"يُرجى الوصول إلى ملصقاتك الجديدة من خلال أيقونة الملصق، أو مشاركتها مع أصدقائك باستخدام الوصلة أدناه.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"يُرجى استخدام الهاشتاغ $hashtag$ لمُساعدة الآخرين على العثور على عناوين أية حزم ملصقات مُخصّصة المراد جعلها متاحة للعموم.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"عنوان صفحة حزمة الملصقات",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"تثبيت",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"إنشاء حزمة ملصقات أخرى",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"ألقوا نظرة على هذه الحزمة من الملصقات الجديدة التي صممتُها ﻷجل Signal. #اجعل_الخصوصية_متوفرة_دائماً",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, zero {تمت إضافة {count,number} صورة} one {تمت إضافة {count,number} صورة واحدة} two {تمت إضافة {count,number} صورتين} few {تمت إضافة {count,number} صور} many {تمت إضافة {count,number} صورة} other {تمت إضافة {count,number} صورة}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"لا ندعم حالياً الملصقات المتحركة",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"الصورة التي تم وضعها كبيرة جداً",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"فشلت معالجة الصورة",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"يَجب أن تكون صور PNG المتحركة داخل إطار مربع",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"يَجب ألا تتوقف الصور المتحركة أبدًا",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"أبعاد صورة PNG المتحركة كبيرة جدًا",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"أبعاد صورة PNG المتحركة صغيرة جدًا",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"فشل في تحميل الصور: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"لا يمكن الاتصال بالخادم: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"فشل تحميل الصور بسبب انتهاء صلاحية بيانات الاعتماد. يُرجى إعادة فتح موقع الويب من Signal Desktop مرة أخرى.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"نُسخَ الرابط",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"ملصقي خلال السمة النهارية",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"ملصقي خلال السمة الليلية",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"يُرجى إعداد Signal في هاتفك وفي الحاسوب لاستخدام مُنشيء حزم الملصقات",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:o,CustomizingPreferredReactions__title:i,"ArtFrame--emoji-name-placeholder":{message:"الاسم المُستعار للرموز التعبيرية",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{i as CustomizingPreferredReactions__title,o as EmojiButton__label,t as cancel,a as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"Cancelar"},r={message:"$minutes$ m",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},a={message:"Emojis",description:"Label for emoji button"},o={message:"Personalizar reacciones",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},i={smartling:e,"index--title":{message:"Creador de stickers"},"index--create-sticker-pack":{message:"Crear nuevo paquete de stickers"},"SignIn--title":{message:"Crear un paquete de stickers",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Como todo lo demás en Signal, los stickers también están encriptados . Usa esta herramienta para crear tus propios paquetes de stickers personalizados.",description:"A body of SignIn page"},"SignIn--qr":{message:"Código de inicio de sesión",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"Para empezar, abre Signal para Esctorio",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"Lo sentimos, tu navegador no es compatible. Por favor, abre este enlace en Firefox o Chrome",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"Emoji no encontrado",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"Buscar emoji",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"Tono de piel $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"Emoticonos y personas",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"Animales y naturaleza",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"Comida y bebida",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"Viajes y destinos",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"Actividades",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"Objetos",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"Símbolos",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"Banderas",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Creador artístico de Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Creador de paquetes de stickers de Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Logo de Signal",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Pautas del creador de paquetes de stickers",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"Haz clic para añadir imágenes o arrástralas aquí",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"Arrastra imágenes aquí",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"Paquete de stickers",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"Paquete de stickers",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"Cancelar",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"Copiar",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"Siguiente",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"Atrás",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"Añade stickers",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"Eliminar imagen",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"Haz clic o arrastra y suelta un archivo para agregar un sticker",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"Los stickers son archivos en formato PNG, APNG o WebP con fondo transparente y un tamaño de 512x512 píxeles. El margen recomendado es de 16 píxeles.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"Ver márgenes",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"Describe cada sticker con un emoji",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"Esto permite sugerir stickers al introducir un emoji en un chat.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"Solo unos pocos detalles más…",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"Título",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"Ponle nombre a tu paquete de stickers",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"Autor",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"Introduce un alias para subir tus stickers",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"Imagen de presentación",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"Esta es la imagen mostrada cuando se comparte el paquete",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"¿SegurX que quieres subir el paquete de stickers?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"Subir",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"No podrás editar el paquete ni borrarlo nunca más tras subirlo (pero podrás crear nuevos paquetes sin fallos para compartir).",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"Creando tu paquete de stickers",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$count$ de $total$ transferidos",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"¡Enhorabuena! Has creado un paquete de stickers.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"Accede a tus nuevos stickers a través del icono de stickers o compártelos con tus amistades usando el enlace inferior.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"Usa el hashtag $hashtag$ en las redes sociales para ayudar a más personas a encontrar tu paquete de stickers, si deseas publicarlo.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"Dirección del paquete de stickers",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"Instalar",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"Crear otro paquete de stickers",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Mira este paquete de stickers que he creado en Signal. #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {1 imagen añadida} other {{count,number} imágenes añadidas}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"Las animaciones no son compatibles actualmente",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"La imagen arrastrada es demasiado grande",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"Fallo al procesar la imagen",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"Las imágenes en formato PNG animado deben tener forma cuadrada",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"Las imágenes animadas deben tener un bucle infinito",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"El tamaño de las imágenes en formato PNG animado es demasiado grande",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"El tamaño de las imágenes en formato PNG animado es demasiado pequeño",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"Fallo al subir imágenes: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"Fallo al conectar con el servidor: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"Error al cargar imágenes debido a credenciales caducadas. Por favor, vuelve a abrir la web desde Signal para Escritorio",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"Enlace copiado",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"Tu sticker en tema (con fondo) claro",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"Tu sticker en tema (con fondo) oscuro",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"Por favor, configura Signal en tu celular/móvil y enlázalo con Signal Desktop para usar el Creador de Paquetes de Stickers",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:a,CustomizingPreferredReactions__title:o,"ArtFrame--emoji-name-placeholder":{message:"Nombre del emoji",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{o as CustomizingPreferredReactions__title,a as EmojiButton__label,t as cancel,i as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"Prekliči"},a={message:"$minutes$ min",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},o={message:"Emoji",description:"Label for emoji button"},r={message:"Prilagodi odzive",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},i={smartling:e,"index--title":{message:"Ustvarjalnik nalepk"},"index--create-sticker-pack":{message:"Ustvari nov paket nalepk"},"SignIn--title":{message:"Ustvari paket nalepk",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Kot vse ostalo pri Signalu, so tudi nalepke šifrirane. Uporabite to orodje, da ustvarite lastne pakete nalepk po meri.",description:"A body of SignIn page"},"SignIn--qr":{message:"Koda za prijavo",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"Odprite Signal Desktop, da začnete",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"Oprostite, vaš brskalnik ni podprt. Odprite to povezavo v Firefoxu ali Chromu",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:a,"EmojiPicker--empty":{message:"Najden ni bil noben emoji",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"Poišči emoji",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"Odtenek kože $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"Smeški in ljudje",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"Živali in narava",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"Hrana in pijača",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"Potovanja in kraji",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"Dejavnosti",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"Objekti",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"Simboli",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"Zastave",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Signalov ustvarjalnik umetnosti",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Signalov ustvarjalnik paketov nalepk",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Signalov logotip",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Smernice za uporabo ustvarjalnika paketov nalepk",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"Za dodajanje slik kliknite ali povlecite sem",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"Spustite slike tukaj",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"Paket nalepk",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"Paket nalepk",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"Prekliči",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"Kopiraj",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"Naprej",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"Nazaj",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"Dodajte svoje nalepke",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"Odstrani sliko",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"Za dodajanje nalepke kliknite ali povlecite/spustite datoteko",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"Nalepke morajo biti v formatu PNG, AONG ali WebP, s prosojnim ozadjem in velikosti 512 x 512 pikslov. Priporočen rob je 16 px.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"Ogled robov",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"Vsaki nalepki dodajte emoji",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"To nam omogoča, da vam med tipkanjem priporočamo nalepke.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"Samo še nekaj malenkosti ...",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"Naslov",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"Poimenujte svoj paket nalepk",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"Avtor",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"Vnesite ime, pod katerim želite oddati svoje nalepke",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"Naslovna slika",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"Ta slika bo prikazana, ko boste delili svoj paket nalepk z drugimi",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"Ste prepričani, da želite naložiti svoj paket nalepk?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"Naloži",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"Ko je paket nalepk enkrat ustvarjen, ga ni več mogoče popravljati oziroma izbrisati.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"Ustvarjanje vašega paketa nalepk",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$count$ od $total$ naloženih",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"Čestitamo! Ustvarili ste paket nalepk.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"Dostopajte do svojega paketa nalepk preko ikone ali pa ga delite s prijatelji prek spodnje povezave.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"Da bi ljudje lažje našli URL naslove s paketi nalepk, za katere želite, da so na voljo javnosti, uporabljajte ključnik $hashtag$.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"URL paketa nalepk",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"Namesti",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"Ustvari nov paket nalepk",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Poglej si moj novi paket nalepk za Signal! #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {Dodana je 1 slika} two {Dodani sta {count,number} sliki} few {Dodane so {count,number} slike} other {Dodanih je {count,number} slik}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"Animacija trenutno ni podprta",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"Spuščena slika je prevelika",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"Napaka pri obdelavi slike",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"Animirane PNG slike morajo biti kvadratne oblike",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"Animirane slike se morajo vrteti v neskončnost",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"Animirana PNG slika je prevelika",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"Animirana PNG slika je premajhna",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"Napaka pri nalaganju slik: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"Ni mogoče vzpostaviti povezave s strežnikom: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"Nalaganje slik ni uspelo zaradi pretečenih poverilnic. Znova odprite spletno stran iz aplikacije Signal Desktop.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"Povezava je kopirana",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"Moja nalepka v svetlem načinu",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"Moja nalepka v temnem načinu",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"Če želite uporabljati ustvarjalnik paketov nalepk, povežite aplikacijo Signal na svojem telefonu s tisto na računalniku",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:o,CustomizingPreferredReactions__title:r,"ArtFrame--emoji-name-placeholder":{message:"Emoji vzdevek",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{r as CustomizingPreferredReactions__title,o as EmojiButton__label,t as cancel,i as default,a as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"ਰੱਦ ਕਰੋ"},r={message:"$minutes$ ਮਿੰਟ",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},o={message:"ਇਮੋਜੀ",description:"Label for emoji button"},i={message:"ਰਿਐਕਸ਼ਨ ਕਸਟਮਾਈਜ਼ ਕਰੋ",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},a={smartling:e,"index--title":{message:"ਸਟਿੱਕਰ ਆਰਟ ਕ੍ਰੀਏਟਰ"},"index--create-sticker-pack":{message:"ਨਵਾਂ ਸਟਿੱਕਰ ਪੈਕ ਬਣਾਓ"},"SignIn--title":{message:"ਸਟਿੱਕਰ ਪੈਕ ਬਣਾਓ",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Signal ਵਿੱਚ ਹਰ ਇੱਕ ਚੀਜ਼ ਵਾਂਗ, ਸਟਿੱਕਰ ਵੀ ਇਨਕ੍ਰਿਪਟਡ ਹਨ। ਆਪਣੇ ਖੁਦ ਦੇ ਕਸਟਮ ਸਟਿੱਕਰ ਪੈਕ ਬਣਾਉਣ ਲਈ ਇਸ ਟੂਲ ਦੀ ਵਰਤੋਂ ਕਰੋ।",description:"A body of SignIn page"},"SignIn--qr":{message:"ਸਾਈਨ ਇਨ ਕੋਡ",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"ਸ਼ੁਰੂਆਤ ਕਰਨ ਲਈ Signal Desktop ਖੋਲ੍ਹੋ",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"ਮਾਫ਼ ਕਰਨਾ, ਤੁਹਾਡਾ ਬ੍ਰਾਊਜ਼ਰ ਸਮਰਥਿਤ ਨਹੀਂ ਹੈ। ਕਿਰਪਾ ਕਰਕੇ ਇਸ ਲਿੰਕ ਨੂੰ Firefox ਜਾਂ Chrome ਵਿੱਚ ਖੋਲ੍ਹੋ",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"ਕੋਈ ਵੀ ਇਮੋਜੀ ਨਹੀਂ ਲੱਭਿਆ",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"ਇਮੋਜੀ ਖੋਜੋ",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"ਸਕਿੱਨ ਟੋਨ $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"ਸਮਾਇਲੀ ਅਤੇ ਲੋਕ",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"ਜਾਨਵਰ ਅਤੇ ਕੁਦਰਤ",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"ਖਾਣਾ-ਪੀਣਾ",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"ਸੈਰ ਸਪਾਟਾ",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"ਗਤੀਵਿਧੀਆਂ",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"ਚੀਜ਼ਾਂ",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"ਚਿੰਨ੍ਹ",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"ਝੰਡੇ",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Signal ਆਰਟ ਕ੍ਰੀਏਟਰ",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Signal ਸਟਿੱਕਰ ਪੈਕ ਕ੍ਰੀਏਟਰ",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Signal ਲੋਗੋ",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"ਸਟਿੱਕਰ ਪੈਕ ਕ੍ਰੀਏਟਰ ਦਿਸ਼ਾ-ਨਿਰਦੇਸ਼",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"ਤਸਵੀਰਾਂ ਨੂੰ ਇੱਥੇ ਸ਼ਾਮਲ ਕਰਨ ਜਾਂ ਡਰੌਪ ਕਰਨ ਲਈ ਕਲਿੱਕ ਕਰੋ",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"ਤਸਵੀਰਾਂ ਇੱਥੇ ਡਰੌਪ ਕਰੋ",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"ਸਟਿੱਕਰ ਪੈਕ",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"ਸਟਿੱਕਰ ਪੈਕ",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"ਰੱਦ ਕਰੋ",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"ਕਾਪੀ ਕਰੋ",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"ਅੱਗੇ",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"ਪਿੱਛੇ ਜਾਓ",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"ਆਪਣੇ ਸਟਿੱਕਰ ਸ਼ਾਮਲ ਕਰੋ",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"ਤਸਵੀਰ ਹਟਾਓ",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"ਸਟਿੱਕਰ ਸ਼ਾਮਲ ਕਰਨ ਲਈ ਕਲਿੱਕ ਜਾਂ ਡਰੈਗ/ਡਰੌਪ ਕਰੋ",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"ਸਟਿੱਕਰ ਪਾਰਦਰਸ਼ੀ ਬੈਕਗਰਾਊਂਡ ਦੇ ਨਾਲ PNG, APNG, ਜਾਂ WebP ਫਾਰਮੈਟ ਵਿੱਚ ਅਤੇ 512x512 ਪਿਕਸਲ ਦੇ ਹੋਣੇ ਚਾਹੀਦੇ ਹਨ। ਹਾਸ਼ੀਆ 16px ਰੱਖਣ ਦੀ ਸਲਾਹ ਦਿੱਤੀ ਜਾਂਦੀ ਹੈ।",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"ਹਾਸ਼ੀਏ ਦੇਖੋ",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"ਹਰੇਕ ਸਟਿੱਕਰ ਵਿੱਚ ਕੋਈ ਇਮੋਜੀ ਸ਼ਾਮਲ ਕਰੋ",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"ਇਸ ਨਾਲ ਸਾਨੂੰ ਉਸ ਵੇਲੇ ਸਟਿੱਕਰਾਂ ਦਾ ਸੁਝਾਅ ਦੇਣ ਵਿੱਚ ਮਦਦ ਮਿਲਦੀ ਹੈ ਜਦੋਂ ਤੁਸੀਂ ਸੁਨੇਹੇ ਭੇਜ ਰਹੇ ਹੁੰਦੇ ਹੋ।",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"ਬੱਸ ਥੋੜ੍ਹੀ ਜਾਣਕਾਰੀ ਹੋਰ…",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"ਸਿਰਲੇਖ",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"ਆਪਣੇ ਸਟਿੱਕਰ ਪੈਕ ਨੂੰ ਨਾਮ ਦਿਓ",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"ਲੇਖਕ",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"ਉਹ ਨਾਮ ਦਰਜ ਕਰੋ ਜਿਸ ਅਧੀਨ ਤੁਸੀਂ ਆਪਣੇ ਸਟਿੱਕਰਾਂ ਨੂੰ ਜਮ੍ਹਾਂ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"ਕਵਰ ਤਸਵੀਰ",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"ਇਹ ਤਸਵੀਰ ਉਦੋਂ ਦਿਖਾਈ ਦੇਵੇਗੀ ਜਦੋਂ ਤੁਸੀਂ ਆਪਣੇ ਸਟਿੱਕਰ ਪੈਕ ਨੂੰ ਸਾਂਝਾ ਕਰੋਗੇ",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"ਕੀ ਤੁਸੀਂ ਪੱਕਾ ਆਪਣੇ ਸਟਿੱਕਰ ਪੈਕ ਨੂੰ ਅੱਪਲੋਡ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"ਅੱਪਲੋਡ ਕਰੋ",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"ਸਟਿੱਕਰ ਪੈਕ ਬਣਾਉਣ ਤੋਂ ਬਾਅਦ ਤੁਸੀਂ ਉਸ ਨੂੰ ਸੋਧ ਜਾਂ ਮਿਟਾ ਨਹੀਂ ਸਕੋਗੇ।",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"ਤੁਹਾਡਾ ਸਟਿੱਕਰ ਪੈਕ ਬਣਾਇਆ ਜਾ ਰਿਹਾ ਹੈ",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$total$ ਵਿੱਚੋਂ $count$ ਨੂੰ ਅੱਪਲੋਡ ਕੀਤਾ ਗਿਆ",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"ਵਧਾਈਆਂ! ਤੁਸੀਂ ਸਟਿੱਕਰ ਪੈਕ ਬਣਾਇਆ ਹੈ।",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"ਸਟਿੱਕਰ ਆਈਕਾਨ ਦੇ ਰਾਹੀਂ ਆਪਣੇ ਨਵੇਂ ਸਟਿੱਕਰਾਂ ਦੀ ਵਰਤੋਂ ਕਰੋ, ਜਾਂ ਹੇਠਾਂ ਦਿੱਤੇ ਲਿੰਕ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਉਹਨਾਂ ਨੂੰ ਆਪਣੇ ਦੋਸਤਾਂ ਨਾਲ ਸਾਂਝਾ ਕਰੋ।",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"ਜਿਹੜੇ ਕਸਟਮ ਸਟਿੱਕਰ ਪੈਕ ਤੁਸੀਂ ਜਨਤਕ ਤੌਰ 'ਤੇ ਉਪਲਬਧ ਕਰਵਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ ਉਹਨਾਂ ਦਾ URL ਲੱਭਣ ਵਿੱਚ ਲੋਕਾਂ ਦੀ ਮਦਦ ਕਰਨ ਲਈ $hashtag$ ਹੈਸ਼ਟੈਗ ਦੀ ਵਰਤੋਂ ਕਰੋ।",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"ਸਟਿੱਕਰ ਪੈਕ URL",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"ਸਥਾਪਤ ਕਰੋ",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"ਇੱਕ ਹੋਰ ਸਟਿੱਕਰ ਪੈਕ ਬਣਾਓ",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"ਇਹ ਨਵਾਂ ਸਟਿੱਕਰ ਪੈਕ ਦੇਖੋ ਜੋ ਮੈਂ Signal ਦੇ ਲਈ ਬਣਾਇਆ ਹੈ। #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {1 ਤਸਵੀਰ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ} other {{count,number} ਤਸਵੀਰਾਂ ਸ਼ਾਮਲ ਕੀਤੀਆਂ ਗਈਆਂ}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"ਐਨੀਮੇਟਿਡ ਆਰਟ ਫ਼ਿਲਹਾਲ ਸਮਰਥਿਤ ਨਹੀਂ ਹੈ",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"ਡਰੌਪ ਕੀਤੀ ਤਸਵੀਰ ਬਹੁਤ ਵੱਡੀ ਹੈ",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"ਤਸਵੀਰ ਉੱਤੇ ਕਾਰਵਾਈ ਕਰਨ ਵੇਲੇ ਕੋਈ ਗੜਬੜੀ ਪੇਸ਼ ਆਈ",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"ਐਨੀਮੇਟਡ PNG ਤਸਵੀਰਾਂ ਵਰਗਾਕਾਰ ਹੋਣੀਆਂ ਚਾਹੀਦੀਆਂ ਹਨ",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"ਐਨੀਮੇਟਡ ਤਸਵੀਰਾਂ ਹਮੇਸ਼ਾ ਲੂਪ ਵਿੱਚ ਰਹਿਣੀਆਂ ਚਾਹੀਦੀਆਂ ਹਨ",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"ਐਨੀਮੇਟਡ PNG ਤਸਵੀਰ ਦਾ ਆਕਾਰ ਬਹੁਤ ਵੱਡਾ ਹੈ",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"ਐਨੀਮੇਟਡ PNG ਤਸਵੀਰ ਦਾ ਆਕਾਰ ਬਹੁਤ ਛੋਟਾ ਹੈ",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"ਤਸਵੀਰਾਂ ਅੱਪਲੋਡ ਕਰਨ ਵੇਲੇ ਗੜਬੜੀ ਪੇਸ਼ ਆਈ: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"ਸਰਵਰ ਨਾਲ ਕਨੈਕਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"ਕ੍ਰੀਡੈਨਸ਼ਿਅਲ ਦੀ ਪੁੱਗਣ ਕਾਰਨ ਤਸਵੀਰਾਂ ਅੱਪਲੋਡ ਕਰਨ ਵਿੱਚ ਅਸਫਲ ਰਹੇ। ਕਿਰਪਾ ਕਰਕੇ Signal Desktop ਤੋਂ ਵੈੱਬਸਾਈਟ ਨੂੰ ਦੁਬਾਰਾ ਖੋਲ੍ਹੋ।",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"ਲਿੰਕ ਕਾਪੀ ਕੀਤਾ ਗਿਆ",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"ਲਾਈਟ ਥੀਮ ਵਿੱਚ ਮੇਰਾ ਸਟਿੱਕਰ",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"ਡਾਰਕ ਥੀਮ ਵਿੱਚ ਮੇਰਾ ਸਟਿੱਕਰ",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"ਸਟਿੱਕਰ ਪੈਕ ਕ੍ਰੀਏਟਰ ਨੂੰ ਵਰਤਣ ਲਈ ਕਿਰਪਾ ਕਰਕੇ ਆਪਣੇ ਫ਼ੋਨ ਅਤੇ ਡੈਸਕਟੌਪ ’ਤੇ Signal ਨੂੰ ਸੈੱਟ ਅੱਪ ਕਰੋ",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:o,CustomizingPreferredReactions__title:i,"ArtFrame--emoji-name-placeholder":{message:"ਇਮੋਜੀ ਦਾ ਉਪਨਾਮ",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{i as CustomizingPreferredReactions__title,o as EmojiButton__label,t as cancel,a as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"रद्द करा"},r={message:"$minutes$मि",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},o={message:"इमोजी",description:"Label for emoji button"},i={message:"प्रतिक्रिया सानुकूलित करा",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},a={smartling:e,"index--title":{message:"स्टिकर आर्ट निर्माता"},"index--create-sticker-pack":{message:"नवीन स्टिकर पॅक तयार करा"},"SignIn--title":{message:"स्टिकर पॅक तयार करा",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"जसे Signal मध्ये सर्वकाही असते त्याप्रमाणेच, स्टिकर हे देखील कूटबद्ध केलेले असतील. या साधनाचा वापर आपले स्वतःचे सानुकूलित स्टिकर पॅक्स तयार करण्यासाठी करा.",description:"A body of SignIn page"},"SignIn--qr":{message:"साइन इन कोड",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"सुरुवात करण्यासाठी Signal Desktop उघडा",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"क्षमस्व, आपला ब्राउझर समर्थित नाही. कृपया ही लिंक Firefox किंवा Chrome मध्ये उघडा",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"कुठलेही इमोजी आढळले नाही",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"इमोजी शोधा",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"स्किन टोन $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"स्मायली आणि व्यक्ती",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"प्राणी आणि निसर्ग",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"खाद्य आणि पेय",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"प्रवास आणि जागा",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"गतिविधी",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"वस्तू",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"चिन्ह",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"झेंडे",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Signal आर्ट निर्माता",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Signal स्टिकर पॅक निर्माता",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Signal लोगो",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Signal स्टिकर पॅक निर्माता मार्गदर्शक तत्त्वे",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"चित्र जोडण्यासाठी किंवा ड्रॉप करण्यासाठी येथे क्लिक करा",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"चित्रे येथे ड्रॉप करा",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"स्टिकर पॅक",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"स्टिकर पॅक",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"रद्द करा",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"कॉपी करा",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"पुढे",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"मागे",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"आपले स्टिकर्स जोडा",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"चित्र काढून टाका",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"स्टिकर जोडण्यासाठी फाइल क्लिक किंवा ड्रॅग/ड्रॉप करा",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"स्टिकर्स हे पारदर्शक पार्श्वभूमी आणि 512x512 पिक्सेल असलेले PNG, APNG, किंवा WebP स्वरूपनामध्ये असायला हवे. सुचविलेले मार्जिन 16px आहे.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"मार्जिन पहा",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"प्रत्येक स्टिकरसाठी एक इमोजी जोडा",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"यामुळे आम्हाला आपण संदेश करताना आपल्यासाठी स्टिकर सुचविण्यात मदत मिळेल.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"फक्त आणखी काही तपशील...",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"शीर्षक",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"आपल्या स्टिकर पॅकला नाव द्या",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"लेखक",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"खाली आपले स्टिकर्स सबमिट करण्यासाठी नाव प्रविष्ट करा",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"कव्हर चित्र",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"आपण आपले स्टिकर पॅक सामायिक करतांना हे चित्र दर्शविले जाईल",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"आपण खात्रीने स्टिकर पॅक अपलोड करू इच्छिता?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"अपलोड करा",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"स्टिकर पॅक तयार केल्यानंतर आपल्याला यापुढे संपादन करता किंवा हटवता येणार नाही.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"आपला स्टिकर पॅक तयार करत आहे",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$total$ मधून $count$ अपलोड केले गेले",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"अभिनंदन! आपण एक स्टिकर पॅक तयार केले.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"स्टिकर चिन्हाद्वारे आपले नवीन स्टिकर्स अ‍ॅक्सेस करा, किंवा खालील लिंक वापरून आपल्या मित्रांसह सामायिक करा.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"आपण सार्वजनिकरीत्या ॲक्सेस करण्यायोग्य बनवू इच्छिता असे कुठलेही सानुकूल स्टिकर पॅकचे URLS शोधण्यात लोकांची मदत करण्यासाठी हॅशटॅग $hashtag$ वापरा.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"स्टिकर पॅक URL",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"स्थापना करा",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"आणखी एक स्टिकर पॅक तयार करा",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Signal साठी मी तयार केलेला हा नवीन स्टिकर पॅक पहा. #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {1 प्रतिमा जोडली} other {{count,number} प्रतिमा जोडल्या}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"अ‍ॅनिमेट केलेले आर्ट सध्या समर्थित नाही",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"ड्रॉप केलेले चित्र खूप मोठे आहे",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"चित्रावर प्रक्रिया करण्यात त्रुटी",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"अ‍ॅनिमेटेड PNG चित्र चौकोनी असणे आवश्यक आहे",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"अ‍ॅनिमेटेड चित्र कायमस्वरूपी लूप केलेली असावीत",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"अ‍ॅनिमेटेड PNG चित्राची मोजमापे अतिशय मोठी आहेत",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"अ‍ॅनिमेटेड PNG चित्राची मोजमापे अतिशय लहान आहे",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"चित्र अपलोड करताना त्रुटी: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"सर्व्हरशी कनेक्ट करु शकत नाही: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"कालबाह्य क्रडेन्शियल्समुळे चित्र अपलोड करण्यात अपयशी. कृपया Signak Desktop वरून वेबसाईट पुन्हा उघडा.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"लिंक कॉपी केली",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"लाइट थीम मध्ये माझे स्टिकर",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"गडद थीम मध्ये माझे स्टिकर",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"स्टिकर पॅक उत्पादक वापरण्यासाठी कृपया आपल्या फोन आणि डेस्कटॉपवर Signal सेट अप करा",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:o,CustomizingPreferredReactions__title:i,"ArtFrame--emoji-name-placeholder":{message:"इमोजी उपनाम",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{i as CustomizingPreferredReactions__title,o as EmojiButton__label,t as cancel,a as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"Annuleren"},r={message:"$minutes$ min",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},o={message:"Emoji",description:"Label for emoji button"},i={message:"Reactie-balk personaliseren",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},a={smartling:e,"index--title":{message:"Sticker-art"},"index--create-sticker-pack":{message:"Maak een nieuw stickerpakket"},"SignIn--title":{message:"Een Stickerpakket maken",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Net als bij alles in Signal, zijn stickers ook versleuteld. Gebruik deze tool om je eigen aangepaste stickerpakketten te maken.",description:"A body of SignIn page"},"SignIn--qr":{message:"Inlogcode",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"Open Signal Desktop om te beginnen",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"Sorry, je browser wordt niet ondersteund. Open deze link in Firefox of Chrome",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"Geen emoji gevonden",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"Emoji zoeken",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"Huidskleur $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"Gezichtjes & mensen",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"Dieren & natuur",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"Eten & drinken",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"Reizen & plaatsen",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"Activiteiten",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"Objecten",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"Symbolen",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"Vlaggen",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Signal Art-creator",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Signal Stickerpakketmaker",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Signal-logo",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Richtlijnen voor Stickerpakketmaker",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"Klik hier of sleep naar hier om afbeeldingen toe te voegen",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"Sleep hier afbeeldingen naartoe",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"Stickerpakket",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"Stickerpakket",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"Annuleren",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"Kopiëren",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"Volgende",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"Terug",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"Voeg je stickers toe",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"Afbeelding verwijderen",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"Klik hier of sleep hier een bestand naartoe om een sticker toe te voegen",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"Stickers moeten een PNG-, APNG- of WebP-bestand zijn met een (doorzichtige) achtergrond van 512 bij 512 pixels, liefst inclusief een marge rondom van 16 pixels.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"Bekijk marges",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"Wijs aan elke sticker een emoji toe",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"Dit maakt het voor Signal mogelijk om stickers voor te stellen terwijl je een bericht typt.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"Nog wat details...",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"Titel",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"Geef je stickerpakket een naam",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"Maker",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"Voer de naam van de maker in",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"Omslagafbeelding",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"Dit is de afbeelding die mensen te zien krijgen als je je stickerpakket met anderen deelt",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"Weet je zeker dat je je stickerpakket wilt uploaden?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"Uploaden",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"Je kunt je stickerpakket niet langer aanpassen of wissen nadat je deze hebt aangemaakt.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"Je stickerpakket uploaden",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$count$ van $total$ geüpload",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"Gefeliciteerd, je hebt een stickerpakket gemaakt!",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"Gebruik jouw nieuwe stickers via het sticker-pictogram, of deel ze met je kennissen door middel van de link hieronder.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"Als je jouw stickerpakket publiekelijk bekend wilt maken, gebruik dan de hashtag $hashtag$ om anderen te helpen de URL van jouw stickerpakket te ontdekken.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"Stickerpakket-URL",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"Installeren",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"Nog een stickerpakket maken",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Ik heb voor Signal dit nieuwe stickerpakket gemaakt. #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {1 afbeelding toegevoegd} other {{count,number} afbeeldingen toegevoegd}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"Geanimeerde extra's worden momenteel niet ondersteund",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"Het afbeeldingsbestand is te groot",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"Fout bij het verwerken van afbeelding",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"Geanimeerde PNG-afbeeldingen moeten vierkant zijn",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"Geanimeerde afbeeldingen moeten eindeloos herhaald worden",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"Afmetingen van geanimeerde PNG-afbeeldingen zijn te groot",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"Afmetingen van geanimeerde PNG-afbeeldingen zijn te klein",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"Fout bij het uploaden van afbeeldingen: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"Kan geen verbinding maken met server: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"Kan afbeeldingen niet uploaden vanwege verlopen inloggegevens. Open de website opnieuw vanaf Signal Desktop.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"Link gekopieerd",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"Mijn sticker in het lichte thema",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"Mijn sticker in het donkere thema",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"Je moet eerst Signal in gebruik nemen op je telefoon en op je desktop voor je de stickermaker kunt gebruiken",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:o,CustomizingPreferredReactions__title:i,"ArtFrame--emoji-name-placeholder":{message:"Emoji-alias",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{i as CustomizingPreferredReactions__title,o as EmojiButton__label,t as cancel,a as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"取消"},r={message:"$minutes$ 分鐘前",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},o={message:"表情",description:"Label for emoji button"},i={message:"自定義回應",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},a={smartling:e,"index--title":{message:"貼圖包藝術製作器"},"index--create-sticker-pack":{message:"建立新的貼圖包"},"SignIn--title":{message:"建立貼圖包",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"和其他 Signal 內容一樣,貼圖已經加密。使用此工具建立你的自訂貼圖包。",description:"A body of SignIn page"},"SignIn--qr":{message:"登入代碼",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"開啟 Signal 桌面版即可開始",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"抱歉,系統不支援你的瀏覽器。請使用 Firefox 或 Chrome 開啟此連結",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"找不到 Emoji",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"搜尋 Emoji",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"膚色 $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"笑臉 & 人們",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"動物 & 大自然",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"食物 & 飲料",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"旅行 & 地點",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"活動",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"物品",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"符號",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"旗幟",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Signal 藝術製作器",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Signal 貼圖包製作器",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Signal 標誌",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"貼圖包製作器指南",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"點擊以此處新增或放置圖片",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"將圖片放至此處",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"貼圖包",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"貼圖包",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"取消",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"複製",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"推特",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"下一步",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"返回",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"新增你的貼圖",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"移除圖片",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"單擊或拖放檔案以新增貼圖",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"貼圖必須為PNG,APNG或WebP格式,並具有透明背景和512x512畫素。 建議邊距為16畫素。",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"檢視邊距",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"在每個貼圖新增一個表情符號",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"這將允許我們可以在你傳送訊息時向你建議貼圖。",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"還有更多細節…",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"標題",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"為你的貼圖包命名",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"作者名",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"輸入名稱以提交你的貼圖",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"封面圖案",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"這是共享貼圖包時將顯示的圖片",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"你確定要上傳你的貼圖包?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"上傳",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"創作貼紙包後,你將不能夠再編輯或刪除。",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"製作你的貼圖包",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$count$之$total$已上傳",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"恭喜!你已經製作了一個貼圖包。",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"透過貼圖圖示連結到你的新貼圖,或使用下面的連結與你的朋友分享。",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"使用主題標籤$hashtag$可以幫助其他人找到你要公開連結的任何自定義貼圖包的URL。",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"貼圖包 URL",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"安裝",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"製作另一個貼圖包",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"查看我為 Signal 製作的新貼圖包。 #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, other {已新增 {count,number} 個圖像}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"系統暫不支援動態藝術",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"已放置的圖片檔案太大",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"影像處理錯誤",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"動態 PNG 圖片必須為正方形",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"動態圖片必須循環播放",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"動態 PNG 圖片尺寸太大",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"動態 PNG 圖片尺寸太小",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"圖片上載錯誤:$message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"無法連接到伺服器:$message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"由於憑證過期,無法上載圖片。請於 Signal 桌面版重新開啟網站。",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"已複製貼圖包連結",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"明亮主題下的我的貼圖",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"深色主題下我的貼圖",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"請在手機和桌上型電腦設定 Signal 以使用貼圖包編輯器",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:o,CustomizingPreferredReactions__title:i,"ArtFrame--emoji-name-placeholder":{message:"表情符號別名",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{i as CustomizingPreferredReactions__title,o as EmojiButton__label,t as cancel,a as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"Zrušiť"},o={message:"$minutes$ m",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},r={message:"Emoji",description:"Label for emoji button"},a={message:"Prispôsobiť reakcie",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},i={smartling:e,"index--title":{message:"Kreatívny nástroj na vytváranie nálepiek"},"index--create-sticker-pack":{message:"Vytvoriť nový balíček nálepiek"},"SignIn--title":{message:"Vytvoriť balíček nálepiek",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Tak, ako všetko ostatné v aplikácii Signal, aj nálepky sú šifrované. Vytvorte si vlastné balíčky nálepiek pomocou tohto nástroja.",description:"A body of SignIn page"},"SignIn--qr":{message:"Prihlasovací kód",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"Ak chcete začať, otvorte Signal Desktop",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"Ľutujeme, váš prehliadač nie je podporovaný. Otvorte tento odkaz v prehliadači Firefox alebo Chrome",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:o,"EmojiPicker--empty":{message:"Nenašli sa žiadne emoji",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"Hľadať emoji",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"Farba pleti $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"Smajlíky a ľudia",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"Zvieratá a príroda",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"Jedlo a nápoje",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"Cestovanie a miesta",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"Aktivity",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"Objekty",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"Symboly",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"Vlajky",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Kreatívny nástroj tvorby nálepiek Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Nástroj na vytváranie balíčkov nálepiek Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Logo Signal",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Pokyny na vytváranie balíčkov nálepiek",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"Kliknite pre pridanie obrázkov alebo ich presuňte myšou sem",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"Presuňte obrázky sem",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"Balíček nálepiek",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"Balíček nálepiek",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"Zrušiť",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"Kopírovať",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"Ďalej",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"Späť",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"Pridajte si nálepky",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"Odstrániť obrázok",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"Kliknutím alebo presunutím súboru pridáte nálepku",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"Nálepky musia byť vo formáte PNG, APNG alebo WebP s priehľadným pozadím a rozmermi 512x512 pixelov. Doporučený okraj je 16 px.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"Zobraziť okraje",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"Pridajte emoji ku každej nálepke",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"Táto možnosť nám dovolí odporučiť vám nálepky, keď si s niekým píšete.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"Už len pár detailov…",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"Názov",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"Pomenujte balíček nálepiek",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"Autor",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"Zadajte meno, pod ktorým budete odosielať svoje nálepky",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"Titulný obrázok",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"Toto je obrázok, ktorý sa zobrazí, keď budete zdielať svoj balíček nálepiek",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"Naozaj chcete nahrať svoj balíček nálepiek?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"Nahrať",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"Po vytvorení balíčku nálepiek ho už viac nebudete môcť upravovať ani zmazať.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"Vytváram váš balíček nálepiek",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$count$ z $total$ je nahratých",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"Gratulujeme! Vytvorili ste balíček nálepiek.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"Ku svojim novým nálepkám sa dostanete cez ikonu nálepiek alebo ich môžete zdieľať so svojimi priateľmi pomocou odkazu nižšie.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"Použite hashtag $hashtag$ , aby ste pomohli ostatným nájsť adresu pre ktorýkoľvek vytvorený balíček nálepiek, ktorý by ste chceli zverejniť.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"Adresa balíčku nálepiek",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"Inštalovať",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"Vytvoriť ďalší balíček nálepiek",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Vyskúšajte nový balíček nálepiek, ktorý som vytvoril/a pre Signal. #zalepsvojesúkromie",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {Bol pridaný 1 obrázok} few {Boli pridané {count,number} obrázky} many {Bolo pridaného {count,number} obrázka} other {Bolo pridaných {count,number} obrázkov}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"Animované nálepky momentálne nepodporujeme",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"Presunutý obrázok je príliš veľký",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"Chyba pri spracovaní obrázku",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"Animované obrázky PNG musia byť štvorcové",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"Animované obrázky sa musia donekonečna opakovať",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"Rozmery animovaného obrázku PNG sú príliš veľké",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"Rozmery animovaného obrázku PNG sú príliš malé",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"Chyba pri nahrávaní obrázkov: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"Nedá sa pripojiť k serveru: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"Nepodarilo sa nahrať obrázky z dôvodu vypršania platnosti prihlasovacích údajov. Znova otvorte webovú stránku zo Signal Desktop.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"Odkaz skopírovaný",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"Moja nálepka v svetlej téme",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"Moja nálepka v tmavej téme",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"Pre používanie nástroja na vytváranie balíčkov nálepiek si musíte nastaviť Signal na svojom telefóne a počítači",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:r,CustomizingPreferredReactions__title:a,"ArtFrame--emoji-name-placeholder":{message:"Meno emoji",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{a as CustomizingPreferredReactions__title,r as EmojiButton__label,t as cancel,i as default,o as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"Anulo"},r={message:"$minutes$m",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},i={message:"Emoji",description:"Label for emoji button"},o={message:"Përshtat reagimet",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},a={smartling:e,"index--title":{message:"Krijuesi i artit të ngjitëseve"},"index--create-sticker-pack":{message:"Krijo një paketë të re ngjitësesh"},"SignIn--title":{message:"Krijo një paketë ngjitësesh",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Ashtu si me çdo gjë tjetër në Signal, ngjitësit janë gjithashtu të koduar. Përdore këtë mjet për të krijuar paketat e tua ngjitëse të personalizuara.",description:"A body of SignIn page"},"SignIn--qr":{message:"Kodi i hyrjes",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"Hap Signal Desktop për të filluar",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"Na vjen keq, shfletuesi yt nuk mbështetet. Ju lutemi hapeni këtë lidhje në Firefox ose Chrome",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"Nuk u gjet asnjë emoji",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"Kërko për emoji",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"Toni i lëkurës $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"Fytyra & Njerëz",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"Kafshë & Natyra",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"Ushqim & Pije",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"Udhëtim & Vende",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"Aktivitete",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"Objekte",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"Simbole",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"Flamuj",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Krijuesi i Artit të Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Krijuesi i paketës së ngjitëses së Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Logoja e Signal",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Udhëzime për krijuesin e paketës së ngjitëses së Signal",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"Kliko që të shtosh ose lësho një imazh këtu",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"Lësho imazhet këtu",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"Paketë ngjitësesh",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"Paketë ngjitësesh",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"Anulo",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"Kopjo",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"Tjetri",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"Prapa",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"Shto ngjitëset e tua",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"Hiq imazhin",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"Që të shtohet një ngjitës, kliko ose tërhiq/lësho një skedar",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"Ngjitëset duhet të jenë në format PNG, APNG ose WebP, me një sfond të tejdukshëm dhe 512x512 piksela. Kufijtë e këshilluar janë 16 piksela.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"Shiko kufijtë",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"Shto një emoji te çdo ngjitës",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"Kjo na lejon t’ju sugjerojmë ngjitësa teksa shkruani mesazhe.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"Edhe pak detaje…",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"Titull",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"Emërto paketën tënde të ngjitësve",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"Autor",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"Vendos një emër për të nxjerrë ngjitësen tënde",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"Imazhi i kopertinës",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"Kjo është figura që do të shfaqet kur të ndash me të tjerë paketën tënde të ngjitësve",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"Je i sigurt që dëshiron të ngarkosh paketën tënde të ngjitësve?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"Ngarko",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"Nuk do të mund të bësh më modifikime apo fshirje pasi të krijosh një paketë ngjitësesh.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"Duke krijuar paketën tënde të ngjitësve",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$count$ nga $total$ të ngarkuara",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"Përgëzime! Krijove një paketë ngjitësesh.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"Hap paketën tënde të re të ngjitësve përmes ikonës së ngjitëses, ose ndaje me shokët e tu duke përdorur lidhjen më poshtë.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"Përdor hashtagun $hashtag$ që të ndihmosh personat e tjerë të gjejnë URL-të për cilëndo paketë personale ngjitësish që do të donit ta bëni të përdorshme publikisht.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"URL-ja e paketës së ngjitëseve",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"Instaloje",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"Krijo një tjetër paketë ngjitësesh",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Hidhini një sy kësaj pakete të re ngjitësesh që krijova për Signal. #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {1 imazh u shtua} other {{count,number} imazhe u shtuan}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"Arti i animuar nuk mbështetet aktualisht",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"Imazhi i hedhur është shumë i madh",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"Gabim gjatë përpunimit të imazhit",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"Imazhet e animuara PNG duhet të jenë katrore",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"Imazhet e animuara duhet të qarkullojnë përgjithmonë",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"Dimensionet e imazhit të animuar PNG janë shumë të mëdha",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"Dimensionet e imazhit të animuar PNG janë shumë të vogla",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"Gabim gjatë ngarkimit të imazheve: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"Nuk mund të lidhet me serverin: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"Ngarkimi i imazheve dështoi për shkak të kredencialeve të skaduara. Të lutem, rihapni sërish faqen e internetit nga Signal Desktop.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"Lidhja u kopjua",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"Ngjitësi im në temë të çelët",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"Ngjitësi im në temë të errët",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"Ju lutemi konfiguro Signal në telefon dhe desktop për të përdorur Krijuesin e Paketës së Ngjitësve",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:i,CustomizingPreferredReactions__title:o,"ArtFrame--emoji-name-placeholder":{message:"Nofkat emoji",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{o as CustomizingPreferredReactions__title,i as EmojiButton__label,t as cancel,a as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"منسوخ کریں"},r={message:"$minutes$منٹ",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},o={message:"ایموجی",description:"Label for emoji button"},i={message:"ری ایکشنز کو اپنے حسبِ ضرورت بنائیں",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},a={smartling:e,"index--title":{message:"اسٹیکر آرٹ کا تخلیق کار"},"index--create-sticker-pack":{message:"نیا اسٹیکر پیک تخلیق کریں"},"SignIn--title":{message:"اسٹیکر پیک تخلیق کریں",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Signal میں موجود تمام دوسری چیزوں کی طرح، اسٹیکرز بھی انکرپٹ کردہ ہوتے ہیں۔ اپنا ذاتی اسٹیکر پیکس تخلیق کرنے کے لیے اس ٹول کا استعمال کریں۔",description:"A body of SignIn page"},"SignIn--qr":{message:"سائن ان کوڈ",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"آغاز کرنے کے لیے Signal ڈیسک ٹاپ کھولیں",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"معذرت، آپ کا براؤزر سپورٹ یافتہ نہیں ہے۔ براہ کرم اس لنک کو Firefox یا Chrome میں کھولیں",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"کوئی ایموجی نہیں ملا",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"ایموجی تلاش کریں",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"اسکن ٹون $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"سمائیلیز اور افراد",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"جانور اور قدرت",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"خوراک اور مشروب",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"سفر اور مقامات",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"سرگرمیاں",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"اشیاء",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"علامتیں",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"جھنڈے",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Signal آرٹ کا تخلیق کار",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Signal کے اسٹیکر پیک کا تخلیق کار",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Signal لوگو",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"اسٹیکر پیک کے تخلیق کار کے لیے گائیڈ لائنز",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"تصاویر یہاں شامل کرنے یا چھوڑنے کے لیے کلک کریں",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"تصاویر یہاں چھوڑیں",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"اسٹیکر پیک",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"اسٹیکر پیک",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"منسوخ کریں",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"کاپی کریں",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"اگلا",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"واپس جائیں",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"اپنے اسٹیکرز شامل کریں",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"تصویر ہٹائیں",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"اسٹیکر شامل کرنے کے لیے فائل پر کلک کریں یا گھسیٹیں/چھوڑیں",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"اسٹیکرز کو PNG ،APNG، یا WebP فارمیٹ میں شفاف پس منظر اور 512x512 پکسلز کا حامل ہونا لازمی ہے۔ تجویز کردہ مارجن 16px ہے۔",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"مارجنز ملاحظہ کریں",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"ہر اسٹیکر میں ایک ایموجی شامل کریں",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"جب آپ پیغام رسانی کر رہے ہوتے ہیں تو اس سے ہمیں آپ کو اسٹیکرز تجویز کرنے میں مدد ملتی ہے۔",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"بس کچھ مزید تفصیلات...",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"عنوان",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"اپنے اسٹیکر پیک کو نام دیں",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"مصنف",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"اس کے تحت اپنے اسٹیکرز جمع کروانے کے لیے نام درج کریں",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"کور تصویر",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"جب آپ اپنا اسٹیکر پیک شیئر کرتے ہیں تو یہ وہ تصویر ہے جو ظاہر ہو گی",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"کیا آپ واقعتاً اپنا اسٹیکر پیک اپ لوڈ کرنا چاہتے ہیں؟",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"اپ لوڈ کریں",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"اسٹیکر پیک تخلیق کرنے کے بعد آپ مزید ترمیمات یا حذف کرنے کے قابل نہیں ہوں گے۔",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"آپ کا اسٹیکر پیک تخلیق کیا جا رہا ہے",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$total$ میں سے $count$ اپ لوڈ ہو گئے",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"مبارک ہو! آپ اسٹیکر پیک تخلیق کر چکے ہیں۔",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"اسٹیکر آئیکن کے ذریعے اپنے نئے اسٹیکرز تک رسائی حاصل کریں، یا درج ذیل لنک کا استعمال کرتے ہوئے اپنے دوستوں کے ساتھ شئیر کریں۔",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"کسی بھی حسبِ ضرورت اسٹیکر پیکس کے URLs تلاش کرنے میں دیگر افراد کی مدد کرنے کے لیے ہیش ٹیگ $hashtag$ استعمال کریں جسے آپ عوامی طور پر قابلِ رسائی بنانا پسند کریں گے۔",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"اسٹیکر پیک URL",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"انسٹال",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"ایک اور اسٹیکر پیک تخلیق کریں",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"یہ نیا اسٹیکر پیک چیک کریں جو میں نے Signal کے لیے تخلیق کیا ہے۔ #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {1 تصویر شامل کر دی گئی} other {{count,number} تصاویر شامل کر دی گئیں}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"اینیمیٹڈ آرٹ فی الحال سپورٹ یافتہ نہیں ہے",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"چھوڑی گئی تصویر بہت بڑی ہے",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"تصویر پر کارروائی میں خامی",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"اینیمیٹڈ PNG تصاویر کا مستطیل ہونا لازمی ہے",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"اینیمیٹڈ تصاویر کا ہمیشہ لوپ ہونا لازمی ہے",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"اینیمیٹڈ PNG تصویر کی ڈائمنشنز بہت بڑی ہیں",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"اینیمیٹڈ PNG تصویر کی ڈائمنشنز بہت چھوٹی ہیں",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"تصاویر اپ لوڈ ہونے میں نقص: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"سرور سے منسلک نہیں ہو سکتا: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"کوائف کے زائد المیعاد ہونے کے باعث تصاویر اپ لوڈ کرنے سے قاصر ہیں۔ براہ کرم ایک بار پھر Signal ڈیسک ٹاپ سے ویب سائٹ کو دوبارہ کھولیں۔",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"لنک کاپی کر لیا",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"لائٹ تھیم میں میرا اسٹیکر",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"ڈارک تھیم میں میرا اسٹیکر",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"براہ کرم اسٹیکر پیک تخلیق کار کو استعمال کرنے کے لیے اپنے فون اور ڈیسک ٹاپ پر Signal سیٹ کریں",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:o,CustomizingPreferredReactions__title:i,"ArtFrame--emoji-name-placeholder":{message:"ایموجی کا عرفی نام",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{i as CustomizingPreferredReactions__title,o as EmojiButton__label,t as cancel,a as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"I-cancel"},a={message:"$minutes$m",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},r={message:"Emoji",description:"Label for emoji button"},i={message:"I-customize ang reactions",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},o={smartling:e,"index--title":{message:"Sticker Art Creator"},"index--create-sticker-pack":{message:"Gumawa ng bagong sticker pack"},"SignIn--title":{message:"Gumawa ng Sticker Pack",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Gaya ng lahat ng bagay sa Signal, encrypted rin ang stickers. Gamitin ang tool na ito para gumawa ng sarili mong sticker packs.",description:"A body of SignIn page"},"SignIn--qr":{message:"Sign In Code",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"Buksan ang Signal Desktop para Magsimula",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"Paumanhin, pero hindi suportado ang browser na ginagamit mo. Paki buksan ang link na ito sa Firefox o Chrome",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:a,"EmojiPicker--empty":{message:"Walang nahanap na emoji",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"Mag-search ng emoji",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"Skin tone $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"Smileys & People",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"Animals & Nature",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"Food & Drink",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"Travel & Places",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"Activities",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"Objects",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"Symbols",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"Flags",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Signal Art Creator",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Signal Sticker Pack Creator",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Signal Logo",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Sticker Pack Creator Guidelines",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"Mag-click o mag-drop ng images dito",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"Mag-drop ng images dito",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"Sticker pack",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"Sticker pack",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"I-cancel",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"Kopyahin",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"Susunod",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"Bumalik",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"Mag-add ng iyong stickers",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"Tanggalin ang image",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"Mag-click o mag-drop ng file para mag-add ng sticker",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"Ang stickers ay dapat nasa PNG, APNG, o WebP format na may transparent background at 512x512 pixels. 16px ang recommended margin.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"Ipakita ang margins",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"Mag-add ng emoji sa bawat sticker",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"Nakatutulong ito sa amin para makapag-suggest ng stickers habang nagta-type ka ng message.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"Kaunting detalye na lang…",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"Title",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"Bigyan ng pangalan ang iyong sticker pack",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"Author",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"Ilagay ang pangalan mo para ma-submit ang iyong stickers",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"Cover image",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"Ito ang image na ipapakita kapag shinare mo ang iyong sticker pack",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"Sigurado ka bang gusto mong i-upload ang iyong sticker pack?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"I-upload",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"Hindi mo na pwedeng i-edit o i-delete ang isang sticker pack kapag nagawa mo na ito.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"Ginagawa ang sticker pack mo",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$count$ ng $total$ ang na-upload",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"Congratulations! Nakagawa ka na ng sticker pack.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"I-access sa sticker icon ang iyong stickers, o i-share ito sa friends mo gamit ang link sa baba.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"Gamitin ang hashtag $hashtag$ para tulungan ang ibang mahanap ang URLs ng custom sticker packs na gusto mong maging publicly accessible.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"Sticker Pack URL",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"I-install",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"Gumawa ng panibagong sticker pack",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"I-check out ang bagong sticker pack na ginawa ko para sa Signal. #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {1 image ang nadagdag} other {{count,number} images ang nadagdag}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"Hindi suportado sa ngayon ang animated art",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"Masyadong malaki ang inilagay na image",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"Nagka-error sa pag-process ng image",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"Parisukat o square dapat ang hugis ng animated PNG images",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"Dapat palaging naka-loop ang animated images",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"Masyadong malaki ang image dimensions ng animated PNG",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"Masyadong maliit ang image dimensions ng animated PNG",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"Nagka-error sa pag-upload ng images: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"Hindi maka-connect sa server: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"Hindi ma-upload ang images dahil sa expired credentials. Buksan ulit ang website sa Signal Desktop.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"Nakopya na ang link",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"Preview ng sticker ko sa light theme",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"Preview ng sticker ko sa dark theme",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"I-set up ang Signal sa iyong phone at desktop para magamit ang Sticker Pack Creator",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:r,CustomizingPreferredReactions__title:i,"ArtFrame--emoji-name-placeholder":{message:"Emoji alias",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{i as CustomizingPreferredReactions__title,r as EmojiButton__label,t as cancel,o as default,a as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"Poništi"},a={message:"$minutes$m",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},i={message:"Emotikon",description:"Label for emoji button"},o={message:"Prilagodite reakcije",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},r={smartling:e,"index--title":{message:"Alat za kreativnu izradu naljepnica"},"index--create-sticker-pack":{message:"Stvorite novi paket naljepnica"},"SignIn--title":{message:"Stvorite paket naljepnica",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Baš kao i sve ostalo na Signalu, naljepnice su također šifrirane. Izradite personalizirane pakete naljepnica pomoću ovog alata.",description:"A body of SignIn page"},"SignIn--qr":{message:"Kôd za prijavu",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"Otvorite Signal za Desktop za početak",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"Nažalost, vaš preglednik nije podržan. Otvorite ovu poveznicu u preglednicima Firefox ili Chrome",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:a,"EmojiPicker--empty":{message:"Nisu pronađeni emotikoni",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"Pretraži emotikone",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"Boja kože $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"Smajlići i osobe",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"Životinje i priroda",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"Hrana i piće",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"Putovanja i mjesta",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"Aktivnosti",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"Predmeti",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"Simboli",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"Zastave",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Signalov alat za kreativce",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Signalov alat za izradu naljepnica",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Signalov logotip",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Smjernice alata za izradu naljepnica",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"Kliknite ovdje za dodavanje ili ispuštanje slika",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"Ispustite slike ovdje",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"Paket naljepnica",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"Paket naljepnica",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"Poništi",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"Kopiraj",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"Dalje",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"Natrag",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"Dodajte svoje naljepnice",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"Ukloni sliku",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"Kliknite ili povucite/ispustite datoteku da biste dodali naljepnicu",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"Naljepnice moraju biti u PNG, APNG ili WebP formatu s prozirnom pozadinom i veličine 512x512 piksela. Preporučena margina iznosi 16 piksela.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"Prikaži margine",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"Dodajte emotikon svakoj naljepnici",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"Ovo nam omogućuje da vam predlažemo naljepnice dok razmjenjujete poruke.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"Još samo nekoliko detalja…",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"Naslov",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"Dodijelite naslov svom paketu naljepnica",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"Autor",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"Upišite ime pod kojim želite podijeliti svoje naljepnice",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"Naslovna slika",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"Ovo je slika koja će se pojaviti kada podijelite svoj paket naljepnica",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"Jeste li sigurni da želite učitati svoj paket naljepnica?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"Učitaj",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"Nakon izrade paketa naljepnica više ga nećete moći uređivati niti brisati.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"Stvaranje vašeg paketa naljepnica",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$count$ od $total$ učitano",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"Čestitamo! Stvorili ste paket naljepnica.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"Pristupite svojim novim naljepnicama putem ikone naljepnice ili ih podijelite s prijateljima putem poveznice u nastavku.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"Upotrijebite hashtag $hashtag$ da biste drugima pomogli da pronađu URL-ove svih personaliziranih paketa naljepnica koje želite učiniti javno dostupnima.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"URL paketa naljepnica",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"Instaliraj",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"Stvori novi paket naljepnica",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Pogledaj moj novi paket naljepnica na Signalu. #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {Dodana je {count,number} fotografija} few {Dodane su {count,number} fotografije} many {Dodano je {count,number} fotografija} other {Dodano je {count,number} fotografija}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"Animirane slike trenutno nisu podržane",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"Ispuštena slika je prevelika",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"Pogreška pri obradi slike",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"Animirane PNG slike moraju biti kvadratnog formata",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"Animirane slike moraju se neprekidno ponavljati",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"Dimenzije animirane PNG slike su prevelike",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"Dimenzije animirane PNG slike su premale",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"Pogreška pri učitavanju slika: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"Povezivanje s poslužiteljem nije uspjelo: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"Prijenos slika nije uspio zbog nevažećih korisničkih podataka. Molimo, ponovno učitajte web lokaciju sa Signala za Desktop.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"Poveznica je kopirana",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"Moja naljepnica u svijetloj temi",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"Moja naljepnica u tamnoj temi",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"Postavite Signal na telefonu i računalu da biste koristili alat za stvaranje paketa naljepnica",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:i,CustomizingPreferredReactions__title:o,"ArtFrame--emoji-name-placeholder":{message:"Pseudonim emotikona",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{o as CustomizingPreferredReactions__title,i as EmojiButton__label,t as cancel,r as default,a as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"取消"},r={message:"$minutes$ 分钟",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},o={message:"表情",description:"Label for emoji button"},i={message:"自定义反应",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},a={smartling:e,"index--title":{message:"贴纸艺术创建器"},"index--create-sticker-pack":{message:"创建新的贴纸包"},"SignIn--title":{message:"创建一个贴纸包",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"像 Signal 上的其他所有信息一样,贴纸也是加密的。快用这个工具创建属于你的专属贴纸包吧。",description:"A body of SignIn page"},"SignIn--qr":{message:"登录码",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"打开 Signal Desktop 以开始",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"抱歉,您的浏览器不支持。请在 Firefox 或 Chrome 中打开此链接",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"没有找到符合条件的表情",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"搜索表情",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"肤色 $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"笑脸和情感",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"动物和自然",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"食物和饮料",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"旅行和地点",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"活动",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"物品",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"符号",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"旗帜",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Signal 艺术创建器",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Signal 贴纸包创建器",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Signal 徽标",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Signal 贴纸包创建器指南",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"点击添加或将图片拖放到此处",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"将图片拖放至此处",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"贴纸包",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"贴纸包",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"取消",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"复制",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"下一步",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"返回",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"添加贴纸",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"移除图片",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"点击或拖/放文件以添加贴纸",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"贴纸必须是:PNG、APNG 或 WebP 格式,背景透明,512x512 像素。推荐边距为 16 像素。",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"查看边距",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"为每张贴纸添加一个表情符号",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"这能帮助我们在您聊天时推荐贴纸。",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"输入详情…",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"命名",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"为你的贴纸包命名",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"创作者",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"输入贴纸创作者名字",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"封面图片",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"分享贴纸包时将展示该图片",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"是否确定上传贴纸包?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"上传",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"贴纸包创建完毕之后,不可继续编辑或删除。",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"正在创建贴纸包",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$count$ 之 $total$ 已上传",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"恭喜!贴纸包创建完成。",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"通过贴纸图标访问你的新贴纸,或使用下方链接分享给好友。",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"如您希望公开自定义贴纸包,添加标签 $hashtag$ 可帮助用户找到相应的 URL 地址。",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"贴纸包 URL",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"安装",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"创建新的贴纸包",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"欢迎围观我新建的 Signal 贴纸包。#makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, other {已添加 {count,number} 张图片}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"动画艺术目前暂不支持",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"拖放的图片过大",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"处理图片出错",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"动画 PNG 图片必须是正方形",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"动画图片必须无限循环",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"动画 PNG 图片尺寸过大",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"动画 PNG 图片尺寸过小",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"上传图片时出错:$message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"无法连接服务器:$message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"登录身份过期,上传图片失败。请通过 Signal Desktop 重新打开网站。",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"链接已复制",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"浅色主题贴纸效果",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"深色主题贴纸效果",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"如需使用贴纸包创建器,请在手机和桌面电脑上设置 Signal",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:o,CustomizingPreferredReactions__title:i,"ArtFrame--emoji-name-placeholder":{message:"表情别名",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{i as CustomizingPreferredReactions__title,o as EmojiButton__label,t as cancel,a as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"Batal"},a={message:"$minutes$ m",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},r={message:"Emoji",description:"Label for emoji button"},i={message:"Atur tanggapan kustom",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},o={smartling:e,"index--title":{message:"Pembuat Seni Stiker"},"index--create-sticker-pack":{message:"Buat paket stiker baru"},"SignIn--title":{message:"Buat Paket Stiker",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Sama seperti semua hal lain di Signal, stiker juga dienkripsi. Gunakan alat ini untuk membuat paket stiker kustom Anda sendiri.",description:"A body of SignIn page"},"SignIn--qr":{message:"Kode Masuk",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"Buka Signal Desktop untuk Memulai",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"Maaf, browser Anda tidak didukung. Silakan buka tautan ini di Firefox atau Chrome",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:a,"EmojiPicker--empty":{message:"Tidak ditemukan emoji",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"Cari Emoji",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"Warna kulit $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"Smiley & Orang",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"Binatang & Alam",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"Makanan & Minuman",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"Perjalanan & Tempat",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"Aktivitas",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"Objek",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"Simbol",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"Bendera",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Pembuat Seni Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Pembuat Paket Stiker Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Logo Signal",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Panduan Pembuat Paket Stiker",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"Klik untuk menambah atau melepas gambar di sini",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"Lepas gambar di sini",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"Paket stiker",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"Paket stiker",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"Batal",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"Salin",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"Berikutnya",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"Kembali",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"Tambahkan stiker Anda",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"Hapus gambar",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"Klik atau seret/lepaskan file untuk menambahkan stiker",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"Stiker harus dalam format PNG, APNG, atau WebP dengan latar transparan dan berukuran 512x512 piksel. Margin yang disarankan adalah 16px.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"Lihat margin",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"Tambahkan emoji ke setiap stiker",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"Memungkinkan kami menyarankan stiker saat Anda menulis pesan.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"Beberapa detail tambahan...",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"Judul",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"Beri nama paket stiker Anda",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"Pembuat",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"Masukkan nama pembuat stiker",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"Gambar sampul",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"Inilah gambar yang akan ditampilkan saat Anda membagikan paket stiker",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"Yakin ingin mengunggah paket stiker Anda?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"Unggah",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"Anda tidak dapat mengedit atau menghapus setelah selesai membuat paket stiker.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"Membuat paket stiker Anda",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$count$ dari $total$ diunggah",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"Selamat! Anda telah membuat paket stiker.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"Akses stiker baru Anda melalui ikon stiker, atau bagikan kepada teman menggunakan tautan di bawah.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"Gunakan tagar $hashtag$ untuk membantu orang lain menemukan URL paket stiker kustom yang ingin Anda jadikan publik.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"URL Paket Stiker",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"Pasang",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"Buat paket stiker lain",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Lihat paket stiker baru yang saya buat di Signal. #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, other {{count,number} gambar ditambahkan}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"Seni animasi saat ini tidak didukung",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"Ukuran gambar terlalu besar",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"Terjadi kesalahan saat memproses gambar",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"Gambar PNG animasi harus berbentuk persegi",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"Gambar animasi harus selalu bergerak berulang-ulang",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"Dimensi gambar PNG animasi terlalu besar",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"Dimensi gambar PNG animasi terlalu kecil",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"Terjadi kesalahan saat mengunggah gambar: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"Tidak dapat tersambung ke server: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"Gagal mengunggah gambar karena kredensial kedaluwarsa. Harap buka kembali situs web dari Signal Desktop.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"Tautan disalin",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"Stiker saya dengan tema terang",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"Stiker saya dengan tema gelap",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"Siapkan Signal pada ponsel dan komputer Anda untuk menggunakan Pembuat Paket Stiker",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:r,CustomizingPreferredReactions__title:i,"ArtFrame--emoji-name-placeholder":{message:"Alias emoji",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{i as CustomizingPreferredReactions__title,r as EmojiButton__label,t as cancel,o as default,a as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"ரத்துசெய்"},r={message:"$minutes$நி",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},o={message:"ஈமோஜி",description:"Label for emoji button"},i={message:"எதிர்வினைகளைத் தனிப்பயனாக்குங்கள்",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},a={smartling:e,"index--title":{message:"ஸ்டிக்கர் ஆர்ட் கிரியேட்டர்"},"index--create-sticker-pack":{message:"புதிய ஸ்டிக்கர் பேக்கை உருவாக்கவும்"},"SignIn--title":{message:"ஸ்டிக்கர் தொகுப்பை உருவாக்கவும்",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Signal இல் உள்ள எல்லாவற்றையும் போலவே, ஸ்டிக்கர்களும் குறியாக்கம் செய்யப்பட்டுள்ளன. உங்களுக்கான தனிப்பயன் ஸ்டிக்கர் தொகுப்புகளை உருவாக்க இந்தக் கருவியைப் பயன்படுத்தவும்.",description:"A body of SignIn page"},"SignIn--qr":{message:"உள்நுழைவு குறியீடு",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"தொடங்குவதற்கு Signal டெஸ்க்டாப்பைத் திறக்கவும்",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"மன்னிக்கவும், உங்கள் பிரவுசர் ஆதரிக்கப்படவில்லை. இந்த இணைப்பை Firefox அல்லது Chrome இல் திறக்கவும்",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"ஈமோஜிகள் எதுவும் கிடைக்கவில்லை",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"ஈமோஜியைத் தேடுங்கள்",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"ஸ்கின் டோன் $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"ஸ்மைலிகள் மற்றும் மக்கள்",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"விலங்குகள் & இயற்கை",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"உணவு & பானம்",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"பயணம் & இடங்கள்",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"செயல்பாடுகள்",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"பொருட்கள்",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"சின்னங்கள்",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"கொடிகள்",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Signal ஆர்ட் கிரியேட்டர்",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Signal ஸ்டிக்கர் பேக் கிரியேட்டர்",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Signal லோகோ",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"ஸ்டிக்கர் பேக் கிரியேட்டர் வழிகாட்டுதல்கள்",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"படங்களை சேர்க்க அல்லது வைக்க இங்கே கிளிக் செய்யவும்",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"படங்களை இங்கே விடுங்கள்",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"ஸ்டிக்கர் பேக்",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"ஸ்டிக்கர் பேக்",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"ரத்துசெய்",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"நகலெடு",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"அடுத்தது",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"முந்தையது",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"உங்கள் ஸ்டிக்கர்களைச் சேர்க்கவும்",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"படத்தை அகற்று",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"ஸ்டிக்கரைச் சேர்க்க கோப்பைக் கிளிக் செய்யவும் அல்லது இழுத்து/விடவும்",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"ஸ்டிக்கர்கள் வெளிப்படையான பின்னணி மற்றும் 512x512 பிக்சல்கள் கொண்ட PNG, APNG அல்லது WebP வடிவத்தில் இருக்க வேண்டும். பரிந்துரைக்கப்பட்ட விளிம்பு 16px ஆகும்.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"விளிம்புகளைக் காண்க",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"ஒவ்வொரு ஸ்டிக்கருக்கும் ஒரு ஈமோஜியைச் சேர்க்கவும்",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"நீங்கள் மெசேஜ் அனுப்பும்போது உங்களுக்கு ஸ்டிக்கர்களைப் பரிந்துரைக்க இது அனுமதிக்கிறது.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"இன்னும் சில விவரங்கள்...",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"தலைப்பு",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"உங்கள் ஸ்டிக்கர் பேக்கிற்குப் பெயரிடவும்",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"உருவாக்கியவர்",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"உங்கள் ஸ்டிக்கர்களைச் சமர்ப்பிக்க ஒரு பெயரை உள்ளிடவும்",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"வெளிப்புற அட்டை படம்",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"உங்கள் ஸ்டிக்கர் பேக்கைப் பகிரும்போது காண்பிக்கப்படும் படம் இது",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"உங்கள் ஸ்டிக்கர் பேக்கைப் பதிவேற்ற விரும்புகிறீர்களா?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"பதிவேற்று",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"ஸ்டிக்கர் பேக்கை உருவாக்கிய பிறகு நீங்கள் திருத்தங்களைச் செய்யவோ அழிக்கவோ முடியாது.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"உங்கள் ஸ்டிக்கர் பேக்கை உருவாக்குகிறது",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$count$ / $total$ பதிவேற்றப்பட்டது",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"வாழ்த்துகள்! நீங்கள் ஒரு ஸ்டிக்கர் பேக்கை உருவாக்கியுள்ளீர்கள்.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"உங்கள் புதிய ஸ்டிக்கர்களை, ஸ்டிக்கர் ஐகான் மூலம் அணுகலாம் அல்லது கீழேயுள்ள இணைப்பைப் பயன்படுத்தி உங்கள் நண்பர்களுடன் பகிர்ந்து கொள்ளுங்கள்.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"நீங்கள் பொதுவில் அணுகக்கூடிய தனிப்பயன் ஸ்டிக்கர் பேக்குகளுக்கான URLகளை பிறர் கண்டறிய உதவ, $hashtag$ என்ற ஹேஷ்டேக்கைப் பயன்படுத்தவும்.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"ஸ்டிக்கர் பேக் URL",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"நிறுவு",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"மற்றொரு ஸ்டிக்கர் பேக்கை உருவாக்கவும்",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Signalக்காக நான் உருவாக்கிய இந்த புதிய ஸ்டிக்கர் பேக்கைப் பாருங்கள். #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {1 படம் சேர்க்கப்பட்டது} other {{count,number} படங்கள் சேர்க்கப்பட்டன}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"அனிமேஷன் செய்யப்பட்ட ஆர்ட் தற்போது ஆதரிக்கப்படவில்லை",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"வைக்கப்பட்ட படம் மிகவும் பெரிதாக உள்ளது",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"படத்தை செயலாக்குவதில் பிழை",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"அனிமேஷன் செய்யப்பட்ட PNG படங்கள் சதுரமாக இருக்க வேண்டும்",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"அனிமேஷன் செய்யப்பட்ட படங்கள் எப்போதும் லூப் செய்யப்பட வேண்டும்",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"அனிமேஷன் செய்யப்பட்ட PNG படங்களின் பரிமாணங்கள் மிகவும் பெரிதாக உள்ளன",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"அனிமேஷன் செய்யப்பட்ட PNG படங்களின் பரிமாணங்கள் மிகவும் சிறிதாக உள்ளன",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"படங்களைப் பதிவேற்றுவதில் பிழை: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"சர்வருடன் இணைக்க முடியவில்லை: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"காலாவதியான நம்பகச்சான்றுகள் காரணமாக படங்களை பதிவேற்ற முடியவில்லை. சிக்னல் டெஸ்க்டாப்பில் இருந்து இணையதளத்தை மீண்டும் திறக்கவும்.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"இணைப்பு நகலெடுக்கப்பட்டது",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"லைட் தீம் காட்சியில் எனது ஸ்டிக்கர்",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"டார்க் தீம் காட்சியில் எனது ஸ்டிக்கர்",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"ஸ்டிக்கர் பேக் கிரியேட்டரைப் பயன்படுத்த உங்கள் ஃபோன் மற்றும் டெஸ்க்டாப்பில் Signalஐ அமைக்கவும்",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:o,CustomizingPreferredReactions__title:i,"ArtFrame--emoji-name-placeholder":{message:"ஈமோஜி மாற்றுப்பெயர்",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{i as CustomizingPreferredReactions__title,o as EmojiButton__label,t as cancel,a as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"Peruuta"},a={message:"$minutes$ min",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},i={message:"Emoji",description:"Label for emoji button"},r={message:"Mukauta reaktiot",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},o={smartling:e,"index--title":{message:"Tarrakuvien luonti"},"index--create-sticker-pack":{message:"Luo uusi tarrapaketti"},"SignIn--title":{message:"Luo tarrapaketti",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Tarrat salataan, kuten kaikki muukin Signalissa. Luo tämän työkalun avulla omat mukautetut tarrapakettisi.",description:"A body of SignIn page"},"SignIn--qr":{message:"Kirjautumiskoodi",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"Aloita avaamalla Signal Desktop",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"Selaintasi ei valitettavasti tueta. Avaa tämä linkki Firefoxissa tai Chromessa",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:a,"EmojiPicker--empty":{message:"Emojia ei löytynyt",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"Hae emojia",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"Ihonväri $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"Hymiöt ja ihmiset",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"Eläimet ja luonto",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"Ruoka ja juoma",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"Matkailu ja paikat",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"Toiminta",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"Esineet",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"Symbolit",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"Liput",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Signal-kuvien luonti",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Signal-tarrapaketin luonti",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Signal-logo",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Tarrapaketin luonnin ohjeet",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"Lisää napsauttamalla tai pudota kuvia tähän",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"Pudota kuvat tähän",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"Tarrapaketti",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"Tarrapaketti",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"Peruuta",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"Kopioi",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"Seuraava",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"Takaisin",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"Lisää omia tarroja",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"Poista kuva",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"Lisää tarra napsauttamalla tai vetämällä ja pudottamalla tiedosto",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"Tarrojen tulee olla PNG-, APNG- tai WebP-muodossa, läpinäkyvällä taustalla ja kooltaan 512 x 512 pikseliä. Suositeltu marginaali on 16 pikseliä.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"Näytä marginaalit",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"Lisää emoji jokaiseen tarraan",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"Tämän avulla voimme ehdottaa sinulle tarroja viestin kirjoittamisen aikana.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"Vielä muutama lisätieto...",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"Nimi",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"Anna tarrapaketille nimi",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"Tekijä",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"Kirjoita tekijänimesi lähettääksesi tarrat",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"Kansikuva",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"Tämä kuva tulee näkyviin, kun jaat tarrapakettisi",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"Haluatko varmasti ladata tarrapakettisi?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"Lataa",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"Et voi enää tehdä muokkauksia tai poistoja tarrapaketin luomisen jälkeen.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"Tarrapakettiasi luodaan",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$count$/$total$ ladattu",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"Onnittelut! Tarrapaketti luotu.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"Käytä uusia tarroja tarrakuvakkeen kautta tai jaa ystäviesi kanssa alla olevan linkin avulla.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"Auta muita löytämään julkisiksi haluamasi tarrapakettien osoitteet käyttämällä aihetunnistetta $hashtag$.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"Tarrapaketin osoite",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"Asenna",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"Luo toinen tarrapaketti",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Tutustu tähän uuteen tarrapakettiin, jonka loin Signalille. #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {1 kuva lisätty} other {{count,number} kuvaa lisätty}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"Animoituja kuvia ei tällä hetkellä tueta",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"Pudotettu kuva on liian suuri",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"Virhe kuvan käsittelyssä",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"Animoidun PNG-kuvan tulee olla neliömäinen",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"Animoiduissa kuvissa on oltava jatkuva toisto",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"Animoidun PNG-kuvan koko on liian suuri",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"Animoidun PNG-kuvan koko on liian pieni",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"Virhe kuvien lataamisessa: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"Palvelimeen ei voida muodostaa yhteyttä: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"Kuvien lataaminen epäonnistui vanhentuneiden tunnistetietojen takia. Avaa verkkosivusto Signal Desktopista uudelleen.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"Linkki kopioitu",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"Tarra vaaleassa teemassa",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"Tarra tummassa teemassa",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"Asenna Signal puhelimeesi ja tietokoneelle, jotta voit käyttää tarrapakettityökalua",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:i,CustomizingPreferredReactions__title:r,"ArtFrame--emoji-name-placeholder":{message:"Emojialias",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{r as CustomizingPreferredReactions__title,i as EmojiButton__label,t as cancel,o as default,a as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"Annuller"},r={message:"$minutes$ m",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},i={message:"Emoji",description:"Label for emoji button"},o={message:"Tilpas reaktioner",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},a={smartling:e,"index--title":{message:"Klistermærkekunst"},"index--create-sticker-pack":{message:"Opret en ny klistermærkepakke"},"SignIn--title":{message:"Opret en klistermærkepakke",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Ligesom med alt andet hos Signal er klistermærker også krypteret. Brug dette værktøj til at lave dine egne tilpassede klistermærkepakker.",description:"A body of SignIn page"},"SignIn--qr":{message:"Login-kode",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"Åbn Signal Desktop for at starte",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"Beklager, din browser er ikke understøttet. Åbn dette link i Firefox eller Chrome",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"Ingen emojier fundet",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"Søg efter emoji",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"Hudfarve $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"Smileys og personer",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"Dyr og natur",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"Mad og drikke",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"Rejser og steder",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"Aktiviteter",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"Objekter",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"Symboler",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"Flag",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Signal-kunstner",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Signal-klistermærkepakkeværktøj",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Signal-logo",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Vejledning til Signal-klistermærkepakkeværktøj",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"Klik for at tilføje eller slip billeder her",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"Slip billeder her",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"Klistermærkepakke",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"Klistermærkepakke",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"Annullér",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"Kopiér",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"Næste",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"Tilbage",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"Tilføj dine klistermærker",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"Fjern billede",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"Klik eller træk/slip en fil for at tilføje et klistermærke",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"Klistermærker skal være i formatet PNG, APNG eller WebP med en gennemsigtig baggrund og 512 x 512 pixels. Den anbefalede margen er 16 px.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"Se margener",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"Tilføj emoji til hvert klistermærke",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"Dette gør det muligt for Signal-appen at foreslå klistermærker til dig under beskedskrivning.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"Lige et par detaljer mere...",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"Titel",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"Navngiv din klistermærkepakke",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"Forfatter",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"Angiv et navn for at indsende dine klistermærker",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"Forsidebillede",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"Dette er det billede, der vises, når du deler din klistermærkepakke",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"Er du sikker på, at du vil uploade din klistermærkepakke?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"Upload",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"Du vil ikke længere være i stand til at redigere eller slette efter oprettelse af en klistermærkepakke.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"Opretter din klistermærkepakke",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$count$ af $total$ er uploadet",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"Tillykke! Du har oprettet en klistermærkepakke.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"Få adgang til dine nye klistermærker med klistermærkeikonet, eller del med dine venner med nedenstående link.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"Hvis du ønsker at gøre din klistermærkepakke offentligt tilgængelig, skal du bruge hashtagget $hashtag$ for at hjælpe andre mennesker med at finde webadressen til din klistermærkepakke.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"Webadresse til klistermærkepakke",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"Installér",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"Opret en anden klistermærkepakke",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Se denne nye klistermærkepakke, jeg har oprettet til Signal. #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {1 billede tilføjet} other {{count,number} billeder tilføjet}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"Animeret kunst er ikke understøttet i øjeblikket",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"Det valgte billede er for stort",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"Fejl ved bearbejdning af billede",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"Animerede PNG-billeder skal være firkantede",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"Animerede billeder skal blive ved med at loope",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"Animerede PNG-billeddimensioner er for store",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"Animerede PNG-billeddimensioner er for små",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"Fejl ved upload af billeder: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"Kan ikke oprette forbindelse til serveren: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"Det lykkedes ikke at uploade billeder på grund af udløbne loginoplysninger. Åbn hjemmesiden igen fra Signal Desktop.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"Link kopieret",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"Mit klistermærke i lyst tema",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"Mit klistermærke i mørkt tema",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"Sæt Signal op på din telefon og computer for at bruge værktøjet til klistermærkepakker",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:i,CustomizingPreferredReactions__title:o,"ArtFrame--emoji-name-placeholder":{message:"Emojialias",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{o as CustomizingPreferredReactions__title,i as EmojiButton__label,t as cancel,a as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"Cancel·la"},a={message:"$minutes$ min",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},r={message:"Emoticones",description:"Label for emoji button"},s={message:"Personalització de reaccions",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},o={smartling:e,"index--title":{message:"Creador d'adhesius"},"index--create-sticker-pack":{message:"Crear nou paquet d'adhesius"},"SignIn--title":{message:"Crear nou paquet d'adhesius",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Com tot a Signal, els adhesius també estan encriptats. Utilitza aquesta eina per crear els teus propis paquets d'adhesius personalitzats.",description:"A body of SignIn page"},"SignIn--qr":{message:"Codi d'inici de sessió",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"Per començar, obre Signal per a Escriptori",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"Ho sentim, el teu navegador no és compatible. Obre aquest enllaç a Firefox o Chrome",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:a,"EmojiPicker--empty":{message:"No s'ha trobat cap emoticona",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"Cerca una emoticona",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"To de la pell $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"Emoticones somrients i gent",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"Animals i natura",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"Menjar i beure",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"Viatges i llocs",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"Activitats",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"Objectes",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"Símbols",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"Banderes",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Creador artístic de Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Creador de paquets d'adhesius",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Logo de Signal",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Guia del creador de paquets d'adhesius",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"Clica aquí per a afegir o deixar anar imatges.",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"Deixa anar imatges aquí",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"Paquet d'adhesius",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"Paquet d'adhesius",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"Cancel·la",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"Copia",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"Següent",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"Enrere",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"Afegeix els teus adhesius",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"Eliminar imatge",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"Fes clic o arrossega un fitxer per a afegir un adhesiu",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"Els adhesius han de tenir el format PNG, APNG o WebP amb un fons transparent i 512 x 512 píxels. El marge recomanat és de 16 píxels.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"Veure marges",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"Afegeix una emoticona a cada adhesiu",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"Això ens permet suggerir-vos adhesius a mesura que esteu fent missatges.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"Uns quants detalls més…",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"Títol",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"Posa-li nom al teu paquet d'adhesius",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"Autor",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"Introdueix un àlies per als teus adhesius",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"Imatge de la coberta",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"Aquesta és la imatge que es mostrarà quan comparteixis el paquet d'adhesius.",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"Segur que vols pujar el paquet d'adhesius?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"Pujar",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"Ja no podràs fer modificacions o supressions després de crear un paquet d'adhesius.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"Creant paquet d'adhesius",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$count$ de $total$ carregat",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"Enhorabona! Has creat un paquet d'adhesius.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"Accedeix als adhesius nous mitjançant la icona de l’adhesiu o comparteix-los amb les amistats amb l’enllaç següent.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"Utilitza l'etiqueta $hashtag$ per a ajudar altres persones a trobar els URL de qualsevol paquet d'adhesius personalitzat que voldries fer accessible al públic.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"URL del paquet d'adhesius",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"Instal·la",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"Crea un altre paquet d'adhesius",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Mireu aquest nou paquet d'adhesius que he creat per a Signal. #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {1 imatge afegida} other {{count,number} imatges afegides}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"Les imatges animades no són compatibles en aquest moment",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"La imatge és massa gran",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"Error al processar la imatge",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"Les imatges animades en PNG han de ser quadrades",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"Les imatges animades han de tenir un cicle infinit",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"Les dimensions de les imatges animades en PNG són excessives",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"Les dimensions de les imatges animades en PNG són massa petites",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"Error carregant les imatges: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"No s'ha pogut connectar al servidor: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"No s'han pogut carregar les imatges a causa de les credencials caducades. Si us plau, torna a obrir el lloc web des de Signal per a Escriptori.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"Enllaç copiat",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"L'adhesiu en tema clar",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"L'adhesiu en tema fosc",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"Configura Signal tant al telèfon com a l'Escriptori per poder utilitzar el Creador de paquets d'adhesius",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:r,CustomizingPreferredReactions__title:s,"ArtFrame--emoji-name-placeholder":{message:"Nom de l'emoticona",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{s as CustomizingPreferredReactions__title,r as EmojiButton__label,t as cancel,o as default,a as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"Anulează"},r={message:"$minutes$m",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},i={message:"Emoji",description:"Label for emoji button"},a={message:"Personalizare reacții",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},o={smartling:e,"index--title":{message:"Creator de stickere artistice"},"index--create-sticker-pack":{message:"Creează un nou pachet de stickere"},"SignIn--title":{message:"Creează un pachet de stickere",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"La fel ca totul în Signal, și stickerele sunt criptate. Folosește acest instrument și creează-ți propriile pachete de stickere.",description:"A body of SignIn page"},"SignIn--qr":{message:"Cod de conectare",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"Deschide Signal Desktop ca să începi",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"Ne pare rău, browser-ul tău nu este acceptat. Deschide acest link în Firefox sau Chrome",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"Nu a fost găsit nici un emoji",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"Căutare emoji",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"Culoare piele $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"Smiley-uri și Oameni",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"Animale și Natură",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"Mâncare și Băuturi",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"Călătorii și Locații",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"Activități",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"Obiecte",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"Simboluri",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"Steaguri",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Creator de artă Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Creator Pachet Stickere Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Logo Signal",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Reguli Creator Pachet de Stickere",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"Click pentru a adăuga sau plasează imaginile aici",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"Trage imaginile aici",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"Pachet autocolante",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"Pachet autocolante",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"Anulează",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"Copiere",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"Următorul",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"Înapoi",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"Adaugă autocolantele tale",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"Elimină imaginea",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"Dă click sau glisează și fixează un fișier pentru a adăuga un sticker",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"Autocolantele trebuie să fie în format PNG, APNG sau WebP cu un fundal transparent și o mărime de 512x512 pixeli. Marginea recomandată este de 16px.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"Vezi marginile",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"Adaugă un emoji la fiecare sticker",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"Acest lucru ne permite să îți sugerăm stickere în timp ce scrii.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"Doar încă câteva detalii...",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"Titlu",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"Numește-ți pachetul de stickere",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"Autor",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"Introdu un nume ca să-ți trimiți stickerele",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"Imagine de copertă",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"Aceasta este imaginea care va fi afișată când partajezi pachetul tău cu autocolante",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"Sigur vrei să încarci pachetul tău cu stickere?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"Încarcă",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"Nu vei mai putea modifica sau șterge după crearea unui pachet de autocolante.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"Se creează pachetul cu autocolante",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$count$ din $total$ încărcate",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"Felicitări! Ai creat un pachet cu autocolante.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"Accesează noile autocolante prin pictograma autocolantului sau partajează cu prietenii utilizând linkul de mai jos.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"Folosește hashtag-ul $hashtag$ pentru a-i ajuta pe alți oameni să găsească URL-urile pentru orice pachet de stickere pe care ai dori să-l faci accesibil public.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"URL Pachetul cu stickere",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"Instalează",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"Creează un alt pachet cu autocolante",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Vezi acest nou pachet cu stickere pe care l-am creat pentru Signal. #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {1 imagine adăugată} few {{count,number} imagini adăugate} other {{count,number} de imagini adăugate}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"Creațiile animate nu sunt momentan acceptate",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"Imaginea aleasă este prea mare",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"Eroare la procesarea imaginii",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"Imaginile PNG animate trebuie să fie pătrate",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"Imaginile animate trebuie să se repete continuu",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"Dimensiunile imaginilor PNG animate sunt prea mari",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"Dimensiunile imaginilor PNG animate sunt prea mici",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"Eroare la încărcarea imaginilor: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"Nu ne putem conecta la server: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"Nu am putut încărca imagini datorită credențialelor expirate. Redeschide site-ul web cu Signal Desktop din nou.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"Link copiat",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"Autocolantul meu în tema deschisă",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"Stickerul meu în tema întunecată",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"Te rugăm să configurezi Signal pe telefonul și desktopul tău pentru a utiliza creatorul de stickere",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:i,CustomizingPreferredReactions__title:a,"ArtFrame--emoji-name-placeholder":{message:"Alias emoji",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{a as CustomizingPreferredReactions__title,i as EmojiButton__label,t as cancel,o as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"Поништи"},r={message:"$minutes$ m",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},o={message:"Емоџи",description:"Label for emoji button"},i={message:"Прилагодите реакције",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},a={smartling:e,"index--title":{message:"Креатор налепница"},"index--create-sticker-pack":{message:"Направите нови пакет налепница"},"SignIn--title":{message:"Направите пакет налепница",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Као и све остало у Signal-у, налепнице су такође шифроване. Користите ову алатку да креирате сопствене прилагођене пакете налепница.",description:"A body of SignIn page"},"SignIn--qr":{message:"Шифра за пријаву",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"Отворите Signal Desktop да започнете",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"Жао нам је, ваш прегледач није подржан. Отворите линк у Firefox-у или Chrome-у",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"Није пронађен ниједан емоџи",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"Тражи емоџи",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"Нијанса коже $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"Смајлији и људи",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"Животиње и природа",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"Храна и пиће",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"Путовање и места",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"Активности",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"Ствари",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"Симболи",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"Заставе",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Креатор цртежа у Signal-у",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Креатор пакета налепница у Signal-у",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Логотип Signal-а",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Смернице за креатор пакета налепница",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"Кликните да додате слике или их превуците овде",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"Превуците слике овде",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"Пакет налепница",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"Пакет налепница",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"Поништи",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"Копирај",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"Даље",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"Назад",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"Додајте налепнице",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"Уклони слику",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"Кликните или превуците/отпустите фајл да додате налепницу",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"Налепнице морају бити у формату PNG, APNG или WebP са провидном позадином и 512x512 пиксела. Препоручена маргина је 16 пиксела.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"Прикажи маргине",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"Додајте емоџи у сваку налепницу",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"То нам омогућава да вам предлажемо налепнице током размене порука.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"Још само неколико детаља…",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"Назив",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"Дајте назив пакету налепница",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"Аутор",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"Унесите име под којим желите да пошаљете налепнице",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"Насловна слика",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"Ово је слика која ће се појавити када поделите пакет налепница",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"Да ли сте сигурни да желите да отпремите пакет налепница?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"Отпреми",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"Након креирања пакета налепница више нећете моћи да их мењате или бришете.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"Прављење пакета налепница",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$count$ од $total$ је отпремљено",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"Честитамо! Направили сте пакет налепница.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"Приступите новим налепницама преко иконе налепнице или их поделите са пријатељима помоћу линка у наставку.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"Користите хеш ознаку $hashtag$ да би други могли лакше да пронађу URL адресе за било који прилагођени пакет налепница који бисте желели да учините јавно доступним.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"URL за пакет налепница",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"Инсталирај",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"Направите још један пакет налепница",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Погледајте мој нови пакет налепница за Signal. #налепиприватност",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {Додатих слика: 1} other {Додатих слика: {count,number}}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"Анимирани цртежи тренутно нису подржани",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"Превучена слика је превелика",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"Грешка при обради слике",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"Анимиране слике у формату PNG морају бити квадратне",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"Анимиране слике морају да имају трајну анимацију",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"Димензије анимиране слике у формату PNG су превелике",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"Димензије анимиране слике у формату PNG су премале",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"Грешка приликом отпремања слика: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"Неуспешно повезивање са сервером: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"Отпремање слика није успело због истеклих акредитива. Поново отворите веб-сајт преко Signal Desktop-а.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"Линк је копиран",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"Моја налепница у светлој теми",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"Моја налепница у тамној теми",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"Подесите Signal на телефону и рачунару да бисте користили креатор пакета налепница",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:o,CustomizingPreferredReactions__title:i,"ArtFrame--emoji-name-placeholder":{message:"Назив емоџија",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{i as CustomizingPreferredReactions__title,o as EmojiButton__label,t as cancel,a as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"မလုပ်တော့ပါ"},r={message:"$minutes$m",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},o={message:"အီမိုဂျိ",description:"Label for emoji button"},i={message:"တုံ့ပြန်မှုများကို စိတ်ကြိုက်လုပ်ရန်",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},a={smartling:e,"index--title":{message:"Sticker Art Creator"},"index--create-sticker-pack":{message:"စတစ်ကာတွဲအသစ် ဖန်တီးရန်"},"SignIn--title":{message:"စတစ်ကာတွဲတစ်ခု ဖန်တီးရန်",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Signal ရှိ အခြားအရာအားလုံးကဲ့သို့ပင် စတစ်ကာများကိုလည်း ကုဒ်ပြောင်းဝှက်ထားပါသည်။ သင့်ကိုယ်ပိုင်စတစ်ကာတွဲများ ဖန်တီးရန် ဤတူးလ်ကို သုံးပါ။",description:"A body of SignIn page"},"SignIn--qr":{message:"ဝင်ရောက်ကုဒ်",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"စတင်လုပ်ဆောင်ရန်အတွက် Signal Desktop ကို ဖွင့်ရန်",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"ဝမ်းနည်းပါသည်၊ သင့်ဘရောက်ဇာကို ပံ့ပိုးပေးခြင်း မရှိပါ။ ဤလင့်ခ်ကို Firefox သို့မဟုတ် Chrome တွင် ဖွင့်ကြည့်ပေးပါ",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"အီမိုဂျိ ရှာမတွေ့ပါ",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"အီမိုဂျိ ရှာရန်",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"အသားအရောင် $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"အပြုံးမျက်နှာများနှင့် လူများ",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"တိရိစ္ဆာန်များနှင့် သဘာဝအရာများ",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"အစားအသောက်",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"အသွားအလာနှင့် နေရာများ",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"လှုပ်ရှားမှုများ",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"အရာဝတ္ထုများ",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"သင်္ကေတများ",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"အလံများ",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Signal Art Creator",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Signal Sticker Pack Creator",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Signal လိုဂို",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Sticker Pack Creator လမ်းညွှန်များ",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"ဤနေရာတွင် ရုပ်ပုံများကို ဆွဲယူထည့်ပါ သို့မဟုတ် ပေါင်းထည့်ရန် နှိပ်ပါ",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"ဤနေရာတွင် ရုပ်ပုံများ ဆွဲယူထည့်ရန်",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"စတစ်ကာတွဲ",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"စတစ်ကာတွဲ",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"မလုပ်တော့ပါ",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"ကူးရန်",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"ရှေ့သို့",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"နောက်သို့",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"သင့်စတစ်ကာများကို ပေါင်းထည့်ရန်",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"ရုပ်ပုံကို ဖယ်ရှားရန်",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"စတစ်ကာတစ်ခုကို ပေါင်းထည့်ရန် ဖိုင်တစ်ဖိုင်ကို ဆွဲယူထည့်ပါ သို့မဟုတ် နှိပ်ပါ",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"စတစ်ကာများသည် PNG ၊ APNG သို့မဟုတ် WebP ဖောမတ်၊ နောက်ခံအကြည်နှင့် 512x512 Pixel ဖြင့် ရှိရပါမည်။ အကြံပြုထားသော မာဂျင်သည် 16px ဖြစ်ပါသည်။",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"မာဂျင်များ ကြည့်ရန်",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"စတစ်ကာတစ်ခုစီတိုင်းတွင် အီမိုဂျိတစ်ခုစီ ပေါင်းထည့်ရန်",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"ဤသည်က သင်မက်ဆေ့ချ်ရိုက်သည့်အခါ စတစ်ကာများ အကြံပြုပေးနိုင်စေပါသည်။",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"နောက်ထပ်အသေးစိတ် အနည်းငယ်...",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"ခေါင်းစဉ်",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"သင့်စတစ်ကာတွဲကို အမည်ပေးပါ",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"ဖန်တီးသူ",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"သင့်စတစ်ကာတွဲများအောက်တွင် ထည့်သွင်းရန် အမည်တစ်ခုကို ရိုက်ထည့်ပါ",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"ကာဗာပုံ",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"ဤသည်က သင့်စတစ်ကာတွဲကို ဝေမျှသည့်အခါ ပြသမည့် ရုပ်ပုံဖြစ်ပါသည်",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"သင့်စတစ်ကာတွဲကို အပ်လုဒ် လုပ်လိုသည်မှာ သေချာပါသလား။",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"အပ်လုဒ်လုပ်ရန်",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"စတစ်ကာတွဲတစ်ခုကို ဖန်တီးပြီးနောက် ပြင်ဆင်ခြင်း သို့မဟုတ် ဖျက်ခြင်း ပြုလုပ်နိုင်တော့မည် မဟုတ်ပါ။",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"သင့်စတစ်ကာတွဲကို ဖန်တီးနေဆဲ",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$total$ တွင် $count$ အပ်လုဒ်လုပ်ပြီး",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"ဂုဏ်ယူပါသည်၊ သင်သည် စတစ်ကာတွဲတစ်ခုကို ဖန်တီးပြီးပါပြီ။",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"စတစ်ကာ အိုင်ကွန်မှတစ်ဆင့် သင့်စတစ်ကာအသစ်များကို ဝင်ရောက် သုံးစွဲပါ သို့မဟုတ် အောက်ပါလင့်ခ်ကို သုံး၍ သင့်မိတ်ဆွေများနှင့် ဝေမျှပါ။",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"အများ ဝင်ရောက် သုံးစွဲစေလိုသော စိတ်ကြိုက်စတစ်ကာတွဲတိုင်းအတွက် URL များကို အခြားသူများ ရှာရာတွင် ကူညီပေးရန် Hashtag $hashtag$ ကို သုံးပါ။",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"စတစ်ကာတွဲ URL",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"ထည့်သွင်းပါ",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"နောက်ထပ်စတစ်ကာတွဲကို ဖန်တီးရန်",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Signal အတွက် ကျွန်ုပ် ဖန်တီးထားသော ဤစတစ်ကာတွဲ အသစ်ကို ကြည့်လိုက်ပါ။ #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, other {{count,number} ပုံ ပေါင်းထည့်ပြီး}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"သက်ဝင်လှုပ်ရှားသော အနုလက်ရာများကို လက်ရှိတွင် မပံ့ပိုးပေးပါ",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"ဆွဲယူထည့်သော ပုံသည် ကြီးလွန်းနေပါသည်",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"ပုံ စီမံလုပ်ဆောင်ခြင်း ချို့ယွင်းချက်",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"သက်ဝင်လှုပ်ရှားသော PNG ရုပ်ပုံများသည် လေးထောင့်ပုံဖြစ်ရပါမည်",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"သက်ဝင်လှုပ်ရှားသော ရုပ်ပုံများသည် အမြဲ ပြန်ကျော့နေရပါမည်",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"သက်ဝင်လှုပ်ရှားသော PNG ရုပ်ပုံ အတိုင်းအတာများသည် ကြီးလွန်းနေပါသည်",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"သက်ဝင်လှုပ်ရှားသော PNG ရုပ်ပုံ အတိုင်းအတာများသည် သေးလွန်းနေပါသည်",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"ရုပ်ပုံများ အပ်လုဒ်လုပ်ခြင်း ချို့ယွင်းချက်- $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"ဆာဗာနှင့် ချိတ်ဆက်၍ မရနိုင်ပါ- $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"အထောက်အထားများ သက်တမ်းကုန်သွားသောကြောင့် ရုပ်ပုံများကို အပ်လုဒ်လုပ်ရာတွင် မအောင်မြင်ပါ။ Signal Desktop မှ ဝက်ဘ်ဆိုက်ကို တစ်ဖန် ပြန်ဖွင့်ပေးပါ။",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"လင့်ခ် ကူးပြီး",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"ကျွန်ုပ်၏ စတစ်ကာသည် လင်းသော Theme တွင် ရှိပါသည်",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"ကျွန်ုပ်၏ စတစ်ကာသည် မှောင်သော Theme တွင် ရှိပါသည်",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"Sticker Pack Creator ကို သုံးရန် သင့်ဖုန်းနှင့် Desktop တွင် Signal ကို စီစဉ်သတ်မှတ်ပေးပါ",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:o,CustomizingPreferredReactions__title:i,"ArtFrame--emoji-name-placeholder":{message:"အီမိုဂျိ အမည်လွှဲ",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{i as CustomizingPreferredReactions__title,o as EmojiButton__label,t as cancel,a as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"Avbryt"},r={message:"$minutes$min",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},i={message:"Emoji",description:"Label for emoji button"},o={message:"Tilpass reaksjonene",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},a={smartling:e,"index--title":{message:"Klistremerkeskaper"},"index--create-sticker-pack":{message:"Lag en ny klistremerkepakke"},"SignIn--title":{message:"Lag en klistremerkepakke",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Klistremerker er også krypterte, som alt annet i Signal. Dette verktøyet kan brukes til å lage dine egne klistremerkepakker.",description:"A body of SignIn page"},"SignIn--qr":{message:"Innloggingskode",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"Åpne Signal Desktop for å komme i gang",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"Beklager, denne nettleseren støttes ikke. Åpne lenken i Firefox eller Chrome.",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"Ingen emoji funnet",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"Søk i emojier",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"Hudfarge $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"Smilefjes og mennesker",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"Dyr og natur",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"Mat og drikke",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"Reise og steder",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"Aktiviteter",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"Objekter",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"Symboler",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"Flagg",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Klistremerkeskaper fra Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Verktøy for opprettelse av Signal-klistremerkepakke",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Signal-logo",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Veiledning for opprettelse av klistremerkepakke",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"Klikk for å legge til eller slippe bilder her",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"Slipp bilder her",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"Klistremerkepakke",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"Klistremerkepakke",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"Avbryt",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"Kopier",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"Neste",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"Tilbake",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"Legg til klistremerkene dine",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"Fjern bildet",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"Klikk eller dra og slipp en fil for å legge til et klistremerke",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"Klistremerker må være i PNG-, APNG- eller WebP-format og ha transparent bakgrunn og 512x512 piksler. Anbefalt marg er 16 piksler.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"Vis marger",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"Velg en emoji for hvert klistremerke",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"Dette gjør det mulig for oss å foreslå klistremerker når du skriver.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"Bare noen få detaljer til …",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"Tittel",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"Gi klistremerkepakken et navn",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"Forfatter",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"Skriv inn navnet på den som har laget klistremerkene",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"Omslagsbilde",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"Dette er bildet som vises når du deler klistremerkepakken",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"Er du sikker på at du vil laste opp klistremerkepakken?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"Last opp",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"Du vil ikke lenger kunne gjøre endringer eller slette noe etter du har opprettet en klistremerkepakke.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"Oppretter klistremerkepakken",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$count$ av $total$ lastet opp",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"Gratulerer! Du har laget en klistremerkepakke.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"Få tilgang til de nye klistremerkene dine via klistremerkeikonet, eller bruk lenken nedenfor til å dele dem med vennene dine.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"Bruk hashtaggen $hashtag$ for å hjelpe andre med å finne URL-adressen til klistremerkepakken som du ønsker å gjøre offentlig tilgjengelig.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"URL-adresse for klistremerkepakken",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"Installer",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"Lag enda en klistremerkepakke",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Ta en titt på denne nye klistremerkepakken jeg lagde for Signal. #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {{count,number} bilde ble lagt til} other {{count,number} bilder ble lagt til}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"Animasjoner støttes ikke for øyeblikket",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"Bildet er for stort",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"Klarte ikke å behandle bildet",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"Animerte PNG-bilder må være kvadratiske",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"Animerte bilder må være på kontinuerlig loop",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"Dimensjonene på det animerte PNG-bildet er for store",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"Dimensjonene på det animerte PNG-bildet er for små",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"Feil ved bildeopplasting: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"Klarte ikke å koble til serveren: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"Kunne ikke laste opp bildene på grunn av utløpt innloggingsinformasjon. Åpne nettstedet på nytt fra Signal Desktop.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"Lenken er kopiert",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"Klistremerket mitt i lyst tema",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"Klistremerket mitt i mørkt tema",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"Konfigurer Signal på telefonen og skrivebordet ditt for å bruke verktøyet for opprettelse av klistremerkepakke",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:i,CustomizingPreferredReactions__title:o,"ArtFrame--emoji-name-placeholder":{message:"Emoji-navn",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{o as CustomizingPreferredReactions__title,i as EmojiButton__label,t as cancel,a as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"Скасувати"},r={message:"$minutes$ хв",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},o={message:"Емодзі",description:"Label for emoji button"},i={message:"Налаштуйте реакції",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},a={smartling:e,"index--title":{message:"Художній редактор наліпок"},"index--create-sticker-pack":{message:"Створити новий набір наліпок"},"SignIn--title":{message:"Створіть набір наліпок",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Як і решта елементів Signal, наліпки також є зашифрованими. Користуйтеся цим інструментом, щоб створювати власні набори наліпок.",description:"A body of SignIn page"},"SignIn--qr":{message:"Код входу",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"Відкрити Signal для комп'ютера, щоб почати",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"Вибачте, ваш браузер не підтримується. Будь ласка, відкрийте це посилання в Firefox чи Chrome",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"Емодзі не знайдено",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"Пошук емодзі",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"Відтінок шкіри $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"Емограми і люди",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"Тварини і природа",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"Їжа і напої",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"Подорожі й місця",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"Активності",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"Об'єкти",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"Символи",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"Прапори",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Художній редактор Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Створення наборів наліпок у Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Логотип Signal",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Рекомендації зі створення наборів наліпок",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"Натисніть, щоб додати зображення, або перетягніть їх сюди",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"Перетягніть зображення сюди",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"Набір наліпок",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"Набір наліпок",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"Скасувати",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"Копіювати",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"Далі",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"Назад",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"Додайте наліпки",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"Видалити зображення",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"Клацніть тут або перетягніть файл, щоб додати наліпку",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"Наліпки повинні бути у форматі PNG, APNG чи WebP із прозорим фоном і розміром 512x512 пікселів. Рекомендований відступ: 16 пкс.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"Показати відступ",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"Призначте емодзі кожній наліпці",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"Так ми зможемо пропонувати вам наліпки, коли ви будете вводити повідомлення.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"Ще кілька деталей…",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"Назва",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"Придумайте назву для свого набору",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"Автор",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"Введіть ім'я, під яким додати наліпки",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"Зображення обкладинки",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"Це зображення буде показано, коли ви поділитеся набором наліпок",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"Ви дійсно хочете завантажити свій набір наліпок?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"Завантажити",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"Ви не зможете редагувати чи видалити цей набір наліпок після створення.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"Створюємо ваш набір наліпок",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$count$ з $total$ завантажено",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"Вітаємо! Ви створили набір наліпок.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"Отримайте доступ до своїх нових наліпок через значок наліпок або поділіться ними з друзями, використовуючи посилання нижче.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"Використовуйте гештег $hashtag$, щоб допомогти іншим людям знайти посилання на набори наліпок, які ви хочете зробити загальнодоступними.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"Посилання на набір наліпок",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"Встановити",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"Створити ще один набір наліпок",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Ось новий набір наліпок, створений мною для Signal. #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {Додано 1 зображення} few {Додано {count,number} зображення} many {Додано {count,number} зображень} other {Додано {count,number} зображення}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"Анімація наразі не підтримується",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"Додане зображення завелике",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"Помилка в обробці зображення",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"Анімовані зображення PNG мають бути квадратними",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"Анімовані зображення мають повторюватися постійно",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"Розміри анімованого зображення PNG завеликі",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"Розміри анімованого зображення PNG замалі",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"Помилка в завантаженні зображень: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"Не вдається підключитися до сервера: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"Не вдалося завантажити зображення, тому що термін дії облікових даних минув. Будь ласка, відкрийте сайт із Signal для комп'ютера ще раз.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"Посилання скопійовано",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"Моя наліпка у світлій темі",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"Моя наліпка в темній темі",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"Щоб створити набір наліпок, потрібно встановити Signal на телефон і комп'ютер",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:o,CustomizingPreferredReactions__title:i,"ArtFrame--emoji-name-placeholder":{message:"Псевдонім емодзі",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{i as CustomizingPreferredReactions__title,o as EmojiButton__label,t as cancel,a as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"Токтотуу"},r={message:"$minutes$м",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},o={message:"Быйтыкча",description:"Label for emoji button"},i={message:"Сезимди билдирүү параметрлери",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},a={smartling:e,"index--title":{message:"Стикерлер түзгүчү"},"index--create-sticker-pack":{message:"Жаңы стикерлер топтомун түзүү"},"SignIn--title":{message:"Стикерлер топтомун түзүү",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Signal'дагы башка нерселер сыяктуу стикерлер да шифрленет. Ушул курал аркылуу өзүңүздүн стикерлериңиздин топтомдорун түзсөңүз болот.",description:"A body of SignIn page"},"SignIn--qr":{message:"Кирүү коду",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"Баштоо үчүн Signal'ды компьютериңизде ачыңыз",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"Кечиресиз, сиздин серепчиңизде иштебейт экен. Firefox же Chrome серепчисинде ачып көрүңүз",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"Быйтыкчалар табылган жок",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"Быйтыкчаларды издөө",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"Теринин өңү $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"Быйтыкчалар жана адамдар",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"Жаныбарлар жана жаратылыш",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"Тамак-аш жана суусундук",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"Саякаттоо жана жерлер",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"Аракеттер",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"Объекттер",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"Символдор",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"Желектер",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Signal өнөрканасы",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Signal стикерлер топтомун түзгүчү",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Signal логотиби",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Signal стикерлер топтомун түзүү нускамасы",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"Бул жерди басып сүрөт кошуңуз же сүйрөп келиңиз",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"Сүрөттөрдү бул жерге сүйрөп келиңиз",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"Стикерлер топтому",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"Стикерлер топтому",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"Токтотуу",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"Көчүрүү",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"Кийинки",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"Артка",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"Стикерлериңизди кошуңуз",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"Сүрөттү өчүрүү",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"Стикер кошуу үчүн файлды басыңыз же сүйрөңүз",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"Стикерлер тунук фондо, PNG, APNG же WebP форматында, 512 x 512 пиксель өлчөмүндө болушу керек. Сунушталган чек - 16 пиксель.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"Четтерин көрүү",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"Ар бир стикерге быйтыкча кошуу",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"Бирөөлөр менен маектешип жатканыңызда стикерлерди сунуштап турабыз.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"Дагы бир аз калды...",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"Аталышы",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"Стикерлер топтомуңуздун аталышы кандай",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"Автор",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"Стикерлерди ким тапшырып жатат",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"Мукаба сүрөтү",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"Стикерлер топтомуңузду бөлүшүп жатканда ушул сүрөт көрүнөт",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"Стикерлер топтомуңузду чын эле жүктөп бересизби?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"Жүктөп берүү",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"Стикерлер топтомун түзгөндөн кийин аларды оңдоп же өчүрө албай каласыз.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"Стикерлер топтому түзүлүүдө",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$total$ ичинен $count$ жүктөлдү",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"Куттуктайбыз! Стикерлер топтомун түздүңүз.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"Жаңы стикерлериңизди стикер сүрөтчөсү аркылуу табасыз же досторуңуз менен төмөнкү шилтеме аркылуу бөлүшсөңүз болот.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"Жалпыга ачык жарыялаган жеке стикерлер топтомуңуздун шилтемелерин башкалар оңой таба алышы үчүн хештегди $hashtag$ колдонуңуз.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"Стикерлер топтомуна шилтеме",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"Орнотуу",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"Башка стикерлер топтомун түзүү",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Signal үчүн түзгөн бул жаңы стикерлер топтомумду карап көрүңүз. #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, other {{count,number} сүрөт кошулду}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"Азырынча анимацияланган сүрөттөр колдонулбайт",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"Өтө чоң сүрөттү сүйрөп келдиңиз",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"Сүрөттү иштетүүдө ката кетти",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"Анимацияланган PNG сүрөттөрү чарчы формада болушу керек",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"Анимацияланган сүрөттөр тынымсыз кыймылдап турушу керек",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"Анимацияланган PNG сүрөтүнүн өлчөмдөрү өтө чоң",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"Анимацияланган PNG сүрөтүнүн өлчөмдөрү өтө кичине",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"Сүрөттөрдү жүктөөдө ката кетти: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"Серверге туташпай жатат: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"Аккаунтка киргизүүчү маалымат эскирип калгандыктан, сүрөттөр жүктөлгөн жок. Signal сайтын компьютерден дагы бир жолу ачып көрүңүз.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"Шилтеме көчүрүлдү",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"Менин стикерим ачык темада",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"Менин стикерим күңүрт темада",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"Стикерлер топтомунун түзгүчүн колдонуу үчүн телефонуңузга жана компьютериңизге Signal'ды коюп алыңыз",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:o,CustomizingPreferredReactions__title:i,"ArtFrame--emoji-name-placeholder":{message:"Быйтыкчанын аталышы",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{i as CustomizingPreferredReactions__title,o as EmojiButton__label,t as cancel,a as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"ರದ್ದುಗೊಳಿಸಿ"},r={message:"$minutes$ನಿ",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},o={message:"ಎಮೋಜಿ",description:"Label for emoji button"},i={message:"ಪ್ರತಿಕ್ರಿಯೆಗಳನ್ನು ಕಸ್ಟಮೈಸ್ ಮಾಡಿ",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},a={smartling:e,"index--title":{message:"ಸ್ಟಿಕ್ಕರ್ ಆರ್ಟ್ ಕ್ರಿಯೇಟರ್"},"index--create-sticker-pack":{message:"ಹೊಸ ಸ್ಟಿಕ್ಕರ್ ಪ್ಯಾಕ್ ರಚಿಸಿ"},"SignIn--title":{message:"ಸ್ಟಿಕ್ಕರ್ ಪ್ಯಾಕ್ ರಚಿಸಿ",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Signal ನಲ್ಲಿರುವ ಬೇರೆ ಎಲ್ಲವುಗಳಂತೆಯೇ, ಸ್ಟಿಕ್ಕರ್‌ಗಳು ಕೂಡಾ ಎನ್‌ಕ್ರಿಪ್ಟ್ ಆಗಿವೆ. ನಿಮ್ಮ ಸ್ವಂತ ಕಸ್ಟಮ್ ಸ್ಟಿಕ್ಕರ್ ಪ್ಯಾಕ್‌ಗಳನ್ನು ರಚಿಸಲು ಈ ಪರಿಕರವನ್ನು ಬಳಸಿ.",description:"A body of SignIn page"},"SignIn--qr":{message:"ಸೈನ್ ಇನ್ ಕೋಡ್",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"ಪ್ರಾರಂಭಿಸಲು Signal Desktop ತೆರೆಯಿರಿ",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"ಕ್ಷಮಿಸಿ, ನಿಮ್ಮ ಬ್ರೌಸರ್ ಬೆಂಬಲಿತವಾಗಿಲ್ಲ. ದಯವಿಟ್ಟು ಈ ಲಿಂಕ್ ಅನ್ನು Firefox ಅಥವಾ Chrome ನಲ್ಲಿ ತೆರೆಯಿರಿ",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"ಯಾವುದೇ ಎಮೋಜಿ ಕಂಡುಬಂದಿಲ್ಲ",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"ಎಮೋಜಿ ಹುಡುಕಿ",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"ಚರ್ಮದ ಟೋನ್ $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"ಸ್ಮೈಲೀಗಳು ಮತ್ತು ಜನರು",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"ಪ್ರಾಣಿಗಳು ಮತ್ತು ಪ್ರಕೃತಿ",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"ಆಹಾರ ಮತ್ತು ಪಾನೀಯ",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"ಪ್ರಯಾಣ ಮತ್ತು ಸ್ಥಳಗಳು",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"ಚಟುವಟಿಕೆಗಳು",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"ವಸ್ತುಗಳು",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"ಚಿಹ್ನೆಗಳು",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"ಫ್ಲ್ಯಾಗ್‌ಗಳು",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Signal ಆರ್ಟ್ ಕ್ರಿಯೇಟರ್",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Signal ಸ್ಟಿಕ್ಕರ್ ಪ್ಯಾಕ್ ಕ್ರಿಯೇಟರ್",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Signal ಲೋಗೋ",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"ಸ್ಟಿಕ್ಕರ್ ಪ್ಯಾಕ್ ಕ್ರಿಯೇಟರ್ ಮಾರ್ಗಸೂಚಿಗಳು",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"ಇಲ್ಲಿ ಚಿತ್ರಗಳನ್ನು ಸೇರಿಸಲು ಅಥವಾ ಡ್ರಾಪ್ ಮಾಡಲು ಕ್ಲಿಕ್ ಮಾಡಿ",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"ಚಿತ್ರಗಳನ್ನು ಇಲ್ಲಿ ಡ್ರಾಪ್ ಮಾಡಿ",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"ಸ್ಟಿಕ್ಕರ್ ಪ್ಯಾಕ್",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"ಸ್ಟಿಕ್ಕರ್ ಪ್ಯಾಕ್",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"ರದ್ದುಗೊಳಿಸಿ",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"ನಕಲಿಸಿ",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"ಮುಂದಕ್ಕೆ",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"ಹಿಂದಕ್ಕೆ",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"ನಿಮ್ಮ ಸ್ಟಿಕ್ಕರ್‌ಗಳನ್ನು ಸೇರಿಸಿ",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"ಚಿತ್ರವನ್ನು ತೆಗೆದುಹಾಕಿ",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"ಸ್ಟಿಕ್ಕರ್ ಸೇರಿಸಲು ಒಂದು ಫೈಲ್ ಅನ್ನು ಕ್ಲಿಕ್ ಮಾಡಿ ಅಥವಾ ಡ್ರ್ಯಾಗ್/ಡ್ರಾಪ್ ಮಾಡಿ",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"ಸ್ಟಿಕ್ಕರ್‌ಗಳು ಪಾರದರ್ಶಕ ಹಿನ್ನೆಲೆ ಹೊಂದಿದ್ದು, PNG, APNG ಅಥವಾ WebP ಫಾರ್ಮ್ಯಾಟ್‌ನಲ್ಲಿರಬೇಕು ಮತ್ತು 512x512 ಪಿಕ್ಸೆಲ್‌ಗಳು ಇರಬೇಕು. ಶಿಫಾರಸು ಮಾಡಿದ ಮಾರ್ಜಿನ್ 16px ಆಗಿದೆ.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"ಮಾರ್ಜಿನ್‌ಗಳನ್ನು ವೀಕ್ಷಿಸಿ",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"ಪ್ರತಿ ಸ್ಟಿಕ್ಕರ್‌ಗೆ ಒಂದು ಎಮೋಜಿ ಸೇರಿಸಿ",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"ನೀವು ಮೆಸೇಜ್ ಮಾಡುತ್ತಿರುವಾಗ ಸ್ಟಿಕ್ಕರ್‌ಗಳನ್ನು ಸಲಹೆ ಮಾಡಲು ಇದು ನಮಗೆ ಅನುವು ಮಾಡುತ್ತದೆ.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"ಇನ್ನು ಕೆಲವೇ ವಿವರಗಳು...",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"ಶೀರ್ಷಿಕೆ",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"ನಿಮ್ಮ ಸ್ಟಿಕ್ಕರ್ ಪ್ಯಾಕ್‌ ಅನ್ನು ಹೆಸರಿಸಿ",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"ಲೇಖಕ",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"ನಿಮ್ಮ ಸ್ಟಿಕ್ಕರ್‌ಗಳನ್ನು ಇದರಡಿಯಲ್ಲಿ ಸಲ್ಲಿಸಲು ಹೆಸರು ನಮೂದಿಸಿ",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"ಕವರ್ ಚಿತ್ರ",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"ಇದು ನಿಮ್ಮ ಸ್ಟಿಕ್ಕರ್ ಪ್ಯಾಕ್ ಅನ್ನು ನೀವು ಹಂಚಿಕೊಂಡಾಗ ಕಾಣಿಸಿಕೊಳ್ಳುವ ಚಿತ್ರ",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"ನಿಮ್ಮ ಸ್ಟಿಕ್ಕರ್ ಪ್ಯಾಕ್ ಅನ್ನು ಅಪ್‌ಲೋಡ್ ಮಾಡಲು ನೀವು ಖಚಿತವಾಗಿಯೂ ಬಯಸುತ್ತೀರಾ?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"ಅಪ್‌ಲೋಡ್",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"ನೀವು ಇನ್ನು ಮುಂದೆ ಎಡಿಟ್‌ಗಳನ್ನು ಮಾಡಲು ಆಗದು ಅಥವಾ ಸ್ಟಿಕ್ಕರ್ ಪ್ಯಾಕ್ ರಚಿಸಿದ ನಂತರ ಅಳಿಸಲು ಆಗದು.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"ನಿಮ್ಮ ಸ್ಟಿಕ್ಕರ್ ಪ್ಯಾಕ್ ರಚಿಸುವುದು",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$total$ ಪೈಕಿ $count$ ಅಪ್‌ಲೋಡ್ ಮಾಡಲಾಗಿದೆ",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"ಅಭಿನಂದನೆಗಳು! ನೀವು ಸ್ಟಿಕ್ಕರ್ ಪ್ಯಾಕ್ ರಚಿಸಿದ್ದೀರಿ.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"ಸ್ಟಿಕ್ಕರ್ ಐಕಾನ್ ಮೂಲಕ ನಿಮ್ಮ ಹೊಸ ಸ್ಟಿಕ್ಕರ್‌ಗಳನ್ನು ಆಕ್ಸೆಸ್ ಮಾಡಿ ಅಥವಾ ಈ ಕೆಳಗಿನ ಲಿಂಕ್ ಬಳಸಿ ನಿಮ್ಮ ಸ್ನೇಹಿತರೊಂದಿಗೆ ಹಂಚಿಕೊಳ್ಳಿ.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"ನೀವು ಸಾರ್ವಜನಿಕವಾಗಿ ಲಭ್ಯವಾಗಿಸಲು ಬಯಸಿದ ಯಾವುದೇ ಕಸ್ಟಮ್ ಸ್ಟಿಕ್ಕರ್ ಪ್ಯಾಕ್‌ಗಳ URL ಗಳನ್ನು ಕಂಡುಕೊಳ್ಳಲು ಸಹಾಯ ಮಾಡುವುದಕ್ಕಾಗಿ $hashtag$ ಹ್ಯಾಶ್‌ಟ್ಯಾಗ್ ಬಳಸಿ.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"ಸ್ಟಿಕ್ಕರ್ ಪ್ಯಾಕ್ URL",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"ಸ್ಥಾಪಿಸಿ",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"ಇನ್ನೊಂದು ಸ್ಟಿಕ್ಕರ್ ಪ್ಯಾಕ್ ರಚಿಸಿ",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Signal ಗಾಗಿ ನಾನು ರಚಿಸಿದ ಹೊಸ ಸ್ಟಿಕ್ಕರ್ ಪ್ಯಾಕ್ ಅನ್ನು ಪರಿಶೀಲಿಸಿ. #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {1 ಚಿತ್ರವನ್ನು ಸೇರಿಸಲಾಗಿದೆ} other {{count,number} ಚಿತ್ರಗಳನ್ನು ಸೇರಿಸಲಾಗಿದೆ}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"ಅನಿಮೇಟೆಡ್ ಆರ್ಟ್ ಪ್ರಸ್ತುತ ಬೆಂಬಲಿತವಾಗಿಲ್ಲ",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"ಡ್ರಾಪ್ ಮಾಡಿದ ಚಿತ್ರ ತುಂಬಾ ದೊಡ್ಡದಾಗಿದೆ",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"ಚಿತ್ರ ಪ್ರಕ್ರಿಯೆಗೊಳಿಸುವಲ್ಲಿ ದೋಷ",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"ಅನಿಮೇಟೆಡ್ PNG ಚಿತ್ರಗಳು ಚೌಕಾಕರದಲ್ಲಿರಬೇಕು",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"ಅನಿಮೇಟೆಡ್ ಚಿತ್ರಗಳು ಯಾವತ್ತೂ ಲೂಪ್ ಆಗಿರಬೇಕು",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"ಅನಿಮೇಟೆಡ್ PNG ಚಿತ್ರದ ಆಯಾಮಗಳು ತೀರಾ ದೊಡ್ಡದಾಗಿವೆ",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"ಅನಿಮೇಟೆಡ್ PNG ಚಿತ್ರದ ಆಯಾಮಗಳು ತೀರಾ ಸಣ್ಣದಾಗಿವೆ",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"ಚಿತ್ರಗಳನ್ನು ಅಪ್‌ಲೋಡ್ ಮಾಡುವಲ್ಲಿ ದೋಷ: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"ಸರ್ವರ್‌ಗೆ ಕನೆಕ್ಟ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"ಅವಧಿ ಮೀರಿದ ರುಜುವಾತುಗಳಿಂದಾಗಿ ಚಿತ್ರಗಳನ್ನು ಅಪ್‌ಲೋಡ್ ಮಾಡಲು ವಿಫಲವಾಗಿದೆ. ದಯವಿಟ್ಟು Signal Desktop ನಿಂದ ಮತ್ತೊಮ್ಮೆ ವೆಬ್‌ಸೈಟ್ ಮರುತೆರೆಯಿರಿ.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"ಲಿಂಕ್ ಅನ್ನು ನಕಲಿಸಲಾಗಿದೆ",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"ಲೈಟ್ ಥೀಮ್‌ನಲ್ಲಿ ನನ್ನ ಸ್ಟಿಕ್ಕರ್",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"ಡಾರ್ಕ್ ಥೀಮ್‌ನಲ್ಲಿ ನನ್ನ ಸ್ಟಿಕ್ಕರ್",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"ಸ್ಟಿಕ್ಕರ್ ಪ್ಯಾಕ್ ಕ್ರಿಯೇಟರ್ ಬಳಸಲು ನಿಮ್ಮ ಫೋನ್ ಮತ್ತು ಡೆಸ್ಕ್‌ಟಾಪ್‌ನಲ್ಲಿ ದಯವಿಟ್ಟು Signal ಸೆಟಪ್ ಮಾಡಿ",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:o,CustomizingPreferredReactions__title:i,"ArtFrame--emoji-name-placeholder":{message:"ಎಮೋಜಿ ಉಪನಾಮ",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{i as CustomizingPreferredReactions__title,o as EmojiButton__label,t as cancel,a as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"취소"},r={message:"$minutes$분",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},o={message:"이모지",description:"Label for emoji button"},i={message:"반응 사용자 지정",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},a={smartling:e,"index--title":{message:"스티커 아트 생성기"},"index--create-sticker-pack":{message:"새 스티커 팩 만들기"},"SignIn--title":{message:"스티커 팩 만들기",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Signal의 다른 모든 것들과 마찬가지로 스티커도 암호화됩니다. 이 도구를 사용하여 나만의 맞춤 스티커 팩을 만들어보세요.",description:"A body of SignIn page"},"SignIn--qr":{message:"로그인 코드",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"Signal 데스크톱 열어서 시작",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"죄송하지만 지원되지 않는 브라우저입니다. Firefox나 Chrome에서 이 링크를 열어주세요.",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"이모지 검색 결과 없음",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"이모지 검색",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"피부 톤: $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"웃는 얼굴과 사람",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"동물과 자연",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"음식과 음료",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"여행과 장소",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"활동",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"물체",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"부호",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"깃발",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Signal 아트 생성기",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Signal 스티커 팩 생성기",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Signal 로고",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"스티커 팩 생성기 안내",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"클릭하여 이미지를 추가하거나 여기에 드롭하세요.",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"여기에 이미지 드롭",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"스티커 팩",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"스티커 팩",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"취소",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"복사",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"다음",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"뒤로",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"스티커 추가",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"이미지 제거",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"파일을 클릭하거나 끌어와 스티커를 추가합니다.",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"스티커는 512x512 픽셀의 투명한 배경을 가진 PNG, APNG, WebP 형식이어야 합니다. 권장 여백은 16px입니다.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"여백 보기",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"각 스티커에 이모지 추가",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"이 기능을 사용하면 메시지를 보낼 때 스티커를 추천받을 수 있습니다.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"몇 가지 추가 세부 사항...",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"제목",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"스티커 팩에 이름 붙이기",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"저자",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"스티커를 제출할 때 사용할 이름을 입력하세요.",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"커버 사진",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"스티커 팩을 공유할 때 표시되는 이미지입니다.",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"스티커 팩을 업로드할까요?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"업로드",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"스티커 팩을 만든 후에는 더 이상 편집하거나 삭제할 수 없습니다.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"스티커 팩 만들기",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$count$/$total$개 업로드함",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"축하드립니다! 스티커 팩을 만들었습니다.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"스티커 아이콘을 통해 새 스티커에 액세스하거나 아래 링크를 사용하여 친구와 공유하세요.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"$hashtag$ 해시태그를 사용하여 누구나 액세스할 수 있었으면 하는 맞춤 스티커 팩의 URL을 다른 사람들이 찾을 수 있도록 도와주세요.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"스티커 팩 URL",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"설치",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"다른 스티커 팩 만들기",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"내가 만든 새 Signal 스티커 팩을 구경하세요. #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, other {이미지 {count,number}개를 추가함}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"애니메이션 아트는 현재 지원되지 않습니다.",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"드롭한 이미지가 너무 큽니다.",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"이미지 처리 오류",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"애니메이션 PNG 이미지는 정사각형이어야 합니다.",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"애니메이션 이미지는 계속 반복되어야 합니다.",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"애니메이션 PNG 이미지 크기가 너무 큽니다.",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"애니메이션 PNG 이미지 크기가 너무 작습니다.",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"이미지 업로드 오류: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"서버 연결 오류: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"만료된 자격 증명으로 인해 이미지를 업로드하지 못했습니다. Signal 데스크톱에서 웹사이트를 다시 열어주세요.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"링크를 복사했습니다.",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"밝은 테마의 내 스티커",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"어두운 테마의 내 스티커",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"스티커 팩 생성기를 사용하려면 휴대전화와 데스크톱에서 Signal을 설정하세요.",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:o,CustomizingPreferredReactions__title:i,"ArtFrame--emoji-name-placeholder":{message:"이모지 별칭",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{i as CustomizingPreferredReactions__title,o as EmojiButton__label,t as cancel,a as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"Hủy"},r={message:"$minutes$ phút",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},i={message:"Emoji",description:"Label for emoji button"},o={message:"Tuỳ chỉnh bày tỏ cảm xúc",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},a={smartling:e,"index--title":{message:"Công Cụ Tạo Nhãn Dán Nghệ Thuật"},"index--create-sticker-pack":{message:"Tạo gói nhãn dán mới"},"SignIn--title":{message:"Tạo Một Gói Nhãn Dán",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Giống như mọi điều khác trong Signal, nhãn dán cũng được mã hóa. Sử dụng công cụ này để tạo các gói nhãn dán của riêng bạn.",description:"A body of SignIn page"},"SignIn--qr":{message:"Mã Đăng Nhập",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"Mở Signal Desktop Để Bắt đầu",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"Rất tiếc, trình duyệt của bạn không được hỗ trợ. Vui lòng mở liên kết này trong Firefox hoặc Chrome",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"Không tìm thấy emoji",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"Tìm kiếm Emoji",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"Màu da $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"Mặt cười và Con người",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"Thú vật & Thiên nhiên",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"Đồ ăn & Thức uống",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"Du lịch & Nơi chốn",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"Hoạt động",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"Đồ vật",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"Kí hiệu",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"Cờ",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Công Cụ Tạo Hình Ảnh Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Công Cụ Tạo Nhãn Dán Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Signal Logo",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Quy Định Công Cụ Tạo Gói Nhãn Dán",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"Nhấn để thêm ảnh hoặc kéo thả vào đây",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"Kéo thả ảnh vào đây",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"Gói nhãn dán",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"Gói nhãn dán",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"Hủy",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"Sao chép",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"Tiếp",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"Trở lại",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"Thêm nhãn dán của bạn",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"Gỡ hình ảnh",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"Nhấp hoặc kéo/thả một tệp để thêm một nhãn dán",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"Nhãn dán phải có định dạng PNG, APNG, hoặc WebP với ảnh nền trong suốt và 512x512 pixel. Bản lề gợi ý là 16px.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"Hiển thị lề",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"Gán emoji vào mỗi nhãn dán",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"Thao tác này sẽ giúp gợi ý nhãn dán khi bạn đang nhắn tin.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"Chỉ một vài chi tiết nữa…",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"Tiêu đề",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"Đặt tên cho gói nhãn dán của bạn",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"Tác giả",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"Nhập tên để gửi nhãn dán của bạn",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"Ảnh đại diện",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"Đây là ảnh đại diện khi bạn chia sẻ gói nhãn dán",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"Bạn có chắc muốn tải lên gói nhãn dán này?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"Tải lên",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"Bạn sẽ không thể chỉnh sửa hay xóa gói nhãn dán sau khi tải lên.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"Tạo gói nhãn dán của bạn",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"Đã tải lên $count$ trên tổng số $total$",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"Chúc mừng! Bạn đã tạo một gói nhãn dán.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"Truy cập nhãn dán mới thông qua icon nhãn dán, hoặc chia sẻ với bạn bè bằng cách sử dụng đường dẫn bên dưới.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"Dùng hashtag $hashtag$ để giúp mọi người tìm thấy URL của những gói nhãn dán bạn muốn chia sẻ.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"URL gói nhãn dán",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"Cài đặt",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"Tạo gói nhãn dán khác",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Xem gói nhãn dán tôi vừa tạo cho Signal. #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, other {{count,number} ảnh được thêm}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"Ảnh động hiện tại chưa được hỗ trợ",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"Ảnh quá lớn",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"Lỗi trong việc xử lý ảnh",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"Ảnh động PNG phải là hình vuông",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"Ảnh động phải lặp lại liên tục",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"Kích cỡ ảnh động PNG quá lớn",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"Kích cỡ ảnh động PNG quá nhỏ",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"Lỗi trong việc tải ảnh lên: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"Không thể kết nối với máy chủ: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"Không thể tải lên hình ảnh do thông tin đăng nhập đã hết hạn. Vui lòng mở lại trang web từ Signal Desktop.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"Đã sao chép liên kết",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"Nhãn dán trên nền sáng",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"Nhãn dán trên nền tối",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"Vui lòng cài Signal trên điện thoại và máy tính để sử dụng Công Cụ Tạo Nhãn Dán Signal",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:i,CustomizingPreferredReactions__title:o,"ArtFrame--emoji-name-placeholder":{message:"Biệt hiệu emoji",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{o as CustomizingPreferredReactions__title,i as EmojiButton__label,t as cancel,a as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"Cancelar"},r={message:"$minutes$m",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},a={message:"Emoticona",description:"Label for emoji button"},o={message:"Personalizar as reaccións",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},i={smartling:e,"index--title":{message:"Creador artístico de stickers"},"index--create-sticker-pack":{message:"Crear un novo paquete de stickers"},"SignIn--title":{message:"Crea un paquete de stickers",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"De igual maneira que todo o que ofrece Signal, os stickers tamén están encriptados. Emprega esta ferramenta para crear o teu propio paquete personalizado de stickers.",description:"A body of SignIn page"},"SignIn--qr":{message:"Código para iniciar sesión",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"Abrir Signal Desktop para comezar",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"O teu navegador non é compatible. Abre esta ligazón en Firefox ou Chrome",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"Non se atopou a emoticona",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"Buscar emoticona",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"Ton de pel $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"Riseiros & Xente",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"Animais & Natureza",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"Comida & Bebida",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"Viaxes & Lugares",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"Actividades",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"Obxectos",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"Símbolos",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"Bandeiras",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Creador artístico de Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Creador de paquetes de stickers para Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Logo de Signal",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Guía do creador de paquetes de stickers",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"Premer para engadir ou soltar as imaxes aquí",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"Soltar imaxes aquí",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"Paquete de stickers",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"Paquete de stickers",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"Cancelar",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"Copiar",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"Seguinte",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"Volver",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"Engadir os teus stickers",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"Eliminar imaxe",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"Premer ou mover/soltar un arquivo para engadir un sticker",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"Os stickers deben ter un formato PNG, APNG ou WebP cun fondo transparente e 512x512 píxeles. As marxes recomendadas son 16px.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"Ver marxes",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"Engadir unha emoticona en cada sticker",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"Isto permítenos suxerirche stickers mentres escribes mensaxes.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"Só uns detalles máis...",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"Título",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"Nomea o teu paquete de stickers",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"Autor",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"Introduce un nome para enviar os teus stickers",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"Imaxe da portada",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"Esta é a imaxe que se amosará cando compartas o teu paquete de stickers",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"Queres subir o teu paquete de stickers?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"Subir",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"Non poderás nin editar nin borrar nada despois de crear un paquete.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"Creando o teu paquete de stickers",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$count$ de $total$ subidos",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"Parabéns! Creaches un paquete de stickers.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"Accede aos teus novos stickers a través da icona ou compárteos cos teus amigos empregando a seguinte ligazón.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"Emprega a etiqueta $hashtag$ para que outras persoas atopen os URL de calquera paquete personalizado de stickers que queiras que sexa público.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"URL do paquete de stickers",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"Instalar",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"Crear outro paquete de stickers",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Bótalle un ollo ao novo paquete de stickers que creei para Signal. #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {1 imaxe engadida} other {{count,number} imaxes engadidas}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"As imaxes animadas non son compatibles neste momento",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"A imaxe arrastrada é demasiado grande",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"Erro ao procesar a imaxe",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"As imaxes PNG animadas deben ser cadradas",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"As imaxes animadas deben encadearse indefinidamente",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"As dimensións da imaxe PNG animada son demasiado grandes",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"As dimensións da imaxe PNG animada son demasiado pequenas",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"Erro ao subir as imaxes: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"Non se pode conectar co servidor: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"Erro ao subir as imaxes xa que caducaron as credenciais. Volve abrir o sitio web dende Signal Desktop.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"Ligazón copiada",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"O meu sticker en tema claro",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"O meu sticker en tema escuro",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"Configura Signal no teu móbil e ordenador para empregar o creador de paquetes de stickers",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:a,CustomizingPreferredReactions__title:o,"ArtFrame--emoji-name-placeholder":{message:"Alias da emoticona",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{o as CustomizingPreferredReactions__title,a as EmojiButton__label,t as cancel,i as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"გაუქმება"},r={message:"$minutes$ წთ",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},o={message:"Emoji",description:"Label for emoji button"},i={message:"რეაქციების პერსონალიზირება",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},a={smartling:e,"index--title":{message:"სტიკერის ხელოვნების შემქმნელი"},"index--create-sticker-pack":{message:"შექმენი სტიკერების ახალი ნაკრები"},"SignIn--title":{message:"შექმენი სტიკერების ნაკრები",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"ისევე, როგორც სხვა ყველაფერი Signal-ში, სტიკერებიც დაშიფრულია. გამოიყენე ეს აპი, რათა შენზე მორგებული სტიკერების ნაკრები შექმნა.",description:"A body of SignIn page"},"SignIn--qr":{message:"შესასვლელი კოდი",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"დასაწყებად გახსენი Signal Desktop-ი",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"ვწუხვართ, შენი ბრაუზერის მხარდაჭერა არ გვაქვს. გთხოვთ, ეს ბმული Firefox-სა ან Chrome-ში გახსნა",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"emoji არ მოიძებნა",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"Emoji-ს ძებნა",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"კანის ფერი $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"სმაილები & ადამიანები",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"ცხოველები & ბუნება",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"საკვები & სასმელები",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"მოგზაურობა & ადგილები",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"აქტივობები",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"ობიექტები",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"სიმბოლოები",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"დროშები",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Signal-ის ხელოვნების შემქმნელი",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Signal-ის სტიკერების ნაკრების შემქმნელი",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Signal-ის ლოგო",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"სტიკერების ნაკრების შემქმნელის გაიდლაინები",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"დააჭირე სურათების დასამატებლად ან გადმოიტანე ისინი აქ",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"გადმოიტანე სურათები აქ",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"სტიკერების ნაკრები",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"სტიკერების ნაკრები",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"გაუქმება",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"დაკოპირება",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"შემდეგი",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"უკან",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"დაამატე შენი სტიკერები",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"სურათის წაშლა",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"დააჭირე ან გადმოიტანე/ჩააგდე ფაილი, რომ სტიკერი დაამატო",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"სტიკერები უნდა იყოს PNG, APNG ან WebP ფორმატში, გამჭვირვალე ფონით და 512x512 პიქსელით. რეკომენდებული ზღვარი 16 პიქსელია.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"საზღვრების ნახვა",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"დაამატე emoji თითოეულ სტიკერს",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"ეს საშუალებას გვაძლევს შეტყობინებების გაგზავნისას სტიკერები შემოგთავაზოთ.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"კიდევ რამდენიმე დეტალი…",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"სათაური",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"დაარქვი სახელი შენი სტიკერების ნაკრებს",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"ავტორი",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"შეიყვანე სახელი, რომლის ქვეშაც გსურს სტიკერების ატვირთვა",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"ყდის სურათი",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"ეს სურათი გამოჩნდება შენი სტიკერების ნაკრების გაზიარებისას",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"დარწმუნებული ხარ, რომ გსურს შენი სტიკერების ნაკრების ატვირთვა?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"ატვირთვა",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"სტიკერების ნაკრების შექმნის შემდეგ მათ რედაქტირებას ან წაშლას ვეღარ შეძლებ.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"შენი სტიკერების ნაკრების შექმნა",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$total$-დან $count$ აიტვირთა",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"გილოცავთ! შენ სტიკერების ნაკრები შექმენი.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"შენი ახალი სტიკერების სანახავად სტიკერის ხატულა გამოიყენე, ან გაუზიარე ისინი შენს მეგობრებს ქვემოთ მოცემული ბმულით.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"გამოიყენე ჰეშთეგი $hashtag$, რათა დაეხმარო სხვა ადამიანებს იპოვონ URL-ები ნებისმიერი არასტანდარტული სტიკერების ნაკრებისთვის, რომლებიც გსურს საჯაროდ ხელმისაწვდომი გახადო.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"სტიკერების ნაკრების URL-ი",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"გადმოწერა",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"სხვა სტიკერების ნაკრეის შექმნა",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"ნახე სტიკერების ეს ნაკრები, რომელიც Signal-ისთვის შევქმენი. #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {დამატებულია 1 სურათი} other {დამატებულია {count,number} სურათი}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"ამჟამად ანიმაციების მხარდაჭერა არ გვაქვს",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"ჩაგდებული სურათი ზედმეტად დიდია",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"სურათის დამუშავებისას ხარვეზი მოხდა",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"ანიმაციური PNG გამოსახულება კვადრატული უნდა იყოს",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"ანიმაციური გამოსახულება მუდმივად უწყვეტი უნდა იყოს",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"ანიმაციური PNG გამოსახულების ზომები ძალიან დიდია",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"ანიმაციური PNG გამოსახულების ზომები ძალიან პატარაა",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"სურათების ატვირთვისას მოხდა ხარვეზი: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"სერვერთან დაკავშირება ვერ მოხერხდა: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"სურათების ატვირთვა ვერ მოხერხდა ვადაგასული ავტორიზაციის გამო. გთხოვთ, ვებსაიტი Signal Desktop-დან თავიდან გახსნა.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"ბმული დაკოპირდა",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"ჩემი სტიკერი ღია ფერებში",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"ჩემი სტიკერი მუქ ფერებში",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"Sticker Pack Creator გამოსაყენებლად გთხოვთ, დააყენო Signal-ი შენს მობილურსა და კომპიუტერზე",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:o,CustomizingPreferredReactions__title:i,"ArtFrame--emoji-name-placeholder":{message:"Emoji-ის მეტსახელები",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{i as CustomizingPreferredReactions__title,o as EmojiButton__label,t as cancel,a as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"Batal"},a={message:"$minutes$m",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},r={message:"Emoji",description:"Label for emoji button"},i={message:"Sesuaikan reaksi",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},o={smartling:e,"index--title":{message:"Pencipta Seni Pelekat"},"index--create-sticker-pack":{message:"Cipta pek pelekat baru"},"SignIn--title":{message:"Cipta Pek Pelekat",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Sama seperti semua yang lain dalam Signal, pelekat juga disulitkan. Guna alat ini untuk membuat pek pelekat tersuai anda sendiri.",description:"A body of SignIn page"},"SignIn--qr":{message:"Kod Log Masuk",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"Buka Desktop Signal untuk Mula",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"Maaf, pelayar anda tidak disokong. Sila buka pautan ini dalam Firefox atau Chrome",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:a,"EmojiPicker--empty":{message:"Tiada emoji dijumpai",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"Cari Emoji",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"Warna kulit $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"Smiley & Orang",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"Haiwan & Alam Semula Jadi",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"Makanan & Minuman",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"Perjalanan & Tempat",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"Aktiviti",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"Objek",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"Simbol",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"Bendera",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Pencipta Seni Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Pencipta Pek Pelekat Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Logo Signal",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Garis Panduan Pek Pencipta Pelekat",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"Klik untuk menambah atau meletakkan gambar di sini",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"Letakkan imej di sini",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"Pek pelekat",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"Pek pelekat",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"Batal",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"Salin",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"Seterusnya",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"Kembali",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"Tambah pelekat anda",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"Alih keluar imej",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"Klik atau seret/letakkan fail untuk menambah pelekat",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"Pelekat mesti dalam format PNG, APNG, atau WebP dengan latar belakang yang lut sinar dan piksel 512x512. Margin yang disyorkan ialah 16px.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"Lihat margin",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"Tambah emoji kepada setiap pelekat",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"Ini membolehkan kami mencadangkan pelekat kepada anda semasa anda menghantar mesej.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"Hanya beberapa butiran lagi...",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"Tajuk",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"Namakan pek pelekat anda",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"Pengarang",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"Masukkan nama pencipta pelekat ini",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"Imej kulit depan",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"Ini imej yang akan muncul apabila anda kongsikan pek pelekat anda",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"Adakah anda pasti mahu memuat naik pek pelekat anda?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"Muat naik",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"Anda tidak lagi dapat membuat pengeditan atau pemadaman setelah mencipta pek pelekat.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"Mencipta pek pelekat anda",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$count$ daripada $total$ telah dimuat naik",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"Tahniah! Anda telah mencipta pek pelekat.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"Akses pelekat baru anda melalui ikon pelekat, atau kongsikan dengan rakan anda menggunakan pautan di bawah.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"Gunakan tanda pagar $hashtag$ untuk membantu orang lain mencari URL untuk mana-mana pek pelekat tersuai yang anda benarkan untuk diakses secara terbuka.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"URL Pek Pelekat",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"Memasang",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"Cipta pek pelekat yang lain",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Lihat pek pelekat baru yang saya cipta untuk Signal. #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, other {{count,number} imej telah ditambah}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"Seni animasi tidak disokong pada masa ini",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"Imej yang diletakkan terlalu besar",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"Ralat semasa memproses imej",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"Imej animasi PNG mestilah berbentuk segi empat sama",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"Imej animasi mesti sentiasa berulang",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"Dimensi imej animasi PNG terlalu besar",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"Dimensi imej animasi PNG terlalu kecil",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"Ralat memuat naik imej: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"Tidak dapat menyambung ke pelayan: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"Gagal memuat naik imej kerana kelayakan tamat tempoh. Sila buka semula laman web Signal Desktop sekali lagi.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"Pautan telah disalin",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"Pelekat saya dalam tema terang",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"Pelekat saya dalam tema gelap",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"Sila sediakan Signal pada telefon dan desktop anda untuk menggunakan Pencipta Pek Pelekat",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:r,CustomizingPreferredReactions__title:i,"ArtFrame--emoji-name-placeholder":{message:"Alias emoji",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{i as CustomizingPreferredReactions__title,r as EmojiButton__label,t as cancel,o as default,a as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"Avbryt"},r={message:"$minutes$ min",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},a={message:"Emoji",description:"Label for emoji button"},i={message:"Anpassa reaktioner",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},o={smartling:e,"index--title":{message:"Skapare för klistermärken"},"index--create-sticker-pack":{message:"Skapa nytt klistermärkespaket"},"SignIn--title":{message:"Skapa ett klistermärkespaket",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Precis som med allt annat i Signal så är även klistermärken krypterade. Använd det här verktyget för att skapa dina egna anpassade klistermärkespaket.",description:"A body of SignIn page"},"SignIn--qr":{message:"Inloggningskod",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"Öppna Signal Desktop för att börja",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"Din webbläsare stöds inte. Öppna den här länken i Firefox eller Chrome",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"Inga emojis hittades",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"Sök emoji",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"Hudton $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"Smileys och människor",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"Djur och natur",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"Mat och dryck",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"Resor och platser",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"Aktiviteter",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"Objekt",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"Symboler",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"Flaggor",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Skapare för Signal-konst",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Skapare för Signal-klistermärkespaket",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Signal-logotyp",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Riktlinjer för skapare för klistermärkespaket",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"Klicka för att lägga till eller släpp bilder här",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"Släpp bilder här",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"Klistermärkespaket",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"Klistermärkespaket",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"Avbryt",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"Kopiera",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"Nästa",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"Tillbaka",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"Lägg till dina klistermärken",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"Ta bort bild",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"Klicka eller dra/släpp en fil för att lägga till ett klistermärke",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"Klistermärken måste vara i PNG-, APNG- eller WebP-format med en transparent bakgrund och 512x512 pixlar. Rekommenderad marginal är 16 pixlar.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"Visa marginaler",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"Lägg till en emoji till varje klistermärke",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"Detta gör att vi kan föreslå klistermärken till dig när du skickar meddelanden.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"Bara några detaljer till …",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"Titel",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"Namnge ditt klistermärkespaket",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"Skapare",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"Ange ett skaparnamn för dina klistermärken",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"Omslagsbild",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"Det här är bilden som kommer att visas när du delar ditt klistermärkespaket",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"Är du säker på att du vill ladda upp ditt klistermärkespaket?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"Ladda upp",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"Du kommer inte längre att kunna göra ändringar eller ta bort efter att ha skapat ett klistermärkespaket.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"Skapar ditt klistermärkespaket",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$count$ av $total$ uppladdade",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"Grattis! Du skapade ett klistermärkespaket.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"Få åtkomst till dina nya klistermärken via klistermärkesikonen, eller dela med dina vänner med hjälp av länken nedan.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"Använd hashtaggen $hashtag$ för att hjälpa andra att hitta webbadresserna för alla anpassade klistermärkespaket som du vill göra offentligt tillgängliga.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"Webbadress för klistermärkesspaket",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"Installera",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"Skapa ett annat klistermärkespaket",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Kolla in det här nya klistermärkespaketet jag skapade för Signal. #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {1 bild tillagd} other {{count,number} bilder tillagda}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"Animerad konst stöds för närvarande inte",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"Den släppta bilden är för stor",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"Fel vid bearbetning av bild",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"Animerade PNG-bilder måste vara fyrkantiga",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"Animerade bilder måste gå i evig loop",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"Dimensioner på animerad PNG-bild är för stora",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"Dimensioner på animerad PNG-bild är för små",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"Fel vid uppladdning av bilder: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"Kan inte ansluta till servern: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"Det gick inte att ladda upp bilder på grund av utgångna inloggningsuppgifter. Öppna webbplatsen från Signal Desktop igen.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"Länken kopierades",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"Mitt klistermärke i ljust tema",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"Mitt klistermärke i mörkt tema",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"Ställ in Signal på din telefon och ditt skrivbord för att använda skaparen för klistermärkespaket",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:a,CustomizingPreferredReactions__title:i,"ArtFrame--emoji-name-placeholder":{message:"Emoji-alias",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{i as CustomizingPreferredReactions__title,a as EmojiButton__label,t as cancel,o as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},a={message:"Ghairi"},t={message:"Dakika $minutes$",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},i={message:"Emoji",description:"Label for emoji button"},o={message:"Badilisha majibu yakufae",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},r={smartling:e,"index--title":{message:"Kitengeneza Sanaa za Vibandiko"},"index--create-sticker-pack":{message:"Tengeneza pakiti mpya ya vibandiko"},"SignIn--title":{message:"Tengeneza Pakiti ya Vibandiko",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Kama ilivyo kwa kila kitu kwenye Signal, vibandiko vimesimbwa pia. Tumia zana hii kutengeneza vibandiko vyako vya kipekee.",description:"A body of SignIn page"},"SignIn--qr":{message:"Kodi ya Kuingia",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"Fungua Signal Desktop ili Kuanza",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"Pole, kivinjari chako hakifunguki. Tafadhali fungua kiungo hiki katika Firefox au Chrome",description:"A text displayed when user's browser is not supported"},cancel:a,minutesAgo:t,"EmojiPicker--empty":{message:"Hakuna emoji iliyopatikana",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"Tafuta emoji",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"Rangi ya ngozi $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"Smileys & Watu",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"Smileys & Mazingira Asili",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"Chakula & Vinywaji",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"Usafiri & Maeneo",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"Shughuli",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"Vitu",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"Ishara",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"Bendera",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Kitengeneza Sanaa cha Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Kitengeneza Pakiti ya Vibandiko vya Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Nembo ya Signal",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Miongozo ya Kitengeneza Pakiti za Vibandiko",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"Bofya ili kuongeza au kushusha picha",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"Shusha picha hapa",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"Pakiti ya vibandiko",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"Pakiti ya vibandiko",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"Ghairi",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"Nakili",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"Ifuatayo",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"Rudi nyuma",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"Ongeza vibandiko vyako",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"Ondoa picha",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"Bonyeza au vuruta/shusha faili ili kuongeza kibandiko",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"Vibandiko ni lazima viwe katika muundo wa PNG, APNG, au WebP na viwe na mandhari ya nyuma iliyo wazi na pikseli 512x512. Ukingo unaopendekezwa ni 16px.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"Tazama kingo",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"Ongeza emoji moja kwa kila kibandiko",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"Hii inatuwezesha kupendekeza vibandiko kwako ukiwa unatuma jumbe.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"Maelezo machache tu zaidi...",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"Kichwa cha Habari",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"Ipe jina pakiti yako ya vibandiko",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"Mwandishi",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"Ingiza jina utakalotumia kuwasilisha vibandiko vyako",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"Picha ya Juu",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"Hii ni picha itakayojitokeza pale unaposhirikisha wengine pakiti yako ya vibandiko",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"Una hakika unataka kupakia pakiti yako ya vibandiko?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"Pakia",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"Hutoweza tena kuhariri ama kufuta baada ya kutengeneza pakiti ya vibandiko.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"Inabuni pakiti yako ya vibandiko",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"$count$ ya $total$ imepakiwa",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"Kongole! Umebuni pakiti ya vibandiko.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"Fikia vibandiko vyako vipya kupitia ikoni ya vibandiko, ama ushirikishe marafiki ukitumia kiungo kifuatacho.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"Tumia hashtag ya $hashtag$ ili kusaidia wengine kupata URL za pakiti pekee za vibandiko ambazo ungependa zipatikane kwa kila mtu.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"URL ya Pakiti ya Vibandiko",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"Simika",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"Buni pakiti nyingine ya vibandiko",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Tazama pakiti hii mpya ya vibandiko vya Signal niliyobuni. #fanyafaraghainate",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {Picha 1 imeongezwa} other {Picha {count,number} zimeongezwa}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"Sanaa za vikatuni haifanyi kazi kwa sasa",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"Picha iliyoshushwa ni kubwa mno",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"Hitilafu katika kuchakata picha",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"Picha za vikatuni za PNG ni lazima ziwe umbo la mraba",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"Picha za vikatuni ni lazima vijirudie milele",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"Vipimo vya Picha za vikatuni za PNG ni vikubwa sana",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"Vipimo vya Picha za vikatuni za PNG vidogo sana",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"Hitilafu wakati wa kupakia picha: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"Haiwezekani kuunganika katika seva: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"Imeshindikana kupakia kwa sababu ya vigezo vilivyokwisha muda. Tafadhali fungua tena tovuti kutokea Signal Desktop.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"Kiungo kimenakiliwa",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"Kibandiko changu kwenye mandhari nyeupe",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"Kibandiko changu kwenye mandhari nyeusi",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"Tafadhali weka Signal kwenye simu yako na kwenye kompyuta ya mezani ili utumie Kitengeneza Pakiti cha Vibandiko vya Signal",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:i,CustomizingPreferredReactions__title:o,"ArtFrame--emoji-name-placeholder":{message:"Alias ya emoji",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{o as CustomizingPreferredReactions__title,i as EmojiButton__label,a as cancel,r as default,t as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"取消"},r={message:"$minutes$ 分鐘",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},o={message:"表情符號",description:"Label for emoji button"},i={message:"自訂心情回應",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},a={smartling:e,"index--title":{message:"貼圖包藝術製作器"},"index--create-sticker-pack":{message:"建立新的貼圖包"},"SignIn--title":{message:"建立貼圖包",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"和其他 Signal 內容一樣,貼圖已經加密。使用此工具建立你的自訂貼圖包。",description:"A body of SignIn page"},"SignIn--qr":{message:"登入代碼",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"開啟 Signal 桌面版即可開始",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"抱歉,系統不支援你的瀏覽器。請使用 Firefox 或 Chrome 開啟此連結",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"找不到表情符號",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"搜尋表情符號",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"膚色 $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"笑臉及人物",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"動物及自然",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"食物及飲品",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"旅行及地點",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"活動",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"物件",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"符號",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"旗幟",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Signal 藝術製作器",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Signal 貼圖包製作器",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Signal 標誌",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"貼圖包製作器指南",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"點擊以新增或將圖片放到此處",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"將圖片放到此處",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"貼圖包",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"貼圖包",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"取消",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"複製",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"下一步",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"返回",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"新增你的貼圖",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"移除圖片",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"點擊或拖放檔案以新增貼圖",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"貼圖必須為 PNG、APNG 或 WebP 格式,並使用透明背景及 512x512 像素;建議邊距為 16 像素。",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"檢視邊距",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"為每個貼圖新增表情符號",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"這將允許我們在你傳送訊息時向你建議貼圖。",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"只需額外幾項細節…",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"標題",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"為你的貼圖包命名",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"作者",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"輸入名稱以提交你的貼圖",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"封面圖片",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"這是你分享貼圖包時顯示的圖片",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"你確定要上載貼圖包嗎?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"上載",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"建立貼圖包後,你將無法再編輯或刪除。",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"正在建立你的貼圖包",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"已上載 $count$ / $total$",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"恭喜!你已建立了一個貼圖包。",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"使用貼圖圖示查看你的新貼圖,或透過下方連結與朋友分享。",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"使用主題標籤 $hashtag$ 可協助他人找到你公開發佈的自訂貼圖包網址。",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"貼圖包網址",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"安裝",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"建立另一個貼圖包",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"來看看我為 Signal 製作的新貼圖包。#makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, other {已新增 {count,number} 張圖片}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"系統暫不支援動態藝術",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"放置的圖片檔案太大",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"影像處理錯誤",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"動態 PNG 圖片必須為正方形",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"動態圖片必須循環播放",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"動態 PNG 圖片尺寸太大",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"動態 PNG 圖片尺寸太小",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"圖片上載錯誤:$message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"無法連接到伺服器:$message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"由於憑證過期,無法上載圖片。請於 Signal 桌面版重新開啟網站。",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"已複製連結",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"我的淺色主題貼圖",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"我的深色主題貼圖",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"請在手機和桌上型電腦設定 Signal 以使用貼圖包製作器",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:o,CustomizingPreferredReactions__title:i,"ArtFrame--emoji-name-placeholder":{message:"表情符號別名",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{i as CustomizingPreferredReactions__title,o as EmojiButton__label,t as cancel,a as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"Zrušit"},o={message:"$minutes$ m",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},r={message:"Emoji",description:"Label for emoji button"},a={message:"Přizpůsobit reakce",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},i={smartling:e,"index--title":{message:"Nástroj pro tvorbu nálepek"},"index--create-sticker-pack":{message:"Vytvořit nový balíček nálepek"},"SignIn--title":{message:"Vytvořit balíček nálepek",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Stejně jako vše ostatní v aplikaci Signal jsou i nálepky šifrovány. Pomocí tohoto nástroje můžete vytvářet vlastní balíčky nálepek.",description:"A body of SignIn page"},"SignIn--qr":{message:"Přihlašovací kód",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"Chcete-li začít, otevřete aplikaci Signal Desktop",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"Je nám líto, ale váš prohlížeč není podporován. Otevřete prosím tento odkaz v prohlížeči Firefox nebo Chrome",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:o,"EmojiPicker--empty":{message:"Nebyla nalezena žádná emoji",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"Hledat emoji",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"Barva pleti $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"Smajlíci a lidé",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"Zvířata a příroda",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"Jídlo a pití",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"Cestování a místa",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"Aktivity",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"Objekty",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"Symboly",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"Vlajky",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"Nástroj pro tvorbu Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"Nástroj pro tvorbu balíčků nálepek Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"Logo Signal",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Pokyny k nástroji pro tvorbu balíčků nálepek",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"Kliknutím nebo přetažením sem přidáte obrázky",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"Přetáhněte obrázky sem",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"Balíček nálepek",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"Balíček nálepek",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"Zrušit",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"Kopírovat",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"Další",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"Zpět",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"Přidejte své nálepky",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"Odstranit obrázek",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"Kliknutím nebo přetažením souboru přidáte nálepku",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"Nálepky musí být ve formátu PNG, APNG nebo WebP s transparentním pozadím a rozlišením 512x512 pixelů. Doporučený okraj je 16px.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"Zobrazit okraje",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"Přidat emoji ke každé nálepce",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"Díky tomu vám budeme moci navrhovat nálepky při psaní zpráv.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"Ještě pár drobností…",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"Název",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"Pojmenujte svůj balíček nálepek",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"Autor",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"Zadejte jméno autora svých nálepek",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"Titulní obrázek",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"Tento obrázek se zobrazí, když budete balíček nálepek sdílet",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"Jste si jisti, že chcete nahrát svůj balíček nálepek?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"Nahrát",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"Po vytvoření balíčku již nebude možné nálepky upravovat ani mazat.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"Vytvoření vlastního balíčku nálepek",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"Nahráno $count$ z $total$",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"Gratulujeme! Právě jste vytvořili balíček nálepek.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"Ke svým novým nálepkám se dostanete přes ikonku nálepky, nebo je můžete sdílet s přáteli pomocí níže uvedeného odkazu.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"Použijte hashtag $hashtag$, abyste ostatním lidem pomohli najít adresy URL všech vlastních balíčků nálepek, které chcete zpřístupnit.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"Adresa URL balíčku nálepek",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"Instalovat",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"Vytvořit další balíček nálepek",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Vyzkoušejte tenhle balíček nálepek, který jsem vytvořil/a pro Signal. #vytvorsivlastninalepku",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {Byl přidán jeden obrázek} few {Byly přidány {count,number} obrázky} many {Bylo přidáno {count,number} obrázků} other {Bylo přidáno {count,number} obrázků}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"Animovaná grafika není v současné době podporována",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"Vložený obrázek je příliš velký",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"Chyba při zpracování obrázku",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"Animované obrázky PNG musí být čtvercové",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"Animované obrázky musí být v nekonečné smyčce",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"Rozměry animovaného obrázku PNG jsou příliš velké",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"Rozměry animovaného obrázku PNG jsou příliš malé",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"Chyba při nahrávání obrázků: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"Nelze se připojit k serveru: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"Nepodařilo se nahrát obrázky kvůli vypršení platnosti pověření. Otevřete prosím webové stránky znovu z aplikace Signal Desktop.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"Odkaz zkopírován",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"Moje nálepka ve světlém motivu",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"Moje nálepka v tmavém motivu",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"Nastavte si aplikaci Signal v telefonu a na počítači, abyste mohli používat nástroj pro tvorbu balíčků nálepek",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:r,CustomizingPreferredReactions__title:a,"ArtFrame--emoji-name-placeholder":{message:"Název emoji",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{a as CustomizingPreferredReactions__title,r as EmojiButton__label,t as cancel,i as default,o as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"បោះបង់"},r={message:"$minutes$ នាទី",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},o={message:"រូបអារម្មណ៍",description:"Label for emoji button"},i={message:"កំណត់រូបប្រតិកម្មតាមបំណង",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},a={smartling:e,"index--title":{message:"ឧបករណ៍បង្កើតសិល្បៈស្ទីគ័រ"},"index--create-sticker-pack":{message:"បង្កើតកញ្ចប់ស្ទីគ័រថ្មី"},"SignIn--title":{message:"បង្កើតកញ្ចប់ស្ទីគ័រ",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"ដូចអ្វីៗផ្សេងទៀតនៅក្នុង Signal ដែរ ស្ទីគ័រក៏ត្រូវបានអ៊ីនគ្រីបផងដែរ។។ ប្រើឧបករណ៍នេះដើម្បីបង្កើតកញ្ចប់ស្ទីគ័រផ្ទាល់ខ្លួនរបស់អ្នក។",description:"A body of SignIn page"},"SignIn--qr":{message:"កូដសម្រាប់ចូល",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"បើក Signal Desktop ដើម្បីចាប់ផ្តើម",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"សូមអភ័យទោស កម្មវិធីរុករករបស់អ្នកមិនអាចប្រើបានទេ។ សូមបើកតំណនេះនៅក្នុង Firefox ឬ Chrome",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:r,"EmojiPicker--empty":{message:"រកមិនឃើញរូបអារម្មណ៍ទេ",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"ស្វែងរករូបអារម្មណ៍",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"ពណ៌ស្បែក $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"រូបមុខញញឹម និងមនុស្ស",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"សត្វ និងធម្មជាតិ",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"អាហារ និងភេសជ្ជៈ",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"ការធ្វើដំណើរ និងទីកន្លែង",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"សកម្មភាព",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"វត្ថុ",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"សញ្ញា",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"ទង់",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"ឧបករណ៍បង្កើតសិល្បៈ Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"ឧបករណ៍បង្កើតកញ្ចប់ស្ទីគ័រ Signal",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"និមិត្តសញ្ញា Signal",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"គោលការណ៍ណែនាំអំពីឧបករណ៍បង្កើតកញ្ចប់ស្ទីគ័រ",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"ចុចដើម្បីបញ្ចូល ឬទម្លាក់រូបភាពនៅទីនេះ",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"ទម្លាក់រូបភាពនៅទីនេះ",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"កញ្ចប់ស្ទីកគ័រ",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"កញ្ចប់ស្ទីកគ័រ",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"បោះបង់",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"ចម្លង",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"បន្ទាប់",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"ត្រឡប់ក្រោយ",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"បញ្ចូលស្ទីកគ័ររបស់អ្នក",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"ដករូបភាពចេញ",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"ចុច ឬអូស/ទម្លាក់ឯកសារ ដើម្បីបញ្ចូលស្ទីគ័រ",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"ស្ទីគ័រត្រូវតែមានទម្រង់ជា PNG, APNG ឬ WebP ដែលមានផ្ទៃខាងក្រោយច្បាស់ ហើយមានទំហំ 512x512 ភីកស៊ែល។ គួរតែមានរឹម 16px។",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"មើលរឹម",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"បញ្ចូលរូបអារម្មណ៍ទៅស្ទីកគ័រនីមួយៗ",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"វាអាចឲ្យយើងណែនាំស្ទីកគ័រទៅអ្នកបាន ពេលអ្នកកំពុងផ្ញើសារ។",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"គ្រាន់តែព័ត៌មានលម្អិតបន្តិចទៀតប៉ុណ្ណោះ…",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"ចំណងជើង",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"ដាក់ឈ្មោះកញ្ចប់ស្ទីគ័ររបស់អ្នក",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"អ្នកនិពន្ធ",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"បញ្ចូលឈ្មោះដើម្បីដាក់បញ្ជូនស្ទីគ័ររបស់អ្នក",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"រូបភាពក្រប",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"នេះគឺជារូបភាពដែលនឹងត្រូវបង្ហាញនៅពេលអ្នកចែករំលែកកញ្ចប់ស្ទីកគ័ររបស់អ្នក",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"តើអ្នកប្រាកដជាចង់បង្ហោះកញ្ចប់ស្ទីកគ័ររបស់អ្នកឬ?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"បង្ហោះ",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"អ្នកនឹងមិនអាចធ្វើការកែ ឬលុបបានទៀតទេ បន្ទាប់ពីបង្កើតកញ្ចប់ស្ទីកគ័ររួច។",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"កំពុងបង្កើតកញ្ចប់ស្ទីកគ័ររបស់អ្នក",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"បានបង្ហោះ $count$ ក្នុងចំណោម $total$",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"អបអរសាទរ! អ្នកបានបង្កើតកញ្ចប់ស្ទីកគ័រមួយ។",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"ចូលប្រើស្ទីកគ័រថ្មីរបស់អ្នក តាមរយៈរូបតំណាងស្ទីកគ័រ ឬចែករំលែកជាមួយមិត្តភក្តិរបស់អ្នក ដោយប្រើប្រាស់តំណខាងក្រោម។",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"ប្រើប្រាស់ hashtag $hashtag$ ដើម្បីជួយអ្នកដទៃស្វែងរកតំណសម្រាប់កញ្ចប់ស្ទីកគ័រណាមួយ ដែលអ្នកចង់ដាក់ឱ្យប្រើប្រាស់ជាសាធារណៈ។",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"តំណកញ្ចប់ស្ទីកគ័រ",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"ដំឡើង",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"បង្កើតកញ្ចប់ស្ទីកគ័រមួយផ្សេងទៀត",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"ឆែកមើលកញ្ចប់ស្ទីកគ័រថ្មីនេះដែលខ្ញុំបានបង្កើតសម្រាប់ Signal។ #makeprivacystick",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, other {បានបញ្ចូល {count,number} រូបភាព}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"បច្ចុប្បន្ននេះ សិល្បៈបែបជីវចលមិនអាចប្រើបានទេ",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"រូបភាពដែលបានទម្លាក់ធំពេក",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"បញ្ហាដំណើរការរូបភាព",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"រូបភាព PNG ដែលមានចលនាត្រូវតែមានរាងការ៉េ",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"រូបភាពដែលមានចលនាត្រូវតែរង្វិលជុំជារៀងរហូត",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"វិមាត្ររូបភាព PNG ដែលមានចលនាធំពេក",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"វិមាត្ររូបភាព PNG ដែលមានចលនាតូចពេក",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"មានបញ្ហាក្នុងការបង្ហោះរូបភាព៖ $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"មិនអាចភ្ជាប់ទៅម៉ាស៊ីនមេ៖ $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"មិនអាចបង្ហោះរូបភាពបានដោយសារព័ត៌មានបញ្ជាក់អត្តសញ្ញាណផុតកំណត់។ សូមបើកគេហទំព័រឡើងវិញពី Signal Desktop ម្តងទៀត។",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"បានចម្លងតំណ",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"ស្ទីកគ័ររបស់ខ្ញុំក្នុងផ្ទៃពណ៌ភ្លឺ",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"ស្ទីកគ័ររបស់ខ្ញុំក្នុងផ្ទៃពណ៌ងងឹត",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"សូមរៀបចំ Signal នៅលើទូរសព្ទរបស់អ្នក និងកុំព្យូទ័រ ដើម្បីប្រើប្រាស់ឧបករណ៍បង្កើតកញ្ចប់ស្ទីកគ័រ",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:o,CustomizingPreferredReactions__title:i,"ArtFrame--emoji-name-placeholder":{message:"ឈ្មោះរូបអារម្មណ៍",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{i as CustomizingPreferredReactions__title,o as EmojiButton__label,t as cancel,a as default,r as minutesAgo,e as smartling}; const e={placeholder_format_custom:"(\\$.+?\\$)",string_format_paths:"icu: [*/messageformat]",translate_paths:[{path:"*/messageformat",key:"{*}/messageformat",instruction:"*/description"},{key:"{*}/message",path:"*/message",instruction:"*/description"}]},t={message:"Atšaukti"},i={message:"$minutes$ min.",description:"Contracted form of 'X minutes ago' which works both for singular and plural"},r={message:"Jaustukai",description:"Label for emoji button"},a={message:"Tinkinti reakcijas",description:"Shown in the header of the modal for customizing the preferred reactions. Also shown in the tooltip for the button that opens this modal."},o={smartling:e,"index--title":{message:"Lipdukų kūrimo įrankis"},"index--create-sticker-pack":{message:"Sukurti naują lipdukų paketą"},"SignIn--title":{message:"Sukurk lipdukų paketą",description:"A title of SignIn page"},"icu:SignIn--body":{messageformat:"Kaip ir viskas programėlėje „Signal“, lipdukai taip pat užšifruoti. Naudok šį įrankį savo lipdukų paketams kurti.",description:"A body of SignIn page"},"SignIn--qr":{message:"Prisijungimo kodas",description:"An alt text of QR code displayed on sign in page"},"SignIn--link":{message:"Atidaryk „Signal Desktop“ ir pradėk",description:"A link text for signing into the website using Signal Desktop client"},"UnsupportedBrowser--description":{message:"Atsiprašome, tavo naršyklė nepalaikoma. Atidaryk šią nuorodą per „Firefox“ arba „Chrome“",description:"A text displayed when user's browser is not supported"},cancel:t,minutesAgo:i,"EmojiPicker--empty":{message:"Jaustukų nerasta",description:"Shown in the emoji picker when a search yields 0 results."},"EmojiPicker--search-placeholder":{message:"Ieškoti jaustukų",description:"Shown as a placeholder inside the emoji picker search field."},"EmojiPicker--skin-tone":{message:"Odos atspalvis $tone$",description:"Shown as a tooltip over the emoji tone buttons."},"EmojiPicker--category--smileys_people":{message:"Šypsenėlės ir žmonės",description:"Name of the emoji picker category."},"EmojiPicker--category--animals_nature":{message:"Gyvūnai ir gamta",description:"Name of the emoji picker category."},"EmojiPicker--category--food_drink":{message:"Maistas ir gėrimai",description:"Name of the emoji picker category."},"EmojiPicker--category--travel_places":{message:"Kelionės ir vietos",description:"Name of the emoji picker category."},"EmojiPicker--category--activities":{message:"Veiklos",description:"Name of the emoji picker category."},"EmojiPicker--category--objects":{message:"Objektai",description:"Name of the emoji picker category."},"EmojiPicker--category--symbols":{message:"Simboliai",description:"Name of the emoji picker category."},"EmojiPicker--category--flags":{message:"Vėliavos",description:"Name of the emoji picker category."},"ArtCreator--title":{message:"„Signal“ paveikslėlių kūrimo įrankis",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--sticker":{message:"„Signal“ lipdukų paketo kūrimas",description:"The title of the Sticker Pack Creator window"},"StickerCreator--title--icon":{message:"„Signal“ logotipas",description:"An alt text of signal logo"},"StickerCreator--guidelines":{message:"Lipdukų paketo kūrimo gairės",description:"The title of the Sticker Pack Guidelines link"},"StickerCreator--DropZone--staticText":{message:"Spustelėk ir pridėk arba įmesk paveikslėlius čia",description:"Text which appears on the Sticker Creator drop zone when there is no active drag"},"StickerCreator--DropZone--activeText":{message:"Įmesk paveikslėlius čia",description:"Text which appears on the Sticker Creator drop zone when there is an active drag"},"StickerCreator--Preview--title--sticker":{message:"Lipdukų paketas",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--Preview--title--emoji":{message:"Lipdukų paketas",description:"The 'title' of the sticker pack preview 'modal'"},"StickerCreator--ConfirmDialog--cancel":{message:"Atšaukti",description:"The default text for the confirm dialog cancel button"},"StickerCreator--CopyText--button":{message:"Kopijuoti",description:"The text which appears on the copy button for the sticker creator share screen"},"StickerCreator--ShareButtons--facebook":{message:"Facebook",description:"Title for Facebook button"},"StickerCreator--ShareButtons--twitter":{message:"Twitter",description:"Title for Twitter button"},"StickerCreator--ShareButtons--pinterest":{message:"Pinterest",description:"Title for Pinterest button"},"StickerCreator--ShareButtons--whatsapp":{message:"WhatsApp",description:"Title for WhatsApp button"},"StickerCreator--AppStage--next":{message:"Toliau",description:"Default text for the next button on all stages of the sticker creator"},"StickerCreator--AppStage--prev":{message:"Atgal",description:"Default text for the previous button on all stages of the sticker creator"},"icu:StickerCreator--DropStage--title--sticker":{messageformat:"Pridėk savo lipdukus",description:"Title for the drop stage of the sticker creator"},"StickerCreator--DropStage--removeSticker":{message:"Pašalinti paveikslėlį",description:"Label for the X button used to remove a staged image"},"StickerCreator--DropStage--dragDrop--sticker":{message:"Jei nori pridėti lipduką, spustelėk arba įmesk failą",description:"Shown on the + section of the file addition stage of sticker pack creation"},"StickerCreator--DropStage--help--sticker":{message:"Lipdukai turi būti PNG, APNG ar WebP formato su permatomu fonu ir 512x512 pikselių dydžio. Rekomenduojama paraštė yra 16 pikselių.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--DropStage--showMargins":{message:"Žiūrėti paraštes",description:"Text for the show margins toggle on the drop stage of the sticker creator"},"StickerCreator--EmojiStage--title--sticker":{message:"Pridėk jaustuką prie kiekvieno lipduko",description:"Title for the drop stage of the sticker creator"},"StickerCreator--EmojiStage--help--sticker":{message:"Tai leis mums siūlyti lipdukus tau rašant žinutę.",description:"Help text for the drop stage of the sticker creator"},"StickerCreator--MetaStage--title":{message:"Dar šiek tiek informacijos…",description:"Title for the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title":{message:"Pavadinimas",description:"Label for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--title-placeholder":{message:"Suteik pavadinimą savo lipdukų paketui",description:"Placeholder for the title input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author":{message:"Autorius",description:"Label for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--author-placeholder":{message:"Įvesk vardą, kuris bus nurodytas prie tavo lipdukų",description:"Placeholder for the author input of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover":{message:"Viršelio paveikslėlis",description:"Label for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--Field--cover--help--sticker":{message:"Šis paveikslėlis bus rodomas tau bendrinant savo lipdukų paketą",description:"Help text for the cover image picker of the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--title--sticker":{message:"Ar tikrai nori įkelti savo lipdukų paketą?",description:"Title for the confirm dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--confirm":{message:"Įkelti",description:"Text for the upload button in the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--MetaStage--ConfirmDialog--text--sticker":{message:"Po to, kai sukursi lipdukų paketą, nebegalėsi atlikti korekcijų ar ištrinti.",description:"The text inside the confirmation dialog on the meta stage of the sticker creator"},"StickerCreator--UploadStage--title--sticker":{message:"Kuriamas tavo lipdukų paketas",description:"Title for the upload stage of the sticker creator"},"StickerCreator--UploadStage-uploaded":{message:"Įkelta $count$ iš $total$",description:"Title for the upload stage of the sticker creator"},"StickerCreator--ShareStage--title":{message:"Sveikiname! Tu sukūrei lipdukų paketą.",description:"Title for the share stage of the sticker creator"},"StickerCreator--ShareStage--help":{message:"Pasiek savo naujus lipdukus per lipduko piktogramą arba bendrink su draugais per nuorodą apačioje.",description:"Help text for the share stage of the sticker creator"},"StickerCreator--ShareStage--callToAction":{message:"Naudok grotažymę $hashtag$, kad kitiems būtų lengviau rasti lipdukų paketų, kuriuos norėtum padaryti visiems pasiekiamus, URL adresus.",description:"Call to action text for the share stage of the sticker creator"},"StickerCreator--ShareStage--copyTitle":{message:"Lipdukų paketo URL",description:"Title for the copy button on the share stage of the sticker creator"},"StickerCreator--ShareStage--install":{message:"Įdiegti",description:"Text for the primary button on the share stage of the sticker creator"},"StickerCreator--ShareStage--createAnother":{message:"Sukurti dar vieną lipdukų paketą",description:"Text for the create another sticker pack button on the share stage of the sticker creator"},"StickerCreator--ShareStage--socialMessage":{message:"Pažiūrėk, kokį naują lipdukų paketą sukūriau „Signal“. #privatumas #lipdukai",description:"Text which is shared to social media platforms for sticker packs"},"icu:StickerCreator--Toasts--imagesAdded":{messageformat:"{count, plural, one {Pridėtas 1 paveikslėlis} few {Pridėti {count,number} paveikslėliai} many {Pridėta {count,number} pav.} other {Pridėta {count,number} paveikslėlių}}",description:"Text for the toast when images are added to the sticker creator"},"StickerCreator--Toasts--animated":{message:"Animuoti vaizdai šiuo metu nepalaikomi",description:"Text for the toast when an image that is animated was dropped on the sticker creator"},"StickerCreator--Toasts--tooLarge":{message:"Įmestas paveikslėlis per didelis",description:"Text for the toast when an image that is too large was dropped on the sticker creator"},"StickerCreator--Toasts--errorProcessing":{message:"Klaida apdorojant paveikslėlį",description:"Text for the toast when an image cannot be processed was dropped on the sticker creator with a generic error"},"StickerCreator--Toasts--APNG--notSquare":{message:"Animuoti PNG paveikslėliai turi būti kvadratiniai",description:"Text for the toast when someone tries to upload a non-square APNG"},"StickerCreator--Toasts--mustLoopForever":{message:"Animuoti paveikslėliai turi cikliškai kartotis",description:"Text for the toast when an image in the art creator does not animate forever"},"StickerCreator--Toasts--APNG--dimensionsTooLarge":{message:"Animuoto PNG paveikslėlio matmenys per dideli",description:"Text for the toast when an APNG image in the art creator is too large"},"StickerCreator--Toasts--APNG--dimensionsTooSmall":{message:"Animuoto PNG paveikslėlio matmenys per maži",description:"Text for the toast when an APNG image in the art creator is too small"},"StickerCreator--Toasts--errorUploading":{message:"Klaida įkeliant paveikslėlius: $message$",description:"Text for the toast when a art pack cannot be uploaded"},"StickerCreator--Toasts--errorSigningIn":{message:"Nepavyksta prisijungti prie serverio: $message$",description:"Text for the toast displayed when connection to the server cannot be established."},"StickerCreator--Toasts--expired-credenitals":{message:"Nepavyko įkelti paveikslėlių dėl pasibaigusių įgaliojimų. Atidaryk svetainę per „Signal Desktop“ iš naujo.",description:"Text for the toast when a art pack cannot be uploaded due to expired credentials"},"StickerCreator--Toasts--linkedCopied":{message:"Nuoroda nukopijuota",description:"Text for the toast when a link for sharing is copied from the Sticker Creator"},"StickerCreator--StickerPreview--light":{message:"Mano lipdukas šviesiame apipavidalinime",description:"Text for the sticker preview for the light theme"},"StickerCreator--StickerPreview--dark":{message:"Mano lipdukas tamsiame apipavidalinime",description:"Text for the sticker preview for the dark theme"},"StickerCreator--Authentication--error":{message:"Jei nori naudoti lipdukų paketo kūrimo įrankį, įdiek „Signal“ telefone ir kompiuteryje",description:"The error message which appears when the user has not linked their account and attempts to use the Sticker Creator"},EmojiButton__label:r,CustomizingPreferredReactions__title:a,"ArtFrame--emoji-name-placeholder":{message:"Jaustuko slapyvardis",description:"Shown as a placeholder of input below the emoji image to let user select the lowercase alias to be used for the emoji."}};export{a as CustomizingPreferredReactions__title,r as EmojiButton__label,t as cancel,o as default,i as minutesAgo,e as smartling}; Signal Sticker Pack Creator
@charset "UTF-8"; @font-face { font-family: "Inter"; src: url("../fonts/inter-v3.19/Inter-BoldItalic.woff2"); font-weight: bolder; font-style: italic; } @font-face { font-family: "Inter"; src: url("../fonts/inter-v3.19/Inter-Bold.woff2"); font-weight: bolder; } @font-face { font-family: "Inter"; src: url("../fonts/inter-v3.19/Inter-SemiBoldItalic.woff2"); font-weight: bold; font-style: italic; } @font-face { font-family: "Inter"; src: url("../fonts/inter-v3.19/Inter-Italic.woff2"); font-style: italic; } @font-face { font-family: "Inter"; src: url("../fonts/inter-v3.19/Inter-SemiBold.woff2"); font-weight: bold; } @font-face { font-family: "Inter"; src: url("../fonts/inter-v3.19/Inter-Medium.woff2"); font-weight: 500; } @font-face { font-family: "Inter"; src: url("../fonts/inter-v3.19/Inter-Regular.woff2"); } @font-face { font-family: "Parisienne"; src: url("../fonts/stories/Parisienne-Regular.ttf"); } @font-face { font-family: "Barlow Condensed"; src: url("../fonts/stories/BarlowCondensed-Medium.ttf"); } @font-face { font-family: "EB Garamond"; src: url("../fonts/stories/EBGaramond-Regular.ttf"); } @font-face { font-family: "Hatsuishi"; src: url("../fonts/stories/Hatsuishi-Regular.woff2"); } @keyframes search-results-loading-pulsating-background-animation { 0% { opacity: 1; } 50% { opacity: 0.55; } 100% { opacity: 1; } } html { height: 100%; cursor: inherit; overflow-wrap: break-word; } .light-theme { color-scheme: light; } .dark-theme { color-scheme: dark; } body { position: relative; height: 100%; width: 100%; margin: 0; color: #1b1b1b; font-family: Inter, "Source Sans Pro", "Source Han Sans", -apple-system, system-ui, "Segoe UI", "Noto Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; /* Japanese */ /* Farsi (Persian) */ /* Urdu */ font-size: 14px; line-height: 20px; letter-spacing: -0.08px; } body:lang(ja) { font-family: Inter, "SF Pro", "SF Pro JP", "BIZ UDGothic", "Hiragino Kaku Gothic Pro", "ヒラギノ角ゴ Pro W3", メイリオ, Meiryo, "MS Pゴシック", "Helvetica Neue", Helvetica, Arial, sans-serif; } body:lang(fa) { font-family: "Vazirmatn", -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Tahoma, "Noto Sans Arabic", Helvetica, Arial, sans-serif; } body:lang(ur) { font-family: "Noto Nastaliq Urdu", Gulzar, "Jameel Noori Nastaleeq", "Faiz Lahori Nastaleeq", "Urdu Typesetting", Helvetica, Arial, sans-serif; } body.light-theme { background-color: #ffffff; color: #1b1b1b; } body.dark-theme { background-color: #121212; color: #e9e9e9; } body.is-resizing-left-pane { cursor: col-resize; } input, button, select, optgroup, textarea { font-family: inherit; } [contenteditable] { -webkit-user-modify: read-write-plaintext-only; } :dir(ltr) > [dir=auto]:is(input[value=""], input:not([value]), :not(input):empty, :has(> br:only-child)) { /* stylelint-disable-next-line declaration-property-value-disallowed-list */ direction: ltr; } :dir(rtl) > [dir=auto]:is(input[value=""], input:not([value]), :not(input):empty, :has(> br:only-child)) { /* stylelint-disable-next-line declaration-property-value-disallowed-list */ direction: rtl; } audio { max-width: 100%; } .dark-overlay { position: absolute; top: 0; inset-inline: 0; bottom: 0; opacity: 0.25; z-index: 99; } .dark-overlay { background-color: #000000; } .dark-theme .dark-overlay { background-color: #121212; } .clearfix:before, .clearfix:after { display: table; content: " "; } .clearfix:after { clear: both; } .hide { display: none; } button { -webkit-app-region: no-drag; } button:not(:disabled) { cursor: pointer; } button.grey { border-radius: 5px; border: solid 1px #b9b9b9; cursor: pointer; margin-block: 1em; margin-inline: auto; padding: 1em; font-family: inherit; } button.grey { color: #5e5e5e; background: #f6f6f6; box-shadow: 0 0 10px -5px rgba(0, 0, 0, 0.4); } .dark-theme button.grey { border: solid 1px #b9b9b9; color: #5e5e5e; background: #f6f6f6; box-shadow: 0 0 10px -5px rgba(255, 255, 255, 0.6); } button.grey:hover { box-shadow: 0 0 10px -3px rgba(0, 0, 0, 0.6); } .dark-theme button.grey:hover { box-shadow: 0 0 10px -3px rgba(255, 255, 255, 0.8); } button.grey[disabled=disabled], button.grey[disabled=disabled]:hover { opacity: 0.5; box-shadow: none; cursor: default; } @layer base { a { color: #2c6bed; } .dark-theme a { color: #e9e9e9; } } .loading { position: relative; } .loading::before { display: block; margin-block: 0px; margin-inline: auto; content: " "; height: 16px; width: 16px; border-radius: 32px; animation: rotate 1s linear infinite; border: solid 3px; border-color: #b0c8f9 #b0c8f9 #f6f6f6 #f6f6f6 !important; } .x { display: inline-block; float: inline-end; cursor: pointer; border-radius: 50%; width: 22px; height: 22px; padding: 3px; background: #5e5e5e; } .x:before { content: ""; display: block; width: 100%; height: 100%; } .x:before { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .x:before { background-color: WindowText; } } @keyframes loading { 50% { transform: scale(1); opacity: 1; } 100% { opacity: 0.3; } } @keyframes fade-in { 0% { opacity: 0; } 100% { opacity: 1; } } .app-migration-screen { display: flex; flex-direction: column; } .app-loading-screen { z-index: 9000; position: absolute; inset-inline: 0; top: 0; bottom: 0; padding-block: 0; padding-inline: 16px; /* Note: background-color is intentionally transparent until body has the * theme class. */ display: flex; flex-direction: column; align-items: center; justify-content: center; user-select: none; } .light-theme .app-loading-screen { background-color: #ffffff; color: rgba(0, 0, 0, 0.8); } .dark-theme .app-loading-screen { background-color: #121212; color: rgba(255, 255, 255, 0.8); } .app-loading-screen .dot-container { display: flex; gap: 7px; margin-block: 6px 22px; margin-inline: 0; } .app-loading-screen .dot-container .dot { width: 14px; height: 14px; border: 3px solid; border-radius: 50%; float: inline-start; margin-block: 0; margin-inline: 6px; transform: scale(0); } .app-loading-screen .dot-container .dot { border-color: #000000; } .dark-theme .app-loading-screen .dot-container .dot { border-color: #ffffff; } .app-loading-screen .dot-container .dot { animation: loading 1500ms ease infinite 0ms; } .app-loading-screen .dot-container .dot:nth-child(2) { animation: loading 1500ms ease infinite 333ms; } .app-loading-screen .dot-container .dot:nth-child(3) { animation: loading 1500ms ease infinite 666ms; } .app-loading-screen__progress--container { animation: fade-in 150ms ease 1 0ms; border-radius: 2px; height: 4px; max-width: 400px; overflow: hidden; width: 100%; margin-block: 12px 26px; margin-inline: 0; } .app-loading-screen__progress--container { background: rgba(0, 0, 0, 0.2); } .dark-theme .app-loading-screen__progress--container { background: rgba(255, 255, 255, 0.2); } .app-loading-screen__progress--bar { border-radius: 2px; display: block; height: 100%; width: 100%; transition: transform 500ms linear; } .app-loading-screen__progress--bar:dir(ltr) { transform: translateX(-100%); } .app-loading-screen__progress--bar:dir(rtl) { transform: translateX(100%); } .app-loading-screen__progress--bar { background: #000000; } .dark-theme .app-loading-screen__progress--bar { background: #ffffff; } .app-loading-screen .message { animation: fade-in 150ms ease 1 0ms; max-width: 35em; } .app-loading-screen .message-placeholder { height: 20px; } .full-screen-flow { position: absolute; inset-inline: 0; top: 0; bottom: 0; color: #000000; background: linear-gradient(to bottom, rgb(238, 238, 238) 0%, rgb(243, 243, 243) 12%, rgb(255, 255, 255) 27%, rgb(255, 255, 255) 60%, rgb(249, 249, 249) 85%, rgb(213, 213, 213) 100%); display: flex; align-items: center; text-align: center; font-size: 10pt; } .full-screen-flow.overlay { z-index: 99; } .full-screen-flow a { color: #2c6bed; } .full-screen-flow input { font-size: 12pt; border: 2px solid #2c6bed; padding: 0.5em; text-align: center; } .full-screen-flow .phone-input .number { margin-top: 1em; width: 20em; } @media (min-height: 750px) and (min-width: 700px) { .full-screen-flow { font-size: 14pt; } .full-screen-flow input { font-size: 16pt; } } .full-screen-flow .header { font-weight: normal; line-height: 1em; margin-bottom: 1.5em; font-size: 20pt; } @media (min-height: 750px) and (min-width: 700px) { .full-screen-flow .header { font-size: 28pt; } } .full-screen-flow .body-text { max-width: 22em; text-align: start; margin-inline: auto; } .full-screen-flow .body-text-wide { max-width: 30em; text-align: start; margin-inline: auto; } .full-screen-flow form { height: 100%; width: 100%; } .full-screen-flow .step { height: 100%; width: 100%; padding-block: 70px 50px; padding-inline: 0; } .full-screen-flow .step-body { margin-inline: auto; max-width: 35em; } .full-screen-flow .inner { display: flex; align-items: center; justify-content: center; flex-direction: column; height: 100%; } .full-screen-flow .banner-image { margin: 1em; display: none; } @media (min-height: 550px) { .full-screen-flow .banner-image { display: inline-block; height: 10em; width: 10em; } } .full-screen-flow .banner-icon { display: none; margin: 1em; } @media (min-height: 550px) { .full-screen-flow .banner-icon { display: inline-block; height: 10em; width: 10em; } } .full-screen-flow .banner-icon.check-circle-outline { -webkit-mask: url("../images/full-screen-flow/check-circle-outline.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .full-screen-flow .banner-icon.check-circle-outline { background-color: WindowText; } } .full-screen-flow .banner-icon.alert-outline { -webkit-mask: url("../images/full-screen-flow/alert-outline.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .full-screen-flow .banner-icon.alert-outline { background-color: WindowText; } } .full-screen-flow .banner-icon.folder-outline { -webkit-mask: url("../images/full-screen-flow/folder-outline.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .full-screen-flow .banner-icon.folder-outline { background-color: WindowText; } } .full-screen-flow .banner-icon.import { -webkit-mask: url("../images/full-screen-flow/import.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .full-screen-flow .banner-icon.import { background-color: WindowText; } } .full-screen-flow .banner-icon.lead-pencil { -webkit-mask: url("../images/full-screen-flow/lead-pencil.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .full-screen-flow .banner-icon.lead-pencil { background-color: WindowText; } } .full-screen-flow .banner-icon.sync { -webkit-mask: url("../images/full-screen-flow/sync.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .full-screen-flow .banner-icon.sync { background-color: WindowText; } } .full-screen-flow .banner-icon.alert-outline-red { -webkit-mask: url("../images/full-screen-flow/alert-outline.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #f44336; } @media (forced-colors: active) { .full-screen-flow .banner-icon.alert-outline-red { background-color: WindowText; } } .full-screen-flow .banner-icon.delete { -webkit-mask: url("../images/full-screen-flow/delete.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .full-screen-flow .banner-icon.delete { background-color: WindowText; } } .full-screen-flow .button { cursor: pointer; display: inline-block; border: none; min-width: 300px; padding: 0.75em; margin-top: 1em; margin-inline: 0.5em; color: #ffffff; background: #2c6bed; box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4); font-size: 12pt; } .full-screen-flow .button.neutral { color: #000000; background: #dedede; } .full-screen-flow .button.destructive { background: #f44336; } @media (min-height: 750px) and (min-width: 700px) { .full-screen-flow .button { font-size: 20pt; } } .full-screen-flow .button:disabled { background-color: #c6c6c6; cursor: auto; } .full-screen-flow button.link { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .full-screen-flow button.link { border: 1px solid WindowText; } } .full-screen-flow button.link { display: block; margin-block: 0.5em; margin-inline: auto; text-align: center; text-decoration: underline; color: #2c6bed; } .full-screen-flow button.link:disabled { color: #c6c6c6; cursor: auto; } .full-screen-flow a.link { display: block; cursor: pointer; text-decoration: underline; margin: 0.5em; color: #2c6bed; } .full-screen-flow .nav { width: 100%; bottom: 50px; margin-top: auto; padding-bottom: 2em; padding-inline: 20px; } .full-screen-flow .nav .instructions { text-align: start; margin-inline: auto; margin-bottom: 2em; margin-top: 2em; max-width: 30em; } .full-screen-flow .nav .instructions:after { clear: both; } .full-screen-flow .nav .android { float: inline-start; } .full-screen-flow .nav .apple { float: inline-end; } .full-screen-flow .nav .label { float: inline-start; } .full-screen-flow .nav .body { float: inline-start; } .full-screen-flow .StandaloneRegistration__error { color: #f44336; } .inbox:focus { outline: none; } .inbox { position: relative; } .overflow-hidden { overflow: hidden; } @keyframes rotate { to { transform: rotate(360deg); } } body { --zoom-factor: 1; --title-bar-drag-area-height: 0px; } body.os-macos:not(.full-screen), body .app-loading-screen--before-app-load { --title-bar-drag-area-height: calc(28px / var(--zoom-factor)); } #app-container { height: 100%; } .inbox { height: 100%; overflow: hidden; position: relative; } .module-title-bar-drag-area { -webkit-app-region: drag; height: var(--title-bar-drag-area-height); inset-inline-start: 0; position: fixed; top: 0; width: 100%; z-index: 9000; } .module-splash-screen { display: flex; flex-direction: column; justify-content: center; align-items: center; } .module-splash-screen__logo { margin-block: 24px; margin-inline: 0; } .module-splash-screen__logo { -webkit-mask: url("../images/signal-logo.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b45fd; } @media (forced-colors: active) { .module-splash-screen__logo { background-color: WindowText; } } .dark-theme .module-splash-screen__logo { -webkit-mask: url("../images/signal-logo.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .dark-theme .module-splash-screen__logo { background-color: WindowText; } } .module-splash-screen__logo.module-splash-screen__logo--128 { height: 128px; width: 128px; } .module-splash-screen__logo.module-splash-screen__logo--96 { height: 96px; width: 96px; } .module-message { position: relative; display: flex; flex-direction: row; align-items: stretch; outline: none; padding-inline: 16px; transition-property: background, translate; transition-duration: 0.1s; transition-timing-function: ease-out; } .module-message__quote-story-reaction-header { font-size: 12px; line-height: 16px; letter-spacing: 0; margin-bottom: 6px; } .module-message__container-outgoing .module-message__quote-story-reaction-header { color: rgba(255, 255, 255, 0.8); } .module-message__container-incoming .module-message__quote-story-reaction-header { color: #5e5e5e; } .module-message--expired { animation: module-message__shake 0.2s linear infinite; } @keyframes module-message__shake { 0% { /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translateX(0px); } 25% { /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translateX(-5px); } 50% { /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translateX(0px); } 75% { /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translateX(5px); } 100% { /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translateX(0px); } } @keyframes module-message__highlight { 0% { filter: none; } 33% { filter: brightness(50%); } 66% { filter: brightness(50%); } 100% { filter: none; } } @keyframes module-message__highlight-lighter { 0% { filter: none; } 33% { filter: brightness(76%); } 66% { filter: brightness(76%); } 100% { filter: none; } } .module-message--outgoing { flex-direction: row-reverse; } .module-message__buttons { display: inline-flex; flex-direction: row; align-items: center; opacity: 0; } .module-message:hover .module-message__buttons, .module-message__buttons:has([data-axo-contextmenu-state=open]) { opacity: 1; } .module-message__buttons--incoming { padding-inline-start: 8px; } .module-message__buttons--incoming > * { margin-inline-start: 12px; } .module-message__buttons--incoming > *:first-child { margin-inline-start: 0; } .module-message__buttons--outgoing { padding-inline-end: 8px; flex-direction: row-reverse; } .module-message__buttons--outgoing > * { margin-inline-end: 12px; } .module-message__buttons--outgoing > *:first-child { margin-inline-end: 0; } .module-message__buttons__download { cursor: pointer; height: 20px; width: 20px; } .module-message__buttons__download { -webkit-mask: url("../images/icons/v3/save/save.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #848484; } @media (forced-colors: active) { .module-message__buttons__download { background-color: WindowText; } } .module-message__buttons__download:hover { -webkit-mask: url("../images/icons/v3/save/save.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #1b1b1b; } @media (forced-colors: active) { .module-message__buttons__download:hover { background-color: WindowText; } } .dark-theme .module-message__buttons__download { -webkit-mask: url("../images/icons/v3/save/save.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #848484; } @media (forced-colors: active) { .dark-theme .module-message__buttons__download { background-color: WindowText; } } .dark-theme .module-message__buttons__download:hover { -webkit-mask: url("../images/icons/v3/save/save.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #f6f6f6; } @media (forced-colors: active) { .dark-theme .module-message__buttons__download:hover { background-color: WindowText; } } .mouse-mode .module-message--targeted .module-message__buttons__download { background-color: #5e5e5e; } .dark-theme.mouse-mode .module-message--targeted .module-message__buttons__download { background-color: #ffffff; } .keyboard-mode .module-message:focus .module-message__buttons__download { background-color: #5e5e5e; } .dark-theme.keyboard-mode .module-message:focus .module-message__buttons__download { background-color: #ffffff; } .module-message__buttons__react { cursor: pointer; height: 20px; width: 20px; } .module-message__buttons__react { -webkit-mask: url("../images/icons/v3/heart/heart-plus.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #848484; } @media (forced-colors: active) { .module-message__buttons__react { background-color: WindowText; } } .module-message__buttons__react:hover { -webkit-mask: url("../images/icons/v3/heart/heart-plus.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #1b1b1b; } @media (forced-colors: active) { .module-message__buttons__react:hover { background-color: WindowText; } } .dark-theme .module-message__buttons__react { -webkit-mask: url("../images/icons/v3/heart/heart-plus.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #848484; } @media (forced-colors: active) { .dark-theme .module-message__buttons__react { background-color: WindowText; } } .dark-theme .module-message__buttons__react:hover { -webkit-mask: url("../images/icons/v3/heart/heart-plus.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #f6f6f6; } @media (forced-colors: active) { .dark-theme .module-message__buttons__react:hover { background-color: WindowText; } } .mouse-mode .module-message--targeted .module-message__buttons__react { background-color: #5e5e5e; } .dark-theme.mouse-mode .module-message--targeted .module-message__buttons__react { background-color: #ffffff; } .keyboard-mode .module-message:focus .module-message__buttons__react { background-color: #5e5e5e; } .dark-theme.keyboard-mode .module-message:focus .module-message__buttons__react { background-color: #ffffff; } .module-message__buttons__reply { cursor: pointer; height: 20px; width: 20px; } .module-message__buttons__reply { -webkit-mask: url("../images/icons/v3/reply/reply.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #848484; } @media (forced-colors: active) { .module-message__buttons__reply { background-color: WindowText; } } .module-message__buttons__reply:hover { -webkit-mask: url("../images/icons/v3/reply/reply.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #1b1b1b; } @media (forced-colors: active) { .module-message__buttons__reply:hover { background-color: WindowText; } } .dark-theme .module-message__buttons__reply { -webkit-mask: url("../images/icons/v3/reply/reply.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #848484; } @media (forced-colors: active) { .dark-theme .module-message__buttons__reply { background-color: WindowText; } } .dark-theme .module-message__buttons__reply:hover { -webkit-mask: url("../images/icons/v3/reply/reply.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #f6f6f6; } @media (forced-colors: active) { .dark-theme .module-message__buttons__reply:hover { background-color: WindowText; } } .mouse-mode .module-message--targeted .module-message__buttons__reply { background-color: #5e5e5e; } .dark-theme.mouse-mode .module-message--targeted .module-message__buttons__reply { background-color: #ffffff; } .keyboard-mode .module-message:focus .module-message__buttons__reply { background-color: #5e5e5e; } .dark-theme.keyboard-mode .module-message:focus .module-message__buttons__reply { background-color: #ffffff; } .module-message__buttons__menu { cursor: pointer; height: 20px; width: 20px; } .module-message__buttons__menu { -webkit-mask: url("../images/icons/v3/more/more.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #848484; } @media (forced-colors: active) { .module-message__buttons__menu { background-color: WindowText; } } .module-message__buttons__menu:hover { -webkit-mask: url("../images/icons/v3/more/more.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #1b1b1b; } @media (forced-colors: active) { .module-message__buttons__menu:hover { background-color: WindowText; } } .dark-theme .module-message__buttons__menu { -webkit-mask: url("../images/icons/v3/more/more.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #848484; } @media (forced-colors: active) { .dark-theme .module-message__buttons__menu { background-color: WindowText; } } .dark-theme .module-message__buttons__menu:hover { -webkit-mask: url("../images/icons/v3/more/more.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #f6f6f6; } @media (forced-colors: active) { .dark-theme .module-message__buttons__menu:hover { background-color: WindowText; } } .mouse-mode .module-message--targeted .module-message__buttons__menu { background-color: #5e5e5e; } .dark-theme.mouse-mode .module-message--targeted .module-message__buttons__menu { background-color: #ffffff; } .keyboard-mode .module-message:focus .module-message__buttons__menu { background-color: #5e5e5e; } .dark-theme.keyboard-mode .module-message:focus .module-message__buttons__menu { background-color: #ffffff; } .module-message__buttons__menu--container { border-radius: 4px; height: 20px; z-index: 2; } .module-message__error-container { min-width: 28px; position: relative; } .module-message__error { width: 20px; height: 20px; display: inline-block; position: absolute; bottom: 4px; } .module-message__error { -webkit-mask: url("../images/icons/v3/error/error-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #f44336; } @media (forced-colors: active) { .module-message__error { background-color: WindowText; } } .dark-theme .module-message__error { -webkit-mask: url("../images/icons/v3/error/error-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #f44336; } @media (forced-colors: active) { .dark-theme .module-message__error { background-color: WindowText; } } .module-message__error--paused { -webkit-mask: url("../images/icons/v3/error/error-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .module-message__error--paused { background-color: WindowText; } } .dark-theme .module-message__error--paused { -webkit-mask: url("../images/icons/v3/error/error-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #848484; } @media (forced-colors: active) { .dark-theme .module-message__error--paused { background-color: WindowText; } } .module-message__error--outgoing { inset-inline-start: 8px; } .module-message__error--incoming { inset-inline-end: 8px; } .module-message__container-outer { line-height: 0; display: flex; flex-direction: column; min-width: 0; max-width: min(306px, 100% - 16px - 22px); } .module-timeline--width-wide .module-message__container-outer, .module-message-detail .module-message__container-outer { max-width: 50vw; } .module-timeline--width-medium .module-message__container-outer { max-width: 370px; } .module-message__container { position: relative; display: inline-block; border-radius: 18px; outline: none; margin-bottom: 6px; margin-top: 6px; min-width: 0px; overflow: hidden; padding-inline: 12px; padding-top: 8px; padding-bottom: 8px; } .module-message--collapsed-above .module-message__container { margin-top: 1px; } .module-message--collapsed-below .module-message__container { margin-bottom: 1px; } .module-message--incoming.module-message--collapsed-above .module-message__container { border-start-start-radius: 4px; } .module-message--incoming.module-message--collapsed-below .module-message__container { border-end-start-radius: 4px; } .module-message--outgoing.module-message--collapsed-above .module-message__container { border-start-end-radius: 4px; } .module-message--outgoing.module-message--collapsed-below .module-message__container { border-end-end-radius: 4px; } .mouse-mode .module-message__container--targeted { animation: module-message__highlight 1.2s cubic-bezier(0.17, 0.17, 0, 1); } .mouse-mode .module-message__container--targeted-lighter { animation: module-message__highlight-lighter 1.2s cubic-bezier(0.17, 0.17, 0, 1); } .module-message__wrapper { position: relative; transition: background 0.1s ease-out; } .module-message__wrapper--select-mode .module-message--incoming:dir(ltr) { /* stylelint-disable-next-line declaration-property-value-disallowed-list */ translate: 38px 0; } .module-message__wrapper--select-mode .module-message--incoming:dir(rtl) { /* stylelint-disable-next-line declaration-property-value-disallowed-list */ translate: -38px 0; } .module-message__alt-accessibility-tree { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border-width: 0; } .module-message__wrapper--selected { background: rgba(44, 107, 237, 0.08); } .module-message__select-checkbox { position: absolute; top: 50%; inset-inline-start: 16px; transform: translateY(-50%); width: 20px; height: 20px; border-radius: 9999px; background: transparent; border: 1px solid #c6c6c6; animation: module-message__select-checkbox--fadeIn 0.2s ease-out; transition: background 0.1s ease-out, border-color 0.1s ease-out; } .module-message__select-checkbox::before { content: ""; display: block; width: 14px; height: 14px; margin: 2px; } .module-message__select-checkbox::before { -webkit-mask: url("../images/icons/v3/check/check-compact-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .module-message__select-checkbox::before { background-color: WindowText; } } .module-message__select-checkbox::before { opacity: 0; transition: opacity 0.1s ease-out; } .module-message__wrapper--selected .module-message__select-checkbox { background: #2c6bed; border-color: #2c6bed; } .module-message__wrapper--selected .module-message__select-checkbox::before { opacity: 1; } @keyframes module-message__select-checkbox--fadeIn { from { opacity: 0; } } .keyboard-mode .module-message:focus-within { background: rgba(44, 107, 237, 0.24); } .dark-theme.keyboard-mode .module-message:focus-within { background: #4a4a4a; } .module-message__container--emoji { padding-top: 4px; } .module-message__container--emoji .module-message__text--outgoing { text-align: end; } .module-message__container--outgoing { background-color: #2c6bed; color: #ffffff; } .dark-theme .module-message__container--outgoing { background-color: #2c6bed; color: #e9e9e9; } .module-message__container--incoming { background-color: #e9e9e9; color: #1b1b1b; } .dark-theme .module-message__container--incoming { background-color: #3b3b3b; color: #e9e9e9; } .module-message__container--outgoing-blue { background-color: #336ba3; } .dark-theme .module-message__container--outgoing-blue { background-color: #336ba3; } .module-message__container--outgoing-burlap { background-color: #6f6a58; } .dark-theme .module-message__container--outgoing-burlap { background-color: #6f6a58; } .module-message__container--outgoing-crimson { background-color: #cf163e; } .dark-theme .module-message__container--outgoing-crimson { background-color: #cf163e; } .module-message__container--outgoing-forest { background-color: #3b7845; } .dark-theme .module-message__container--outgoing-forest { background-color: #3b7845; } .module-message__container--outgoing-indigo { background-color: #6058ca; } .dark-theme .module-message__container--outgoing-indigo { background-color: #6058ca; } .module-message__container--outgoing-plum { background-color: #aa377a; } .dark-theme .module-message__container--outgoing-plum { background-color: #aa377a; } .module-message__container--outgoing-steel { background-color: #71717f; } .dark-theme .module-message__container--outgoing-steel { background-color: #71717f; } .module-message__container--outgoing-taupe { background-color: #8f616a; } .dark-theme .module-message__container--outgoing-taupe { background-color: #8f616a; } .module-message__container--outgoing-teal { background-color: #077d92; } .dark-theme .module-message__container--outgoing-teal { background-color: #077d92; } .module-message__container--outgoing-vermilion { background-color: #c73f0a; } .dark-theme .module-message__container--outgoing-vermilion { background-color: #c73f0a; } .module-message__container--outgoing-violet { background-color: #9932c8; } .dark-theme .module-message__container--outgoing-violet { background-color: #9932c8; } .module-message__container--outgoing-wintergreen { background-color: #1d8663; } .dark-theme .module-message__container--outgoing-wintergreen { background-color: #1d8663; } .module-message__container--outgoing-custom { background-attachment: fixed; } .module-message__container--outgoing-ultramarine { background-attachment: fixed; background-image: linear-gradient(180deg, #0552f0, #2c6bed); } .module-message__container--outgoing-basil { background-attachment: fixed; background-image: linear-gradient(180deg, #2f9373, #077343); } .module-message__container--outgoing-ember { background-attachment: fixed; background-image: linear-gradient(168deg, #e57c00, #5e0000); } .module-message__container--outgoing-fluorescent { background-attachment: fixed; background-image: linear-gradient(192deg, #ec13dd, #1b36c6); } .module-message__container--outgoing-infrared { background-attachment: fixed; background-image: linear-gradient(192deg, #f65560, #442ced); } .module-message__container--outgoing-lagoon { background-attachment: fixed; background-image: linear-gradient(180deg, #004066, #32867d); } .module-message__container--outgoing-midnight { background-attachment: fixed; background-image: linear-gradient(180deg, #2c2c3a, #787891); } .module-message__container--outgoing-sea { background-attachment: fixed; background-image: linear-gradient(180deg, #498fd4, #2c66a0); } .module-message__container--outgoing-sublime { background-attachment: fixed; background-image: linear-gradient(180deg, #6281d5, #974460); } .module-message__container--outgoing-tangerine { background-attachment: fixed; background-image: linear-gradient(192deg, #db7133, #911231); } .module-message__container--deleted-for-everyone { color: #1b1b1b; border: 1px solid #b9b9b9; background-color: transparent; background-image: none; } .dark-theme .module-message__container--deleted-for-everyone { color: #e9e9e9; border: 1px solid #3b3b3b; background-color: transparent; background-image: none; } .module-message__attachment-too-big { user-select: none; margin-inline: -12px; margin-top: -8px; margin-bottom: -8px; padding-top: 8px; padding-bottom: 8px; padding-inline: 12px; border-radius: 18px; font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-style: italic; } .module-message__attachment-too-big { color: #1b1b1b; border: 1px solid #e9e9e9; background-color: #ffffff; background-image: none; } .dark-theme .module-message__attachment-too-big { color: #e9e9e9; border: 1px solid #3b3b3b; background-color: #121212; background-image: none; } .module-message__attachment-too-big--content-above { margin-block-start: 0; border-top-left-radius: 0; border-top-right-radius: 0; } .module-message__attachment-too-big--content-below { border-bottom-left-radius: 0; border-bottom-right-radius: 0; border-bottom: none; margin-bottom: 7px; } .module-message__attachment-too-big--collapse-above--incoming { border-top-left-radius: 4px; } .module-message__attachment-too-big--collapse-above--outgoing { border-top-right-radius: 4px; } .module-message__attachment-too-big--collapse-below--incoming { border-bottom-left-radius: 4px; } .module-message__attachment-too-big--collapse-below--outgoing { border-bottom-right-radius: 4px; } .module-message__attachment-container { text-align: center; position: relative; margin-inline: -12px; margin-top: -8px; margin-bottom: -8px; line-height: 0; overflow: hidden; } .module-message__attachment-container { background-color: #ffffff; } .dark-theme .module-message__attachment-container { background-color: #121212; } .module-message__attachment-container--with-content-below { margin-bottom: 7px; } .module-message__attachment-container--with-content-above { margin-top: 4px; } .module-message__undownloadable-attachment { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; display: flex; padding-block: 9px 8px; padding-inline: 12px; margin-inline: -12px; margin-block-start: -8px; margin-block-end: -8px; } .module-message__undownloadable-attachment--with-content-below { margin-block-end: 7px; border-bottom: 0.5px solid rgba(255, 255, 255, 0.1); } .module-message__undownloadable-attachment--with-content-below { border-color: rgba(0, 0, 0, 0.1); } .dark-theme .module-message__undownloadable-attachment--with-content-below { border-color: rgba(255, 255, 255, 0.1); } .module-message__undownloadable-attachment--with-content-above { margin-block-start: 4px; } .module-message__container--outgoing .module-message__undownloadable-attachment--with-content-below { border-color: rgba(255, 255, 255, 0.3); } .module-message__container--is-clickable { cursor: pointer; } .module-message__sticker-container { text-align: center; margin-inline: -12px; margin-top: -9px; margin-bottom: -5px; } .module-message__sticker-container--with-content-below { margin-bottom: 5px; } .module-message__sticker-container--with-content-above { margin-top: 4px; } .module-message__img-attachment { margin-bottom: -3px; cursor: pointer; } .module-message__simple-attachment { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-message__simple-attachment { border: 1px solid WindowText; } } .module-message__simple-attachment { user-select: none; width: 100%; display: flex; flex-direction: row; align-items: center; border-radius: 4px; } .keyboard-mode .module-message__simple-attachment:focus { box-shadow: 0px 0px 0px 2px #2c6bed; } .keyboard-mode .module-message__container--outgoing .module-message__simple-attachment:focus { box-shadow: 0px 0px 0px 2px #ffffff; } .module-message__simple-attachment--with-content-below { padding-bottom: 8px; } .module-message__simple-attachment--with-content-above { padding-top: 4px; } .module-message__simple-attachment__icon__extension { font-size: 12px; line-height: 16px; letter-spacing: 0; text-transform: lowercase; user-select: none; text-align: center; margin-inline: auto; white-space: nowrap; overflow-x: hidden; text-overflow: clip; color: #1b1b1b; } .module-message__simple-attachment__icon__extension--more-char { font-size: 9px; line-height: 11px; letter-spacing: -0.2px; } .module-message__simple-attachment__text { flex-grow: 1; max-width: calc(100% - 42px); } .module-message__simple-attachment__file-name { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; margin-top: 2px; user-select: none; font-weight: 500; overflow-x: hidden; white-space: nowrap; text-overflow: ellipsis; } .module-message__simple-attachment__file-name { color: #ffffff; } .dark-theme .module-message__simple-attachment__file-name { color: rgba(255, 255, 255, 0.9); } .module-message__simple-attachment__file-name--incoming { color: #ffffff; } .module-message__simple-attachment__file-name--incoming { color: #1b1b1b; } .dark-theme .module-message__simple-attachment__file-name--incoming { color: #e9e9e9; } .module-message__simple-attachment__bottom-row { display: flex; flex-direction: row; } .module-message__simple-attachment__metadata-container { flex-grow: 1; padding-inline-start: 8px; padding-top: 6px; align-self: end; } .module-message__container--incoming .module-message__simple-attachment__file-name--undownloadable { color: #1b1b1b; } .dark-theme .module-message__container--incoming .module-message__simple-attachment__file-name--undownloadable { color: #e9e9e9; } .module-message__simple-attachment__file-size { flex-grow: 1; flex-shrink: 0; font-size: 12px; line-height: 16px; letter-spacing: 0px; margin-top: 2px; user-select: none; white-space: no-wrap; } .module-message__simple-attachment__file-size { color: rgba(255, 255, 255, 0.8); } .dark-theme .module-message__simple-attachment__file-size { color: rgba(255, 255, 255, 0.6); } .module-message__simple-attachment__file-size--incoming { color: #ffffff; } .module-message__simple-attachment__file-size--incoming { color: #5e5e5e; } .dark-theme .module-message__simple-attachment__file-size--incoming { color: #b9b9b9; } .module-message__undownloadable-attachment__icon-container { margin-inline-end: 8px; } .module-message__undownloadable-attachment__icon-container--file { margin-block-start: 1px; margin-inline-end: 3px; } .module-message__undownloadable-attachment__icon { height: 20px; width: 20px; } .module-message__undownloadable-attachment__icon--audio { -webkit-mask: url("../images/icons/v3/waveform/waveform-slash.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .module-message__undownloadable-attachment__icon--audio { background-color: WindowText; } } .module-message__undownloadable-attachment__icon--file { -webkit-mask: url("../images/icons/v3/error/error-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .module-message__undownloadable-attachment__icon--file { background-color: WindowText; } } .module-message__undownloadable-attachment__icon--sticker { -webkit-mask: url("../images/icons/v3/sticker/sticker-slash.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .module-message__undownloadable-attachment__icon--sticker { background-color: WindowText; } } .module-message__undownloadable-attachment__icon--tap-to-view { -webkit-mask: url("../images/icons/v3/view_once/view_once-slash-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .module-message__undownloadable-attachment__icon--tap-to-view { background-color: WindowText; } } .module-message__undownloadable-attachment__icon--small { width: 16px; height: 16px; } .module-message__undownloadable-attachment-info--file { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; } .module-message__container--incoming .module-message__undownloadable-attachment-info--file { color: #2e2e2e; } .dark-theme .module-message__container--incoming .module-message__undownloadable-attachment-info--file { color: #b9b9b9; } .module-message__undownloadable-attachment { min-width: 200px; } .module-message__undownloadable-attachment-file { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; display: flex; } .module-message__undownloadable-attachment-text { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-message__undownloadable-attachment-text { border: 1px solid WindowText; } } .module-message__undownloadable-attachment-text { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; width: calc(100% + 24px); margin-block-start: 9px; margin-inline: -12px; padding-block-start: 9px; padding-inline: 12px; border-block-start: 0.5px solid; } .module-message__undownloadable-attachment-text { border-block-start-color: rgba(0, 0, 0, 0.1); } .dark-theme .module-message__undownloadable-attachment-text { border-block-start-color: rgba(255, 255, 255, 0.1); } .module-message__container--outgoing .module-message__undownloadable-attachment-text { border-block-start-color: rgba(255, 255, 255, 0.3); } .module-message__undownloadable-attachment-text__icon-container { margin-inline-end: 8px; align-self: flex-start; } .module-message--outgoing .module-message__undownloadable-attachment + .module-message__metadata .module-message__metadata__date--with-sticker { color: inherit; } .module-message--outgoing .module-message__undownloadable-attachment + .module-message__metadata .module-message__metadata__status-icon--with-sticker { background-color: rgba(255, 255, 255, 0.8); } .module-message__undownloadable-attachment-learn-more { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-message__undownloadable-attachment-learn-more { border: 1px solid WindowText; } } .keyboard-mode .module-message__undownloadable-attachment-learn-more:focus { box-shadow: 0px 0px 0px 2px #2c6bed; } .module-message__undownloadable-attachment-learn-more { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; font-weight: 500; } .module-message__link-preview { cursor: pointer; } .module-message__link-preview--nonclickable { cursor: inherit; } .module-message__link-preview--nonclickable .module-image__image, .module-message__link-preview--nonclickable .module-image__border-overlay--with-click-handler { cursor: inherit; } .module-message__link-preview { display: block; margin-inline: -12px; width: calc(100% + 24px); outline: none; margin-top: -8px; margin-bottom: 5px; overflow: hidden; } .keyboard-mode .module-message__link-preview:focus { box-shadow: 0px 0px 0px 2px #2c6bed; } .module-message__link-preview--with-content-above { margin-top: 4px; } .module-message__link-preview__content { padding-block: 8px; padding-inline: 12px; display: flex; flex-direction: row; align-items: center; } .module-message__link-preview__content { background-color: #f6f6f6; } .dark-theme .module-message__link-preview__content { background-color: #2e2e2e; } .module-message__link-preview__icon_container { margin: -2px; margin-inline-end: 8px; display: inline-block; } .module-message__link-preview__text--with-icon { margin-top: 5px; } .module-message__link-preview__title { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; overflow: hidden; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; } .module-message__link-preview__title { color: #1b1b1b; } .dark-theme .module-message__link-preview__title { color: #e9e9e9; } .module-message__link-preview__description { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; margin-top: 4px; overflow: hidden; display: -webkit-box; -webkit-line-clamp: 5; -webkit-box-orient: vertical; overflow-wrap: break-word; word-wrap: break-word; word-break: break-word; } .module-message__link-preview__description { color: #1b1b1b; } .dark-theme .module-message__link-preview__description { color: #e9e9e9; } .module-message__link-preview__footer { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; display: flex; flex-flow: row wrap; align-items: center; margin-top: 2px; } .module-message__link-preview__footer { color: #5e5e5e; } .dark-theme .module-message__link-preview__footer { color: #b9b9b9; } .module-message__link-preview__footer > *:not(:first-child) { display: flex; flex-grow: 1; } .module-message__link-preview__footer > *:not(:first-child):before { content: "•"; font-size: 50%; margin-inline: 0.2rem; } .module-message__link-preview__location { text-transform: lowercase; } .module-message__author { font-size: 12px; line-height: 16px; letter-spacing: 0px; font-weight: 600; user-select: none; overflow: hidden; text-overflow: ellipsis; margin-bottom: 3px; } .module-message__author_with_sticker { font-size: 12px; line-height: 16px; letter-spacing: 0px; font-weight: 600; min-height: 18px; width: 300px; } .module-message__author_with_sticker { color: #1b1b1b; } .dark-theme .module-message__author_with_sticker { color: #e9e9e9; } .module-message__author--with-quote { margin-bottom: 3px; } .module-message__text { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; text-align: start; overflow-wrap: break-word; word-wrap: break-word; word-break: break-word; white-space: pre-wrap; } .module-message__text { color: rgba(255, 255, 255, 0.9); } .dark-theme .module-message__text { color: rgba(255, 255, 255, 0.9); } .module-message__text a { text-decoration: underline; outline: none; word-break: break-all; } .module-message__text a { color: rgba(255, 255, 255, 0.9); } .keyboard-mode .module-message__text a:focus { outline: 1px solid #1b1b1b; } .dark-theme .module-message__text a { color: rgba(255, 255, 255, 0.9); } .dark-theme.keyboard-mode .module-message__text a:focus { outline: 1px solid rgba(255, 255, 255, 0.9); } .module-message__text--incoming { color: #1b1b1b; } .dark-theme .module-message__text--incoming { color: #e9e9e9; } .module-message__text--incoming a { text-decoration: underline; outline: none; } .module-message__text--incoming a { color: #1b1b1b; } .keyboard-mode .module-message__text--incoming a:focus { outline: 1px solid #1b1b1b; } .dark-theme .module-message__text--incoming a { color: #e9e9e9; } .dark-theme.keyboard-mode .module-message__text--incoming a:focus { outline: 1px solid #e9e9e9; } .module-message__text--error { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-style: italic; } .module-message__text--delete-for-everyone { user-select: none; } .module-message__text--delete-for-everyone { color: #1b1b1b; } .dark-theme .module-message__text--delete-for-everyone { color: #e9e9e9; } .module-message__metadata { font-size: 11px; line-height: 14px; letter-spacing: 0.06px; align-items: center; display: flex; flex-direction: row; justify-content: flex-end; margin-top: 3px; font-style: normal; user-select: none; white-space: nowrap; color: light-dark(#5e5e5e, #b9b9b9); } .module-message__metadata--outgoing { color: rgba(255, 255, 255, 0.8); } .module-message__metadata--outline-only-bubble, .module-message__metadata--sticker { color: light-dark(#5e5e5e, #b9b9b9); } .module-message__metadata--with-image-no-caption { color: light-dark(#ffffff, rgba(255, 255, 255, 0.8)); } .module-message__metadata--inline { float: inline-end; margin-top: -14px; position: relative; z-index: 1; } .module-message__metadata__edited { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-message__metadata__edited { border: 1px solid WindowText; } } .module-message__metadata__edited { cursor: pointer; margin-inline-end: 6px; z-index: 1; } .module-message__metadata__sms { margin-inline-start: 6px; } .module-message__metadata--with-image-no-caption { position: absolute; bottom: 9px; z-index: 2; width: 100%; padding-inline-end: 24px; pointer-events: none; } .module-message__metadata__tapable { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-message__metadata__tapable { border: 1px solid WindowText; } } .module-message__metadata__status-icon { width: 12px; height: 12px; display: inline-block; margin-inline: 6px; margin-bottom: 2px; } .page-is-visible .module-message__metadata__status-icon--paused, .page-is-visible .module-message__metadata__status-icon--sending { animation: rotate 4s linear infinite; } .module-message__metadata__status-icon--paused, .module-message__metadata__status-icon--sending { -webkit-mask: url("../images/icons/v3/message_status/messagestatus-sending.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .module-message__metadata__status-icon--paused, .module-message__metadata__status-icon--sending { background-color: WindowText; } } .module-message__metadata__status-icon--sent { -webkit-mask: url("../images/icons/v3/message_status/messagestatus-sent.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .module-message__metadata__status-icon--sent { background-color: WindowText; } } .module-message__metadata__status-icon--delivered { margin-inline-end: 0px; width: 18px; } .module-message__metadata__status-icon--delivered { -webkit-mask: url("../images/icons/v3/message_status/messagestatus-delivered.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .module-message__metadata__status-icon--delivered { background-color: WindowText; } } .module-message__metadata__status-icon--read, .module-message__metadata__status-icon--viewed { margin-inline-end: 0px; width: 18px; } .module-message__metadata__status-icon--read, .module-message__metadata__status-icon--viewed { -webkit-mask: url("../images/icons/v3/message_status/messagestatus-read.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .module-message__metadata__status-icon--read, .module-message__metadata__status-icon--viewed { background-color: WindowText; } } .module-message__metadata__status-icon--with-image-no-caption { color: light-dark(#ffffff, #f6f6f6); } .module-message__metadata__spinner-container { margin-inline-start: 6px; } .module-message__send-message-button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-message__send-message-button { border: 1px solid WindowText; } } .module-message__send-message-button { width: calc(100% + 24px); font-size: 13px; line-height: 18px; letter-spacing: -0.03px; font-weight: 600; margin-top: 8px; margin-bottom: -8px; margin-inline: -12px; text-align: center; padding: 10px; border-bottom-left-radius: 18px; border-bottom-right-radius: 18px; } .module-message__send-message-button { color: #2c6bed; background-color: #f6f6f6; border: 1px solid rgba(0, 0, 0, 0.2); } .dark-theme .module-message__send-message-button { color: #6191f3; background-color: #3b3b3b; border: 1px solid #848484; } .keyboard-mode .module-message__send-message-button:focus { box-shadow: 0px 0px 0px 2px #2c6bed; } .module-message__send-message-button--no-bottom-left-curve { border-bottom-left-radius: 4px; } .module-message__send-message-button--no-bottom-right-curve { border-bottom-right-radius: 4px; } .module-message__author-avatar-container { align-items: flex-end; display: flex; justify-content: center; margin-inline-end: 8px; min-width: 28px; padding-bottom: 6px; } .module-message__author-avatar-container--with-reactions { padding-bottom: 15px; } .module-message__author-avatar-container--typing { flex-direction: row-reverse; overflow-y: clip; } .module-message__container-outer--typing-bubble { overflow-y: clip; } .module-message__typing-avatar-container { flex-direction: row-reverse; overflow-y: clip; } .module-message__typing-avatar { display: flex; justify-content: center; position: relative; z-index: 1; } .module-message__typing-avatar:not(:last-child) { margin-inline-start: -4px; } .module-message__typing-avatar--overflow-count .module-Avatar__contents { background: #e9e9e9; color: #5e5e5e; } .dark-theme .module-message__typing-avatar--overflow-count .module-Avatar__contents { background: #3b3b3b; color: #b9b9b9; } .module-message__typing-avatar--overflow-count .module-Avatar__label { font-size: 11px; line-height: 14px; letter-spacing: 0.06px; font-weight: 600; } .module-message__typing-avatar .module-Avatar { min-width: 28px; width: 28px; height: 28px; } .module-message__typing-avatar .module-Avatar__contents { outline: 3px solid; } .module-message__typing-avatar .module-Avatar__contents { outline-color: #ffffff; } .dark-theme .module-message__typing-avatar .module-Avatar__contents { outline-color: #121212; } .module-message__typing-avatar-spacer { flex: 0 1 24px; } .module-message__unopened-gift-badge { width: 240px; height: 132px; background-color: #2c6bed; position: relative; margin-inline: -12px; margin-top: -8px; margin-bottom: 8px; } .module-message__unopened-gift-badge--outgoing { border-bottom: 1px solid rgba(255, 255, 255, 0.8); } .dark-theme .module-message__unopened-gift-badge--outgoing { border-bottom: 1px solid #121212; } .module-message__unopened-gift-badge__container { cursor: default; user-select: none; } .module-message__unopened-gift-badge__ribbon-horizontal { position: absolute; inset-inline: 0; height: 16px; top: 50%; transform: translateY(-50%); background-color: #ffffff; } .module-message__unopened-gift-badge__ribbon-vertical { position: absolute; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translateX(-50%); top: 0; bottom: 0; width: 16px; background-color: #ffffff; } .module-message__unopened-gift-badge__bow { position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); margin-top: 3px; width: 81px; height: 60px; } .module-message__unopened-gift-badge__text { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; font-style: italic; } .module-message__unopened-gift-badge__text--incoming { color: #5e5e5e; } .dark-theme .module-message__unopened-gift-badge__text--incoming { color: #b9b9b9; } .module-message__unopened-gift-badge__container .module-message__text--incoming { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; font-style: italic; } .module-message__unopened-gift-badge__container .module-message__text--incoming { color: #5e5e5e; } .dark-theme .module-message__unopened-gift-badge__container .module-message__text--incoming { color: #b9b9b9; } .module-message__unopened-gift-badge__container .module-message__text--outgoing { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; font-style: italic; } .module-message__unopened-gift-badge__container .module-message__text--outgoing { color: rgba(255, 255, 255, 0.8); } .dark-theme .module-message__unopened-gift-badge__container .module-message__text--outgoing { color: rgba(255, 255, 255, 0.8); } .module-message__redeemed-gift-badge { display: flex; flex-direction: row; } .module-message__redeemed-gift-badge__container { user-select: none; } .module-message__redeemed-gift-badge__badge { height: 64px; width: 64px; margin-inline: 4px 12px; margin-top: 8px; margin-bottom: 16px; flex-grow: 0; flex-shrink: 0; } .module-message__redeemed-gift-badge__badge--missing-incoming { border-radius: 50%; } .module-message__redeemed-gift-badge__badge--missing-incoming { background-color: #dedede; } .dark-theme .module-message__redeemed-gift-badge__badge--missing-incoming { background-color: #5e5e5e; } .module-message__redeemed-gift-badge__badge--missing-outgoing { border-radius: 50%; } .module-message__redeemed-gift-badge__badge--missing-outgoing { background-color: rgba(255, 255, 255, 0.2); } .dark-theme .module-message__redeemed-gift-badge__badge--missing-outgoing { background-color: rgba(255, 255, 255, 0.2); } .module-message__redeemed-gift-badge__text { flex-grow: 1; margin-top: 19px; } .module-message__redeemed-gift-badge__title { margin-bottom: 6px; font-size: 14px; line-height: 20px; letter-spacing: -0.08px; } .module-message__redeemed-gift-badge__remaining { font-size: 12px; line-height: 16px; letter-spacing: 0; } .module-message__redeemed-gift-badge__remaining--incoming { color: #3b3b3b; } .dark-theme .module-message__redeemed-gift-badge__remaining--incoming { color: #b9b9b9; } .module-message__redeemed-gift-badge__remaining--outgoing { color: rgba(255, 255, 255, 0.8); } .dark-theme .module-message__redeemed-gift-badge__remaining--outgoing { color: rgba(255, 255, 255, 0.8); } .module-message__redeemed-gift-badge__button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-message__redeemed-gift-badge__button { border: 1px solid WindowText; } } .module-message__redeemed-gift-badge__button { color: #1b1b1b; background-color: #e9e9e9; } .dark-theme .module-message__redeemed-gift-badge__button { color: #e9e9e9; background-color: #4a4a4a; } .mouse-mode .module-message__redeemed-gift-badge__button:hover { background-color: rgb(198.05, 198.05, 198.05); } .dark-theme.mouse-mode .module-message__redeemed-gift-badge__button:hover { background-color: rgb(101.15, 101.15, 101.15); } .mouse-mode .module-message__redeemed-gift-badge__button:active { background-color: rgb(174.75, 174.75, 174.75); } .dark-theme.mouse-mode .module-message__redeemed-gift-badge__button:active { background-color: rgb(119.25, 119.25, 119.25); } .keyboard-mode .module-message__redeemed-gift-badge__button:active { background-color: rgb(174.75, 174.75, 174.75); } .dark-theme.keyboard-mode .module-message__redeemed-gift-badge__button:active { background-color: rgb(119.25, 119.25, 119.25); } .keyboard-mode .module-message__redeemed-gift-badge__button:focus { box-shadow: 0px 0px 0px 3px #2c6bed; } .dark-theme.keyboard-mode .module-message__redeemed-gift-badge__button:focus { box-shadow: 0px 0px 0px 3px #6191f3; } .module-message__redeemed-gift-badge__button { margin-inline: auto; width: 216px; margin-bottom: 7px; text-align: center; border-radius: 4px; font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; display: flex; flex-direction: column; align-items: center; cursor: pointer; } .module-message__redeemed-gift-badge__button--incoming { color: #1b1b1b; background-color: #ffffff; } .dark-theme .module-message__redeemed-gift-badge__button--incoming { color: #e9e9e9; background-color: #545454; } .mouse-mode .module-message__redeemed-gift-badge__button--incoming:hover { background-color: #ffffff; } .dark-theme.mouse-mode .module-message__redeemed-gift-badge__button--incoming:hover { background-color: #545454; } .module-message__redeemed-gift-badge__button--outgoing { color: #1b1b1b; background-color: rgba(255, 255, 255, 0.8); } .dark-theme .module-message__redeemed-gift-badge__button--outgoing { color: #1b1b1b; background-color: rgba(255, 255, 255, 0.8); } .mouse-mode .module-message__redeemed-gift-badge__button--outgoing:hover { background-color: rgba(255, 255, 255, 0.9); } .dark-theme.mouse-mode .module-message__redeemed-gift-badge__button--outgoing:hover { background-color: rgba(255, 255, 255, 0.9); } .keyboard-mode .module-message__redeemed-gift-badge__button--outgoing:focus { box-shadow: 0px 0px 0px 3px #6191f3; } .dark-theme.keyboard-mode .module-message__redeemed-gift-badge__button--outgoing:focus { box-shadow: 0px 0px 0px 3px #6191f3; } .mouse-mode .module-message__redeemed-gift-badge__button--outgoing:active { background-color: #ffffff; } .dark-theme.mouse-mode .module-message__redeemed-gift-badge__button--outgoing:active { background-color: #ffffff; } .keyboard-mode .module-message__redeemed-gift-badge__button--outgoing:active { background-color: #ffffff; } .dark-theme.keyboard-mode .module-message__redeemed-gift-badge__button--outgoing:active { background-color: #ffffff; } .module-message__redeemed-gift-badge__button__text { display: flex; flex-direction: row; align-items: center; height: 36px; } .module-message__redeemed-gift-badge__icon-check { height: 19px; width: 19px; margin-inline-end: 5px; display: inline-block; } .module-message__redeemed-gift-badge__icon-check--incoming { -webkit-mask: url("../images/icons/v3/check/check-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #1b1b1b; } @media (forced-colors: active) { .module-message__redeemed-gift-badge__icon-check--incoming { background-color: WindowText; } } .dark-theme .module-message__redeemed-gift-badge__icon-check--incoming { -webkit-mask: url("../images/icons/v3/check/check-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #e9e9e9; } @media (forced-colors: active) { .dark-theme .module-message__redeemed-gift-badge__icon-check--incoming { background-color: WindowText; } } .module-message__redeemed-gift-badge__icon-check--outgoing { -webkit-mask: url("../images/icons/v3/check/check-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #1b1b1b; } @media (forced-colors: active) { .module-message__redeemed-gift-badge__icon-check--outgoing { background-color: WindowText; } } .dark-theme .module-message__redeemed-gift-badge__icon-check--outgoing { -webkit-mask: url("../images/icons/v3/check/check-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #1b1b1b; } @media (forced-colors: active) { .dark-theme .module-message__redeemed-gift-badge__icon-check--outgoing { background-color: WindowText; } } .module-message__typing-animation-container { height: 16px; overflow-y: clip; display: flex; flex-direction: row; align-items: center; } .module-message__reactions { position: relative; z-index: 2; height: 22px; display: flex; user-select: none; } .module-message__reactions--incoming { align-self: flex-end; padding-inline-end: 8px; margin-inline-start: 8px; } .module-message__reactions--outgoing { align-self: flex-start; padding-inline-start: 8px; margin-inline-end: 8px; } .module-message__reactions__reaction { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-message__reactions__reaction { border: 1px solid WindowText; } } .module-message__reactions__reaction { min-width: 28px; height: 22px; border: 1px solid; border-radius: 33px; display: flex; justify-content: center; align-items: center; } .module-message__reactions__reaction--with-count { min-width: 40px; padding-block: 0; padding-inline: 6px; } .module-message__reactions__reaction__count { font-size: 11px; line-height: 14px; letter-spacing: 0.06px; font-weight: 600; margin-inline-start: 4px; } .module-message__reactions__reaction__count--no-emoji { margin-inline-start: 0px; } .module-message__reactions__reaction__count { color: #5e5e5e; } .dark-theme .module-message__reactions__reaction__count { color: #b9b9b9; } .dark-theme .module-message__reactions__reaction__count--is-me { color: #dedede; } .module-message__reactions__reaction:focus { outline: none; } .keyboard-mode .module-message__reactions__reaction:focus { box-shadow: 0px 0px 0px 2px #2c6bed; } .module-message__reactions__reaction { border-color: #ffffff; background: #e9e9e9; } .dark-theme .module-message__reactions__reaction { border-color: #121212; background: #1b1b1b; } .dark-theme .module-message__reactions__reaction--is-me { background: #5e5e5e; } .module-message__reactions__reaction--is-me { background: #b9b9b9; } .module-message__tap-to-view__icon--ready { -webkit-mask: url("../images/icons/v3/view_once/view_once-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #1b1b1b; } @media (forced-colors: active) { .module-message__tap-to-view__icon--ready { background-color: WindowText; } } .dark-theme .module-message__tap-to-view__icon--ready { -webkit-mask: url("../images/icons/v3/view_once/view_once-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #e9e9e9; } @media (forced-colors: active) { .dark-theme .module-message__tap-to-view__icon--ready { background-color: WindowText; } } .module-message__tap-to-view__icon--outgoing { -webkit-mask: url("../images/icons/v3/view_once/view_once-dash-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: rgba(255, 255, 255, 0.8); } @media (forced-colors: active) { .module-message__tap-to-view__icon--outgoing { background-color: WindowText; } } .module-message__tap-to-view__icon--viewed { -webkit-mask: url("../images/icons/v3/view_once/view_once-viewed-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #1b1b1b; } @media (forced-colors: active) { .module-message__tap-to-view__icon--viewed { background-color: WindowText; } } .dark-theme .module-message__tap-to-view__icon--viewed { -webkit-mask: url("../images/icons/v3/view_once/view_once-viewed-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #e9e9e9; } @media (forced-colors: active) { .dark-theme .module-message__tap-to-view__icon--viewed { background-color: WindowText; } } .module-message__tap-to-view__icon--not-available { -webkit-mask: url("../images/icons/v3/view_once/view_once-slash-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #1b1b1b; } @media (forced-colors: active) { .module-message__tap-to-view__icon--not-available { background-color: WindowText; } } .dark-theme .module-message__tap-to-view__icon--not-available { -webkit-mask: url("../images/icons/v3/view_once/view_once-slash-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #e9e9e9; } @media (forced-colors: active) { .dark-theme .module-message__tap-to-view__icon--not-available { background-color: WindowText; } } .module-expire-timer { width: 12px; height: 12px; display: inline-block; margin-inline-start: 6px; margin-bottom: 2px; } .module-expire-timer--60 { -webkit-mask: url("../images/icons/v3/message_timer/messagetimer-60.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .module-expire-timer--60 { background-color: WindowText; } } .module-expire-timer--55 { -webkit-mask: url("../images/icons/v3/message_timer/messagetimer-55.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .module-expire-timer--55 { background-color: WindowText; } } .module-expire-timer--50 { -webkit-mask: url("../images/icons/v3/message_timer/messagetimer-50.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .module-expire-timer--50 { background-color: WindowText; } } .module-expire-timer--45 { -webkit-mask: url("../images/icons/v3/message_timer/messagetimer-45.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .module-expire-timer--45 { background-color: WindowText; } } .module-expire-timer--40 { -webkit-mask: url("../images/icons/v3/message_timer/messagetimer-40.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .module-expire-timer--40 { background-color: WindowText; } } .module-expire-timer--35 { -webkit-mask: url("../images/icons/v3/message_timer/messagetimer-35.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .module-expire-timer--35 { background-color: WindowText; } } .module-expire-timer--30 { -webkit-mask: url("../images/icons/v3/message_timer/messagetimer-30.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .module-expire-timer--30 { background-color: WindowText; } } .module-expire-timer--25 { -webkit-mask: url("../images/icons/v3/message_timer/messagetimer-25.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .module-expire-timer--25 { background-color: WindowText; } } .module-expire-timer--20 { -webkit-mask: url("../images/icons/v3/message_timer/messagetimer-20.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .module-expire-timer--20 { background-color: WindowText; } } .module-expire-timer--15 { -webkit-mask: url("../images/icons/v3/message_timer/messagetimer-15.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .module-expire-timer--15 { background-color: WindowText; } } .module-expire-timer--10 { -webkit-mask: url("../images/icons/v3/message_timer/messagetimer-10.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .module-expire-timer--10 { background-color: WindowText; } } .module-expire-timer--05 { -webkit-mask: url("../images/icons/v3/message_timer/messagetimer-05.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .module-expire-timer--05 { background-color: WindowText; } } .module-expire-timer--00 { -webkit-mask: url("../images/icons/v3/message_timer/messagetimer-00.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .module-expire-timer--00 { background-color: WindowText; } } .module-about__container { margin-inline: auto; max-width: 248px; text-align: center; } .module-about__text { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; } .module-about__text { color: #5e5e5e; } .dark-theme .module-about__text { color: #b9b9b9; } .module-about__text { max-width: 400px; -webkit-box-orient: vertical; -webkit-line-clamp: 2; display: -webkit-box; overflow: hidden; text-overflow: ellipsis; } .module-embedded-contact { width: 100%; padding-top: 4px; padding-bottom: 4px; display: flex; flex-direction: row; align-items: center; } .module-embedded-contact--with-content-above { padding-top: 4px; } .module-embedded-contact--with-content-below { padding-bottom: 4px; } .module-embedded-contact__avatar-container { height: 52px; width: 52px; border-radius: 26px; } .keyboard-mode .module-embedded-contact__avatar-container:focus { box-shadow: 0px 0px 0px 2px #2c6bed; } .keyboard-mode .module-embedded-contact--outgoing .module-embedded-contact__avatar-container:focus { box-shadow: 0px 0px 0px 2px #ffffff; } .module-embedded-contact__avatar-container .AttachmentStatusIcon__container { margin: 0; height: 52px; width: 52px; } .module-embedded-contact__avatar-container .AttachmentStatusIcon__circle-icon-container { margin: 0; } .module-embedded-contact__avatar-container { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-embedded-contact__avatar-container { border: 1px solid WindowText; } } .module-embedded-contact__avatar-container .AttachmentStatusIcon__circle-icon-container { position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); } .module-embedded-contact__text-container { flex-grow: 1; margin-inline-start: 12px; max-width: calc(100% - 64px); } .module-embedded-contact__contact-name { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; margin-top: 6px; max-width: 100%; white-space: nowrap; overflow-x: hidden; text-overflow: ellipsis; } .module-embedded-contact__contact-name { color: #ffffff; } .dark-theme .module-embedded-contact__contact-name { color: #e9e9e9; } .module-embedded-contact__contact-name--incoming { color: #ffffff; } .module-embedded-contact__contact-name--incoming { color: #1b1b1b; } .dark-theme .module-embedded-contact__contact-name--incoming { color: #b9b9b9; } .module-embedded-contact__contact-method { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; margin-top: 3px; max-width: 100%; white-space: nowrap; overflow-x: hidden; text-overflow: ellipsis; } .dark-theme .module-embedded-contact__contact-method { color: rgba(255, 255, 255, 0.8); } .module-embedded-contact__contact-method { color: rgba(255, 255, 255, 0.8); } .module-embedded-contact__contact-method--incoming { color: rgba(255, 255, 255, 0.8); } .module-embedded-contact__contact-method--incoming { color: #5e5e5e; } .module-contact-detail { text-align: center; max-width: 300px; margin-inline: auto; } .module-contact-detail__avatar { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-contact-detail__avatar { border: 1px solid WindowText; } } .module-contact-detail__avatar { cursor: default; position: relative; height: 80px; width: 80px; margin-bottom: 10px; border-radius: 40px; } .module-contact-detail__avatar { background-color: #e9e9e9; } .dark-theme .module-contact-detail__avatar { background-color: #2e2e2e; } .module-contact-detail__avatar--clickable { cursor: pointer; } .module-contact-detail__avatar .AttachmentStatusIcon__container { height: 80px; width: 80px; margin: 0; } .module-contact-detail__avatar .AttachmentStatusIcon__circle-icon-container { position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); } .module-contact-detail__contact-name { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; } .module-contact-detail__contact-method { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; margin-top: 10px; } .module-contact-detail__send-message { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-contact-detail__send-message { border: 1px solid WindowText; } } .module-contact-detail__send-message { border-radius: 4px; background-color: #2c6bed; display: inline-block; padding: 6px; margin-top: 20px; color: #ffffff; flex-direction: column; align-items: center; } .module-contact-detail__send-message__inner { display: flex; align-items: center; padding-inline-end: 5px; font-size: 13px; line-height: 18px; letter-spacing: -0.03px; font-weight: 600; } .module-contact-detail__send-message__bubble-icon { height: 17px; width: 18px; display: inline-block; margin-inline-end: 5px; } .module-contact-detail__send-message__bubble-icon { -webkit-mask: url("../images/icons/v3/chat/chat.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .module-contact-detail__send-message__bubble-icon { background-color: WindowText; } } .dark-theme .module-contact-detail__send-message__bubble-icon { -webkit-mask: url("../images/icons/v3/chat/chat.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .dark-theme .module-contact-detail__send-message__bubble-icon { background-color: WindowText; } } .module-contact-detail__additional-contact { text-align: start; margin-top: 15px; padding-top: 8px; } .module-contact-detail__additional-contact { border-top: 1px solid #e9e9e9; } .dark-theme .module-contact-detail__additional-contact { border-top: 1px solid #3b3b3b; } .module-contact-detail__additional-contact__type { font-size: 11px; line-height: 14px; letter-spacing: 0.06px; font-weight: 600; color: #848484; margin-bottom: 3px; } .module-inline-notification-wrapper { outline: none; } .keyboard-mode .module-inline-notification-wrapper:focus { background: rgba(44, 107, 237, 0.24); } .dark-theme.keyboard-mode .module-inline-notification-wrapper:focus { background: #4a4a4a; } .module-group-notification__contact { font-weight: bold; } .module-error-boundary-notification { text-align: center; cursor: pointer; } .keyboard-mode .module-error-boundary-notification:focus { outline: 0; } .keyboard-mode .module-error-boundary-notification:focus .module-error-boundary-notification__message { opacity: 1; } .module-error-boundary-notification__message { opacity: 0.8; } .module-error-boundary-notification { color: #5e5e5e; } .dark-theme .module-error-boundary-notification { color: #e9e9e9; } .module-error-boundary-notification__icon-container { margin-inline: auto; display: inline-flex; flex-direction: row; align-items: center; margin-bottom: 8px; } .module-error-boundary-notification__icon { height: 20px; width: 20px; display: inline-block; opacity: 0.6; } .module-error-boundary-notification__icon { -webkit-mask: url("../images/icons/v2/error-solid-24.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .module-error-boundary-notification__icon { background-color: WindowText; } } .dark-theme .module-error-boundary-notification__icon { -webkit-mask: url("../images/icons/v2/error-solid-24.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #e9e9e9; } @media (forced-colors: active) { .dark-theme .module-error-boundary-notification__icon { background-color: WindowText; } } .module-notification--with-click-handler { cursor: pointer; } .module-notification__icon { height: 24px; width: 24px; margin-inline: auto; } .module-in-contacts-icon__icon { display: inline-block; height: 14px; width: 14px; margin-bottom: 2px; vertical-align: middle; } .module-in-contacts-icon__icon { -webkit-mask: url("../images/icons/v3/person/person-circle-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .module-in-contacts-icon__icon { background-color: WindowText; } } .dark-theme .module-in-contacts-icon__icon { -webkit-mask: url("../images/icons/v3/person/person-circle-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .dark-theme .module-in-contacts-icon__icon { background-color: WindowText; } } .keyboard-mode .module-in-contacts-icon__icon:focus { -webkit-mask: url("../images/icons/v3/person/person-circle-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #2c6bed; } @media (forced-colors: active) { .keyboard-mode .module-in-contacts-icon__icon:focus { background-color: WindowText; } } .conversation-details-panel { max-width: 750px; margin-block: 0; margin-inline: auto; user-select: none; } .conversation .conversation-details-panel { overflow-y: auto; } button.ConversationDetails__action-button { margin-inline-start: 16px; } .module-message-request-actions { padding-block: 8px 12px; padding-inline: 16px; } .module-message-request-actions { background: #ffffff; } .dark-theme .module-message-request-actions { background: #121212; } .module-message-request-actions__message { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; text-align: center; margin-bottom: 12px; } .module-message-request-actions__message { color: #5e5e5e; } .dark-theme .module-message-request-actions__message { color: #b9b9b9; } .module-message-request-actions__message__name { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; font-weight: 600; } .module-message-request-actions__message__learn-more { text-decoration: none; } .module-message-request-actions__buttons { display: flex; flex-direction: row; justify-content: center; } .module-message-request-actions__buttons .module-Button { min-width: 80px; } .module-message-request-actions__buttons .module-Button:not(:last-of-type) { margin-inline-end: 8px; } .module-image { position: relative; display: inline-block; vertical-align: middle; } .module-image--hidden { visibility: hidden; } .module-image--tap-to-play, .module-image--not-downloaded { align-items: center; display: flex; justify-content: center; } .module-image--tap-to-play span, .module-image--not-downloaded span { align-items: center; display: flex; justify-content: center; border-radius: 50px; height: 50px; width: 50px; background-color: rgba(0, 0, 0, 0.7); } .module-image--tap-to-play:hover span, .module-image--not-downloaded:hover span { background-color: rgba(0, 0, 0, 0.8); } .module-image--tap-to-play:focus span, .module-image--not-downloaded:focus span { background-color: #3b3b3b; border: 4px solid #2c6bed; box-sizing: border-box; outline: none; } .module-image--not-downloaded span:after { content: ""; height: 24px; width: 24px; } .module-image--not-downloaded span:after { -webkit-mask: url("../images/icons/v3/arrow/arrow-down.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .module-image--not-downloaded span:after { background-color: WindowText; } } .module-image--tap-to-play span:after { display: flex; flex-direction: column; align-items: center; content: "GIF"; font-size: 14px; line-height: 20px; letter-spacing: -0.08px; color: #ffffff; } .module-image__progress-circle-wrapper { position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); } .module-image__spinner-container { position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); } .module-image__spinner-container .module-image-spinner__arc { background-color: rgba(0, 0, 0, 0.8); } .module-image__spinner-container .module-image-spinner__circle { background-color: #ffffff; } .dark-theme .module-image__spinner-container .module-image-spinner__arc { background-color: rgba(0, 0, 0, 0.8); } .module-image--with-background { background-color: #ffffff; } .dark-theme .module-image--with-background { background-color: #000000; } .module-image__caption-icon { position: absolute; top: 6px; inset-inline-start: 6px; } .module-image--cropped { overflow: hidden; } .module-image__border-overlay { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-image__border-overlay { border: 1px solid WindowText; } } .module-image__border-overlay { width: 100%; cursor: inherit; pointer-events: none; position: absolute; top: 0; bottom: 0; inset-inline: 0; z-index: 2; } .module-image__border-overlay--with-click-handler { cursor: pointer; pointer-events: all; } .module-image__border-overlay--with-border { box-shadow: inset 0px 0px 0px 1px rgba(0, 0, 0, 0.085); } .dark-theme .module-image__border-overlay--with-border { box-shadow: inset 0px 0px 0px 1px rgba(255, 255, 255, 0.2); } .module-image--gif video { cursor: pointer; object-fit: cover; } .keyboard-mode button.module-image__border-overlay:focus { box-shadow: inset 0px 0px 0px 2px #2c6bed; } .module-image__border-overlay--dark { background-color: rgba(0, 0, 0, 0.2); } .module-image__loading-placeholder { display: inline-flex; flex-direction: row; align-items: center; } .module-image__loading-placeholder { background-color: rgba(0, 0, 0, 0.2); } .dark-theme .module-image__loading-placeholder { background-color: rgba(255, 255, 255, 0.2); } .module-image__image { object-fit: cover; cursor: pointer; } .module-image__bottom-overlay { height: 48px; background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0) 9%, rgba(0, 0, 0, 0.02) 17%, rgba(0, 0, 0, 0.05) 24%, rgba(0, 0, 0, 0.08) 31%, rgba(0, 0, 0, 0.12) 37%, rgba(0, 0, 0, 0.16) 44%, rgba(0, 0, 0, 0.2) 50%, rgba(0, 0, 0, 0.24) 56%, rgba(0, 0, 0, 0.28) 63%, rgba(0, 0, 0, 0.32) 69%, rgba(0, 0, 0, 0.35) 76%, rgba(0, 0, 0, 0.38) 83%, rgba(0, 0, 0, 0.4) 91%, rgba(0, 0, 0, 0.4)); position: absolute; bottom: 0; z-index: 1; inset-inline: 0; pointer-events: none; } .module-image__overlay-circle { position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); } .module-image__overlay-circle { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-image__overlay-circle { border: 1px solid WindowText; } } .module-image__overlay-circle { width: 50px; height: 50px; background-color: rgba(0, 0, 0, 0.8); border-radius: 25px; } .module-image__overlay-circle--undownloadable { background-color: rgba(0, 0, 0, 0.4); } .module-image__play-icon { position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); height: 24px; width: 24px; } .module-image__play-icon { -webkit-mask: url("../images/icons/v3/play/play-fill.svg") no-repeat center; -webkit-mask-size: 100%; background-color: var(--color-label-primary-on-color); } @media (forced-colors: active) { .module-image__play-icon { background-color: WindowText; } } .module-image__stop-icon { position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); height: 24px; width: 24px; } .module-image__stop-icon { -webkit-mask: url("../images/icons/v3/stop/stop-fill.svg") no-repeat center; -webkit-mask-size: 100%; background-color: var(--color-label-primary-on-color); } @media (forced-colors: active) { .module-image__stop-icon { background-color: WindowText; } } .module-image__download-icon { position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); height: 24px; width: 24px; } .module-image__download-icon { -webkit-mask: url("../images/icons/v3/arrow/arrow-down.svg") no-repeat center; -webkit-mask-size: 100%; background-color: var(--color-label-primary-on-color); } @media (forced-colors: active) { .module-image__download-icon { background-color: WindowText; } } .module-image__undownloadable-icon { position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); height: 24px; width: 24px; } .module-image__undownloadable-icon { -webkit-mask: url("../images/icons/v3/photo/photo-slash-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: var(--color-label-primary-on-color); } @media (forced-colors: active) { .module-image__undownloadable-icon { background-color: WindowText; } } .module-image__text-container { position: absolute; top: 0; inset-inline: 0; bottom: 0; z-index: 3; pointer-events: none; color: #ffffff; font-size: 14px; line-height: 20px; letter-spacing: -0.08px; text-align: center; } .module-image__close-button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-image__close-button { border: 1px solid WindowText; } } .module-image__close-button { position: absolute; top: 4px; inset-inline-end: 4px; width: 16px; height: 16px; z-index: 2; } .module-image__close-button::before { content: ""; display: block; width: 16px; height: 16px; } .module-image__close-button::before { -webkit-mask: url("../images/icons/v3/x/x-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .module-image__close-button::before { background-color: WindowText; } } .module-image__close-button { background-image: url("../images/icons/v3/x/x-compact.svg"); filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.6)); } .keyboard-mode .module-image__close-button:focus { outline: 2px solid #2c6bed; } .module-image-grid { position: relative; display: inline-flex; flex-direction: row; align-items: center; gap: 1px; } .module-image-grid__download-pill { position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); } .module-image-grid__download-pill { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-image-grid__download-pill { border: 1px solid WindowText; } } .module-image-grid__download-pill { background-color: rgba(0, 0, 0, 0.8); color: #ffffff; backdrop-filter: blur(10px); height: 44px; border-radius: 44px; display: inline-flex; flex-direction: row; align-items: center; } .module-image-grid__download_pill__icon-wrapper { position: relative; width: 44px; height: 44px; margin-inline-end: -6px; } .module-image-grid__download_pill__download-icon { position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); height: 24px; width: 24px; } .module-image-grid__download_pill__download-icon { -webkit-mask: url("../images/icons/v3/arrow/arrow-down.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .module-image-grid__download_pill__download-icon { background-color: WindowText; } } .module-image-grid__download_pill__text-wrapper { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; margin-inline-end: 14px; } .module-image-grid--one-image { margin-bottom: -5px; } .module-image-grid--with-sticker { padding: 8px; } .module-image-grid__column { display: inline-flex; flex-direction: column; align-items: center; gap: 1px; } .module-image-grid__row { display: inline-flex; flex-direction: row; align-items: center; flex-grow: 1; gap: 1px; } .module-typing-animation { display: inline-flex; flex-direction: row; align-items: center; height: 8px; width: 38px; padding-inline: 1px; } .module-message__typing-animation-container .module-typing-animation { width: 30px; } .module-typing-animation__dot { border-radius: 50%; height: 6px; width: 6px; opacity: 0.4; will-change: transform, opacity; } .dark-theme .module-typing-animation__dot { background-color: #ffffff; } .module-typing-animation__dot { background-color: #5e5e5e; } .page-is-visible .module-typing-animation__dot { animation-name: typing-animation; animation-duration: 1600ms; animation-timing-function: ease; animation-iteration-count: infinite; } .page-is-visible .module-left-pane .module-typing-animation__dot { animation-name: typing-animation-bare; } .module-typing-animation__dot--light { background-color: #ffffff; } .module-typing-animation__dot--light { background-color: #5e5e5e; } @keyframes typing-animation { 0% { opacity: 0.4; } 20% { transform: scale(1.3); opacity: 1; } 40% { opacity: 0.4; } } @keyframes typing-animation-bare { 0% { opacity: 0.4; } 20% { opacity: 1; } 40% { opacity: 0.4; } } .module-typing-animation__dot--second { animation-delay: 160ms; } .module-typing-animation__dot--third { animation-delay: 320ms; } .module-typing-animation__spacer { flex-grow: 1; } .module-attachments__header { height: 24px; position: relative; } .module-attachments__edit-icon { align-items: center; background: rgba(0, 0, 0, 0.6); border-radius: 100%; display: flex; height: 36px; justify-content: center; inset-inline-start: 50%; margin-inline-start: -20px; margin-top: -18px; position: absolute; top: 50%; visibility: hidden; width: 36px; } .module-attachments__edit-icon::after { -webkit-mask: url("../images/icons/v3/edit/edit-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .module-attachments__edit-icon::after { background-color: WindowText; } } .module-attachments__edit-icon::after { content: ""; height: 20px; width: 20px; } .module-attachments--editable { display: inline-block; position: relative; } .module-attachments--editable:hover .module-attachments__edit-icon { visibility: visible; } .module-attachments__close-button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-attachments__close-button { border: 1px solid WindowText; } } .module-attachments__close-button { position: absolute; top: 8px; inset-inline-end: 16px; width: 20px; height: 20px; z-index: 2; } .module-attachments__close-button { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .module-attachments__close-button { background-color: WindowText; } } .dark-theme .module-attachments__close-button { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .dark-theme .module-attachments__close-button { background-color: WindowText; } } .keyboard-mode .module-attachments__close-button:focus { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #2c6bed; } @media (forced-colors: active) { .keyboard-mode .module-attachments__close-button:focus { background-color: WindowText; } } .module-attachments__rail { margin-top: 12px; margin-inline-start: 12px; padding-inline-end: 12px; overflow-x: scroll; max-height: 142px; white-space: nowrap; overflow-y: hidden; margin-bottom: 6px; } .module-staged-attachment { margin-inline-end: 8px; } .module-staged-attachment.module-image::before { background: linear-gradient(180deg, rgba(0, 0, 0, 0.3) 0%, transparent 100%); content: ""; display: block; height: 40px; opacity: 0; position: absolute; transition: opacity 0.2s ease-out; width: 100%; } .module-staged-attachment.module-image:hover::before { opacity: 1; } .module-staged-generic-attachment { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 5px; height: 120px; width: 120px; position: relative; border-radius: 4px; padding: 7px; vertical-align: middle; white-space: nowrap; } .module-staged-generic-attachment { box-shadow: inset 0px 0px 0px 1px rgba(0, 0, 0, 0.2); background-color: #e9e9e9; } .dark-theme .module-staged-generic-attachment { box-shadow: inset 0px 0px 0px 1px #848484; background-color: #3b3b3b; color: #f6f6f6; } .module-staged-generic-attachment__close-button { position: absolute; inset-inline-end: 5px; top: 0; } .module-staged-generic-attachment__close-button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-staged-generic-attachment__close-button { border: 1px solid WindowText; } } .module-staged-generic-attachment__close-button { position: absolute; top: 4px; inset-inline-end: 4px; width: 16px; height: 16px; z-index: 2; } .module-staged-generic-attachment__close-button { -webkit-mask: url("../images/icons/v3/x/x-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .module-staged-generic-attachment__close-button { background-color: WindowText; } } .dark-theme .module-staged-generic-attachment__close-button { -webkit-mask: url("../images/icons/v3/x/x-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #848484; } @media (forced-colors: active) { .dark-theme .module-staged-generic-attachment__close-button { background-color: WindowText; } } .module-staged-generic-attachment__filename { font-size: 11px; line-height: 14px; letter-spacing: 0.06px; max-width: 100%; text-align: center; overflow: hidden; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; text-overflow: ellipsis; } .module-staged-placeholder-attachment { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-staged-placeholder-attachment { border: 1px solid WindowText; } } .module-staged-placeholder-attachment { margin: 1px; border-radius: 4px; height: 120px; width: 120px; display: inline-block; vertical-align: middle; position: relative; } .module-staged-placeholder-attachment { border: 1px solid #b9b9b9; } .module-staged-placeholder-attachment:hover { background: #e9e9e9; } .keyboard-mode .module-staged-placeholder-attachment:focus { box-shadow: inset 0 0 0 2px #2c6bed; } .dark-theme .module-staged-placeholder-attachment { border: 1px solid #5e5e5e; } .dark-theme .module-staged-placeholder-attachment:hover { background: #3b3b3b; } .dark-theme.keyboard-mode .module-staged-placeholder-attachment:focus { box-shadow: inset 0 0 0 2px #2c6bed; } .module-staged-placeholder-attachment__plus-icon { position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); height: 28px; width: 28px; } .module-staged-placeholder-attachment__plus-icon { -webkit-mask: url("../images/icons/v3/plus/plus-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #848484; } @media (forced-colors: active) { .module-staged-placeholder-attachment__plus-icon { background-color: WindowText; } } .dark-theme .module-staged-placeholder-attachment__plus-icon { -webkit-mask: url("../images/icons/v3/plus/plus-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .dark-theme .module-staged-placeholder-attachment__plus-icon { background-color: WindowText; } } .module-payment-notification__container { display: block; } .module-payment-notification__label { margin-block: 0 7px; margin-inline: 0; font-size: 12px; line-height: 16px; letter-spacing: 0; } .module-payment-notification__label { color: #5e5e5e; } .dark-theme .module-payment-notification__label { color: #b9b9b9; } .module-payment-notification__check_device_box { display: flex; gap: 9px; align-items: center; font-size: 13px; line-height: 18px; letter-spacing: -0.03px; padding-block: 22px; padding-inline: 7px; padding-inline-start: 12px; border-radius: 18px; margin-block: 0; margin-inline: -4px; } .module-payment-notification__check_device_box { background: rgba(255, 255, 255, 0.6); color: #1b1b1b; } .dark-theme .module-payment-notification__check_device_box { background: rgba(255, 255, 255, 0.2); color: #ffffff; } .module-payment-notification__check_device_box::before { content: ""; display: block; flex-shrink: 0; width: 16px; height: 16px; } .module-payment-notification__check_device_box::before { -webkit-mask: url("../images/icons/v3/info/info.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentcolor; } @media (forced-colors: active) { .module-payment-notification__check_device_box::before { background-color: WindowText; } } .module-payment-notification__note { margin-block: 9px 0; margin-inline: 0; font-size: 14px; line-height: 20px; letter-spacing: -0.08px; } .module-payment-notification--outgoing .module-payment-notification__label { color: rgba(255, 255, 255, 0.8); } .dark-theme .module-payment-notification--outgoing .module-payment-notification__label { color: rgba(255, 255, 255, 0.8); } .module-payment-notification--outgoing .module-payment-notification__check_device_box { background: rgba(255, 255, 255, 0.2); color: #ffffff; } .module-spinner__container { margin-inline: auto; position: relative; height: 56px; width: 56px; } .module-spinner__circle { position: absolute; top: 0; inset-inline-start: 0; z-index: 2; height: 100%; width: 100%; } .module-spinner__circle { -webkit-mask: url("../images/spinner-track-56.svg") no-repeat center; -webkit-mask-size: 100%; background-color: rgba(255, 255, 255, 0.4); } @media (forced-colors: active) { .module-spinner__circle { background-color: WindowText; } } .module-spinner__arc { position: absolute; top: 0; inset-inline-start: 0; z-index: 3; height: 100%; width: 100%; animation: rotate 1000ms linear infinite; } .module-spinner__arc { -webkit-mask: url("../images/spinner-56.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .module-spinner__arc { background-color: WindowText; } } .dark-theme .module-spinner__arc { -webkit-mask: url("../images/spinner-56.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #e9e9e9; } @media (forced-colors: active) { .dark-theme .module-spinner__arc { background-color: WindowText; } } .module-spinner__container--small { height: 24px; width: 24px; } .module-spinner__circle--small { -webkit-mask: url("../images/spinner-track-24.svg") no-repeat center; -webkit-mask-size: 100%; } .dark-theme .module-spinner__circle--small { -webkit-mask: url("../images/spinner-track-24.svg") no-repeat center; -webkit-mask-size: 100%; } .module-spinner__arc--small { -webkit-mask: url("../images/spinner-24.svg") no-repeat center; -webkit-mask-size: 100%; } .dark-theme .module-spinner__arc--small { -webkit-mask: url("../images/spinner-24.svg") no-repeat center; -webkit-mask-size: 100%; } .module-spinner__circle--incoming { background-color: rgba(255, 255, 255, 0.4); } .module-spinner__arc--incoming { background-color: #5e5e5e; } .dark-theme .module-spinner__arc--incoming { background-color: #f6f6f6; } .module-spinner__circle--outgoing { background-color: rgba(255, 255, 255, 0.4); } .dark-theme .module-spinner__circle--outgoing { background-color: rgba(255, 255, 255, 0.4); } .module-spinner__arc--outgoing { background-color: #ffffff; } .dark-theme .module-spinner__arc--outgoing { background-color: #e9e9e9; } .module-spinner__circle--on-avatar { background-color: rgba(255, 255, 255, 0.4); } .module-spinner__circle--on-background { background-color: #e9e9e9; } .dark-theme .module-spinner__circle--on-background { background-color: #3b3b3b; } .module-spinner__arc--on-background { background-color: #5e5e5e; } .dark-theme .module-spinner__arc--on-background { background-color: #b9b9b9; } .module-spinner__circle--on-primary-button { background-color: rgba(255, 255, 255, 0.4); } .module-spinner__circle--on-progress-dialog { background-color: #ffffff; } .dark-theme .module-spinner__circle--on-progress-dialog { background-color: #2e2e2e; } .module-spinner__arc--on-progress-dialog { background-color: #2c6bed; } .module-spinner__arc--on-avatar { background-color: #ffffff; } .module-spinner__arc--on-primary-button { background-color: #ffffff; } .module-reaction-viewer { width: 320px; height: 320px; border-radius: 8px; display: flex; flex-direction: column; } .module-reaction-viewer { box-shadow: 0px 8px 20px rgba(0, 0, 0, 0.3), 0px 0px 8px rgba(0, 0, 0, 0.05); } @media (forced-colors: active) { .module-reaction-viewer { border: 1px solid WindowText; } } .module-reaction-viewer { background: #ffffff; } .dark-theme .module-reaction-viewer { background: #3b3b3b; } .module-reaction-viewer__header { width: 100%; min-height: 44px; padding-block: 0px; padding-inline: 8px; display: flex; flex-direction: row; justify-content: flex-start; align-items: center; overflow-x: auto; } .module-reaction-viewer__header__button { min-height: 28px; border: none; border-radius: 18px; padding-block: 0px; padding-inline: 8px; display: flex; justify-content: center; align-items: center; flex-basis: 45px; flex-shrink: 0; background: none; } .module-reaction-viewer__header__button:not(:first-of-type) { margin-inline-start: 4px; } .module-reaction-viewer__header__button:focus { outline: none; } .keyboard-mode .module-reaction-viewer__header__button:focus { box-shadow: 0px 0px 0px 2px #2c6bed; } .module-reaction-viewer__header__button--selected { background: #e9e9e9; } .dark-theme .module-reaction-viewer__header__button--selected { background: #5e5e5e; } .module-reaction-viewer__header__button__count, .module-reaction-viewer__header__button__all { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; font-weight: 600; white-space: nowrap; } .module-reaction-viewer__header__button__count, .module-reaction-viewer__header__button__all { color: #1b1b1b; } .dark-theme .module-reaction-viewer__header__button__count, .dark-theme .module-reaction-viewer__header__button__all { color: #e9e9e9; } .module-reaction-viewer__header__button__count { margin-inline-start: 4px; } .module-reaction-viewer__body { flex-grow: 1; padding-block: 0; padding-inline: 16px; overflow: auto; } .module-reaction-viewer__body__row { margin-top: 12px; min-height: 32px; display: flex; flex-direction: row; justify-content: flex-start; align-items: center; } .module-reaction-viewer__body__row:last-of-type { margin-bottom: 12px; } .module-reaction-viewer__body__row__avatar { min-width: 32px; flex-shrink: 1; } .module-reaction-viewer__body__row__name { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; flex-grow: 1; margin-inline-start: 8px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .module-reaction-viewer__body__row__name { color: #1b1b1b; } .dark-theme .module-reaction-viewer__body__row__name { color: #e9e9e9; } .module-reaction-viewer__body__row__emoji { width: 18px; flex-shrink: 1; } .module-calling__modal-container { position: fixed; top: 0; inset-inline-start: 0; z-index: 100; } .module-calling__container { align-items: center; background-color: #1b1b1b; display: flex; flex-direction: column; height: 100vh; justify-content: center; position: fixed; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 0; top: 0; width: 100%; z-index: 101; } .module-calling__background { position: absolute; inset-inline-start: 0; inset-inline-end: 0; top: 0; bottom: 0; display: flex; align-items: center; flex-direction: column; justify-content: center; overflow: hidden; } .module-calling__background--darken { position: absolute; height: 100%; width: 100%; background-color: rgba(94, 94, 94, 0.6); } .module-calling__background--blur { background-repeat: no-repeat; background-size: cover; background-position: center; filter: blur(25px); height: 100%; position: absolute; width: 100%; transform: scale(1.2, 1.2); } .module-calling__camera-is-off { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; text-shadow: 0 0 4px rgba(0, 0, 0, 0.4); align-items: center; color: #ffffff; display: flex; flex-direction: column; flex-grow: 1; margin-block-start: 15px; margin-block-end: 15px; justify-content: center; text-align: center; transition: opacity 100ms ease-out; user-select: none; z-index: 1; } .module-calling__camera-is-off::before { content: ""; display: block; background-color: #ffffff; -webkit-mask-repeat: no-repeat; -webkit-mask-position: center; -webkit-mask-size: 100%; -webkit-mask-image: url("../images/icons/v3/video/video-slash-light.svg"); height: 24px; width: 24px; margin-block-end: 12px; } .module-calling__camera-is-off-spacer { flex-basis: 120px; } .module-calling__spacer { display: flex; flex-grow: 0; flex-shrink: 1; } @keyframes module-ongoing-call__controls--fade-in { from { opacity: 0; } to { opacity: 1; } } @keyframes module-ongoing-call__controls--fade-out { from { opacity: 1; } to { opacity: 0; } } .module-ongoing-call__container--hide-controls .module-ongoing-call__prev-page, .module-ongoing-call__container--hide-controls .module-ongoing-call__next-page { animation-name: module-ongoing-call__controls--fade-out; animation-duration: 1200ms; animation-timing-function: cubic-bezier(0.19, 1, 0.22, 1); animation-fill-mode: forwards; pointer-events: none; } .module-ongoing-call__remote-video-enabled { height: 100%; width: 100%; position: relative; } .module-ongoing-call__remote-video-enabled--reconnecting { filter: blur(15px); } .module-ongoing-call__remote-video-disabled { background-color: #121212; height: 100vh; width: 100%; display: flex; position: relative; align-items: center; justify-content: center; } .module-ongoing-call__container--direct:not(.module-ongoing-call__container--call-not-started) .module-ongoing-call__footer { position: absolute; } .module-ongoing-call__next-page, .module-ongoing-call__prev-page { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-ongoing-call__next-page, .module-ongoing-call__prev-page { border: 1px solid WindowText; } } .module-ongoing-call__next-page, .module-ongoing-call__prev-page { position: absolute; top: 50%; transform: translateY(-50%); height: 32px; width: 32px; display: flex; justify-content: center; align-items: center; border-radius: 50%; background-color: #343434; z-index: 3; } .module-ongoing-call__next-page--arrow, .module-ongoing-call__prev-page--arrow { width: 20px; height: 20px; } .module-ongoing-call__next-page { inset-inline-end: 4px; } .module-ongoing-call__next-page--arrow { -webkit-mask: url("../images/icons/v3/chevron/chevron-right.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .module-ongoing-call__next-page--arrow { background-color: WindowText; } } :dir(rtl) .module-ongoing-call__next-page--arrow { -webkit-mask: url("../images/icons/v3/chevron/chevron-left.svg") no-repeat center; } .module-ongoing-call__prev-page { inset-inline-start: 4px; } .module-ongoing-call__prev-page--arrow { -webkit-mask: url("../images/icons/v3/chevron/chevron-left.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .module-ongoing-call__prev-page--arrow { background-color: WindowText; } } :dir(rtl) .module-ongoing-call__prev-page--arrow { -webkit-mask: url("../images/icons/v3/chevron/chevron-right.svg") no-repeat center; } .module-ongoing-call__direct-call-ringing-spacer { flex: 1; z-index: -1; } .module-ongoing-call__direct-call-speaking-indicator { position: absolute; inset-inline-end: 16px; bottom: 112px; transition: bottom 0.3s cubic-bezier(0.17, 0.17, 0, 1); } .module-ongoing-call__direct-call-speaking-indicator--self-view-expanded { bottom: 330px; } .module-ongoing-call__direct-call-speaking-indicator--expanded-no-controls { bottom: 232px; } .module-ongoing-call__participants { display: flex; flex: 1 1 0; width: 100%; margin-block-start: 24px; z-index: 2; -webkit-app-region: no-drag; } .module-ongoing-call__participants__grid--wrapper { margin-block-start: 26px; margin-block-end: 16px; margin-inline: 16px; display: flex; width: 100%; } .module-ongoing-call__participants__grid { flex-grow: 1; position: relative; } .module-ongoing-call__participants__grid .module-ongoing-call__group-call-remote-participant--hand-raised .module-ongoing-call__group-call-remote-participant__info__contact-name { display: block; visibility: visible; } .module-ongoing-call__participants__grid .module-ongoing-call__group-call-remote-participant { container-type: size; position: relative; } @container (min-width: 180px) or (min-height: 180px) { .module-ongoing-call__participants__grid .module-ongoing-call__group-call-remote-participant .module-ongoing-call__group-call-remote-participant__footer { padding-block: 0 14px; padding-inline: 16px; } .module-ongoing-call__participants__grid .module-ongoing-call__group-call-remote-participant .module-ongoing-call__group-call-remote-participant__error { display: block; } } .module-ongoing-call__participants__grid .module-ongoing-call__group-call-remote-participant--hand-raised .module-ongoing-call__group-call-remote-participant__footer { padding-block: 0 8px; padding-inline: 8px; } .module-ongoing-call__participants__overflow { flex: 0 0 auto; position: relative; margin-block-start: calc(60px + var(--title-bar-drag-area-height)); margin-inline-end: 16px; } .module-ongoing-call__participants__overflow__inner { position: absolute; bottom: 0; inset-inline-start: 0; width: 100%; max-height: 100%; overflow-y: scroll; scrollbar-width: none; } .module-ongoing-call__participants__overflow .module-ongoing-call__group-call-remote-participant { width: 100%; margin-bottom: 1rem; } .module-ongoing-call__participants__overflow .module-ongoing-call__group-call-remote-participant__footer { height: 40px; padding-block: 0 8px; padding-inline: 10px; } .module-ongoing-call__participants__overflow .module-ongoing-call__group-call-remote-participant--hand-raised .module-ongoing-call__group-call-remote-participant__footer { padding-block: 0 6px; padding-inline: 6px; } .module-ongoing-call__participants__overflow__scroll-marker { scroll-behavior: smooth; } @media (prefers-reduced-motion) { .module-ongoing-call__participants__overflow__scroll-marker { scroll-behavior: auto; } } .module-ongoing-call__participants__overflow__scroll-marker { display: flex; justify-content: center; inset-inline-start: 0; opacity: 1; position: absolute; transition: opacity 200ms ease-out; width: 100%; z-index: 3; } .module-ongoing-call__participants__overflow__scroll-marker--hidden { opacity: 0; } .module-ongoing-call__participants__overflow__scroll-marker__button::before { -webkit-mask: url("../images/icons/v3/chevron/chevron-down.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .module-ongoing-call__participants__overflow__scroll-marker__button::before { background-color: WindowText; } } .module-ongoing-call__participants__overflow__scroll-marker__button::before { content: ""; display: block; height: 100%; width: 100%; } .module-ongoing-call__participants__overflow__scroll-marker__button { background: #343434; border-radius: 100%; border: 0; height: 24px; padding-inline: 4px; margin-inline: 0; opacity: 0; outline: none; transition: opacity 200ms ease-out; width: 24px; } .module-ongoing-call__participants__overflow__scroll-marker--top { top: 0; background: linear-gradient(#1b1b1b, transparent 20px, transparent); } .module-ongoing-call__participants__overflow__scroll-marker--top .module-ongoing-call__participants__overflow__scroll-marker__button { margin-block-start: 16px; transform: rotate(180deg); } .module-ongoing-call__participants__overflow__scroll-marker--bottom { bottom: 0; background: linear-gradient(to top, #1b1b1b, transparent 20px, transparent); } .module-ongoing-call__participants__overflow__scroll-marker--bottom .module-ongoing-call__participants__overflow__scroll-marker__button { margin-block-end: 16px; } .module-ongoing-call__participants__overflow:hover .module-ongoing-call__participants__overflow__scroll-marker__button { opacity: 1; } .module-ongoing-call__group-call--pagination-tile { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-ongoing-call__group-call--pagination-tile { border: 1px solid WindowText; } } .module-ongoing-call__group-call--pagination-tile { position: absolute; border-radius: 10px; background-color: #343434; display: flex; justify-content: center; align-items: center; font-size: 14px; line-height: 20px; letter-spacing: -0.08px; color: #c6c6c6; } .module-ongoing-call__group-call--pagination-tile--next-arrow { -webkit-mask: url("../images/icons/v3/chevron/chevron-right.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #c6c6c6; } @media (forced-colors: active) { .module-ongoing-call__group-call--pagination-tile--next-arrow { background-color: WindowText; } } :dir(rtl) .module-ongoing-call__group-call--pagination-tile--next-arrow { -webkit-mask: url("../images/icons/v3/chevron/chevron-left.svg") no-repeat center; } .module-ongoing-call__group-call--pagination-tile--next-arrow { height: 16px; width: 16px; } .module-ongoing-call__group-call--pagination-tile--prev-arrow { -webkit-mask: url("../images/icons/v3/chevron/chevron-left.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #c6c6c6; } @media (forced-colors: active) { .module-ongoing-call__group-call--pagination-tile--prev-arrow { background-color: WindowText; } } :dir(rtl) .module-ongoing-call__group-call--pagination-tile--prev-arrow { -webkit-mask: url("../images/icons/v3/chevron/chevron-right.svg") no-repeat center; } .module-ongoing-call__group-call--pagination-tile--prev-arrow { height: 16px; width: 16px; } .module-ongoing-call__group-call-remote-participant { display: flex; justify-content: center; position: relative; line-height: 0; overflow: hidden; border-radius: 10px; transition: top 200ms linear, inset-inline-start 200ms linear, transform 200ms linear, width 200ms linear, height 200ms linear; } @media (prefers-reduced-motion) { .module-ongoing-call__group-call-remote-participant { transition: none; } } .module-ongoing-call__group-call-remote-participant:after { content: ""; position: absolute; z-index: 3; width: 100%; height: 100%; border: 0 solid transparent; border-radius: 10px; transition-property: border-width, border-color; transition-duration: 300ms; transition-delay: 1000ms; transition-timing-function: ease-in-out; pointer-events: none; } .module-ongoing-call__group-call-remote-participant--speaking:after { border-width: 3px; border-color: #ffffff; transition-duration: 0ms; transition-delay: 0ms; } .module-ongoing-call__group-call-remote-participant__remote-video { background-color: #3b3b3b; } .module-ongoing-call__group-call-remote-participant__remote-video--reconnecting { filter: blur(15px); } .module-ongoing-call__group-call-remote-participant-background.module-calling__background--no-avatar { background-color: #343434; } .module-ongoing-call__group-call-remote-participant-background .module-calling__background--blur { pointer-events: none; } .module-ongoing-call__group-call-remote-participant__error { display: none; margin-block-end: 16px; margin-inline: 8px; font-size: 12px; line-height: 16px; color: #ffffff; text-align: center; z-index: 1; } .module-ongoing-call__group-call-remote-participant__more-info { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-ongoing-call__group-call-remote-participant__more-info { border: 1px solid WindowText; } } .module-ongoing-call__group-call-remote-participant__more-info { padding-block: 3px; padding-inline: 10px; border-radius: 16px; background-color: rgba(0, 0, 0, 0.3); color: #ffffff; font-size: 12px; line-height: 16px; text-overflow: ellipsis; white-space: nowrap; z-index: 2; } .module-ongoing-call__group-call-remote-participant__more-info-modal-title { -webkit-box-orient: vertical; -webkit-line-clamp: 2; display: -webkit-box; overflow: hidden; text-overflow: ellipsis; } .module-ongoing-call__group-call-remote-participant__more-info--icon { width: 20px; height: 20px; } .module-ongoing-call__group-call-remote-participant__more-info--icon-blocked { -webkit-mask: url("../images/icons/v3/block/block.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .module-ongoing-call__group-call-remote-participant__more-info--icon-blocked { background-color: WindowText; } } .module-ongoing-call__group-call-remote-participant__more-info--icon-missing-media-keys { -webkit-mask: url("../images/icons/v3/error/error-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .module-ongoing-call__group-call-remote-participant__more-info--icon-missing-media-keys { background-color: WindowText; } } .module-ongoing-call__group-call-remote-participant__error-icon { width: 20px; height: 20px; margin-block-end: 12px; } .module-ongoing-call__group-call-remote-participant__error-icon--blocked { -webkit-mask: url("../images/icons/v3/block/block.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .module-ongoing-call__group-call-remote-participant__error-icon--blocked { background-color: WindowText; } } .module-ongoing-call__group-call-remote-participant__error-icon--missing-media-keys { -webkit-mask: url("../images/icons/v3/error/error-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .module-ongoing-call__group-call-remote-participant__error-icon--missing-media-keys { background-color: WindowText; } } .module-ongoing-call__group-call-remote-participant__footer { display: flex; position: absolute; bottom: 0; height: 60px; padding-block: 0 10px; padding-inline: 12px; user-select: none; width: 100%; z-index: 2; } .module-ongoing-call__group-call-remote-participant__info { display: flex; align-items: center; align-self: flex-end; justify-content: space-between; max-width: 100%; } .module-ongoing-call__group-call-remote-participant__info__contact-name { flex-grow: 1; font-size: 13px; line-height: 18px; color: #ffffff; overflow: hidden; text-overflow: ellipsis; visibility: hidden; direction: inherit; white-space: nowrap; } .module-ongoing-call__group-call-remote-participant__info--clickable { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-ongoing-call__group-call-remote-participant__info--clickable { border: 1px solid WindowText; } } .module-ongoing-call__group-call-remote-participant--hand-raised .module-ongoing-call__group-call-remote-participant__footer { background: transparent; } .module-ongoing-call__group-call-remote-participant--hand-raised .module-ongoing-call__group-call-remote-participant__info { background: #ffffff; border-radius: 40px; } .module-ongoing-call__group-call-remote-participant--hand-raised .module-ongoing-call__group-call-remote-participant__info__contact-name { display: none; color: #000000; margin-inline-end: 12px; } .module-ongoing-call__group-call-remote-participant--is-on-top { z-index: 3; } .module-ongoing-call__group-call-remote-participant:hover .module-ongoing-call__group-call-remote-participant__info__contact-name { display: block; visibility: visible; } .module-ongoing-call__group-call-remote-participant:hover:not(.module-ongoing-call__group-call-remote-participant--hand-raised) .module-ongoing-call__group-call-remote-participant__footer { background: linear-gradient(180deg, transparent, rgba(0, 0, 0, 0.6) 100%); } .module-ongoing-call__local-preview-container { display: contents; } .module-ongoing-call__local-preview-fullsize { position: absolute; top: 0; display: flex; align-items: center; justify-content: center; width: 100%; height: 100%; z-index: -1; } .module-ongoing-call__local-preview-fullsize video { max-height: calc(100% - 24px); height: auto; transform: rotateY(180deg); width: calc(100% - 24px); border-radius: 8px; } .module-ongoing-call__local-preview-fullsize--presenting video { transform: none; } .module-ongoing-call__local-preview { z-index: 104; border-radius: 12px; position: absolute; display: flex; height: 80px; width: 106.67px; inset-inline-end: 16px; bottom: 16px; transition: all 0.3s cubic-bezier(0.17, 0.17, 0, 1); overflow: hidden; cursor: pointer; } .module-ongoing-call__local-preview--active { box-shadow: 0px 4px 14px 0px rgba(0, 0, 0, 0.4); } .module-ongoing-call__local-preview--expanded { bottom: 112px; width: 312px; height: 234px; } .module-ongoing-call__local-preview--controls-hidden { bottom: 16px; } .module-ongoing-call__local-preview__background { background-color: #343434; } .module-ongoing-call__local-preview__video { height: 100%; width: 100%; } .module-ongoing-call__local-preview__video video { background-color: #3b3b3b; height: 100%; width: 100%; transform: rotateY(180deg); } .module-ongoing-call__local-preview__video--presenting video { transform: inherit; } .module-ongoing-call__footer { bottom: 0; display: flex; flex-direction: row-reverse; justify-content: space-between; width: 100%; z-index: 2; } .module-ongoing-call__footer__actions { align-items: center; display: flex; flex-grow: 1; justify-content: center; } .module-ongoing-call__controls { z-index: 3; } .module-ongoing-call__controls--fadeIn { animation-name: module-ongoing-call__controls--fade-in; animation-duration: 1200ms; animation-timing-function: cubic-bezier(0.19, 1, 0.22, 1); animation-fill-mode: forwards; } .module-ongoing-call__controls--fadeOut { animation-name: module-ongoing-call__controls--fade-out; animation-duration: 1200ms; animation-timing-function: cubic-bezier(0.19, 1, 0.22, 1); animation-fill-mode: forwards; pointer-events: none; } .module-calling-tools { position: absolute; top: calc(32px + var(--title-bar-drag-area-height)); inset-inline-end: 0; display: flex; } .module-calling-tools__button { margin-inline-end: 12px; } .module-calling-tools__button:last-child { margin-inline-end: 24px; } .module-calling-tools .ContextMenu__container { background: none; text-wrap: nowrap; } .module-calling-pip { backface-visibility: hidden; background-color: #121212; border-radius: 18px; box-shadow: 0px 0px 8px rgba(0, 0, 0, 0.05), 0px 8px 20px rgba(0, 0, 0, 0.3); cursor: grab; height: 286px; width: 160px; position: fixed; z-index: 104; overflow: hidden; } .module-calling-pip .module-ongoing-call__group-call-remote-participant { border-radius: 0; } .module-calling-pip__video--remote { align-items: center; background-color: #121212; border-radius: 18px; height: 100%; width: 100%; display: flex; justify-content: center; overflow: hidden; position: relative; } .module-calling-pip__video--remote .module-Avatar img { -webkit-user-drag: none; -webkit-user-select: none; } .module-calling-pip__video--remote .module-calling__background--no-avatar { background: transparent; } .module-calling-pip__video--local, .module-calling-pip__video--local-presenting { position: absolute; top: 8px; inset-inline-start: 8px; height: 60px; width: 80px; border-radius: 12px; overflow: hidden; background-color: #2e2e2e; } .module-calling-pip__video--local video, .module-calling-pip__video--local-presenting video { width: 100%; height: 100%; object-fit: contain; } .module-calling-pip__video--local video { transform: rotateY(180deg); } .module-calling-pip__full-size-local-preview { width: 100%; height: 100%; object-fit: contain; position: relative; } .module-calling-pip__full-size-local-preview video { width: 100%; height: 100%; transform: rotateY(180deg); object-fit: contain; } .module-calling-pip__full-size-local-preview--presenting video { transform: none; } .module-calling-pip__pills { display: flex; flex-direction: row; align-items: center; position: absolute; bottom: 66px; inset-inline-start: 8px; transition: bottom 0.5s cubic-bezier(0.17, 0.17, 0, 1); } .module-calling-pip__pills--no-controls { bottom: 8px; } .module-calling-pip__pill { height: 28px; border-radius: 14px; padding: 6px; padding-inline-start: 12px; padding-inline-end: 12px; background-color: #2e2e2e; color: #e9e9e9; display: flex; flex-direction: row; align-items: center; font-size: 12px; line-height: 16px; letter-spacing: 0px; } .module-calling-pip__pill-icon { height: 16px; width: 16px; margin-inline-end: 4px; } .module-calling-pip__pill-icon__raised-hands { -webkit-mask: url("../images/icons/v3/raise_hand/raise_hand.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #e9e9e9; } @media (forced-colors: active) { .module-calling-pip__pill-icon__raised-hands { background-color: WindowText; } } .module-calling-pip__pill-icon__group-join { -webkit-mask: url("../images/icons/v3/person/person-plus-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #e9e9e9; } @media (forced-colors: active) { .module-calling-pip__pill-icon__group-join { background-color: WindowText; } } .module-calling-pip__actions { position: absolute; bottom: -60px; inset-inline-start: 4px; inset-inline-end: 4px; padding: 12px; height: 56px; opacity: 0; transition: all 0.5s cubic-bezier(0.17, 0.17, 0, 1); display: flex; align-items: center; flex-direction: row; border-radius: 18px; justify-content: space-around; background-color: #343434; } .module-calling-pip__actions--visible { opacity: 1; bottom: 4px; } .module-calling-pip__actions__spacer { flex-grow: 1; flex-shrink: 1; } .module-calling-pip__actions__button { flex-shrink: 0; flex-grow: 0; } .module-calling-pip__actions__middle-button { width: 62px; text-align: center; flex-shrink: 0; flex-grow: 0; } .module-calling-pip__actions .CallingButton__icon { height: 32px; width: 32px; } .module-calling-pip__un-pip-container { position: absolute; top: 16px; inset-inline-end: 16px; opacity: 0; transition: opacity 0.5s cubic-bezier(0.17, 0.17, 0, 1); } .module-calling-pip__un-pip-container--visible { opacity: 1; } .module-calling-pip__button--hangup { -webkit-mask: url("../images/icons/v3/phone/phone-down-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .module-calling-pip__button--hangup { background-color: WindowText; } } .module-calling-pip__button--hangup { height: 28px; width: 28px; border: none; } .dark-theme .module-calling-pip__button--hangup { -webkit-mask: url("../images/icons/v3/phone/phone-down-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .module-calling-pip__button--hangup { background-color: WindowText; } } .module-calling-pip__button--pip { -webkit-mask: url("../images/icons/v3/pip/pip-maximize-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .module-calling-pip__button--pip { background-color: WindowText; } } .module-calling-pip__button--pip { height: 24px; width: 24px; border: none; } .dark-theme .module-calling-pip__button--pip { -webkit-mask: url("../images/icons/v3/pip/pip-maximize-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .module-calling-pip__button--pip { background-color: WindowText; } } .module-calling-participants-list { display: flex; flex-direction: column; width: 320px; height: 440px; max-height: calc(100vh - 80px - 22px); padding-block: 5px 0; padding-inline: 5px; margin-block-end: 85px; margin-block-start: 20px; margin-inline: auto; background-color: #2e2e2e; border-radius: 10px; color: #ffffff; filter: drop-shadow(0px 4px 3px rgba(0, 0, 0, 0.2)); outline: 1px solid #545454; overflow: hidden; } .module-calling-participants-list__overlay { position: absolute; top: 0; display: flex; flex-direction: row; width: 100vw; height: 100vh; padding-inline-start: 15px; align-items: flex-end; inset-inline-start: 0; z-index: 101; } .module-calling-participants-list__overlay::after { content: ""; display: flex; flex-shrink: 1; flex-basis: 480px; } .module-calling-participants-list__title { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; font-weight: 600; } .module-calling-participants-list__contact-icon { margin-inline-start: 0.3em; background-color: #b9b9b9; } .module-calling-participants-list__list { height: 100%; overflow: auto; margin: 0; padding-block: 0; padding-inline: 0; } .module-calling-participants-list__contact { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; } .module-calling-participants-list__contact { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-calling-participants-list__contact { border: 1px solid WindowText; } } .module-calling-participants-list__contact { display: flex; align-items: center; width: 100%; margin-block: 2px; padding-block: 8px; padding-inline-start: 10px; padding-inline-end: 2px; list-style-type: none; border-radius: 6px; cursor: auto; } .module-calling-participants-list__contact:hover { background-color: #545454; } .module-calling-participants-list__contact[disabled] { cursor: auto; } .module-calling-participants-list__avatar-and-name { display: flex; flex-grow: 1; min-width: 0; align-items: center; } .module-calling-participants-list__name { display: inline-block; font-size: 13px; margin-inline-start: 8px; overflow: hidden; text-overflow: ellipsis; vertical-align: middle; white-space: nowrap; } .module-calling-participants-list__header { display: flex; justify-content: space-between; margin-block-end: 2px; padding-block: 8px; padding-inline: 10px 5px; } .module-calling-participants-list__close { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-calling-participants-list__close { border: 1px solid WindowText; } } .module-calling-participants-list__close { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .module-calling-participants-list__close { background-color: WindowText; } } .module-calling-participants-list__close { height: 18px; width: 18px; margin-inline-end: 4px; z-index: 2; } .keyboard-mode .module-calling-participants-list__close:focus { background: #2c6bed; } .module-calling-participants-list__status-icon { display: flex; flex: none; margin-inline: 8px; height: 16px; width: 16px; } .module-calling-participants-list__hand-raised { -webkit-mask: url("../images/icons/v3/raise_hand/raise_hand-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .module-calling-participants-list__hand-raised { background-color: WindowText; } } .module-calling-participants-list__muted--video { -webkit-mask: url("../images/icons/v3/video/video-slash-compact-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .module-calling-participants-list__muted--video { background-color: WindowText; } } .module-calling-participants-list__muted--audio { -webkit-mask: url("../images/icons/v3/mic/mic-slash-compact-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .module-calling-participants-list__muted--audio { background-color: WindowText; } } .module-calling-participants-list__presenting { -webkit-mask: url("../images/icons/v3/share_screen/share_screen-fill-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .module-calling-participants-list__presenting { background-color: WindowText; } } .module-calling-participants-list__remove { -webkit-mask: url("../images/icons/v3/minus/minus-circle-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .module-calling-participants-list__remove { background-color: WindowText; } } button.module-calling-participants-list__contact { cursor: pointer; } .module-call-need-permission-screen { align-items: center; background-color: #121212; color: #e9e9e9; display: flex; flex-direction: column; height: 100vh; justify-content: center; position: fixed; top: 0; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 0; width: 100%; } .module-call-need-permission-screen__text { margin-block: 2em; margin-inline: 1em; max-width: 400px; font-size: 14px; line-height: 20px; letter-spacing: -0.08px; text-align: center; } .module-call-need-permission-screen__button { padding-block: 0.5em; padding-inline: 1em; border: 0; border-radius: 4px; font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; color: #e9e9e9; background: #4a4a4a; } .module-conversation-list { scrollbar-gutter: stable; padding-inline-start: 11px; padding-inline-end: calc(11px - var(--axo-scrollbar-gutter-thin-vertical)); } .module-conversation-list:not(:hover, :focus-within) { scrollbar-color: transparent transparent; } .module-left-pane--mode-choose-group-members .module-conversation-list, .module-left-pane--mode-compose .module-conversation-list { padding-inline: 0; } .module-conversation-list--has-dialog-padding { padding-block-start: 8px; } .module-conversation-list__item--archive-button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-conversation-list__item--archive-button { border: 1px solid WindowText; } } .module-conversation-list__item--archive-button { align-items: center; display: flex; justify-content: center; border-radius: 10px; height: 72px; line-height: 72px; text-align: center; width: 100%; padding-inline: 18px; display: flex; } .module-conversation-list__item--archive-button { color: #5e5e5e; } .module-conversation-list__item--archive-button:hover, .module-conversation-list__item--archive-button:focus { background-color: #e9e9e9; } .dark-theme .module-conversation-list__item--archive-button { color: #b9b9b9; } .dark-theme .module-conversation-list__item--archive-button:hover, .dark-theme .module-conversation-list__item--archive-button:focus { background-color: #3b3b3b; } .module-conversation-list__item--archive-button__icon::before { display: block; content: ""; width: 24px; height: 24px; } .module-conversation-list__item--archive-button__icon::before { -webkit-mask: url("../images/icons/v3/archive/archive.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .module-conversation-list__item--archive-button__icon::before { background-color: WindowText; } } .dark-theme .module-conversation-list__item--archive-button__icon::before { -webkit-mask: url("../images/icons/v3/archive/archive.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .dark-theme .module-conversation-list__item--archive-button__icon::before { background-color: WindowText; } } .module-conversation-list__item--archive-button__text { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; margin-inline: 8px; } .module-conversation-list__item--archive-button__archived-count { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; font-weight: 600; padding: 6px; padding-top: 1px; padding-bottom: 1px; border-radius: 10px; white-space: pre; } .module-conversation-list__item--archive-button__archived-count { color: #5e5e5e; background-color: #e9e9e9; } .dark-theme .module-conversation-list__item--archive-button__archived-count { color: #b9b9b9; background-color: #3b3b3b; } .module-conversation-list--width-narrow .module-conversation-list__item--archive-button__icon { display: block; width: 48px; height: 48px; padding: 12px; } .module-conversation-list--width-narrow .module-conversation-list__item--archive-button__text, .module-conversation-list--width-narrow .module-conversation-list__item--archive-button__archived-count { display: none; } .module-conversation-list__item--contact-or-conversation { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-conversation-list__item--contact-or-conversation { border: 1px solid WindowText; } } .module-conversation-list__item--contact-or-conversation { align-items: center; border-radius: 10px; cursor: inherit; display: flex; flex-direction: row; height: 72px; margin-block: 2px; margin-inline: 0; padding-block: 8px; padding-inline: 14px; user-select: none; width: 100%; } .module-conversation-list__item--contact-or-conversation .module-conversation-list__item--contact-or-conversation__unread-indicator { height: 18px; min-width: 18px; border-radius: 10px; display: flex; justify-content: center; align-items: center; } .module-conversation-list--width-narrow .module-conversation-list__item--contact-or-conversation .module-conversation-list__item--contact-or-conversation__unread-indicator { display: none; } .module-conversation-list__item--contact-or-conversation .module-conversation-list__item--contact-or-conversation__unread-indicator { background-color: #2c6bed; } .dark-theme .module-conversation-list__item--contact-or-conversation .module-conversation-list__item--contact-or-conversation__unread-indicator { background-color: #406ec9; } .module-conversation-list__item--contact-or-conversation .module-conversation-list__item--contact-or-conversation__unread-indicator--unread-messages, .module-conversation-list__item--contact-or-conversation .module-conversation-list__item--contact-or-conversation__unread-indicator--marked-unread { font-size: 11px; line-height: 14px; letter-spacing: 0.06px; font-weight: 600; text-align: center; word-break: normal; padding-inline: 4px; line-height: 100%; color: #ffffff; font-weight: 500; } .module-conversation-list__item--contact-or-conversation .module-conversation-list__item--contact-or-conversation__unread-indicator--unread-mentions__icon { -webkit-mask: url("../images/icons/v3/at/at.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .module-conversation-list__item--contact-or-conversation .module-conversation-list__item--contact-or-conversation__unread-indicator--unread-mentions__icon { background-color: WindowText; } } .module-conversation-list__item--contact-or-conversation .module-conversation-list__item--contact-or-conversation__unread-indicator--unread-mentions__icon { width: 12px; height: 12px; } .module-conversation-list__item--contact-or-conversation--is-button { cursor: pointer; } .module-conversation-list__item--contact-or-conversation--is-button:disabled { cursor: inherit; } .module-conversation-list__item--contact-or-conversation--is-checkbox { cursor: pointer; } .module-conversation-list__item--contact-or-conversation--is-checkbox--disabled { cursor: not-allowed; } .module-conversation-list__item--contact-or-conversation:hover:not(:disabled, .module-conversation-list__item--contact-or-conversation--disabled, .module-conversation-list__item--contact-or-conversation--is-selected), .module-conversation-list__item--contact-or-conversation[data-axo-contextmenu-state=open] { background-color: light-dark(#e9e9e9, #3b3b3b); } .module-conversation-list__item--contact-or-conversation:hover:not(:disabled, .module-conversation-list__item--contact-or-conversation--disabled, .module-conversation-list__item--contact-or-conversation--is-selected) .module-conversation-list__item--contact-or-conversation__unread-indicator, .module-conversation-list__item--contact-or-conversation[data-axo-contextmenu-state=open] .module-conversation-list__item--contact-or-conversation__unread-indicator { border-color: light-dark(#e9e9e9, #3b3b3b); } .keyboard-mode .module-conversation-list__item--contact-or-conversation:focus:not(:disabled, .keyboard-mode .module-conversation-list__item--contact-or-conversation--disabled, .keyboard-mode .module-conversation-list__item--contact-or-conversation--is-selected) { background-color: light-dark(#e9e9e9, #3b3b3b); } .keyboard-mode .module-conversation-list__item--contact-or-conversation:focus:not(:disabled, .keyboard-mode .module-conversation-list__item--contact-or-conversation--disabled, .keyboard-mode .module-conversation-list__item--contact-or-conversation--is-selected) .module-conversation-list__item--contact-or-conversation__unread-indicator { border-color: light-dark(#e9e9e9, #3b3b3b); } .module-conversation-list__item--contact-or-conversation--is-selected { background-color: #dedede; } .dark-theme .module-conversation-list__item--contact-or-conversation--is-selected { background-color: #4a4a4a; } .module-conversation-list__item--contact-or-conversation--is-selected .module-conversation-list__item--contact-or-conversation__avatar-container .module-conversation-list__item--contact-or-conversation__unread-indicator { border-color: #dedede; } .dark-theme .module-conversation-list__item--contact-or-conversation--is-selected .module-conversation-list__item--contact-or-conversation__avatar-container .module-conversation-list__item--contact-or-conversation__unread-indicator { border-color: #4a4a4a; } .module-conversation-list__item--contact-or-conversation__avatar-container { position: relative; } .module-conversation-list__item--contact-or-conversation__avatar-container .module-conversation-list__item--contact-or-conversation__unread-indicator { border-radius: 9999px; border: 3px solid transparent; height: 24px; margin: 0; min-width: 24px; position: absolute; top: -4px; display: none; } .module-conversation-list--width-narrow .module-conversation-list__item--contact-or-conversation__avatar-container .module-conversation-list__item--contact-or-conversation__unread-indicator { display: flex; } .module-conversation-list__item--contact-or-conversation__avatar-container .module-conversation-list__item--contact-or-conversation__unread-indicator { border-color: #f6f6f6; } .dark-theme .module-conversation-list__item--contact-or-conversation__avatar-container .module-conversation-list__item--contact-or-conversation__unread-indicator { border-color: #2e2e2e; } .module-conversation-list__item--contact-or-conversation__avatar-container .module-conversation-list__item--contact-or-conversation__unread-indicator--unread-messages, .module-conversation-list__item--contact-or-conversation__avatar-container .module-conversation-list__item--contact-or-conversation__unread-indicator--marked-unread { inset-inline-end: -8px; } .module-conversation-list__item--contact-or-conversation__avatar-container .module-conversation-list__item--contact-or-conversation__unread-indicator--unread-mentions { inset-inline-start: -8px; } .module-conversation-list__item--contact-or-conversation__avatar-container .module-conversation-list__item--contact-or-conversation__unread-indicator--is-selected { border-color: #dedede; } .dark-theme .module-conversation-list__item--contact-or-conversation__avatar-container .module-conversation-list__item--contact-or-conversation__unread-indicator--is-selected { border-color: #4a4a4a; } .module-conversation-list__item--contact-or-conversation__content { flex-grow: 1; margin-inline-start: 12px; display: flex; flex-direction: column; align-items: stretch; overflow: hidden; } .module-conversation-list__item--contact-or-conversation__content--disabled { opacity: 0.5; } .module-conversation-list__item--contact-or-conversation__content__header { display: flex; flex-direction: row; align-items: center; } .module-conversation-list--width-narrow .module-conversation-list__item--contact-or-conversation__content__header { display: none; } .module-conversation-list__item--contact-or-conversation__content__header__name { align-items: center; display: flex; flex-grow: 1; flex-shrink: 1; font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } .module-conversation-list__item--contact-or-conversation__content__header__name { color: #1b1b1b; } .dark-theme .module-conversation-list__item--contact-or-conversation__content__header__name { color: #e9e9e9; } .module-conversation-list__item--contact-or-conversation__content__header__name__contact-name { overflow: hidden; text-overflow: ellipsis; } .module-conversation-list__item--contact-or-conversation__content__header__name__contact-name .ContactModal__official-badge { position: relative; top: 1px; } .module-conversation-list__item--contact-or-conversation__content__header__name__mute-icon { height: 14px; margin-inline-start: 8px; min-width: 14px; width: 14px; } .module-conversation-list__item--contact-or-conversation__content__header__name__mute-icon { -webkit-mask: url("../images/icons/v3/bell/bell-slash-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #848484; } @media (forced-colors: active) { .module-conversation-list__item--contact-or-conversation__content__header__name__mute-icon { background-color: WindowText; } } .dark-theme .module-conversation-list__item--contact-or-conversation__content__header__name__mute-icon { -webkit-mask: url("../images/icons/v3/bell/bell-slash-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .dark-theme .module-conversation-list__item--contact-or-conversation__content__header__name__mute-icon { background-color: WindowText; } } .module-conversation-list__item--contact-or-conversation__content__header__date { font-size: 11px; line-height: 14px; letter-spacing: 0.06px; display: inline-block; flex-shrink: 0; margin-inline-start: 6px; } .module-conversation-list__item--contact-or-conversation__content__header__date { color: #5e5e5e; } .dark-theme .module-conversation-list__item--contact-or-conversation__content__header__date { color: #b9b9b9; } .module-conversation-list__item--contact-or-conversation__content__message { display: flex; flex-direction: row; justify-content: flex-end; } .module-conversation-list--width-narrow .module-conversation-list__item--contact-or-conversation__content__message { align-items: center; justify-content: flex-start; } .module-conversation-list__item--contact-or-conversation--is-checkbox .module-conversation-list__item--contact-or-conversation__content__message__text { /* restrict the growth so it doesn't encroach on the checkbox */ -webkit-line-clamp: 1; } .module-conversation-list__item--contact-or-conversation__content__message__text { flex-grow: 1; flex-shrink: 1; font-size: 13px; line-height: 18px; letter-spacing: -0.03px; -webkit-box-orient: vertical; -webkit-line-clamp: 2; display: -webkit-box; overflow: hidden; text-overflow: ellipsis; text-align: start; } .module-conversation-list__item--contact-or-conversation__content__message__text { color: #5e5e5e; } .dark-theme .module-conversation-list__item--contact-or-conversation__content__message__text { color: #b9b9b9; } .module-conversation-list--width-narrow .module-conversation-list__item--contact-or-conversation__content__message__text { display: none; } .module-conversation-list__item--contact-or-conversation__content__message__text--always-full-size { height: 36px; } .module-conversation-list__item--contact-or-conversation__content__message__text__blocked { display: flex; align-items: center; } .module-conversation-list__item--contact-or-conversation__content__message__text__blocked::before { content: ""; display: inline-block; width: 16px; height: 16px; margin-inline-end: 4px; } .module-conversation-list__item--contact-or-conversation__content__message__text__blocked::before { -webkit-mask: url("../images/icons/v3/block/block.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .module-conversation-list__item--contact-or-conversation__content__message__text__blocked::before { background-color: WindowText; } } .module-conversation-list__item--contact-or-conversation__content__message__text__message-request { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; font-weight: 600; } .module-conversation-list__item--contact-or-conversation__content__message__text__message-request { color: #5e5e5e; } .dark-theme .module-conversation-list__item--contact-or-conversation__content__message__text__message-request { color: #b9b9b9; } .module-conversation-list__item--contact-or-conversation__content__message__text__draft-prefix, .module-conversation-list__item--contact-or-conversation__content__message__text__deleted-for-everyone { font-style: italic; margin-inline-end: 3px; } .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon { flex-shrink: 0; margin-top: 4px; width: 12px; height: 12px; display: inline-block; margin-inline-start: 6px; } .module-conversation-list--width-narrow .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon { display: none; } .page-is-visible .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--sending { animation: rotate 4s linear infinite; } .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--sending { -webkit-mask: url("../images/icons/v3/message_status/messagestatus-sending.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--sending { background-color: WindowText; } } .dark-theme .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--sending { -webkit-mask: url("../images/icons/v3/message_status/messagestatus-sending.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #848484; } @media (forced-colors: active) { .dark-theme .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--sending { background-color: WindowText; } } .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--sent { -webkit-mask: url("../images/icons/v3/message_status/messagestatus-sent.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #848484; } @media (forced-colors: active) { .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--sent { background-color: WindowText; } } .dark-theme .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--sent { -webkit-mask: url("../images/icons/v3/message_status/messagestatus-sent.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .dark-theme .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--sent { background-color: WindowText; } } .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--delivered { -webkit-mask: url("../images/icons/v3/message_status/messagestatus-delivered.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #848484; } @media (forced-colors: active) { .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--delivered { background-color: WindowText; } } .dark-theme .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--delivered { -webkit-mask: url("../images/icons/v3/message_status/messagestatus-delivered.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .dark-theme .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--delivered { background-color: WindowText; } } .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--delivered { width: 18px; } .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--read, .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--viewed { -webkit-mask: url("../images/icons/v3/message_status/messagestatus-read.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #848484; } @media (forced-colors: active) { .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--read, .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--viewed { background-color: WindowText; } } .dark-theme .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--read, .dark-theme .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--viewed { -webkit-mask: url("../images/icons/v3/message_status/messagestatus-read.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .dark-theme .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--read, .dark-theme .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--viewed { background-color: WindowText; } } .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--read, .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--viewed { width: 18px; } .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--error, .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--partial-sent { -webkit-mask: url("../images/icons/v3/error/error-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #f44336; } @media (forced-colors: active) { .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--error, .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--partial-sent { background-color: WindowText; } } .dark-theme .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--error, .dark-theme .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--partial-sent { -webkit-mask: url("../images/icons/v3/error/error-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #f44336; } @media (forced-colors: active) { .dark-theme .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--error, .dark-theme .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--partial-sent { background-color: WindowText; } } .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--paused { -webkit-mask: url("../images/icons/v3/error/error-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--paused { background-color: WindowText; } } .dark-theme .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--paused { -webkit-mask: url("../images/icons/v3/error/error-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #848484; } @media (forced-colors: active) { .dark-theme .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--paused { background-color: WindowText; } } .module-conversation-list__item--contact-or-conversation__content__message__text__message-search-result-contents { display: -webkit-box; white-space: initial; -webkit-box-orient: vertical; -webkit-line-clamp: 2; } .module-conversation-list__item--contact-or-conversation__content__message__text__start-new-conversation { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-style: italic; } .module-conversation-list__item--contact-or-conversation__content__unread-indicators { display: flex; flex-direction: row; gap: 4px; flex-shrink: 0; margin-inline-start: 10px; margin-top: 1px; } .module-conversation-list__item--contact-or-conversation__checkbox { -webkit-appearance: none; background: #ffffff; border-radius: 100%; height: 20px; margin-inline: 16px; width: 20px; min-width: 20px; pointer-events: none; } .module-conversation-list__item--contact-or-conversation__checkbox { border: 1px solid #dedede; } .dark-theme .module-conversation-list__item--contact-or-conversation__checkbox { border: 1px solid #2e2e2e; } .module-conversation-list__item--contact-or-conversation__checkbox:focus { outline: none; } .keyboard-mode .module-conversation-list__item--contact-or-conversation__checkbox:focus { border-width: 2px; border-color: #2c6bed; } .keyboard-mode .module-conversation-list__item--contact-or-conversation__checkbox:focus:checked { box-shadow: inset 0 0 0px 1px #ffffff; } .dark-theme.keyboard-mode .module-conversation-list__item--contact-or-conversation__checkbox:focus { border-width: 2px; border-color: #6191f3; } .dark-theme.keyboard-mode .module-conversation-list__item--contact-or-conversation__checkbox:focus:checked { box-shadow: inset 0 0 0px 1px #000000; } .module-conversation-list__item--contact-or-conversation__checkbox:disabled:not(:checked) { opacity: 0.5; } .module-conversation-list__item--contact-or-conversation__checkbox:checked { background: #2c6bed; display: flex; align-items: center; justify-content: center; } .module-conversation-list__item--contact-or-conversation__checkbox:checked::before { content: ""; display: block; } .module-conversation-list__item--contact-or-conversation__checkbox:checked::before { -webkit-mask: url("../images/icons/v3/check/check.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .module-conversation-list__item--contact-or-conversation__checkbox:checked::before { background-color: WindowText; } } .module-conversation-list__item--contact-or-conversation__checkbox:checked::before { width: 13px; height: 13px; } .module-conversation-list__item--contact-or-conversation__checkbox:checked:disabled { background: #dedede; } .dark-theme .module-conversation-list__item--contact-or-conversation__checkbox:checked:disabled { background: #848484; } .module-conversation-list__item--contact-or-conversation__checkbox--container { margin-inline-start: 8px; /* prevent sibling content from pushing this smaller (min-width: the "!important" of width) */ min-width: 20px; } .module-conversation-list__item--clear-filter-button { height: 72px; } .module-conversation-list__item--header { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; align-items: flex-end; display: flex; height: 100%; overflow-x: hidden; padding-bottom: 8px; padding-inline-start: 16px; text-overflow: ellipsis; user-select: none; white-space: nowrap; } .dark-theme .module-conversation-list__item--header { color: #e9e9e9; } .module-conversation-list--width-narrow .module-conversation-list__item--header { border-radius: 9999px; display: block; height: 2px; margin-block: 19px; margin-inline: 14px 0; padding-bottom: 0; width: 48px; color: transparent; overflow: hidden; text-indent: -99999px; } .module-conversation-list--width-narrow .module-conversation-list__item--header { background: rgba(0, 0, 0, 0.12); } .dark-theme .module-conversation-list--width-narrow .module-conversation-list__item--header { background: rgba(255, 255, 255, 0.12); } .module-conversation-list__item--spinner { width: 100%; padding: 10px; text-align: center; } .module-conversation-list__empty-results { display: flex; align-items: center; justify-content: center; padding-block: 48px; padding-inline: 12px; } .module-conversation-list__generic-checkbox-icon { display: flex; align-items: center; justify-content: center; width: 32px; height: 32px; border-radius: 16px; background-color: light-dark(rgba(0, 0, 0, 0.06), rgba(255, 255, 255, 0.12)); } .module-conversation-list__generic-checkbox-icon::before { content: ""; display: block; width: 20px; height: 20px; } .module-conversation-list__generic-checkbox-icon--contact::before { -webkit-mask: url("../images/icons/v3/person/person.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#000000, #e9e9e9); } @media (forced-colors: active) { .module-conversation-list__generic-checkbox-icon--contact::before { background-color: WindowText; } } .module-conversation-list__generic-checkbox-icon--group::before { -webkit-mask: url("../images/icons/v3/group/group.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#000000, #e9e9e9); } @media (forced-colors: active) { .module-conversation-list__generic-checkbox-icon--group::before { background-color: WindowText; } } .module-left-pane { display: flex; flex-direction: column; height: 100%; width: 100%; position: relative; } .module-left-pane__header { flex-grow: 0; flex-shrink: 0; user-select: none; } .module-left-pane__header__contents { width: 100%; display: inline-flex; flex-direction: row; align-items: center; padding-block: 15px; } .module-left-pane__header__contents__back-button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-left-pane__header__contents__back-button { border: 1px solid WindowText; } } .module-left-pane__header__contents__back-button { margin-inline-start: 16px; width: 20px; height: 20px; } .module-left-pane__header__contents__back-button:disabled { cursor: not-allowed; } .module-left-pane__header__contents__back-button:dir(ltr) { -webkit-mask: url("../images/icons/v3/chevron/chevron-left.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .module-left-pane__header__contents__back-button:dir(ltr) { background-color: WindowText; } } :dir(rtl) .module-left-pane__header__contents__back-button:dir(ltr) { -webkit-mask: url("../images/icons/v3/chevron/chevron-right.svg") no-repeat center; } .module-left-pane__header__contents__back-button:dir(rtl) { -webkit-mask: url("../images/icons/v3/chevron/chevron-right.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .module-left-pane__header__contents__back-button:dir(rtl) { background-color: WindowText; } } :dir(rtl) .module-left-pane__header__contents__back-button:dir(rtl) { -webkit-mask: url("../images/icons/v3/chevron/chevron-left.svg") no-repeat center; } .keyboard-mode .module-left-pane__header__contents__back-button:dir(ltr):focus { -webkit-mask: url("../images/icons/v3/chevron/chevron-left.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #2c6bed; } @media (forced-colors: active) { .keyboard-mode .module-left-pane__header__contents__back-button:dir(ltr):focus { background-color: WindowText; } } :dir(rtl) .keyboard-mode .module-left-pane__header__contents__back-button:dir(ltr):focus { -webkit-mask: url("../images/icons/v3/chevron/chevron-right.svg") no-repeat center; } .keyboard-mode .module-left-pane__header__contents__back-button:dir(rtl):focus { -webkit-mask: url("../images/icons/v3/chevron/chevron-right.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #2c6bed; } @media (forced-colors: active) { .keyboard-mode .module-left-pane__header__contents__back-button:dir(rtl):focus { background-color: WindowText; } } :dir(rtl) .keyboard-mode .module-left-pane__header__contents__back-button:dir(rtl):focus { -webkit-mask: url("../images/icons/v3/chevron/chevron-left.svg") no-repeat center; } .dark-theme .module-left-pane__header__contents__back-button:dir(ltr) { -webkit-mask: url("../images/icons/v3/chevron/chevron-left.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .dark-theme .module-left-pane__header__contents__back-button:dir(ltr) { background-color: WindowText; } } :dir(rtl) .dark-theme .module-left-pane__header__contents__back-button:dir(ltr) { -webkit-mask: url("../images/icons/v3/chevron/chevron-right.svg") no-repeat center; } .dark-theme .module-left-pane__header__contents__back-button:dir(rtl) { -webkit-mask: url("../images/icons/v3/chevron/chevron-right.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .dark-theme .module-left-pane__header__contents__back-button:dir(rtl) { background-color: WindowText; } } :dir(rtl) .dark-theme .module-left-pane__header__contents__back-button:dir(rtl) { -webkit-mask: url("../images/icons/v3/chevron/chevron-left.svg") no-repeat center; } .dark-theme.keyboard-mode .module-left-pane__header__contents__back-button:dir(ltr):hover { -webkit-mask: url("../images/icons/v3/chevron/chevron-left.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #6191f3; } @media (forced-colors: active) { .dark-theme.keyboard-mode .module-left-pane__header__contents__back-button:dir(ltr):hover { background-color: WindowText; } } :dir(rtl) .dark-theme.keyboard-mode .module-left-pane__header__contents__back-button:dir(ltr):hover { -webkit-mask: url("../images/icons/v3/chevron/chevron-right.svg") no-repeat center; } .dark-theme.keyboard-mode .module-left-pane__header__contents__back-button:dir(rtl):hover { -webkit-mask: url("../images/icons/v3/chevron/chevron-right.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #6191f3; } @media (forced-colors: active) { .dark-theme.keyboard-mode .module-left-pane__header__contents__back-button:dir(rtl):hover { background-color: WindowText; } } :dir(rtl) .dark-theme.keyboard-mode .module-left-pane__header__contents__back-button:dir(rtl):hover { -webkit-mask: url("../images/icons/v3/chevron/chevron-left.svg") no-repeat center; } .NavSidebar--narrow .module-left-pane__header__contents__back-button { margin-inline-start: 0; } .module-left-pane__header__contents__text { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; flex-grow: 1; padding-inline-end: 36px; text-align: center; } .module-left-pane__header__contents__text { color: #1b1b1b; } .dark-theme .module-left-pane__header__contents__text { color: #e9e9e9; } .NavSidebar--narrow .module-left-pane__header__contents__text { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border-width: 0; } .NavSidebar--narrow .module-left-pane__header__contents { justify-content: center; } .module-left-pane__header__form { display: flex; flex-direction: column; } .module-left-pane__header__form__expire-timer { display: flex; flex-direction: row; align-items: center; margin-block: 0 16px; margin-inline: 16px; } .module-left-pane__header__form__expire-timer__label { margin-inline-end: 12px; } .module-left-pane__startComposingIcon { display: block; width: 20px; height: 20px; } .module-left-pane__startComposingIcon { -webkit-mask: url("../images/icons/v3/compose/compose.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .module-left-pane__startComposingIcon { background-color: WindowText; } } .dark-theme .module-left-pane__startComposingIcon { -webkit-mask: url("../images/icons/v3/compose/compose.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .module-left-pane__startComposingIcon { background-color: WindowText; } } .module-left-pane__moreActionsIcon { display: block; width: 20px; height: 20px; } .module-left-pane__moreActionsIcon { -webkit-mask: url("../images/icons/v3/more/more.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .module-left-pane__moreActionsIcon { background-color: WindowText; } } .dark-theme .module-left-pane__moreActionsIcon { -webkit-mask: url("../images/icons/v3/more/more.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .module-left-pane__moreActionsIcon { background-color: WindowText; } } .module-left-pane__dialogs + .module-left-pane__chatFolders { margin-top: 8px; } .module-left-pane__archive-helper-text { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; flex-grow: 0; flex-shrink: 0; user-select: none; padding: 1em; } .module-left-pane__archive-helper-text { color: #5e5e5e; background-color: #e9e9e9; } .dark-theme .module-left-pane__archive-helper-text { color: #b9b9b9; background-color: #3b3b3b; } .NavSidebar--narrow .module-left-pane__archive-helper-text { display: none; } .module-left-pane__no-search-results__unread-header { margin-bottom: 50px; } .module-left-pane__no-search-results--withHeader { display: flex; flex-direction: column; margin-top: 15px; margin-bottom: 20px; padding-inline: 1em; width: 100%; text-align: center; outline: none; } .module-left-pane__no-search-results, .module-left-pane__compose-no-contacts { margin-top: 27px; padding-inline: 1em; width: 100%; text-align: center; outline: none; } .module-left-pane__compose-no-contacts { flex-grow: 1; } .module-left-pane__no-search-results__sms-only { margin-top: 12px; } .module-left-pane__no-search-results__sms-only { color: #5e5e5e; } .dark-theme .module-left-pane__no-search-results__sms-only { color: #b9b9b9; } .module-left-pane__compose-search-form__input { flex-grow: 1; } .module-left-pane__list--measure { flex-grow: 1; flex-shrink: 1; outline: none; } .module-left-pane__list--wrapper { position: relative; } .module-left-pane__list { position: absolute; outline: none; } .module-left-pane__footer { bottom: 0; display: flex; flex-direction: row; justify-content: flex-end; inset-inline-start: 0; padding: 12px; position: absolute; width: 100%; } .module-left-pane__footer { background: linear-gradient(transparent, #f6f6f6); } .dark-theme .module-left-pane__footer { background: linear-gradient(transparent, #2e2e2e); } .module-left-pane__resize-grab-area { position: absolute; width: 8px; height: 100%; inset-inline-end: -8px; top: 0; z-index: 2; cursor: col-resize; } .module-timeline { display: flex; height: 100%; overflow: hidden; } .module-timeline--disabled { user-select: none; } .module-timeline__messages__container { flex: 1 1; overflow-x: hidden; overflow-y: auto; display: flex; flex-direction: column; scrollbar-width: auto; } .module-timeline__messages__container button { -webkit-app-region: initial; } .module-timeline__messages { display: flex; flex-direction: column; flex: 1 1; padding-bottom: 6px; position: relative; justify-content: flex-end; } .module-timeline__messages::after { content: ""; height: 1px; display: block; } .module-timeline__messages--have-newest:not(.module-timeline__messages--scroll-locked) > * { overflow-anchor: none; } .module-timeline__messages--have-newest:not(.module-timeline__messages--scroll-locked)::after { overflow-anchor: auto; } .module-timeline__messages--scroll-locked { flex-shrink: 0; } .module-timeline__messages--have-oldest { justify-content: flex-start; } .module-timeline__messages__at-bottom-detector { position: absolute; bottom: 0; } .module-timeline__scrolldown-buttons { z-index: 10; position: absolute; inset-inline-end: 16px; bottom: 12px; display: flex; flex-direction: column; gap: 14px; } .ReactVirtualized__List { outline: none; } .module-last-seen-indicator { padding-top: 25px; padding-bottom: 35px; user-select: none; } .module-last-seen-indicator__bar { background-color: #848484; width: 100%; height: 1px; } .module-last-seen-indicator__text { margin-top: 3px; font-size: 13px; line-height: 18px; letter-spacing: -0.03px; font-weight: 600; text-align: center; } .module-last-seen-indicator__text { color: #1b1b1b; } .dark-theme .module-last-seen-indicator__text { color: #e9e9e9; } /* Calling: Device Selection */ .module-calling-device-selection { position: relative; } .module-calling-device-selection__close-button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-calling-device-selection__close-button { border: 1px solid WindowText; } } .module-calling-device-selection__close-button { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .module-calling-device-selection__close-button { background-color: WindowText; } } .module-calling-device-selection__close-button { height: 24px; position: absolute; inset-inline-end: 5px; top: 0; width: 24px; z-index: 2; } .keyboard-mode .module-calling-device-selection__close-button:focus, .keyboard-mode .module-calling-device-selection__close-button:active, .keyboard-mode .module-calling-device-selection__close-button:hover { background-color: #2c6bed; } .module-calling-device-selection__title { font-weight: 600; font-size: 20px; line-height: 26px; letter-spacing: -0.34px; margin-top: 12px; margin-bottom: 20px; } .module-calling-device-selection__label { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; display: block; margin-bottom: 16px; } .module-calling-device-selection__select { margin-bottom: 20px; position: relative; } .module-group-v1-disabled-actions { padding-block: 8px 12px; padding-inline: 16px; max-width: 650px; margin-inline: auto; } .module-group-v1-disabled-actions { background: #ffffff; } .dark-theme .module-group-v1-disabled-actions { background: #121212; } .module-group-v1-disabled-actions__message { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; text-align: center; margin-bottom: 12px; } .module-group-v1-disabled-actions__message { color: #5e5e5e; } .dark-theme .module-group-v1-disabled-actions__message { color: #b9b9b9; } .module-group-v1-disabled-actions__message__learn-more { text-decoration: none; } .module-group-v1-disabled-actions__buttons { display: flex; flex-direction: row; justify-content: center; } .module-group-v1-disabled-actions__buttons__button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-group-v1-disabled-actions__buttons__button { border: 1px solid WindowText; } } .module-group-v1-disabled-actions__buttons__button { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; border-radius: 4px; padding: 8px; padding-inline: 30px; background-color: #2c6bed; } .module-group-v1-disabled-actions__buttons__button { color: #ffffff; border: 1px solid white; } .dark-theme .module-group-v1-disabled-actions__buttons__button { color: rgba(255, 255, 255, 0.9); border: 1px solid #121212; } .mouse-mode .module-group-v1-disabled-actions__buttons__button:hover { background-color: rgb(37.4, 90.95, 201.45); } .dark-theme.mouse-mode .module-group-v1-disabled-actions__buttons__button:hover { background-color: rgb(75.65, 129.2, 239.7); } .mouse-mode .module-group-v1-disabled-actions__buttons__button:active { background-color: rgb(33, 80.25, 177.75); } .dark-theme.mouse-mode .module-group-v1-disabled-actions__buttons__button:active { background-color: rgb(96.75, 144, 241.5); } .keyboard-mode .module-group-v1-disabled-actions__buttons__button:active { background-color: rgb(33, 80.25, 177.75); } .dark-theme.keyboard-mode .module-group-v1-disabled-actions__buttons__button:active { background-color: rgb(33, 80.25, 177.75); } .keyboard-mode .module-group-v1-disabled-actions__buttons__button:focus { box-shadow: 0px 0px 0px 3px #2c6bed; } .dark-theme.keyboard-mode .module-group-v1-disabled-actions__buttons__button:focus { box-shadow: 0px 0px 0px 3px #6191f3; } .module-group-v2-pending-approval-actions { padding-block: 8px 12px; padding-inline: 16px; max-width: 650px; margin-inline: auto; } .module-group-v2-pending-approval-actions { background: #ffffff; } .dark-theme .module-group-v2-pending-approval-actions { background: #121212; } .module-group-v2-pending-approval-actions__message { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; text-align: center; margin-bottom: 12px; } .module-group-v2-pending-approval-actions__message { color: #5e5e5e; } .dark-theme .module-group-v2-pending-approval-actions__message { color: #b9b9b9; } .module-group-v2-pending-approval-actions__buttons { display: flex; flex-direction: row; justify-content: center; } .module-group-v2-pending-approval-actions__buttons__button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-group-v2-pending-approval-actions__buttons__button { border: 1px solid WindowText; } } .module-group-v2-pending-approval-actions__buttons__button { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; border-radius: 4px; padding: 8px; padding-inline: 30px; } .module-group-v2-pending-approval-actions__buttons__button { color: #1b1b1b; background-color: #e9e9e9; } .dark-theme .module-group-v2-pending-approval-actions__buttons__button { color: #e9e9e9; background-color: #4a4a4a; } .mouse-mode .module-group-v2-pending-approval-actions__buttons__button:hover { background-color: rgb(198.05, 198.05, 198.05); } .dark-theme.mouse-mode .module-group-v2-pending-approval-actions__buttons__button:hover { background-color: rgb(101.15, 101.15, 101.15); } .mouse-mode .module-group-v2-pending-approval-actions__buttons__button:active { background-color: rgb(174.75, 174.75, 174.75); } .dark-theme.mouse-mode .module-group-v2-pending-approval-actions__buttons__button:active { background-color: rgb(119.25, 119.25, 119.25); } .keyboard-mode .module-group-v2-pending-approval-actions__buttons__button:active { background-color: rgb(174.75, 174.75, 174.75); } .dark-theme.keyboard-mode .module-group-v2-pending-approval-actions__buttons__button:active { background-color: rgb(119.25, 119.25, 119.25); } .keyboard-mode .module-group-v2-pending-approval-actions__buttons__button:focus { box-shadow: 0px 0px 0px 3px #2c6bed; } .dark-theme.keyboard-mode .module-group-v2-pending-approval-actions__buttons__button:focus { box-shadow: 0px 0px 0px 3px #6191f3; } .module-group-v2-pending-approval-actions__buttons__button { color: #5e5e5e; background-color: #e9e9e9; } .module-modal-host__overlay { background: rgba(0, 0, 0, 0.4); width: 100vw; height: 100vh; inset-inline-start: 0; top: 0; position: fixed; z-index: 102; } .module-modal-host__overlay-container { display: flex; flex-direction: row; width: 100vw; height: 100vh; inset-inline-start: 0; top: 0; justify-content: center; align-items: center; overflow: hidden; padding: 20px; position: fixed; z-index: 102; } .module-modal-host__width-container { max-width: 360px; width: 95%; } .module-modal-host--on-top-of-everything .module-modal-host__overlay, .module-modal-host--on-top-of-everything .module-modal-host__overlay-container { z-index: 9001; } .module-group-v2-join-dialog { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; border-radius: 8px; width: 360px; margin-inline: auto; padding: 20px; position: relative; } .module-group-v2-join-dialog { background-color: #ffffff; } .dark-theme .module-group-v2-join-dialog { background-color: #121212; } .module-group-v2-join-dialog__close-button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-group-v2-join-dialog__close-button { border: 1px solid WindowText; } } .module-group-v2-join-dialog__close-button { position: absolute; inset-inline-end: 12px; top: 12px; height: 24px; width: 24px; } .module-group-v2-join-dialog__close-button { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .module-group-v2-join-dialog__close-button { background-color: WindowText; } } .dark-theme .module-group-v2-join-dialog__close-button { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .module-group-v2-join-dialog__close-button { background-color: WindowText; } } .keyboard-mode .module-group-v2-join-dialog__close-button:focus { background-color: #2c6bed; } .dark-theme.keyboard-mode .module-group-v2-join-dialog__close-button:focus { background-color: #6191f3; } .module-group-v2-join-dialog__title { font-weight: 600; font-size: 20px; line-height: 26px; letter-spacing: -0.34px; text-align: center; margin-top: 12px; margin-bottom: 2px; } .module-group-v2-join-dialog__avatar { text-align: center; } .module-group-v2-join-dialog__metadata { color: #5e5e5e; text-align: center; } .module-group-v2-join-dialog__prompt { margin-top: 40px; } .module-group-v2-join-dialog__prompt--approval { font-size: 12px; line-height: 16px; letter-spacing: 0; color: #848484; margin-top: 40px; } .module-group-v2-join-dialog__buttons { margin-top: 16px; text-align: center; display: flex; } .module-group-v2-join-dialog__button { flex: 1 1 0px; } .module-group-v2-join-dialog__button:not(:first-of-type) { margin-inline-start: 16px; } .module-group-v2-join-dialog__description { color: #5e5e5e; margin-top: 12px; } .module-progress-dialog { width: 138px; padding: 18px; border-radius: 8px; } .module-progress-dialog { box-shadow: 0px 8px 20px rgba(0, 0, 0, 0.3), 0px 0px 8px rgba(0, 0, 0, 0.05); } @media (forced-colors: active) { .module-progress-dialog { border: 1px solid WindowText; } } .module-progress-dialog { display: flex; flex-direction: column; justify-content: center; align-items: center; } .module-progress-dialog { background: #ffffff; color: #1b1b1b; } .dark-theme .module-progress-dialog { background: #2e2e2e; color: #e9e9e9; } .module-progress-dialog__spinner { padding: 10px; } .module-progress-dialog__text { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; } .module-progress-dialog__overlay { background: rgba(0, 0, 0, 0.4); position: fixed; inset-inline-start: 0; top: 0; width: 100vw; height: 100vh; display: flex; justify-content: center; align-items: center; z-index: 99; } .module-error-modal__button-container { margin-top: 10px; display: flex; flex-direction: row; justify-content: flex-end; } .module-button__small { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; } .module-button__small { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-button__small { border: 1px solid WindowText; } } .keyboard-mode .module-button__small:focus { box-shadow: 0px 0px 0px 2px #2c6bed; } .module-button__small { color: #1b1b1b; border-color: #dedede; } .dark-theme .module-button__small { color: #e9e9e9; border-color: #4a4a4a; } .module-button__small { border-radius: 4px; border-style: solid; border-width: 1px; outline: none; padding-block: 7px; padding-inline: 12px; } .module-tooltip { --tooltip-text-color: #3b3b3b; --tooltip-background-color: #f6f6f6; } .module-tooltip--dark-theme { --tooltip-text-color: #e9e9e9; --tooltip-background-color: #4a4a4a; } .dark-theme .module-tooltip { --tooltip-text-color: #e9e9e9; --tooltip-background-color: #4a4a4a; } .module-tooltip { background-color: var(--tooltip-background-color); border-radius: 8px; color: var(--tooltip-text-color); display: inline-block; padding-block: 8px; padding-inline: 21px; position: fixed; text-align: center; z-index: 150; } .module-tooltip .module-tooltip-arrow { position: absolute; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ direction: ltr; } .module-tooltip .module-tooltip-arrow::after { border: solid 6px transparent; content: ""; display: block; height: 0; /* stylelint-disable-next-line liberty/use-logical-spec */ margin-left: -6px; margin-top: -6px; position: absolute; width: 0; } .module-tooltip[data-placement=top] .module-tooltip-arrow { bottom: 0; } .module-tooltip[data-placement=top] .module-tooltip-arrow::after { bottom: -12px; border-top-color: var(--tooltip-background-color); } .module-tooltip[data-placement=right] .module-tooltip-arrow { /* stylelint-disable-next-line liberty/use-logical-spec */ left: 0; } .module-tooltip[data-placement=right] .module-tooltip-arrow::after { /* stylelint-disable-next-line liberty/use-logical-spec */ left: -6px; /* stylelint-disable-next-line liberty/use-logical-spec */ border-right-color: var(--tooltip-background-color); } .module-tooltip[data-placement=bottom] .module-tooltip-arrow { top: 0; } .module-tooltip[data-placement=bottom] .module-tooltip-arrow::after { top: -6px; border-bottom-color: var(--tooltip-background-color); } .module-tooltip[data-placement=left] .module-tooltip-arrow { /* stylelint-disable-next-line liberty/use-logical-spec */ right: 0; } .module-tooltip[data-placement=left] .module-tooltip-arrow::after { /* stylelint-disable-next-line liberty/use-logical-spec */ right: -12px; /* stylelint-disable-next-line liberty/use-logical-spec */ border-left-color: var(--tooltip-background-color); } .module-chat-session-refreshed-dialog__image { text-align: center; } .module-chat-session-refreshed-dialog__title { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; margin-top: 10px; margin-bottom: 3px; } .module-delivery-issue-dialog__image { text-align: center; } .module-delivery-issue-dialog__title { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; margin-top: 10px; margin-bottom: 3px; } .module-message__container { max-width: 100%; } .module-message__container--incoming { align-self: flex-start; } .module-message__container--outgoing { align-self: flex-end; } .module-message__container--with-reactions { margin-bottom: -6px; } .module-message__container--deleted-for-everyone { font-style: italic; } .module-message__container--sticker-like { overflow: initial; } .module-message__context--icon::before { content: " "; display: inline-block; height: 16px; margin-inline-end: 8px; width: 16px; vertical-align: middle; } .module-message__context__copy-timestamp::before { -webkit-mask: url("../images/icons/v3/copy/copy-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .module-message__context__copy-timestamp::before { background-color: WindowText; } } .dark-theme .module-message__context__copy-timestamp::before { -webkit-mask: url("../images/icons/v3/copy/copy-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .module-message__context__copy-timestamp::before { background-color: WindowText; } } .module-message__action { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-message__action { border: 1px solid WindowText; } } .module-message__action { border-radius: 30px; margin-top: 14px; margin-bottom: 4px; padding: 8px; text-align: center; width: 100%; font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; } .module-message__action--outgoing { color: #ffffff; background-color: rgba(255, 255, 255, 0.22); } .module-message__action--outgoing:hover { background-color: rgba(255, 255, 255, 0.36); } .module-message__action--outgoing--in-another-call { color: rgba(255, 255, 255, 0.5); } .module-message__action--incoming { color: #315ff4; background-color: rgba(255, 255, 255, 0.7); } .module-message__action--incoming:hover { background-color: #ffffff; } .dark-theme .module-message__action--incoming { color: #ffffff; background-color: rgba(255, 255, 255, 0.07); } .dark-theme .module-message__action--incoming:hover { background-color: rgba(255, 255, 255, 0.17); } .module-message__action--incoming--in-another-call { color: rgba(49, 95, 244, 0.5); } .dark-theme .module-message__action--incoming--in-another-call { color: rgba(255, 255, 255, 0.5); } .module-message__link-preview__call-link-icon { display: flex; align-items: center; justify-content: center; margin-inline-end: 12px; margin-top: 4px; margin-bottom: 4px; } :root { --iti-hover-color: rgba(0, 0, 0, 0.05); --iti-border-color: #ccc; --iti-dialcode-color: #999; --iti-dropdown-bg: white; --iti-spacer-horizontal: 8px; --iti-flag-height: 12px; --iti-flag-width: 16px; --iti-border-width: 1px; --iti-arrow-height: 4px; --iti-arrow-width: 6px; --iti-triangle-border: calc(var(--iti-arrow-width) / 2); --iti-arrow-padding: 6px; --iti-arrow-color: #555; --iti-path-flags-1x: url("../img/flags.webp"); --iti-path-flags-2x: url("../img/flags@2x.webp"); --iti-path-globe-1x: url("../img/globe.webp"); --iti-path-globe-2x: url("../img/globe@2x.webp"); --iti-flag-sprite-width: 3904px; --iti-flag-sprite-height: 12px; --iti-mobile-popup-margin: 30px; } .iti { position: relative; display: inline-block; } .iti * { box-sizing: border-box; } .iti__hide { display: none; } .iti__v-hide { visibility: hidden; } .iti__a11y-text { width: 1px; height: 1px; clip: rect(1px, 1px, 1px, 1px); overflow: hidden; position: absolute; } .iti input.iti__tel-input, .iti input.iti__tel-input[type=text], .iti input.iti__tel-input[type=tel] { position: relative; z-index: 0; margin: 0 !important; } .iti__country-container { position: absolute; top: 0; bottom: 0; padding: var(--iti-border-width); } .iti__selected-country { z-index: 1; position: relative; display: flex; align-items: center; height: 100%; background: none; border: 0; margin: 0; padding: 0; font-family: inherit; font-size: inherit; color: inherit; border-radius: 0; font-weight: inherit; line-height: inherit; text-decoration: none; } .iti__selected-country-primary { display: flex; align-items: center; height: 100%; padding: 0 var(--iti-arrow-padding) 0 var(--iti-spacer-horizontal); } .iti__arrow { margin-left: var(--iti-arrow-padding); width: 0; height: 0; border-left: var(--iti-triangle-border) solid transparent; border-right: var(--iti-triangle-border) solid transparent; border-top: var(--iti-arrow-height) solid var(--iti-arrow-color); } [dir=rtl] .iti__arrow { margin-right: var(--iti-arrow-padding); margin-left: 0; } .iti__arrow--up { border-top: none; border-bottom: var(--iti-arrow-height) solid var(--iti-arrow-color); } .iti__dropdown-content { border-radius: 3px; background-color: var(--iti-dropdown-bg); } .iti--inline-dropdown .iti__dropdown-content { position: absolute; z-index: 2; margin-top: 3px; margin-left: calc(var(--iti-border-width) * -1); border: var(--iti-border-width) solid var(--iti-border-color); box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.2); } .iti__search-input { width: 100%; border-width: 0; border-radius: 3px; } .iti__search-input + .iti__country-list { border-top: 1px solid var(--iti-border-color); } .iti__country-list { list-style: none; padding: 0; margin: 0; overflow-y: scroll; -webkit-overflow-scrolling: touch; } .iti--inline-dropdown .iti__country-list { max-height: 185px; } .iti--flexible-dropdown-width .iti__country-list { white-space: nowrap; } @media (max-width: 500px) { .iti--flexible-dropdown-width .iti__country-list { white-space: normal; } } .iti__country { display: flex; align-items: center; padding: 8px var(--iti-spacer-horizontal); outline: none; } .iti__dial-code { color: var(--iti-dialcode-color); } .iti__country.iti__highlight { background-color: var(--iti-hover-color); } .iti__country-list .iti__flag, .iti__country-name { margin-right: var(--iti-spacer-horizontal); } [dir=rtl] .iti__country-list .iti__flag, [dir=rtl] .iti__country-name { margin-right: 0; margin-left: var(--iti-spacer-horizontal); } .iti--allow-dropdown .iti__country-container:not(:has(+ input[disabled])):not(:has(+ input[readonly])):hover, .iti--allow-dropdown .iti__country-container:not(:has(+ input[disabled])):not(:has(+ input[readonly])):hover button { cursor: pointer; } .iti--allow-dropdown .iti__country-container:not(:has(+ input[disabled])):not(:has(+ input[readonly])) .iti__selected-country-primary:hover, .iti--allow-dropdown .iti__country-container:not(:has(+ input[disabled])):not(:has(+ input[readonly])) .iti__selected-country:has(+ .iti__dropdown-content:hover) .iti__selected-country-primary { background-color: var(--iti-hover-color); } .iti .iti__selected-dial-code { margin-left: 4px; } [dir=rtl] .iti .iti__selected-dial-code { margin-left: 0; margin-right: 4px; } .iti--container { position: fixed; top: -1000px; left: -1000px; z-index: 1060; padding: var(--iti-border-width); } .iti--container:hover { cursor: pointer; } .iti--fullscreen-popup.iti--container { background-color: rgba(0, 0, 0, 0.5); top: 0; bottom: 0; left: 0; right: 0; position: fixed; padding: var(--iti-mobile-popup-margin); display: flex; flex-direction: column; justify-content: flex-start; } .iti--fullscreen-popup .iti__dropdown-content { display: flex; flex-direction: column; max-height: 100%; position: relative; } .iti--fullscreen-popup .iti__country { padding: 10px 10px; line-height: 1.5em; } .iti__flag { --iti-flag-offset: 100px; height: var(--iti-flag-height); width: var(--iti-flag-width); border-radius: 1px; box-shadow: 0px 0px 1px 0px #888; background-image: var(--iti-path-flags-1x); background-repeat: no-repeat; background-position: var(--iti-flag-offset) 0; background-size: var(--iti-flag-sprite-width) var(--iti-flag-sprite-height); } .iti__ac { --iti-flag-offset: 0px; } .iti__ad { --iti-flag-offset: -16px; } .iti__ae { --iti-flag-offset: -32px; } .iti__af { --iti-flag-offset: -48px; } .iti__ag { --iti-flag-offset: -64px; } .iti__ai { --iti-flag-offset: -80px; } .iti__al { --iti-flag-offset: -96px; } .iti__am { --iti-flag-offset: -112px; } .iti__ao { --iti-flag-offset: -128px; } .iti__ar { --iti-flag-offset: -144px; } .iti__as { --iti-flag-offset: -160px; } .iti__at { --iti-flag-offset: -176px; } .iti__au { --iti-flag-offset: -192px; } .iti__aw { --iti-flag-offset: -208px; } .iti__ax { --iti-flag-offset: -224px; } .iti__az { --iti-flag-offset: -240px; } .iti__ba { --iti-flag-offset: -256px; } .iti__bb { --iti-flag-offset: -272px; } .iti__bd { --iti-flag-offset: -288px; } .iti__be { --iti-flag-offset: -304px; } .iti__bf { --iti-flag-offset: -320px; } .iti__bg { --iti-flag-offset: -336px; } .iti__bh { --iti-flag-offset: -352px; } .iti__bi { --iti-flag-offset: -368px; } .iti__bj { --iti-flag-offset: -384px; } .iti__bl { --iti-flag-offset: -400px; } .iti__bm { --iti-flag-offset: -416px; } .iti__bn { --iti-flag-offset: -432px; } .iti__bo { --iti-flag-offset: -448px; } .iti__bq { --iti-flag-offset: -464px; } .iti__br { --iti-flag-offset: -480px; } .iti__bs { --iti-flag-offset: -496px; } .iti__bt { --iti-flag-offset: -512px; } .iti__bw { --iti-flag-offset: -528px; } .iti__by { --iti-flag-offset: -544px; } .iti__bz { --iti-flag-offset: -560px; } .iti__ca { --iti-flag-offset: -576px; } .iti__cc { --iti-flag-offset: -592px; } .iti__cd { --iti-flag-offset: -608px; } .iti__cf { --iti-flag-offset: -624px; } .iti__cg { --iti-flag-offset: -640px; } .iti__ch { --iti-flag-offset: -656px; } .iti__ci { --iti-flag-offset: -672px; } .iti__ck { --iti-flag-offset: -688px; } .iti__cl { --iti-flag-offset: -704px; } .iti__cm { --iti-flag-offset: -720px; } .iti__cn { --iti-flag-offset: -736px; } .iti__co { --iti-flag-offset: -752px; } .iti__cr { --iti-flag-offset: -768px; } .iti__cu { --iti-flag-offset: -784px; } .iti__cv { --iti-flag-offset: -800px; } .iti__cw { --iti-flag-offset: -816px; } .iti__cx { --iti-flag-offset: -832px; } .iti__cy { --iti-flag-offset: -848px; } .iti__cz { --iti-flag-offset: -864px; } .iti__de { --iti-flag-offset: -880px; } .iti__dj { --iti-flag-offset: -896px; } .iti__dk { --iti-flag-offset: -912px; } .iti__dm { --iti-flag-offset: -928px; } .iti__do { --iti-flag-offset: -944px; } .iti__dz { --iti-flag-offset: -960px; } .iti__ec { --iti-flag-offset: -976px; } .iti__ee { --iti-flag-offset: -992px; } .iti__eg { --iti-flag-offset: -1008px; } .iti__eh { --iti-flag-offset: -1024px; } .iti__er { --iti-flag-offset: -1040px; } .iti__es { --iti-flag-offset: -1056px; } .iti__et { --iti-flag-offset: -1072px; } .iti__fi { --iti-flag-offset: -1088px; } .iti__fj { --iti-flag-offset: -1104px; } .iti__fk { --iti-flag-offset: -1120px; } .iti__fm { --iti-flag-offset: -1136px; } .iti__fo { --iti-flag-offset: -1152px; } .iti__fr { --iti-flag-offset: -1168px; } .iti__ga { --iti-flag-offset: -1184px; } .iti__gb { --iti-flag-offset: -1200px; } .iti__gd { --iti-flag-offset: -1216px; } .iti__ge { --iti-flag-offset: -1232px; } .iti__gf { --iti-flag-offset: -1248px; } .iti__gg { --iti-flag-offset: -1264px; } .iti__gh { --iti-flag-offset: -1280px; } .iti__gi { --iti-flag-offset: -1296px; } .iti__gl { --iti-flag-offset: -1312px; } .iti__gm { --iti-flag-offset: -1328px; } .iti__gn { --iti-flag-offset: -1344px; } .iti__gp { --iti-flag-offset: -1360px; } .iti__gq { --iti-flag-offset: -1376px; } .iti__gr { --iti-flag-offset: -1392px; } .iti__gt { --iti-flag-offset: -1408px; } .iti__gu { --iti-flag-offset: -1424px; } .iti__gw { --iti-flag-offset: -1440px; } .iti__gy { --iti-flag-offset: -1456px; } .iti__hk { --iti-flag-offset: -1472px; } .iti__hn { --iti-flag-offset: -1488px; } .iti__hr { --iti-flag-offset: -1504px; } .iti__ht { --iti-flag-offset: -1520px; } .iti__hu { --iti-flag-offset: -1536px; } .iti__id { --iti-flag-offset: -1552px; } .iti__ie { --iti-flag-offset: -1568px; } .iti__il { --iti-flag-offset: -1584px; } .iti__im { --iti-flag-offset: -1600px; } .iti__in { --iti-flag-offset: -1616px; } .iti__io { --iti-flag-offset: -1632px; } .iti__iq { --iti-flag-offset: -1648px; } .iti__ir { --iti-flag-offset: -1664px; } .iti__is { --iti-flag-offset: -1680px; } .iti__it { --iti-flag-offset: -1696px; } .iti__je { --iti-flag-offset: -1712px; } .iti__jm { --iti-flag-offset: -1728px; } .iti__jo { --iti-flag-offset: -1744px; } .iti__jp { --iti-flag-offset: -1760px; } .iti__ke { --iti-flag-offset: -1776px; } .iti__kg { --iti-flag-offset: -1792px; } .iti__kh { --iti-flag-offset: -1808px; } .iti__ki { --iti-flag-offset: -1824px; } .iti__km { --iti-flag-offset: -1840px; } .iti__kn { --iti-flag-offset: -1856px; } .iti__kp { --iti-flag-offset: -1872px; } .iti__kr { --iti-flag-offset: -1888px; } .iti__kw { --iti-flag-offset: -1904px; } .iti__ky { --iti-flag-offset: -1920px; } .iti__kz { --iti-flag-offset: -1936px; } .iti__la { --iti-flag-offset: -1952px; } .iti__lb { --iti-flag-offset: -1968px; } .iti__lc { --iti-flag-offset: -1984px; } .iti__li { --iti-flag-offset: -2000px; } .iti__lk { --iti-flag-offset: -2016px; } .iti__lr { --iti-flag-offset: -2032px; } .iti__ls { --iti-flag-offset: -2048px; } .iti__lt { --iti-flag-offset: -2064px; } .iti__lu { --iti-flag-offset: -2080px; } .iti__lv { --iti-flag-offset: -2096px; } .iti__ly { --iti-flag-offset: -2112px; } .iti__ma { --iti-flag-offset: -2128px; } .iti__mc { --iti-flag-offset: -2144px; } .iti__md { --iti-flag-offset: -2160px; } .iti__me { --iti-flag-offset: -2176px; } .iti__mf { --iti-flag-offset: -2192px; } .iti__mg { --iti-flag-offset: -2208px; } .iti__mh { --iti-flag-offset: -2224px; } .iti__mk { --iti-flag-offset: -2240px; } .iti__ml { --iti-flag-offset: -2256px; } .iti__mm { --iti-flag-offset: -2272px; } .iti__mn { --iti-flag-offset: -2288px; } .iti__mo { --iti-flag-offset: -2304px; } .iti__mp { --iti-flag-offset: -2320px; } .iti__mq { --iti-flag-offset: -2336px; } .iti__mr { --iti-flag-offset: -2352px; } .iti__ms { --iti-flag-offset: -2368px; } .iti__mt { --iti-flag-offset: -2384px; } .iti__mu { --iti-flag-offset: -2400px; } .iti__mv { --iti-flag-offset: -2416px; } .iti__mw { --iti-flag-offset: -2432px; } .iti__mx { --iti-flag-offset: -2448px; } .iti__my { --iti-flag-offset: -2464px; } .iti__mz { --iti-flag-offset: -2480px; } .iti__na { --iti-flag-offset: -2496px; } .iti__nc { --iti-flag-offset: -2512px; } .iti__ne { --iti-flag-offset: -2528px; } .iti__nf { --iti-flag-offset: -2544px; } .iti__ng { --iti-flag-offset: -2560px; } .iti__ni { --iti-flag-offset: -2576px; } .iti__nl { --iti-flag-offset: -2592px; } .iti__no { --iti-flag-offset: -2608px; } .iti__np { --iti-flag-offset: -2624px; } .iti__nr { --iti-flag-offset: -2640px; } .iti__nu { --iti-flag-offset: -2656px; } .iti__nz { --iti-flag-offset: -2672px; } .iti__om { --iti-flag-offset: -2688px; } .iti__pa { --iti-flag-offset: -2704px; } .iti__pe { --iti-flag-offset: -2720px; } .iti__pf { --iti-flag-offset: -2736px; } .iti__pg { --iti-flag-offset: -2752px; } .iti__ph { --iti-flag-offset: -2768px; } .iti__pk { --iti-flag-offset: -2784px; } .iti__pl { --iti-flag-offset: -2800px; } .iti__pm { --iti-flag-offset: -2816px; } .iti__pr { --iti-flag-offset: -2832px; } .iti__ps { --iti-flag-offset: -2848px; } .iti__pt { --iti-flag-offset: -2864px; } .iti__pw { --iti-flag-offset: -2880px; } .iti__py { --iti-flag-offset: -2896px; } .iti__qa { --iti-flag-offset: -2912px; } .iti__re { --iti-flag-offset: -2928px; } .iti__ro { --iti-flag-offset: -2944px; } .iti__rs { --iti-flag-offset: -2960px; } .iti__ru { --iti-flag-offset: -2976px; } .iti__rw { --iti-flag-offset: -2992px; } .iti__sa { --iti-flag-offset: -3008px; } .iti__sb { --iti-flag-offset: -3024px; } .iti__sc { --iti-flag-offset: -3040px; } .iti__sd { --iti-flag-offset: -3056px; } .iti__se { --iti-flag-offset: -3072px; } .iti__sg { --iti-flag-offset: -3088px; } .iti__sh { --iti-flag-offset: -3104px; } .iti__si { --iti-flag-offset: -3120px; } .iti__sj { --iti-flag-offset: -3136px; } .iti__sk { --iti-flag-offset: -3152px; } .iti__sl { --iti-flag-offset: -3168px; } .iti__sm { --iti-flag-offset: -3184px; } .iti__sn { --iti-flag-offset: -3200px; } .iti__so { --iti-flag-offset: -3216px; } .iti__sr { --iti-flag-offset: -3232px; } .iti__ss { --iti-flag-offset: -3248px; } .iti__st { --iti-flag-offset: -3264px; } .iti__sv { --iti-flag-offset: -3280px; } .iti__sx { --iti-flag-offset: -3296px; } .iti__sy { --iti-flag-offset: -3312px; } .iti__sz { --iti-flag-offset: -3328px; } .iti__tc { --iti-flag-offset: -3344px; } .iti__td { --iti-flag-offset: -3360px; } .iti__tg { --iti-flag-offset: -3376px; } .iti__th { --iti-flag-offset: -3392px; } .iti__tj { --iti-flag-offset: -3408px; } .iti__tk { --iti-flag-offset: -3424px; } .iti__tl { --iti-flag-offset: -3440px; } .iti__tm { --iti-flag-offset: -3456px; } .iti__tn { --iti-flag-offset: -3472px; } .iti__to { --iti-flag-offset: -3488px; } .iti__tr { --iti-flag-offset: -3504px; } .iti__tt { --iti-flag-offset: -3520px; } .iti__tv { --iti-flag-offset: -3536px; } .iti__tw { --iti-flag-offset: -3552px; } .iti__tz { --iti-flag-offset: -3568px; } .iti__ua { --iti-flag-offset: -3584px; } .iti__ug { --iti-flag-offset: -3600px; } .iti__us { --iti-flag-offset: -3616px; } .iti__uy { --iti-flag-offset: -3632px; } .iti__uz { --iti-flag-offset: -3648px; } .iti__va { --iti-flag-offset: -3664px; } .iti__vc { --iti-flag-offset: -3680px; } .iti__ve { --iti-flag-offset: -3696px; } .iti__vg { --iti-flag-offset: -3712px; } .iti__vi { --iti-flag-offset: -3728px; } .iti__vn { --iti-flag-offset: -3744px; } .iti__vu { --iti-flag-offset: -3760px; } .iti__wf { --iti-flag-offset: -3776px; } .iti__ws { --iti-flag-offset: -3792px; } .iti__xk { --iti-flag-offset: -3808px; } .iti__ye { --iti-flag-offset: -3824px; } .iti__yt { --iti-flag-offset: -3840px; } .iti__za { --iti-flag-offset: -3856px; } .iti__zm { --iti-flag-offset: -3872px; } .iti__zw { --iti-flag-offset: -3888px; } .iti__globe { background-image: var(--iti-path-globe-1x); background-size: contain; background-position: right; box-shadow: none; height: 19px; } @media (min-resolution: 2x) { .iti__flag { background-image: var(--iti-path-flags-2x); } .iti__globe { background-image: var(--iti-path-globe-2x); } } :root { --iti-path-flags-1x: url("../node_modules/intl-tel-input/build/img/flags.webp"); --iti-path-flags-2x: url("../node_modules/intl-tel-input/build/img/flags@2x.webp"); --iti-path-globe-1x: url("../node_modules/intl-tel-input/build/img/globe.webp"); --iti-path-globe-2x: url("../node_modules/intl-tel-input/build/img/globe@2x.webp"); } .About { align-items: center; display: flex; font-size: 14px; height: 100vh; justify-content: center; overflow: hidden; text-align: center; } .About { background-color: #ffffff; color: #000000; } .dark-theme .About { background-color: #121212; color: rgba(255, 255, 255, 0.8); } .About img { margin-top: 1em; } .About a { color: #2c6bed; } .dark-theme .About a { color: #abc4f8; } .About__Title { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; margin: 0; } .AboutContactModal__headerTitle.module-Modal__headerTitle { padding-block-end: 0; } .AboutContactModal__body_inner { display: flex; flex-direction: column; gap: 12px; padding-inline: 8px; padding-block-end: 20px; } .AboutContactModal__row { display: flex; flex-direction: row; gap: 12px; } .AboutContactModal__row--centered { justify-content: center; } .AboutContactModal__title { font-weight: 600; font-size: 20px; line-height: 26px; letter-spacing: -0.34px; font-weight: 500; margin: 0; margin-block-end: 4px; } .AboutContactModal__row__icon { display: inline-block; height: 20px; width: 20px; vertical-align: text-top; flex-shrink: 0; } .AboutContactModal__row__icon--profile { -webkit-mask: url("../images/icons/v3/person/person-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#000000, #e9e9e9); } @media (forced-colors: active) { .AboutContactModal__row__icon--profile { background-color: WindowText; } } .AboutContactModal__row__icon--verified { -webkit-mask: url("../images/icons/v3/safety_number/safety_number.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#000000, #e9e9e9); } @media (forced-colors: active) { .AboutContactModal__row__icon--verified { background-color: WindowText; } } .AboutContactModal__row__icon--blocked { -webkit-mask: url("../images/icons/v3/block/block.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#000000, #e9e9e9); } @media (forced-colors: active) { .AboutContactModal__row__icon--blocked { background-color: WindowText; } } .AboutContactModal__row__icon--message-request { -webkit-mask: url("../images/icons/v3/chat/chat-badge.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#000000, #e9e9e9); } @media (forced-colors: active) { .AboutContactModal__row__icon--message-request { background-color: WindowText; } } .AboutContactModal__row__icon--no-dms { -webkit-mask: url("../images/icons/v3/chat/chat-x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#000000, #e9e9e9); } @media (forced-colors: active) { .AboutContactModal__row__icon--no-dms { background-color: WindowText; } } .AboutContactModal__row__icon--connections { -webkit-mask: url("../images/icons/v3/connections/connections.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#000000, #e9e9e9); } @media (forced-colors: active) { .AboutContactModal__row__icon--connections { background-color: WindowText; } } .AboutContactModal__row__icon--chat-x { -webkit-mask: url("../images/icons/v3/chat/chat-x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#000000, #e9e9e9); } @media (forced-colors: active) { .AboutContactModal__row__icon--chat-x { background-color: WindowText; } } .AboutContactModal__row__icon--person { -webkit-mask: url("../images/icons/v3/person/person-circle-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#000000, #e9e9e9); } @media (forced-colors: active) { .AboutContactModal__row__icon--person { background-color: WindowText; } } .AboutContactModal__row__icon--phone { -webkit-mask: url("../images/icons/v3/phone/phone-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#000000, #e9e9e9); } @media (forced-colors: active) { .AboutContactModal__row__icon--phone { background-color: WindowText; } } .AboutContactModal__row__icon--group { -webkit-mask: url("../images/icons/v3/group/group.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#000000, #e9e9e9); } @media (forced-colors: active) { .AboutContactModal__row__icon--group { background-color: WindowText; } } .AboutContactModal__row__icon--about { -webkit-mask: url("../images/icons/v3/edit/edit.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#000000, #e9e9e9); } @media (forced-colors: active) { .AboutContactModal__row__icon--about { background-color: WindowText; } } .AboutContactModal__row__icon--note { -webkit-mask: url("../images/icons/v3/note/note.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#000000, #e9e9e9); } @media (forced-colors: active) { .AboutContactModal__row__icon--note { background-color: WindowText; } } .AboutContactModal__row__icon--group-question { -webkit-mask: url("../images/icons/v3/group/group-questionmark-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#000000, #e9e9e9); } @media (forced-colors: active) { .AboutContactModal__row__icon--group-question { background-color: WindowText; } } .AboutContactModal__row__icon--direct-question { -webkit-mask: url("../images/icons/v3/person/person-questionmark-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#000000, #e9e9e9); } @media (forced-colors: active) { .AboutContactModal__row__icon--direct-question { background-color: WindowText; } } .AboutContactModal__row__icon--label { -webkit-mask: url("../images/icons/v3/tag/tag.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#000000, #e9e9e9); } @media (forced-colors: active) { .AboutContactModal__row__icon--label { background-color: WindowText; } } .AboutContactModal__row__icon--qr-code { -webkit-mask: url("../images/icons/v3/qr_code/qr_code.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#000000, #e9e9e9); } @media (forced-colors: active) { .AboutContactModal__row__icon--qr-code { background-color: WindowText; } } .AboutContactModal__label-container { display: flex; align-items: center; gap: 6px; max-width: 100%; white-space: nowrap; overflow-x: hidden; text-overflow: ellipsis; } .AboutContactModal__label-container__string { min-width: 0px; white-space: nowrap; overflow-x: hidden; text-overflow: ellipsis; } .AboutContactModal__button { display: flex; flex-direction: row; align-items: center; min-width: 0; } .AboutContactModal__button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .AboutContactModal__button { border: 1px solid WindowText; } } .keyboard-mode .AboutContactModal__button:focus { box-shadow: 0px 0px 0px 3px #2c6bed; } .dark-theme.keyboard-mode .AboutContactModal__button:focus { box-shadow: 0px 0px 0px 3px #6191f3; } .AboutContactModal__button { border-radius: 3px; padding: 1px; cursor: pointer; } .AboutContactModal__button::after { content: ""; display: inline-block; height: 20px; width: 20px; flex-shrink: 0; } .AboutContactModal__button::after { -webkit-mask: url("../images/icons/v3/chevron/chevron-right-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #848484; } @media (forced-colors: active) { .AboutContactModal__button::after { background-color: WindowText; } } :dir(rtl) .AboutContactModal__button::after { -webkit-mask: url("../images/icons/v3/chevron/chevron-left-bold.svg") no-repeat center; } .AboutContactModal__verified { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .AboutContactModal__verified { border: 1px solid WindowText; } } .AboutContactModal__verified { cursor: pointer; } .AboutContactModal__TitleWithoutNickname { color: #848484; } .AboutContactModal__OneLineEllipsis { white-space: nowrap; overflow-x: hidden; text-overflow: ellipsis; } .AboutContactModal__TitleWithoutNickname__Tooltip { max-width: 300px; } .module-AddGroupMembersModal__header { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; margin: 0; padding: 0; } .module-AddGroupMembersModal__button-container { display: flex; justify-content: flex-end; flex-grow: 0; flex-shrink: 0; padding: 16px; } .module-AddGroupMembersModal__button-container .module-Button:not(:first-child) { margin-inline-start: 12px; } .module-AddGroupMembersModal__close-button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-AddGroupMembersModal__close-button { border: 1px solid WindowText; } } .module-AddGroupMembersModal__close-button { position: absolute; inset-inline-end: 12px; top: 12px; height: 24px; width: 24px; } .module-AddGroupMembersModal__close-button { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .module-AddGroupMembersModal__close-button { background-color: WindowText; } } .dark-theme .module-AddGroupMembersModal__close-button { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .module-AddGroupMembersModal__close-button { background-color: WindowText; } } .keyboard-mode .module-AddGroupMembersModal__close-button:focus { background-color: #2c6bed; } .dark-theme.keyboard-mode .module-AddGroupMembersModal__close-button:focus { background-color: #6191f3; } .module-AddGroupMembersModal .module-ContactPills { max-height: 50px; } .module-AddGroupMembersModal__list-wrapper { flex-grow: 1; overflow: hidden; } .module-AddGroupMembersModal__no-candidate-contacts { flex-grow: 1; display: flex; align-items: center; justify-content: center; } .module-AddGroupMembersModal--choose-members { box-shadow: 0px 8px 20px rgba(0, 0, 0, 0.3), 0px 0px 8px rgba(0, 0, 0, 0.05); } @media (forced-colors: active) { .module-AddGroupMembersModal--choose-members { border: 1px solid WindowText; } } .module-AddGroupMembersModal--choose-members { border-radius: 8px; margin-block: 0; margin-inline: auto; max-height: 100%; max-width: 360px; padding: 16px; position: relative; width: 95%; display: flex; flex-direction: column; } .module-AddGroupMembersModal--choose-members { background: #ffffff; color: #1b1b1b; } .dark-theme .module-AddGroupMembersModal--choose-members { background: #121212; color: #e9e9e9; } .module-AddGroupMembersModal--choose-members { padding: 0; height: 60vh; min-height: 400px; } .module-AddGroupMembersModal--choose-members .module-AddGroupMembersModal__header { padding: 16px; } .module-AddGroupMembersModal--confirm-adds { box-shadow: 0px 8px 20px rgba(0, 0, 0, 0.3), 0px 0px 8px rgba(0, 0, 0, 0.05); } @media (forced-colors: active) { .module-AddGroupMembersModal--confirm-adds { border: 1px solid WindowText; } } .module-AddGroupMembersModal--confirm-adds { border-radius: 8px; margin-block: 0; margin-inline: auto; max-height: 100%; max-width: 360px; padding: 16px; position: relative; width: 95%; display: flex; flex-direction: column; } .module-AddGroupMembersModal--confirm-adds { background: #ffffff; color: #1b1b1b; } .dark-theme .module-AddGroupMembersModal--confirm-adds { background: #121212; color: #e9e9e9; } .module-AddGroupMembersModal--confirm-adds .module-AddGroupMembersModal__button-container { margin-top: 12px; padding: 0; } .module-AddGroupMembersModal .module-conversation-list { padding: 0; } .AddUserToAnotherGroupModal__main-body { display: flex; flex-direction: column; min-height: 300px; } .AddUserToAnotherGroupModal__list-wrapper { flex-grow: 1; overflow: hidden; } .AddUserToAnotherGroupModal .module-conversation-list__item, .AddUserToAnotherGroupModal .module-conversation-list__item--contact-or-conversation { height: 52px; padding-block: 0; padding-inline: 6px; } .AnnouncementsOnlyGroupBanner__banner { font-size: 12px; line-height: 16px; letter-spacing: 0; padding: 16px; text-align: center; } .AnnouncementsOnlyGroupBanner__banner { border-top: 1px solid #e9e9e9; color: #5e5e5e; } .dark-theme .AnnouncementsOnlyGroupBanner__banner { border-top: 1px solid #e9e9e9; color: #e9e9e9; } .AnnouncementsOnlyGroupBanner__banner--admins { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .AnnouncementsOnlyGroupBanner__banner--admins { border: 1px solid WindowText; } } .AnnouncementsOnlyGroupBanner__banner--admins { color: #2c6bed; } .App { height: 100%; position: relative; display: flex; flex-direction: column; } .App.light-theme { background-color: #ffffff; color: #1b1b1b; } .App.dark-theme { background-color: #121212; color: #e9e9e9; } .AttachmentDetailPill--interactive { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .AttachmentDetailPill--interactive { border: 1px solid WindowText; } } .AttachmentDetailPill { position: absolute; top: 6px; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 6px; height: 32px; border-radius: 32px; background-color: rgba(0, 0, 0, 0.8); display: inline-flex; flex-direction: row; align-items: center; z-index: 2; font-size: 11px; line-height: 14px; letter-spacing: 0.06px; color: var(--color-label-primary-on-color); transition: width 400ms ease-out; } .AttachmentDetailPill__spinner-wrapper { position: relative; margin: 4px; margin-inline-end: -4px; } .AttachmentDetailPill__text-wrapper { margin-inline-start: 10px; margin-inline-end: 10px; } .AttachmentDetailPill__icon-wrapper { position: relative; margin-inline-start: 4px; margin-inline-end: -11px; width: 24px; height: 24px; } .AttachmentDetailPill__stop-icon { position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); height: 12px; width: 12px; } .AttachmentDetailPill__stop-icon { -webkit-mask: url("../images/icons/v3/stop/stop-fill.svg") no-repeat center; -webkit-mask-size: 100%; background-color: var(--color-label-primary-on-color); } @media (forced-colors: active) { .AttachmentDetailPill__stop-icon { background-color: WindowText; } } .AttachmentDetailPill__download-icon { position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); height: 16px; width: 16px; } .AttachmentDetailPill__download-icon { -webkit-mask: url("../images/icons/v3/arrow/arrow-down.svg") no-repeat center; -webkit-mask-size: 100%; background-color: var(--color-label-primary-on-color); } @media (forced-colors: active) { .AttachmentDetailPill__download-icon { background-color: WindowText; } } .AttachmentNotAvailableModal__width-container { max-width: 440px; } .AttachmentNotAvailableModal .AttachmentNotAvailableModal__headerTitle { padding-block-end: 5px; } .AttachmentNotAvailableModal__body { padding-block: 16px 0; padding-inline: 16px; } .AttachmentNotAvailableModal .module-Button { padding-inline: 24px; } .AttachmentStatusIcon__container { position: relative; width: 36px; height: 40px; margin-top: 2px; margin-bottom: 2px; margin-inline-end: 12px; } .AttachmentStatusIcon__circle-icon-container { height: 36px; width: 36px; margin-top: 2px; margin-bottom: 2px; border-radius: 18px; position: relative; } .AttachmentStatusIcon__circle-icon-container { background-color: rgba(255, 255, 255, 0.2); } .AttachmentStatusIcon__circle-icon-container:hover { background-color: rgba(255, 255, 255, 0.3); } .AttachmentStatusIcon__circle-icon-container:active { background-color: rgba(255, 255, 255, 0.4); } .dark-theme .AttachmentStatusIcon__circle-icon-container { background-color: rgba(255, 255, 255, 0.2); } .dark-theme .AttachmentStatusIcon__circle-icon-container:hover { background-color: rgba(255, 255, 255, 0.3); } .dark-theme .AttachmentStatusIcon__circle-icon-container:active { background-color: rgba(255, 255, 255, 0.4); } .AttachmentStatusIcon__circle-icon-container--incoming { background-color: rgba(255, 255, 255, 0.8); } .AttachmentStatusIcon__circle-icon-container--incoming:hover { background-color: rgba(255, 255, 255, 0.6); } .AttachmentStatusIcon__circle-icon-container--incoming:active { background-color: rgba(255, 255, 255, 0.4); } .dark-theme .AttachmentStatusIcon__circle-icon-container--incoming { background-color: rgba(255, 255, 255, 0.2); } .AttachmentStatusIcon__circle-icon-container--disabled { background-color: rgba(255, 255, 255, 0.1); } .AttachmentStatusIcon__circle-icon-container--disabled:hover { background-color: rgba(255, 255, 255, 0.1); } .AttachmentStatusIcon__circle-icon-container--disabled:active { background-color: rgba(255, 255, 255, 0.1); } .dark-theme .AttachmentStatusIcon__circle-icon-container--disabled { background-color: rgba(255, 255, 255, 0.1); } .dark-theme .AttachmentStatusIcon__circle-icon-container--disabled:hover { background-color: rgba(255, 255, 255, 0.1); } .dark-theme .AttachmentStatusIcon__circle-icon-container--disabled:active { background-color: rgba(255, 255, 255, 0.1); } .AttachmentStatusIcon__circle-icon-container--incoming.AttachmentStatusIcon__circle-icon-container--disabled { background-color: rgba(255, 255, 255, 0.6); } .AttachmentStatusIcon__circle-icon-container--incoming.AttachmentStatusIcon__circle-icon-container--disabled:hover { background-color: rgba(255, 255, 255, 0.6); } .AttachmentStatusIcon__circle-icon-container--incoming.AttachmentStatusIcon__circle-icon-container--disabled:active { background-color: rgba(255, 255, 255, 0.6); } .dark-theme .AttachmentStatusIcon__circle-icon-container--incoming.AttachmentStatusIcon__circle-icon-container--disabled { background-color: rgba(255, 255, 255, 0.1); } .dark-theme .AttachmentStatusIcon__circle-icon-container--incoming.AttachmentStatusIcon__circle-icon-container--disabled:hover { background-color: rgba(255, 255, 255, 0.1); } .dark-theme .AttachmentStatusIcon__circle-icon-container--incoming.AttachmentStatusIcon__circle-icon-container--disabled:active { background-color: rgba(255, 255, 255, 0.1); } .AttachmentStatusIcon__circle-icon { position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); } .AttachmentStatusIcon__circle-icon { height: 20px; width: 20px; } .AttachmentStatusIcon__circle-icon--x { -webkit-mask: url("../images/icons/v3/x/x-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: var(--color-label-primary-on-color); } @media (forced-colors: active) { .AttachmentStatusIcon__circle-icon--x { background-color: WindowText; } } .dark-theme .AttachmentStatusIcon__circle-icon--x { -webkit-mask: url("../images/icons/v3/x/x-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: var(--color-label-primary-on-color); } @media (forced-colors: active) { .dark-theme .AttachmentStatusIcon__circle-icon--x { background-color: WindowText; } } .AttachmentStatusIcon__circle-icon--arrow-down { -webkit-mask: url("../images/icons/v3/arrow/arrow-down-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: var(--color-label-primary-on-color); } @media (forced-colors: active) { .AttachmentStatusIcon__circle-icon--arrow-down { background-color: WindowText; } } .dark-theme .AttachmentStatusIcon__circle-icon--arrow-down { -webkit-mask: url("../images/icons/v3/arrow/arrow-down-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: var(--color-label-primary-on-color); } @media (forced-colors: active) { .dark-theme .AttachmentStatusIcon__circle-icon--arrow-down { background-color: WindowText; } } .AttachmentStatusIcon__circle-icon--incoming { background-color: var(--color-label-primary); } .dark-theme .AttachmentStatusIcon__circle-icon--incoming { background-color: var(--color-label-primary); } .AudioCapture { display: flex; text-align: center; flex-direction: row; justify-content: center; align-items: center; background: none; } .AudioCapture__microphone { height: 32px; width: 32px; border-radius: 4px; text-align: center; background: none; display: flex; align-items: center; justify-content: center; padding: 0; border: none; outline: none; } .keyboard-mode .AudioCapture__microphone:focus { outline: 2px solid #2c6bed; } .AudioCapture__microphone:before { content: ""; display: inline-block; height: 20px; width: 20px; } .AudioCapture__microphone:before { -webkit-mask: url("../images/icons/v3/mic/mic.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .AudioCapture__microphone:before { background-color: WindowText; } } .dark-theme .AudioCapture__microphone:before { -webkit-mask: url("../images/icons/v3/mic/mic.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .AudioCapture__microphone:before { background-color: WindowText; } } .AudioCapture__recorder-button { flex-grow: 0; flex-shrink: 0; width: 32px; height: 32px; border-radius: 32px; opacity: 0.3; text-align: center; padding: 0; outline: none; } .AudioCapture__recorder-button:focus, .AudioCapture__recorder-button:hover { opacity: 1; } .AudioCapture__recorder-button .icon { display: inline-block; width: 24px; height: 24px; margin-bottom: -3px; } .AudioCapture__recorder-button--complete { background: rgb(145.5378486056, 207.4621513944, 148.0398406375); border: 1px solid #4caf50; } .AudioCapture__recorder-button--complete .icon { -webkit-mask: url("../images/icons/v3/check/check.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #4caf50; } @media (forced-colors: active) { .AudioCapture__recorder-button--complete .icon { background-color: WindowText; } } .AudioCapture__recorder-button--cancel { background: rgb(249.2924528302, 157.4528301887, 150.7075471698); border: 1px solid #f44336; } .AudioCapture__recorder-button--cancel .icon { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #f44336; } @media (forced-colors: active) { .AudioCapture__recorder-button--cancel .icon { background-color: WindowText; } } .AudioCapture__time { color: #5e5e5e; font-variant: tabular-nums; line-height: 36px; margin-block: 0; margin-inline: 15px; } @keyframes pulse { 0% { opacity: 0; } 50% { opacity: 1; } 100% { opacity: 0; } } .AudioCapture__time::before { content: ""; display: inline-block; border-radius: 10px; width: 10px; height: 10px; background: #f44336; margin-inline-end: 10px; opacity: 0; animation: pulse 2s infinite; } .AutoSizeInput__input { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; background: inherit; border: none; resize: none; padding: 0; min-width: 20px; width: 20px; } .AutoSizeInput__input:placeholder { color: #848484; } .AutoSizeInput__input { color: #000000; } .dark-theme .AutoSizeInput__input { color: #e9e9e9; } .AutoSizeInput__input:focus { outline: none; } .AutoSizeInput__input--sizer { visibility: hidden; position: absolute; inset-inline-start: 0; top: 0; width: auto; z-index: -1; } .module-Avatar { display: inline-flex; line-height: 0; position: relative; z-index: 0; user-select: none; vertical-align: middle; } .module-Avatar__contents--A100 { --bg: #e3e3fe; --fg: #3838f5; background-color: var(--bg); color: var(--fg); } .module-Avatar__contents--A100--icon { background-color: var(--fg); } .dark-theme .module-Avatar__contents--A100--icon { background-color: var(--fg); } .module-Avatar__contents--A110 { --bg: #dde7fc; --fg: #1251d3; background-color: var(--bg); color: var(--fg); } .module-Avatar__contents--A110--icon { background-color: var(--fg); } .dark-theme .module-Avatar__contents--A110--icon { background-color: var(--fg); } .module-Avatar__contents--A120 { --bg: #d8e8f0; --fg: #086da0; background-color: var(--bg); color: var(--fg); } .module-Avatar__contents--A120--icon { background-color: var(--fg); } .dark-theme .module-Avatar__contents--A120--icon { background-color: var(--fg); } .module-Avatar__contents--A130 { --bg: #cde4cd; --fg: #067906; background-color: var(--bg); color: var(--fg); } .module-Avatar__contents--A130--icon { background-color: var(--fg); } .dark-theme .module-Avatar__contents--A130--icon { background-color: var(--fg); } .module-Avatar__contents--A140 { --bg: #eae0fd; --fg: #661aff; background-color: var(--bg); color: var(--fg); } .module-Avatar__contents--A140--icon { background-color: var(--fg); } .dark-theme .module-Avatar__contents--A140--icon { background-color: var(--fg); } .module-Avatar__contents--A150 { --bg: #f5e3fe; --fg: #9f00f0; background-color: var(--bg); color: var(--fg); } .module-Avatar__contents--A150--icon { background-color: var(--fg); } .dark-theme .module-Avatar__contents--A150--icon { background-color: var(--fg); } .module-Avatar__contents--A160 { --bg: #f6d8ec; --fg: #b8057c; background-color: var(--bg); color: var(--fg); } .module-Avatar__contents--A160--icon { background-color: var(--fg); } .dark-theme .module-Avatar__contents--A160--icon { background-color: var(--fg); } .module-Avatar__contents--A170 { --bg: #f5d7d7; --fg: #be0404; background-color: var(--bg); color: var(--fg); } .module-Avatar__contents--A170--icon { background-color: var(--fg); } .dark-theme .module-Avatar__contents--A170--icon { background-color: var(--fg); } .module-Avatar__contents--A180 { --bg: #fef5d0; --fg: #836b01; background-color: var(--bg); color: var(--fg); } .module-Avatar__contents--A180--icon { background-color: var(--fg); } .dark-theme .module-Avatar__contents--A180--icon { background-color: var(--fg); } .module-Avatar__contents--A190 { --bg: #eae6d5; --fg: #7d6f40; background-color: var(--bg); color: var(--fg); } .module-Avatar__contents--A190--icon { background-color: var(--fg); } .dark-theme .module-Avatar__contents--A190--icon { background-color: var(--fg); } .module-Avatar__contents--A200 { --bg: #d2d2dc; --fg: #4f4f6d; background-color: var(--bg); color: var(--fg); } .module-Avatar__contents--A200--icon { background-color: var(--fg); } .dark-theme .module-Avatar__contents--A200--icon { background-color: var(--fg); } .module-Avatar__contents--A210 { --bg: #d7d7d9; --fg: #5c5c5c; background-color: var(--bg); color: var(--fg); } .module-Avatar__contents--A210--icon { background-color: var(--fg); } .dark-theme .module-Avatar__contents--A210--icon { background-color: var(--fg); } .module-Avatar__contents { position: relative; overflow: hidden; border-radius: 100%; width: 100%; height: 100%; border: 0; padding: 0; margin: 0; outline: none; } .keyboard-mode button.module-Avatar__contents:focus { box-shadow: 0 0 0 3px #2c6bed; } .module-Avatar__contents:has(.module-Avatar__image) { background-color: transparent; } .module-Avatar__image, .module-Avatar__label, .module-Avatar__icon, .module-Avatar__spinner-container, .module-Avatar__click-to-view { width: 100%; height: 100%; } .module-Avatar__image { background-position: center center; background-size: cover; transition: filter 100ms ease-out; } .module-Avatar__click-to-view { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; align-items: center; background: rgba(0, 0, 0, 0.2); color: #ffffff; display: flex; flex-direction: column; justify-content: center; inset-inline-start: 0; position: absolute; top: 0; } .module-Avatar__click-to-view::before { -webkit-mask: url("../images/icons/v2/click-outline-24.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .module-Avatar__click-to-view::before { background-color: WindowText; } } .module-Avatar__click-to-view::before { content: ""; display: block; height: 24px; margin-bottom: 8px; width: 24px; } .module-Avatar__click-to-view:hover { background: rgba(0, 0, 0, 0.4); } .module-Avatar__label { align-items: center; display: flex; justify-content: center; text-align: center; transition: font-size 100ms ease-out; } .module-Avatar__icon { -webkit-mask-repeat: no-repeat; -webkit-mask-position: center; -webkit-mask-size: 62.5%; background-color: var(--fg); } @media (forced-colors: active) { .module-Avatar__icon { background-color: WindowText; } } .module-Avatar__icon--callLink { -webkit-mask-image: url("../images/icons/v3/video/video-display-bold.svg"); } .module-Avatar__icon--direct { -webkit-mask-image: url("../images/icons/v3/person/person.svg"); } .module-Avatar__icon--group { -webkit-mask-image: url("../images/icons/v3/group/group.svg"); } .module-Avatar__icon--note-to-self { -webkit-mask-image: url("../images/icons/v3/note/note.svg"); } .module-Avatar__icon--search-result { -webkit-mask-image: url("../images/icons/v3/search/search.svg"); } .module-Avatar__spinner-container { padding: 4px; } .module-Avatar__badge { position: absolute; z-index: 1; bottom: 0; inset-inline-end: 0; } .module-Avatar__badge--static { pointer-events: none; } .module-Avatar__badge--button { background-color: transparent; background-position: center center; background-size: contain; border: 0; outline: none; } .keyboard-mode .module-Avatar__badge--button:focus { outline: 2px solid #2c6bed; border-radius: 6px; } .module-Avatar--with-story { border-radius: 100%; border: 2px solid rgba(0, 0, 0, 0.4); padding: 3px; } .dark-theme .module-Avatar--with-story { border-color: rgba(255, 255, 255, 0.4); } .dark-theme .module-Avatar--with-story--unread { border-color: #406ec9; } .module-Avatar--with-story--unread { border-color: #406ec9; } .module-Avatar--signal-official .module-Avatar__contents { align-items: center; background-color: #3640fd; display: flex; justify-content: center; } .module-Avatar--signal-official .module-Avatar__image { height: 62%; width: 62%; } .AvatarEditor__top-buttons { display: flex; } .AvatarEditor__button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .AvatarEditor__button { border: 1px solid WindowText; } } .AvatarEditor__button { align-items: center; border-radius: 8px; display: flex; flex-direction: column; font-size: 9px; justify-content: center; line-height: 14px; margin-block: 0; margin-inline: 8px; min-height: 44px; min-width: 60px; padding-block: 0; padding-inline: 8px; } .AvatarEditor__button { background-color: #e9e9e9; color: #000000; } .dark-theme .AvatarEditor__button { background-color: #4a4a4a; color: #e9e9e9; } .AvatarEditor__button::before { content: ""; display: block; height: 18px; width: 18px; } .AvatarEditor__button--photo::before { -webkit-mask: url("../images/icons/v3/album/album-tilt.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .AvatarEditor__button--photo::before { background-color: WindowText; } } .dark-theme .AvatarEditor__button--photo::before { -webkit-mask: url("../images/icons/v3/album/album-tilt.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #e9e9e9; } @media (forced-colors: active) { .dark-theme .AvatarEditor__button--photo::before { background-color: WindowText; } } .AvatarEditor__button--text::before { -webkit-mask: url("../images/icons/v2/text-24.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .AvatarEditor__button--text::before { background-color: WindowText; } } .dark-theme .AvatarEditor__button--text::before { -webkit-mask: url("../images/icons/v2/text-24.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #e9e9e9; } @media (forced-colors: active) { .dark-theme .AvatarEditor__button--text::before { background-color: WindowText; } } .AvatarEditor__button:focus { box-shadow: 0 0 0 2px #2c6bed; } .AvatarEditor__avatars { display: flex; flex-wrap: wrap; gap: 9px; } .AvatarEditor__divider { border: none; border-bottom: 1px solid #dedede; margin-bottom: 24px; margin-top: 20px; } .AvatarEditor__divider { border-color: #dedede; } .dark-theme .AvatarEditor__divider { border-color: #3b3b3b; } .AvatarEditor__preview { align-items: center; display: flex; flex-direction: column; justify-content: center; width: 100%; } .AvatarEditor__avatar-selector-title { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; margin-bottom: 14px; } .AvatarModalButtons { bottom: 0; position: absolute; inset-inline-end: 0; } .AvatarModalButtons .module-Button { margin-inline-start: 12px; } .AvatarPreview { align-items: center; display: flex; flex-direction: column; justify-content: center; width: 100%; } .AvatarPreview__avatar { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .AvatarPreview__avatar { border: 1px solid WindowText; } } .AvatarPreview__avatar { align-items: center; border-radius: 100%; cursor: auto; display: flex; font-size: 32px; height: 80px; justify-content: center; margin-bottom: 16px; margin-top: 4px; position: relative; transition: background-color 100ms ease-out; user-select: none; width: 80px; } .AvatarPreview__avatar--loading { background: #000000; } .AvatarPreview__avatar--has-image { background-size: cover; background-position: center center; } .keyboard-mode .AvatarPreview__avatar:focus { box-shadow: 0 0 0 3px #2c6bed; } .AvatarPreview__group { -webkit-mask: url("../images/icons/v3/group/group.svg") no-repeat center; -webkit-mask-size: 70%; height: 100%; width: 100%; } .AvatarPreview__note_to_self { -webkit-mask: url("../images/icons/v3/note/note.svg") no-repeat center; -webkit-mask-size: 70%; height: 100%; width: 100%; } .AvatarPreview__upload { align-items: center; background: #f6f6f6; border-radius: 100%; bottom: 4px; box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.12), 0px 2px 4px rgba(0, 0, 0, 0.2); display: flex; height: 28px; justify-content: center; position: absolute; inset-inline-end: -7px; width: 28px; } .AvatarPreview__upload::after { -webkit-mask: url("../images/icons/v3/camera/camera.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .AvatarPreview__upload::after { background-color: WindowText; } } .AvatarPreview__upload::after { content: ""; display: block; height: 16px; width: 16px; } .AvatarPreview__clear { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .AvatarPreview__clear { border: 1px solid WindowText; } } .AvatarPreview__clear { align-items: center; background-color: #ffffff; border-radius: 100%; box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.12), 0px 2px 4px rgba(0, 0, 0, 0.2); display: flex; height: 24px; justify-content: center; position: absolute; inset-inline-end: 0; top: 0; width: 24px; } .AvatarPreview__clear:after { -webkit-mask: url("../images/icons/v3/x/x-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .AvatarPreview__clear:after { background-color: WindowText; } } .AvatarPreview__clear:after { content: ""; height: 16px; width: 16px; } .AvatarTextEditor__input { background: transparent; border: none; color: inherit; outline: none; padding: 0; text-align: center; transition: font-size 30ms linear; width: 100%; } .AvatarTextEditor__measure { inset-inline-start: -9999; position: fixed; top: -9999; touch-action: none; visibility: hidden; } .BackfillFailureModal__width-container { max-width: 440px; } .BackfillFailureModal__body { padding-block: 16px 0; padding-inline: 16px; } .BackfillFailureModal .module-Button { padding-inline: 24px; } .BackfillFailureModal .module-Modal__button-footer { padding-block-start: 18px; } .BackupMediaDownloadProgress__content { display: flex; flex-direction: column; justify-content: center; min-height: 36px; margin-inline-end: 20px; gap: 2px; } .BackupMediaDownloadProgress__title { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; font-weight: 600; } .BackupMediaDownloadProgress__icon--complete::after { content: ""; display: block; width: 24px; height: 24px; } .BackupMediaDownloadProgress__icon--complete::after { -webkit-mask: url("../images/icons/v3/check/check-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #2c6bed; } @media (forced-colors: active) { .BackupMediaDownloadProgress__icon--complete::after { background-color: WindowText; } } .dark-theme .BackupMediaDownloadProgress__icon--complete::after { -webkit-mask: url("../images/icons/v3/check/check-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #6191f3; } @media (forced-colors: active) { .dark-theme .BackupMediaDownloadProgress__icon--complete::after { background-color: WindowText; } } .BackupMediaDownloadProgress__icon--idle::after { content: ""; display: block; width: 24px; height: 24px; } .BackupMediaDownloadProgress__icon--idle::after { -webkit-mask: url("../images/icons/v3/signal_backups/signal_backups.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #2c6bed; } @media (forced-colors: active) { .BackupMediaDownloadProgress__icon--idle::after { background-color: WindowText; } } .dark-theme .BackupMediaDownloadProgress__icon--idle::after { -webkit-mask: url("../images/icons/v3/signal_backups/signal_backups.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #6191f3; } @media (forced-colors: active) { .dark-theme .BackupMediaDownloadProgress__icon--idle::after { background-color: WindowText; } } button.BackupMediaDownloadProgress__button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { button.BackupMediaDownloadProgress__button { border: 1px solid WindowText; } } button.BackupMediaDownloadProgress__button { font-size: 12px; line-height: 16px; letter-spacing: 0; } button.BackupMediaDownloadProgress__button { font-weight: 600; } button.BackupMediaDownloadProgress__button { color: #2c6bed; } .dark-theme button.BackupMediaDownloadProgress__button { color: #6191f3; } button.BackupMediaDownloadProgress__button-more { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { button.BackupMediaDownloadProgress__button-more { border: 1px solid WindowText; } } button.BackupMediaDownloadProgress__button-more { position: absolute; inset-block-start: 8px; inset-inline-end: 14px; } button.BackupMediaDownloadProgress__button-more::after { content: ""; display: block; width: 20px; height: 20px; } button.BackupMediaDownloadProgress__button-more::after { -webkit-mask: url("../images/icons/v3/more/more.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { button.BackupMediaDownloadProgress__button-more::after { background-color: WindowText; } } .dark-theme button.BackupMediaDownloadProgress__button-more::after { -webkit-mask: url("../images/icons/v3/more/more.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #c6c6c6; } @media (forced-colors: active) { .dark-theme button.BackupMediaDownloadProgress__button-more::after { background-color: WindowText; } } button.BackupMediaDownloadProgress__button-close { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { button.BackupMediaDownloadProgress__button-close { border: 1px solid WindowText; } } button.BackupMediaDownloadProgress__button-close { position: absolute; inset-block-start: 12px; inset-inline-end: 12px; } button.BackupMediaDownloadProgress__button-close::after { content: ""; display: block; width: 20px; height: 20px; } button.BackupMediaDownloadProgress__button-close::after { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #848484; } @media (forced-colors: active) { button.BackupMediaDownloadProgress__button-close::after { background-color: WindowText; } } .dark-theme button.BackupMediaDownloadProgress__button-close::after { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #c6c6c6; } @media (forced-colors: active) { .dark-theme button.BackupMediaDownloadProgress__button-close::after { background-color: WindowText; } } .BackupMediaDownloadProgress__description { font-size: 12px; line-height: 16px; letter-spacing: 0; } .BackupMediaDownloadProgress__description { color: rgba(94, 94, 94, 0.8); } .dark-theme .BackupMediaDownloadProgress__description { color: #b9b9b9; } .BackupMediaDownloadCancelConfirmation { min-width: 440px; } .BackupMediaDownloadCancelConfirmation a { text-decoration: none; } .BackupMediaDownloadProgressSettings { display: flex; flex-direction: row; align-items: center; gap: 20px; } .BackupMediaDownloadProgressSettings__buttons { display: flex; gap: 12px; } .BackupMediaDownloadProgressSettings__content { display: flex; flex-direction: column; justify-content: center; gap: 5px; flex: 1; } .BackupMediaDownloadProgressSettings__description { color: light-dark(#5e5e5e, #b9b9b9); font-size: 12px; line-height: 16px; } .BadgeCarouselIndex { display: flex; flex-wrap: wrap; justify-content: center; row-gap: 10px; column-gap: 8px; } .BadgeCarouselIndex__dot { border-radius: 100%; height: 8px; width: 8px; margin-top: 8px; } .BadgeCarouselIndex__dot { background: rgba(0, 0, 0, 0.2); } .dark-theme .BadgeCarouselIndex__dot { background: rgba(255, 255, 255, 0.2); } .BadgeCarouselIndex__dot--selected { background: #2c6bed; } .dark-theme .BadgeCarouselIndex__dot--selected { background: #6191f3; } .BadgeDialog { user-select: none; } .BadgeDialog__width-container { max-width: 420px; } .BadgeDialog__contents { display: flex; align-items: center; } .BadgeDialog__nav { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .BadgeDialog__nav { border: 1px solid WindowText; } } .BadgeDialog__nav { align-items: center; border-radius: 4px; display: flex; justify-content: center; padding-block: 3px; padding-inline: 0; } .BadgeDialog__nav[disabled] { visibility: hidden; } .BadgeDialog__nav::before { content: ""; display: block; width: 20px; height: 20px; } .BadgeDialog__nav:hover, .BadgeDialog__nav:focus { background: #f6f6f6; } .BadgeDialog__nav:active { background: #e9e9e9; } .dark-theme .BadgeDialog__nav:hover, .dark-theme .BadgeDialog__nav:focus { background: #2e2e2e; } .dark-theme .BadgeDialog__nav:active { background: #3b3b3b; } .BadgeDialog__nav--previous::before { -webkit-mask: url("../images/icons/v3/chevron/chevron-left.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #4a4a4a; } @media (forced-colors: active) { .BadgeDialog__nav--previous::before { background-color: WindowText; } } :dir(rtl) .BadgeDialog__nav--previous::before { -webkit-mask: url("../images/icons/v3/chevron/chevron-right.svg") no-repeat center; } .dark-theme .BadgeDialog__nav--previous::before { -webkit-mask: url("../images/icons/v3/chevron/chevron-left.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #e9e9e9; } @media (forced-colors: active) { .dark-theme .BadgeDialog__nav--previous::before { background-color: WindowText; } } :dir(rtl) .dark-theme .BadgeDialog__nav--previous::before { -webkit-mask: url("../images/icons/v3/chevron/chevron-right.svg") no-repeat center; } .BadgeDialog__nav--next::before { -webkit-mask: url("../images/icons/v3/chevron/chevron-right.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #4a4a4a; } @media (forced-colors: active) { .BadgeDialog__nav--next::before { background-color: WindowText; } } :dir(rtl) .BadgeDialog__nav--next::before { -webkit-mask: url("../images/icons/v3/chevron/chevron-left.svg") no-repeat center; } .dark-theme .BadgeDialog__nav--next::before { -webkit-mask: url("../images/icons/v3/chevron/chevron-right.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #e9e9e9; } @media (forced-colors: active) { .dark-theme .BadgeDialog__nav--next::before { background-color: WindowText; } } :dir(rtl) .dark-theme .BadgeDialog__nav--next::before { -webkit-mask: url("../images/icons/v3/chevron/chevron-left.svg") no-repeat center; } .BadgeDialog__main { flex-grow: 1; text-align: center; padding-block: 24px; padding-inline: 10px; } .BadgeDialog__name { font-weight: 600; font-size: 20px; line-height: 26px; letter-spacing: -0.34px; height: 3.5em; overflow-y: auto; align-items: center; display: flex; justify-content: center; margin-bottom: 8px; margin-top: 12px; } .BadgeDialog__description { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; height: 5.5em; overflow-y: auto; margin-bottom: 12px; } .BadgeDialog__instructions-button { width: 100%; } .BadgeDialog__instructions-button.module-Button { font-size: 17px; } .BadgeDialog__instructions-button--hidden { visibility: hidden; } .BadgeDialog .BadgeCarouselIndex { margin-top: 24px; } .BadgeSustainerInstructionsDialog { user-select: none; } .BadgeSustainerInstructionsDialog__width-container { max-width: 420px; } .BadgeSustainerInstructionsDialog__header { font-weight: 600; font-size: 20px; line-height: 26px; letter-spacing: -0.34px; text-align: center; } .BadgeSustainerInstructionsDialog__subheader { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: normal; text-align: center; } .BadgeSustainerInstructionsDialog__instructions { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; padding: 0; list-style-type: decimal; list-style-position: inside; } .BadgeSustainerInstructionsDialog__instructions::before { background-size: contain; content: ""; display: block; height: 160px; margin-block: 24px; margin-inline: auto; width: 146px; } .BadgeSustainerInstructionsDialog__instructions::before { background-image: url("../images/mobile-settings-light.svg"); } .dark-theme .BadgeSustainerInstructionsDialog__instructions::before { background-image: url("../images/mobile-settings-dark.svg"); } .BadgeSustainerInstructionsDialog__instructions > li { margin-top: 1em; } .BadgeSustainerInstructionsDialog__instructions > li:first-child { margin-top: 0; } .BetterAvatarBubble { align-items: center; background-clip: content-box; background-position: center; border-color: transparent; border-radius: 100%; border-style: solid; border-width: 2px; cursor: pointer; display: flex; font-size: 32px; height: 56px; justify-content: center; padding: 2px; position: relative; width: 56px; } .BetterAvatarBubble--A100 { --bg: #e3e3fe; --fg: #3838f5; background-color: var(--bg); color: var(--fg); } .BetterAvatarBubble--A100--icon { background-color: var(--fg); } .dark-theme .BetterAvatarBubble--A100--icon { background-color: var(--fg); } .BetterAvatarBubble--A110 { --bg: #dde7fc; --fg: #1251d3; background-color: var(--bg); color: var(--fg); } .BetterAvatarBubble--A110--icon { background-color: var(--fg); } .dark-theme .BetterAvatarBubble--A110--icon { background-color: var(--fg); } .BetterAvatarBubble--A120 { --bg: #d8e8f0; --fg: #086da0; background-color: var(--bg); color: var(--fg); } .BetterAvatarBubble--A120--icon { background-color: var(--fg); } .dark-theme .BetterAvatarBubble--A120--icon { background-color: var(--fg); } .BetterAvatarBubble--A130 { --bg: #cde4cd; --fg: #067906; background-color: var(--bg); color: var(--fg); } .BetterAvatarBubble--A130--icon { background-color: var(--fg); } .dark-theme .BetterAvatarBubble--A130--icon { background-color: var(--fg); } .BetterAvatarBubble--A140 { --bg: #eae0fd; --fg: #661aff; background-color: var(--bg); color: var(--fg); } .BetterAvatarBubble--A140--icon { background-color: var(--fg); } .dark-theme .BetterAvatarBubble--A140--icon { background-color: var(--fg); } .BetterAvatarBubble--A150 { --bg: #f5e3fe; --fg: #9f00f0; background-color: var(--bg); color: var(--fg); } .BetterAvatarBubble--A150--icon { background-color: var(--fg); } .dark-theme .BetterAvatarBubble--A150--icon { background-color: var(--fg); } .BetterAvatarBubble--A160 { --bg: #f6d8ec; --fg: #b8057c; background-color: var(--bg); color: var(--fg); } .BetterAvatarBubble--A160--icon { background-color: var(--fg); } .dark-theme .BetterAvatarBubble--A160--icon { background-color: var(--fg); } .BetterAvatarBubble--A170 { --bg: #f5d7d7; --fg: #be0404; background-color: var(--bg); color: var(--fg); } .BetterAvatarBubble--A170--icon { background-color: var(--fg); } .dark-theme .BetterAvatarBubble--A170--icon { background-color: var(--fg); } .BetterAvatarBubble--A180 { --bg: #fef5d0; --fg: #836b01; background-color: var(--bg); color: var(--fg); } .BetterAvatarBubble--A180--icon { background-color: var(--fg); } .dark-theme .BetterAvatarBubble--A180--icon { background-color: var(--fg); } .BetterAvatarBubble--A190 { --bg: #eae6d5; --fg: #7d6f40; background-color: var(--bg); color: var(--fg); } .BetterAvatarBubble--A190--icon { background-color: var(--fg); } .dark-theme .BetterAvatarBubble--A190--icon { background-color: var(--fg); } .BetterAvatarBubble--A200 { --bg: #d2d2dc; --fg: #4f4f6d; background-color: var(--bg); color: var(--fg); } .BetterAvatarBubble--A200--icon { background-color: var(--fg); } .dark-theme .BetterAvatarBubble--A200--icon { background-color: var(--fg); } .BetterAvatarBubble--A210 { --bg: #d7d7d9; --fg: #5c5c5c; background-color: var(--bg); color: var(--fg); } .BetterAvatarBubble--A210--icon { background-color: var(--fg); } .dark-theme .BetterAvatarBubble--A210--icon { background-color: var(--fg); } .BetterAvatarBubble--selected { border-color: #000000; } .dark-theme .BetterAvatarBubble--selected { border-color: #ffffff; } .keyboard-mode .BetterAvatarBubble:focus { border-color: #2c6bed; outline: none; } .BetterAvatarBubble--editable { display: flex; align-items: center; justify-content: center; border-radius: 100%; background: rgba(0, 0, 0, 0.2); height: 100%; width: 100%; } .BetterAvatarBubble--editable::after { content: ""; display: block; height: 24px; width: 24px; } .BetterAvatarBubble--editable::after { -webkit-mask: url("../images/icons/v3/edit/edit.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .BetterAvatarBubble--editable::after { background-color: WindowText; } } .BetterAvatarBubble__delete { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .BetterAvatarBubble__delete { border: 1px solid WindowText; } } .BetterAvatarBubble__delete { align-items: center; background-color: #ffffff; border-radius: 100%; box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.12), 0px 2px 4px rgba(0, 0, 0, 0.2); display: none; height: 20px; justify-content: center; position: absolute; top: 0; inset-inline-end: 0; width: 20px; } .BetterAvatarBubble__delete:after { -webkit-mask: url("../images/icons/v3/x/x-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .BetterAvatarBubble__delete:after { background-color: WindowText; } } .BetterAvatarBubble__delete:after { content: ""; height: 10px; width: 10px; } .BetterAvatarBubble:hover .BetterAvatarBubble__delete { display: flex; } .module-Button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-Button { border: 1px solid WindowText; } } .module-Button { border-radius: 4px; padding-block: 8px; padding-inline: 16px; text-align: center; user-select: none; -webkit-app-region: no-drag; } .keyboard-mode .module-Button:focus { box-shadow: 0 0 0 1px #ffffff, 0 0 0 4px #2c6bed; } .dark-theme.keyboard-mode .module-Button:focus { box-shadow: 0 0 0 1px #000000, 0 0 0 4px #2c6bed; } .module-Button:is(:disabled, [aria-disabled=true]) { cursor: not-allowed; } .module-Button--large { font-weight: 600; font-size: 20px; line-height: 26px; letter-spacing: -0.34px; font-weight: bold; } .module-Button--medium { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; } .module-Button--small { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; border-radius: 9999px; padding-block: 6px; padding-inline: 12px; } .module-Button--primary { color: #ffffff; background: #2c6bed; } .module-Button--primary:is(:disabled, [aria-disabled=true]) { color: rgba(255, 255, 255, 0.6); background: rgba(44, 107, 237, 0.4); } .module-Button--primary--discouraged { opacity: 0.4; } .dark-theme .module-Button--primary--discouraged { opacity: 0.5; } .module-Button--primary:hover:not(:disabled):not([aria-disabled=true]) { background: rgb(37.4, 90.95, 201.45); } .module-Button--primary:active:not(:disabled):not([aria-disabled=true]) { background: rgb(33, 80.25, 177.75); } .dark-theme .module-Button--primary:hover:not(:disabled):not([aria-disabled=true]) { background: rgb(75.65, 129.2, 239.7); } .dark-theme .module-Button--primary:active:not(:disabled):not([aria-disabled=true]) { background: rgb(96.75, 144, 241.5); } .module-Button--secondary { color: #1b1b1b; background: #e9e9e9; } .module-Button--secondary:is(:disabled, [aria-disabled=true]) { color: rgba(0, 0, 0, 0.4); background: rgba(233, 233, 233, 0.4); } .module-Button--secondary--affirmative { color: #2c6bed; } .module-Button--secondary--affirmative--discouraged { color: rgba(44, 107, 237, 0.5); } .module-Button--secondary--destructive { color: #f44336; } .module-Button--secondary--destructive--discouraged { color: rgba(44, 107, 237, 0.5); } .module-Button--secondary:hover:not(:disabled):not([aria-disabled=true]) { background: rgb(198.05, 198.05, 198.05); } .module-Button--secondary:active:not(:disabled):not([aria-disabled=true]) { background: rgb(174.75, 174.75, 174.75); } .dark-theme .module-Button--secondary { color: #e9e9e9; background: #4a4a4a; } .dark-theme .module-Button--secondary:is(:disabled, [aria-disabled=true]) { color: rgba(255, 255, 255, 0.2); background: rgba(74, 74, 74, 0.4); } .dark-theme .module-Button--secondary--affirmative { color: #6191f3; } .dark-theme .module-Button--secondary--affirmative--discouraged { color: rgba(97, 145, 243, 0.5); } .dark-theme .module-Button--secondary--destructive { color: #f44336; } .dark-theme .module-Button--secondary--destructive--discouraged { color: rgba(244, 67, 54, 0.5); } .dark-theme .module-Button--secondary:hover:not(:disabled):not([aria-disabled=true]) { background: rgb(101.15, 101.15, 101.15); } .dark-theme .module-Button--secondary:active:not(:disabled):not([aria-disabled=true]) { background: rgb(119.25, 119.25, 119.25); } .module-Button--destructive { color: #ffffff; background: #f44336; } .module-Button--destructive:is(:disabled, [aria-disabled=true]) { color: rgba(255, 255, 255, 0.6); background: rgba(244, 67, 54, 0.4); } .module-Button--destructive:hover:not(:disabled):not([aria-disabled=true]) { background: rgb(207.4, 56.95, 45.9); } .module-Button--destructive:active:not(:disabled):not([aria-disabled=true]) { background: rgb(183, 50.25, 40.5); } .dark-theme .module-Button--destructive:hover:not(:disabled):not([aria-disabled=true]) { background: rgb(245.65, 95.2, 84.15); } .dark-theme .module-Button--destructive:active:not(:disabled):not([aria-disabled=true]) { background: rgb(246.75, 114, 104.25); } .module-Button--calling { border-radius: 9999px; color: #ffffff; background: #4caf50; } .module-Button--calling:is(:disabled, [aria-disabled=true]) { color: rgba(255, 255, 255, 0.6); background: rgba(76, 175, 80, 0.4); } .module-Button--calling--discouraged { opacity: 0.4; } .dark-theme .module-Button--calling--discouraged { opacity: 0.5; } .module-Button--calling:hover:not(:disabled):not([aria-disabled=true]) { background: rgb(64.6, 148.75, 68); } .module-Button--calling:active:not(:disabled):not([aria-disabled=true]) { background: rgb(57, 131.25, 60); } .dark-theme .module-Button--calling:hover:not(:disabled):not([aria-disabled=true]) { background: rgb(102.85, 187, 106.25); } .dark-theme .module-Button--calling:active:not(:disabled):not([aria-disabled=true]) { background: rgb(120.75, 195, 123.75); } .module-Button--system-message { border-radius: 9999px; } .module-Button--system-message.module-Button--small { padding-top: 5px; padding-bottom: 5px; font-weight: 500; } .module-Button--system-message { color: #2c6bed; background: #f6f6f6; } .module-Button--system-message:is(:disabled, [aria-disabled=true]) { color: rgba(44, 107, 237, 0.6); background: rgba(246, 246, 246, 0.4); } .module-Button--system-message--discouraged { color: rgba(44, 107, 237, 0.5); } .module-Button--system-message:hover:not(:disabled):not([aria-disabled=true]) { background: rgb(209.1, 209.1, 209.1); } .module-Button--system-message:active:not(:disabled):not([aria-disabled=true]) { background: rgb(184.5, 184.5, 184.5); } .dark-theme .module-Button--system-message { color: #ffffff; background: #4a4a4a; } .dark-theme .module-Button--system-message:is(:disabled, [aria-disabled=true]) { color: rgba(255, 255, 255, 0.6); background: rgba(74, 74, 74, 0.4); } .dark-theme .module-Button--system-message--discouraged { color: rgba(255, 255, 255, 0.5); } .dark-theme .module-Button--system-message:hover:not(:disabled):not([aria-disabled=true]) { background: rgb(101.15, 101.15, 101.15); } .dark-theme .module-Button--system-message:active:not(:disabled):not([aria-disabled=true]) { background: rgb(119.25, 119.25, 119.25); } .module-Button--details { align-items: center; border-radius: 8px; display: flex; flex-direction: column; font-size: 11px; justify-content: center; line-height: 10px; min-height: 44px; min-width: 68px; padding: 8px; } .module-Button--details--discouraged { opacity: 0.4; } .dark-theme .module-Button--details--discouraged { opacity: 0.5; } .module-Button--details { background-color: #e9e9e9; color: #000000; } .dark-theme .module-Button--details { background-color: #4a4a4a; color: #e9e9e9; } .keyboard-mode .module-Button--details:focus { box-shadow: 0 0 0 2px #2c6bed; } .module-Button--details::before { margin-bottom: 6px; } .module-Button--icon--audio::before { content: ""; display: block; height: 18px; width: 18px; } .module-Button--icon--audio::before { -webkit-mask: url("../images/icons/v3/phone/phone-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .module-Button--icon--audio::before { background-color: WindowText; } } .dark-theme .module-Button--icon--audio::before { -webkit-mask: url("../images/icons/v3/phone/phone-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #e9e9e9; } @media (forced-colors: active) { .dark-theme .module-Button--icon--audio::before { background-color: WindowText; } } .module-Button--icon--message::before { content: ""; display: block; height: 18px; width: 18px; } .module-Button--icon--message::before { -webkit-mask: url("../images/icons/v3/chat/chat-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .module-Button--icon--message::before { background-color: WindowText; } } .dark-theme .module-Button--icon--message::before { -webkit-mask: url("../images/icons/v3/chat/chat-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #e9e9e9; } @media (forced-colors: active) { .dark-theme .module-Button--icon--message::before { background-color: WindowText; } } .module-Button--icon--muted::before { content: ""; display: block; height: 18px; width: 18px; } .module-Button--icon--muted::before { -webkit-mask: url("../images/icons/v3/bell/bell-slash-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .module-Button--icon--muted::before { background-color: WindowText; } } .dark-theme .module-Button--icon--muted::before { -webkit-mask: url("../images/icons/v3/bell/bell-slash-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #e9e9e9; } @media (forced-colors: active) { .dark-theme .module-Button--icon--muted::before { background-color: WindowText; } } .module-Button--icon--search::before { content: ""; display: block; height: 18px; width: 18px; } .module-Button--icon--search::before { -webkit-mask: url("../images/icons/v3/search/search-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .module-Button--icon--search::before { background-color: WindowText; } } .dark-theme .module-Button--icon--search::before { -webkit-mask: url("../images/icons/v3/search/search-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #e9e9e9; } @media (forced-colors: active) { .dark-theme .module-Button--icon--search::before { background-color: WindowText; } } .module-Button--icon--unmuted::before { content: ""; display: block; height: 18px; width: 18px; } .module-Button--icon--unmuted::before { -webkit-mask: url("../images/icons/v3/bell/bell-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .module-Button--icon--unmuted::before { background-color: WindowText; } } .dark-theme .module-Button--icon--unmuted::before { -webkit-mask: url("../images/icons/v3/bell/bell-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #e9e9e9; } @media (forced-colors: active) { .dark-theme .module-Button--icon--unmuted::before { background-color: WindowText; } } .module-Button--icon--video::before { content: ""; display: block; height: 18px; width: 18px; } .module-Button--icon--video::before { -webkit-mask: url("../images/icons/v3/video/video-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .module-Button--icon--video::before { background-color: WindowText; } } .dark-theme .module-Button--icon--video::before { -webkit-mask: url("../images/icons/v3/video/video-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #e9e9e9; } @media (forced-colors: active) { .dark-theme .module-Button--icon--video::before { background-color: WindowText; } } .CallsTab { display: flex; width: 100%; height: 100%; } .CallsTab__NewCallActionIcon { display: block; width: 20px; height: 20px; } .CallsTab__NewCallActionIcon { -webkit-mask: url("../images/icons/v3/phone/phone-plus-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .CallsTab__NewCallActionIcon { background-color: WindowText; } } .dark-theme .CallsTab__NewCallActionIcon { -webkit-mask: url("../images/icons/v3/phone/phone-plus-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .CallsTab__NewCallActionIcon { background-color: WindowText; } } .CallsTab__MoreActionsIcon { display: block; width: 20px; height: 20px; } .CallsTab__MoreActionsIcon { -webkit-mask: url("../images/icons/v3/more/more.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .CallsTab__MoreActionsIcon { background-color: WindowText; } } .dark-theme .CallsTab__MoreActionsIcon { -webkit-mask: url("../images/icons/v3/more/more.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .CallsTab__MoreActionsIcon { background-color: WindowText; } } .CallsTab__EmptyState { display: flex; width: 100%; height: 100%; align-items: center; justify-content: center; flex-direction: column; padding-block: 78px 28px; user-select: none; } .CallsTab__EmptyStateIcon { width: 40px; height: 40px; opacity: 0.7; } .CallsTab__EmptyStateIcon { -webkit-mask: url("../images/icons/v3/phone/phone-display-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .CallsTab__EmptyStateIcon { background-color: WindowText; } } .dark-theme .CallsTab__EmptyStateIcon { -webkit-mask: url("../images/icons/v3/phone/phone-display-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .dark-theme .CallsTab__EmptyStateIcon { background-color: WindowText; } } .CallsTab__EmptyStateLabel { margin-block: 12px 0; margin-inline: 0; opacity: 0.7; text-align: center; } .CallsTab__EmptyStateLabel { color: #5e5e5e; } .dark-theme .CallsTab__EmptyStateLabel { color: #b9b9b9; } .CallsTab__EmptyState__ActionIcon { vertical-align: text-top; display: inline-block; width: 16px; height: 16px; } .CallsTab__EmptyState__ActionIcon { -webkit-mask: url("../images/icons/v3/phone/phone-plus-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .CallsTab__EmptyState__ActionIcon { background-color: WindowText; } } .dark-theme .CallsTab__EmptyState__ActionIcon { -webkit-mask: url("../images/icons/v3/phone/phone-plus-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .dark-theme .CallsTab__EmptyState__ActionIcon { background-color: WindowText; } } .CallsTab__ConversationCallDetails { display: block; overflow: auto; width: 100%; height: 100%; padding-block: 80px; padding-inline: 24px; user-select: none; } .CallsList__Header { display: flex; gap: 0px; } .CallsList__FilterHeader { display: flex; align-items: center; font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; padding-inline-start: 24px; text-overflow: ellipsis; user-select: none; white-space: nowrap; } .dark-theme .CallsList__FilterHeader { color: #e9e9e9; } .CallsList__ToggleFilterByMissedWrapper { margin-inline-end: 8px; } .CallsList__ToggleFilterByMissed { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .CallsList__ToggleFilterByMissed { border: 1px solid WindowText; } } .CallsList__ToggleFilterByMissed { flex-shrink: 0; padding: 4px; border-radius: 4px; } .CallsList__ToggleFilterByMissed:not(.CallsList__ToggleFilterByMissed--pressed):hover { background-color: rgba(0, 0, 0, 0.06); } .dark-theme .CallsList__ToggleFilterByMissed:not(.CallsList__ToggleFilterByMissed--pressed):hover { background-color: rgba(255, 255, 255, 0.06); } .CallsList__ToggleFilterByMissed:focus { outline: none; } .keyboard-mode .CallsList__ToggleFilterByMissed:focus { box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px #2c6bed; } .CallsList__ToggleFilterByMissed::before { content: ""; display: block; width: 20px; height: 20px; } .CallsList__ToggleFilterByMissed::before { -webkit-mask: url("../images/icons/v3/filter/filter.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .CallsList__ToggleFilterByMissed::before { background-color: WindowText; } } .dark-theme .CallsList__ToggleFilterByMissed::before { -webkit-mask: url("../images/icons/v3/filter/filter.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .CallsList__ToggleFilterByMissed::before { background-color: WindowText; } } .CallsList__ToggleFilterByMissed--pressed { border-radius: 9999px; background: #2c6bed; } .CallsList__ToggleFilterByMissed--pressed::before { -webkit-mask: url("../images/icons/v3/filter/filter.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .CallsList__ToggleFilterByMissed--pressed::before { background-color: WindowText; } } .CallsList__ToggleFilterByMissedLabel { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border-width: 0; } .CallsList__ListContainer { flex-grow: 1; overflow: hidden; } .CallsList__List { scrollbar-gutter: stable; padding-inline-start: 11px; padding-inline-end: calc(11px - var(--axo-scrollbar-gutter-thin-vertical)); } .CallsList__List:not(:hover, :focus-within) { scrollbar-color: transparent transparent; } .CallsList__List--disableScrolling { overflow: hidden !important; } .CallsList__EmptyState { padding-block: 28px; padding-inline: 16px; text-align: center; text-wrap: balance; } .CallsList__ItemIcon { display: block; width: 20px; height: 20px; } .CallsList__ItemIcon--Phone { -webkit-mask: url("../images/icons/v3/phone/phone.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .CallsList__ItemIcon--Phone { background-color: WindowText; } } .dark-theme .CallsList__ItemIcon--Phone { -webkit-mask: url("../images/icons/v3/phone/phone.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .CallsList__ItemIcon--Phone { background-color: WindowText; } } .CallsList__ItemIcon--Video { -webkit-mask: url("../images/icons/v3/video/video.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .CallsList__ItemIcon--Video { background-color: WindowText; } } .dark-theme .CallsList__ItemIcon--Video { -webkit-mask: url("../images/icons/v3/video/video.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .CallsList__ItemIcon--Video { background-color: WindowText; } } .CallsList__LoadingAvatar, .CallsList__LoadingText { animation: CallsList__LoadingPulse 1.5s ease-in-out infinite; } .CallsList__LoadingAvatar, .CallsList__LoadingText { background-color: #e9e9e9; } .dark-theme .CallsList__LoadingAvatar, .dark-theme .CallsList__LoadingText { background-color: #3b3b3b; } .CallsList__LoadingAvatar { display: block; width: 36px; height: 36px; border-radius: 9999px; } .CallsList__LoadingText { display: inline-block; height: 1em; border-radius: 4px; } .CallsList__LoadingText--title { width: 75%; } .CallsList__LoadingText--subtitle { width: 60%; } .CallsList__ItemTitle { font-weight: bold; } .CallsList__Item--missed .ListTile__subtitle, .CallsList__Item--declined .ListTile__subtitle { color: #f44336; } .dark-theme .CallsList__Item--missed .ListTile__subtitle, .dark-theme .CallsList__Item--declined .ListTile__subtitle { color: #f44336; } .ListTile.CallsList__ItemTile { padding-block: 10px; border: none; border-radius: 12px; } .ListTile.CallsList__ItemTile .ListTile__subtitle { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; } .CallsList__Item--selected .CallsList__ItemTile { background-color: #dedede; } .dark-theme .CallsList__Item--selected .CallsList__ItemTile { background-color: #4a4a4a; } @keyframes CallsList__LoadingPulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.55; } } .CallsNewCall__ListContainer { flex-grow: 1; overflow: hidden; } .CallsNewCall__List:not(:hover, :focus-within) { scrollbar-color: transparent transparent; } .CallsNewCall__ListHeaderItem { padding-block: 10px; padding-inline: 24px; font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; } .CallsNewCall__EmptyState { padding-block: 28px; padding-inline: 16px; text-align: center; } .CallsNewCall__ItemActions { display: flex; gap: 12px; align-items: center; } .CallsNewCall__ItemActionButton { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .CallsNewCall__ItemActionButton { border: 1px solid WindowText; } } .CallsNewCall__ItemActionButton { padding: 4px; border-radius: 4px; } .CallsNewCall__ItemActionButton:not(:disabled, [aria-disabled=true]):hover { background: #c6c6c6; } .dark-theme .CallsNewCall__ItemActionButton:not(:disabled, [aria-disabled=true]):hover { background: #545454; } .CallsNewCall__ItemActionButton:focus { outline: none; } .keyboard-mode .CallsNewCall__ItemActionButton:focus { box-shadow: 0 0 0 2px #2c6bed; } .CallsNewCall__ItemActionButton:disabled, .CallsNewCall__ItemActionButton[aria-disabled=true] { opacity: 0.5; } .CallsNewCall__ItemActionButton--join-call { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; font-weight: 600; border-radius: 9999px; display: flex; width: auto; align-items: center; background-color: #4caf50; color: #ffffff; outline: none; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; user-select: none; } .CallsNewCall__ItemActionButton--join-call:before { -webkit-mask: url("../images/icons/v3/video/video-compact-fill.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .CallsNewCall__ItemActionButton--join-call:before { background-color: WindowText; } } .CallsNewCall__ItemActionButton--join-call:before { content: ""; display: block; height: 16px; margin-inline-end: 4px; min-width: 16px; width: 16px; } .CallsNewCall__ItemActionButton--join-call:not(:disabled):hover, .dark-theme .CallsNewCall__ItemActionButton--join-call:not(:disabled):hover { background-color: rgb(51.2924302789, 118.1075697211, 53.9920318725); } .keyboard-mode .CallsNewCall__ItemActionButton--join-call:not(:disabled):focus { background-color: rgb(51.2924302789, 118.1075697211, 53.9920318725); } .CallsNewCall__ItemActionButton--join-call { height: 26px; padding-block: 4px; padding-inline: 10px; } .CallsNewCall__ItemActionButton--join-call-disabled { opacity: 0.4; } .dark-theme .CallsNewCall__ItemActionButton--join-call-disabled { opacity: 0.5; } .CallsNewCall__ItemActionButtonTooltip { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; } .CallsNewCall__ItemActionButtonTooltip { background-color: #f0f0f0; color: #000000; outline: 1px solid #c6c6c6; } .dark-theme .CallsNewCall__ItemActionButtonTooltip { background-color: #2e2e2e; color: #dedede; outline: 1px solid #545454; } .CallsNewCall__ItemActionButtonTooltip { padding-block: 5px; padding-inline: 12px; border-radius: 6px; filter: drop-shadow(0px 4px 3px rgba(0, 0, 0, 0.16)); pointer-events: none; } .CallsNewCall__ItemActionButtonTooltip .module-tooltip-arrow::before { position: absolute; content: ""; border-style: solid; border-width: 7px; border-color: light-dark(#f0f0f0, #2e2e2e); } .CallsNewCall__ItemActionButtonTooltip[data-placement=bottom] .module-tooltip-arrow::before { border-color: transparent transparent #c6c6c6 transparent; } .dark-theme .CallsNewCall__ItemActionButtonTooltip[data-placement=bottom] .module-tooltip-arrow::before { border-color: transparent transparent #545454 transparent; } .CallsNewCall__ItemActionButtonTooltip[data-placement=bottom] .module-tooltip-arrow::before { margin-top: -14px; /* stylelint-disable-next-line liberty/use-logical-spec */ margin-left: -7px; } .CallsNewCall__ItemActionButtonTooltip[data-placement=top] .module-tooltip-arrow::before { border-color: #c6c6c6 transparent transparent transparent; } .dark-theme .CallsNewCall__ItemActionButtonTooltip[data-placement=top] .module-tooltip-arrow::before { border-color: #545454 transparent transparent transparent; } .CallsNewCall__ItemActionButtonTooltip[data-placement=top] .module-tooltip-arrow::before { margin-top: 0; /* stylelint-disable-next-line liberty/use-logical-spec */ margin-left: -7px; } .CallsNewCall__ItemActionButtonTooltip[data-placement=left] .module-tooltip-arrow::before { border-color: transparent transparent transparent #c6c6c6; } .dark-theme .CallsNewCall__ItemActionButtonTooltip[data-placement=left] .module-tooltip-arrow::before { border-color: transparent transparent transparent #545454; } .CallsNewCall__ItemActionButtonTooltip[data-placement=left] .module-tooltip-arrow::before { margin-top: -7px; /* stylelint-disable-next-line liberty/use-logical-spec */ margin-left: 0px; } .CallsNewCall__ItemActionButtonTooltip[data-placement=right] .module-tooltip-arrow::before { border-color: transparent #c6c6c6 transparent transparent; } .dark-theme .CallsNewCall__ItemActionButtonTooltip[data-placement=right] .module-tooltip-arrow::before { border-color: transparent #545454 transparent transparent; } .CallsNewCall__ItemActionButtonTooltip[data-placement=right] .module-tooltip-arrow::before { margin-top: -7px; /* stylelint-disable-next-line liberty/use-logical-spec */ margin-left: -14px; } .CallsNewCall__ItemActionButtonTooltip { max-width: 212px; } .CallsNewCall__ItemIcon { display: block; width: 20px; height: 20px; } .CallsNewCall__ItemIcon--Phone { -webkit-mask: url("../images/icons/v3/phone/phone.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .CallsNewCall__ItemIcon--Phone { background-color: WindowText; } } .dark-theme .CallsNewCall__ItemIcon--Phone { -webkit-mask: url("../images/icons/v3/phone/phone.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .CallsNewCall__ItemIcon--Phone { background-color: WindowText; } } .CallsNewCall__ItemIcon--Video { -webkit-mask: url("../images/icons/v3/video/video.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .CallsNewCall__ItemIcon--Video { background-color: WindowText; } } .dark-theme .CallsNewCall__ItemIcon--Video { -webkit-mask: url("../images/icons/v3/video/video.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .CallsNewCall__ItemIcon--Video { background-color: WindowText; } } .CallingAdhocCallInfo { flex-shrink: 0; width: 360px; height: auto; margin-block-end: auto; padding-block-end: 16px; pointer-events: auto; } .CallingAdhocCallInfo__width-container { display: flex; flex-direction: row; width: 100%; max-width: none; height: auto; padding-block: 1px; padding-inline-start: 15px; margin-block-end: 80px; overflow: hidden; pointer-events: none; } .CallingAdhocCallInfo__width-container::after { content: ""; display: flex; flex-shrink: 1; flex-basis: 480px; } .CallingAdhocCallInfo__overlay { background: transparent; } .CallingAdhocCallInfo__overlay-container { flex-direction: column; padding: 0; justify-content: flex-end; } .CallingAdhocCallInfo__MenuItem { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .CallingAdhocCallInfo__MenuItem { border: 1px solid WindowText; } } .CallingAdhocCallInfo__MenuItem { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; display: flex; width: 100%; padding-block: 8px; padding-inline: 10px 2px; align-items: center; border-radius: 6px; } .CallingAdhocCallInfo__MenuItem:hover { background-color: #545454; } .CallingAdhocCallInfo__MenuItemIcon { background: #4a4a4a; display: flex; width: 36px; height: 36px; margin-inline-end: 8px; border-radius: 36px; align-items: center; justify-content: center; } .CallingAdhocCallInfo__MenuItemIcon:before { content: ""; display: inline-block; height: 18px; width: 18px; } .CallingAdhocCallInfo__MenuItemIcon--copy-link:before { -webkit-mask: url("../images/icons/v3/copy/copy.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .CallingAdhocCallInfo__MenuItemIcon--copy-link:before { background-color: WindowText; } } .CallingAdhocCallInfo__MenuItemIcon--share-via-signal:before { -webkit-mask: url("../images/icons/v3/forward/forward.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .CallingAdhocCallInfo__MenuItemIcon--share-via-signal:before { background-color: WindowText; } } .CallingAdhocCallInfo__MenuItemText { display: flex; } .CallingAdhocCallInfo__Divider { display: flex; margin-block: 16px; margin-inline: 10px; border: 1px solid #4a4a4a; } .CallingAdhocCallInfo__RemoveClient { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .CallingAdhocCallInfo__RemoveClient { border: 1px solid WindowText; } } .CallingAdhocCallInfo__RemoveClient { width: 16px; height: 16px; margin-inline: 8px; background: #ffffff; } .CallingAdhocCallInfo__UnknownContactInfoButton { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .CallingAdhocCallInfo__UnknownContactInfoButton { border: 1px solid WindowText; } } .CallingAdhocCallInfo__UnknownContactInfoButton { -webkit-mask: url("../images/icons/v3/info/info.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .CallingAdhocCallInfo__UnknownContactInfoButton { background-color: WindowText; } } .CallingAdhocCallInfo__UnknownContactInfoButton { display: flex; flex: none; width: 16px; height: 16px; margin-inline: 8px; } .keyboard-mode .CallingAdhocCallInfo__UnknownContactInfoButton:focus { background: #2c6bed; } .CallingAdhocCallInfo__UnknownContactInfoDialog__body { padding-block-start: 22px; padding-block-end: 8px; } .CallingAdhocCallInfo__UnknownContactAvatarSet { height: 36px; } .CallingAdhocCallInfo__UnknownContactAvatar:not(:first-child) { margin-inline-start: -24px; } .CallingAdhocCallInfo__UnknownContactAvatar .module-Avatar__contents { outline: 2px solid; outline-color: #2e2e2e; } .CallingAdhocCallInfo .module-calling-participants-list__contact:hover .CallingAdhocCallInfo__UnknownContactAvatar .module-Avatar__contents { outline-color: #545454; } .CallingAdhocCallInfo__RemoveClientDialog { width: 440px; } .CallingAudioIndicator { display: flex; align-items: center; justify-content: center; height: 28px; min-width: 28px; width: 28px; z-index: 1; border-radius: 14px; } .CallingAudioIndicator--with-content { background: rgba(46, 46, 46, 0.7); } .CallingAudioIndicator__content { width: 16px; height: 16px; /* Center Lottie animation */ display: flex; align-items: center; justify-content: center; } .CallingAudioIndicator__content--muted { -webkit-mask: url("../images/icons/v3/mic/mic-slash-fill-compact-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .CallingAudioIndicator__content--muted { background-color: WindowText; } } .module-ongoing-call__local-preview .CallingAudioIndicator { position: absolute; top: 8px; inset-inline-end: 8px; z-index: 1; } .module-ongoing-call__group-call-remote-participant .CallingAudioIndicator { position: absolute; top: 8px; inset-inline-end: 8px; z-index: 1; } .CallingStatusIndicator { display: flex; align-items: center; justify-content: center; height: 28px; min-width: 28px; width: 28px; z-index: 1; border-radius: 14px; background: rgba(46, 46, 46, 0.7); } .CallingStatusIndicator::after { content: ""; width: 16px; height: 16px; } .CallingStatusIndicator--HandRaised { background: #ffffff; } .CallingStatusIndicator--HandRaised::after { -webkit-mask: url("../images/icons/v3/raise_hand/raise_hand-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .CallingStatusIndicator--HandRaised::after { background-color: WindowText; } } .CallingStatusIndicator--NoVideo::after { -webkit-mask: url("../images/icons/v3/video/video-slash-fill-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .CallingStatusIndicator--NoVideo::after { background-color: WindowText; } } .module-ongoing-call__local-preview .CallingStatusIndicator { position: absolute; z-index: 1; } .module-ongoing-call__local-preview .CallingStatusIndicator--NoVideo { top: 8px; inset-inline-start: 8px; } .module-ongoing-call__local-preview .CallingStatusIndicator--HandRaised { bottom: 8px; inset-inline-start: 8px; } .module-ongoing-call__participants__grid .module-ongoing-call__group-call-remote-participant--hand-raised .CallingStatusIndicator--HandRaised { margin-block: 1px; margin-inline-start: 5px; } .CallingButton__icon { align-items: center; border-radius: 40px; border: none; display: flex; height: 36px; justify-content: center; outline: none; width: 36px; } .keyboard-mode .CallingButton__icon:focus { outline-offset: 1px; outline: 2px solid #2c6bed; } .CallingButton__icon--audio--on { background-color: #5e5e5e; } .CallingButton__icon--audio--on div { -webkit-mask: url("../images/icons/v3/mic/mic-fill-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .CallingButton__icon--audio--on div { background-color: WindowText; } } .CallingButton__icon--audio--on div { height: 20px; width: 20px; } .CallingButton__icon--audio--on { backdrop-filter: blur(10px); } .CallingButton__icon--audio--off { background-color: #dedede; } .CallingButton__icon--audio--off div { -webkit-mask: url("../images/icons/v3/mic/mic-slash-fill-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #1b1b1b; } @media (forced-colors: active) { .CallingButton__icon--audio--off div { background-color: WindowText; } } .CallingButton__icon--audio--off div { height: 20px; width: 20px; } .CallingButton__icon--audio--disabled { background-color: #5e5e5e; } .CallingButton__icon--audio--disabled div { -webkit-mask: url("../images/icons/v3/mic/mic-slash-fill-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .CallingButton__icon--audio--disabled div { background-color: WindowText; } } .CallingButton__icon--audio--disabled div { height: 20px; width: 20px; } .CallingButton__icon--audio--disabled { opacity: 0.4; } .CallingButton__icon--video--on { background-color: #5e5e5e; } .CallingButton__icon--video--on div { -webkit-mask: url("../images/icons/v3/video/video-fill-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .CallingButton__icon--video--on div { background-color: WindowText; } } .CallingButton__icon--video--on div { height: 20px; width: 20px; } .CallingButton__icon--video--on { backdrop-filter: blur(10px); } .CallingButton__icon--video--off { background-color: #dedede; } .CallingButton__icon--video--off div { -webkit-mask: url("../images/icons/v3/video/video-slash-fill-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #1b1b1b; } @media (forced-colors: active) { .CallingButton__icon--video--off div { background-color: WindowText; } } .CallingButton__icon--video--off div { height: 20px; width: 20px; } .CallingButton__icon--video--disabled { background-color: #5e5e5e; } .CallingButton__icon--video--disabled div { -webkit-mask: url("../images/icons/v3/video/video-slash-fill-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .CallingButton__icon--video--disabled div { background-color: WindowText; } } .CallingButton__icon--video--disabled div { height: 20px; width: 20px; } .CallingButton__icon--video--disabled { opacity: 0.4; } .CallingButton__icon--full-screen-call { background-color: #2e2e2e; } .CallingButton__icon--full-screen-call div { -webkit-mask: url("../images/icons/v3/pip/pip-maximize-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .CallingButton__icon--full-screen-call div { background-color: WindowText; } } .CallingButton__icon--full-screen-call div { height: 20px; width: 20px; } .CallingButton__icon--hangup { background-color: #f44336; } .CallingButton__icon--hangup div { -webkit-mask: url("../images/icons/v3/phone/phone-down-fill-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .CallingButton__icon--hangup div { background-color: WindowText; } } .CallingButton__icon--hangup div { height: 20px; width: 20px; } .CallingButton__icon--raise-hand--on { background-color: #dedede; } .CallingButton__icon--raise-hand--on div { -webkit-mask: url("../images/icons/v3/raise_hand/raise_hand-fill-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #1b1b1b; } @media (forced-colors: active) { .CallingButton__icon--raise-hand--on div { background-color: WindowText; } } .CallingButton__icon--raise-hand--on div { height: 20px; width: 20px; } .CallingButton__icon--raise-hand--off { background-color: #5e5e5e; } .CallingButton__icon--raise-hand--off div { -webkit-mask: url("../images/icons/v3/raise_hand/raise_hand-fill-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .CallingButton__icon--raise-hand--off div { background-color: WindowText; } } .CallingButton__icon--raise-hand--off div { height: 20px; width: 20px; } .CallingButton__icon--raise-hand--off { backdrop-filter: blur(10px); } .CallingButton__icon--react--on { background-color: #dedede; } .CallingButton__icon--react--on div { -webkit-mask: url("../images/icons/v3/heart/heart-plus-fill.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #1b1b1b; } @media (forced-colors: active) { .CallingButton__icon--react--on div { background-color: WindowText; } } .CallingButton__icon--react--on div { height: 20px; width: 20px; } .CallingButton__icon--react--off { background-color: #5e5e5e; } .CallingButton__icon--react--off div { -webkit-mask: url("../images/icons/v3/heart/heart-plus-fill.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .CallingButton__icon--react--off div { background-color: WindowText; } } .CallingButton__icon--react--off div { height: 20px; width: 20px; } .CallingButton__icon--react--off { backdrop-filter: blur(10px); } .CallingButton__icon--ring--on { background-color: #5e5e5e; } .CallingButton__icon--ring--on div { -webkit-mask: url("../images/icons/v3/bell/bell-ring-fill-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .CallingButton__icon--ring--on div { background-color: WindowText; } } .CallingButton__icon--ring--on div { height: 20px; width: 20px; } .CallingButton__icon--ring--on { backdrop-filter: blur(10px); } .CallingButton__icon--ring--off { background-color: #dedede; } .CallingButton__icon--ring--off div { -webkit-mask: url("../images/icons/v3/bell/bell-slash-fill.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #1b1b1b; } @media (forced-colors: active) { .CallingButton__icon--ring--off div { background-color: WindowText; } } .CallingButton__icon--ring--off div { height: 20px; width: 20px; } .CallingButton__icon--ring--disabled { background-color: #5e5e5e; } .CallingButton__icon--ring--disabled div { -webkit-mask: url("../images/icons/v3/bell/bell-slash-fill.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .CallingButton__icon--ring--disabled div { background-color: WindowText; } } .CallingButton__icon--ring--disabled div { height: 20px; width: 20px; } .CallingButton__icon--ring--disabled { opacity: 0.4; } .CallingButton__icon--presenting--on { background-color: #dedede; } .CallingButton__icon--presenting--on div { -webkit-mask: url("../images/icons/v3/share_screen/share_screen-fill-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #1b1b1b; } @media (forced-colors: active) { .CallingButton__icon--presenting--on div { background-color: WindowText; } } .CallingButton__icon--presenting--on div { height: 20px; width: 20px; } .CallingButton__icon--presenting--off { background-color: #5e5e5e; } .CallingButton__icon--presenting--off div { -webkit-mask: url("../images/icons/v3/share_screen/share_screen-fill-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .CallingButton__icon--presenting--off div { background-color: WindowText; } } .CallingButton__icon--presenting--off div { height: 20px; width: 20px; } .CallingButton__icon--presenting--off { backdrop-filter: blur(10px); } .CallingButton__icon--presenting--disabled { background-color: #5e5e5e; } .CallingButton__icon--presenting--disabled div { -webkit-mask: url("../images/icons/v3/share_screen/share_screen-fill-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .CallingButton__icon--presenting--disabled div { background-color: WindowText; } } .CallingButton__icon--presenting--disabled div { height: 20px; width: 20px; } .CallingButton__icon--presenting--disabled { opacity: 0.4; } .CallingButton__icon--more-options { background-color: #5e5e5e; } .CallingButton__icon--more-options div { -webkit-mask: url("../images/icons/v3/more/more.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .CallingButton__icon--more-options div { background-color: WindowText; } } .CallingButton__icon--more-options div { height: 20px; width: 20px; } .CallingButton__icon--more-options { backdrop-filter: blur(10px); } .CallingButton__icon--maximize { background-color: rgba(46, 46, 46, 0.7); } .CallingButton__icon--maximize div { -webkit-mask: url("../images/icons/v3/maximize/maximize.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .CallingButton__icon--maximize div { background-color: WindowText; } } .CallingButton__icon--maximize div { height: 20px; width: 20px; } .CallingButton__icon--minimize { background-color: rgba(46, 46, 46, 0.7); } .CallingButton__icon--minimize div { -webkit-mask: url("../images/icons/v3/minimize/minimize.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .CallingButton__icon--minimize div { background-color: WindowText; } } .CallingButton__icon--minimize div { height: 20px; width: 20px; } .CallingButton__button-container { display: inline-flex; flex-direction: column; max-width: 64px; margin-inline: 10px; transition: margin-inline-start 0.3s ease-out, opacity 0.3s ease-out; } @media (prefers-reduced-motion) { .CallingButton__button-container { transition: none; } } .CallingButton__button-container--hidden { margin-inline-start: -100px; opacity: 0; pointer-events: none; } .CallingButton__button-container--hidden .CallingButton__label { display: none; } .CallingButton__tooltip { background-color: #2e2e2e; color: #dedede; font-size: 13px; outline: 1px solid #545454; padding-block: 5px; padding-inline: 12px; filter: drop-shadow(0px 4px 3px rgba(0, 0, 0, 0.2)); pointer-events: none; } .CallingButton__tooltip .module-tooltip-arrow::before { position: absolute; content: ""; border-style: solid; border-width: 7px; } .CallingButton__tooltip[data-placement=bottom] .module-tooltip-arrow::before { border-color: transparent transparent #545454 transparent; margin-top: -14px; /* stylelint-disable-next-line liberty/use-logical-spec */ margin-left: -7px; } .CallingButton__tooltip[data-placement=bottom] .module-tooltip-arrow::after { border-bottom-color: #2e2e2e !important; } .CallingButton__tooltip[data-placement=top] .module-tooltip-arrow::before { border-color: #545454 transparent transparent transparent; margin-top: 0; /* stylelint-disable-next-line liberty/use-logical-spec */ margin-left: -7px; } .CallingButton__tooltip[data-placement=top] .module-tooltip-arrow::after { border-top-color: #2e2e2e !important; } .CallingButton__Button--self-view { position: absolute; inset-inline-start: 8px; top: 8px; } .CallingButton__Button--self-view .CallingButton__button-container { margin: 0; } .CallingButton__Button--self-view-normal .CallingButton__icon { height: 28px; width: 28px; } .CallingButton__Button--self-view-normal .CallingButton__icon div { height: 16px; width: 16px; } .module-calling-pip .CallingButton__button-container { margin: 0; } .CallControls { position: relative; bottom: 0; display: flex; flex-grow: 1; flex-shrink: 0; flex-basis: 480px; align-items: center; justify-content: space-between; max-width: 640px; height: 80px; background-color: #343434; box-shadow: 0px 4px 14px 0px rgba(0, 0, 0, 0.4); border-radius: 18px; margin-block-end: 16px; margin-inline: 16px; padding-block: 22px; padding-inline: 24px; text-align: center; } .CallControls__InfoDisplay { display: flex; flex-direction: column; flex: 1; text-align: start; } .CallControls__CallTitle { display: flex; max-height: 40px; margin-block-end: 2px; color: #dedede; font-size: 14px; font-weight: bold; line-height: 20px; overflow: hidden; } .CallControls__Status { display: flex; min-height: 18px; max-height: 36px; color: #c6c6c6; font-size: 13px; line-height: 18px; overflow: hidden; } .keyboard-mode .CallControls__Status:focus-within { outline: 2px solid #2c6bed; outline-offset: 2px; } .CallControls__Status--ParticipantCount { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .CallControls__Status--ParticipantCount { border: 1px solid WindowText; } } .CallControls__Status--ParticipantCount { display: flex; flex-basis: 100%; align-items: center; } .CallControls__Status--ParticipantCount::after { content: ""; display: flex; width: 14px; height: 14px; margin-inline-start: 1px; } .CallControls__Status--ParticipantCount::after { -webkit-mask: url("../images/icons/v3/chevron/chevron-right.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #c6c6c6; } @media (forced-colors: active) { .CallControls__Status--ParticipantCount::after { background-color: WindowText; } } :dir(rtl) .CallControls__Status--ParticipantCount::after { -webkit-mask: url("../images/icons/v3/chevron/chevron-left.svg") no-repeat center; } .CallControls__ButtonContainer { display: flex; } .CallControls__JoinLeaveButtonContainer { display: flex; flex: 1; justify-content: end; } .CallControls__JoinLeaveButton { display: inline-flex; align-items: center; justify-content: center; font-size: 12px; line-height: 17px; padding-block: 7px; padding-inline: 16px; border-radius: 40px; } .keyboard-mode .CallControls__JoinLeaveButton:focus { box-shadow: 0 0 0 1px #2e2e2e, 0 0 0 3px #2c6bed !important; } .CallControls__JoinLeaveButton--hangup { background-color: #f44336; } .CallControls__JoinLeaveButton .module-spinner__container { margin-block: -5px; } .CallControls__OuterSpacer { flex-basis: 122.67px; } .CallControls__ReactionPickerContainer { position: absolute; inset-inline-start: min(44%, 32vw); inset-block-end: 70px; z-index: 200; display: flex; flex-direction: column; max-height: calc(100vh - 155px); font-size: 13px; filter: drop-shadow(0px 4px 3px rgba(0, 0, 0, 0.2)); pointer-events: auto; } .CallControls__ReactionPickerContainer .module-emoji-picker { margin-bottom: auto; max-width: calc(50vw + 20px); } @media (prefers-reduced-motion: no-preference) { .CallControls__ReactionPickerContainer .module-ReactionPickerPicker { animation-duration: 200ms; } } .CallSettingsButton__Button { align-items: center; background-color: #343434; border: none; border-radius: 40px; display: flex; height: 36px; justify-content: center; outline: none; width: 36px; } .keyboard-mode .CallSettingsButton__Button:focus { outline-offset: 1px; outline: 2px solid #2c6bed; } .CallSettingsButton__Icon { height: 20px; width: 20px; border: none; } .CallSettingsButton__Icon--Cancel { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .CallSettingsButton__Icon--Cancel { background-color: WindowText; } } .CallSettingsButton__Icon--SidebarView { -webkit-mask: url("../images/icons/v3/sidebar_view/sidebar_view.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .CallSettingsButton__Icon--SidebarView { background-color: WindowText; } } .CallSettingsButton__Icon--PaginatedView { -webkit-mask: url("../images/icons/v3/grid/grid.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .CallSettingsButton__Icon--PaginatedView { background-color: WindowText; } } .CallSettingsButton__Icon--Pip { -webkit-mask: url("../images/icons/v3/pip/pip.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .CallSettingsButton__Icon--Pip { background-color: WindowText; } } .CallSettingsButton__Icon--Settings { -webkit-mask: url("../images/icons/v3/settings/settings.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .CallSettingsButton__Icon--Settings { background-color: WindowText; } } .CallSettingsButton__Icon--SpeakerView { -webkit-mask: url("../images/icons/v3/speaker_view/speaker_view.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .CallSettingsButton__Icon--SpeakerView { background-color: WindowText; } } .module-CallingLobby__local-preview { position: absolute; z-index: -1; top: 28px; -webkit-app-region: no-drag; } .module-CallingLobby__local-preview--camera-is-on { max-height: calc(100% - 24px); height: auto; transform: rotateY(180deg); width: calc(100% - 24px); border-radius: 8px; width: auto; height: 100%; max-height: calc(100% - 140px); opacity: 0.6; overflow: hidden; } .module-CallingLobby__local-preview--camera-is-on video { width: auto; height: 100%; } .module-CallingLobby__local-preview--camera-is-off { max-height: calc(100% - 24px); height: auto; transform: rotateY(180deg); width: calc(100% - 24px); border-radius: 8px; width: auto; height: 100%; max-height: calc(100% - 140px); aspect-ratio: 4/3; margin-inline-start: auto; margin-inline-end: auto; } .module-CallingLobby__local-preview--camera-is-off .module-calling__background--blur::before { content: ""; position: absolute; height: 100%; width: 100%; background: rgba(0, 0, 0, 0.4); } .module-CallingLobby__camera-is-off--visible { opacity: 1; } .module-CallingLobby__camera-is-off--invisible { opacity: 0; } .CallingLobby__CallLinkNotice { font-size: 11px; line-height: 14px; letter-spacing: 0.06px; display: flex; padding-block: 12px; padding-inline: 18px; margin-block-end: 32px; width: 340px; background: #343434; color: #ffffff; border-radius: 10px; align-items: center; text-align: center; } .CallingLobby__CallLinkNotice--join-request-pending { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; width: auto; } .CallingLobby__CallLinkJoinRequestPendingText { margin-inline-start: 8px; } .CallingLobby__Footer { display: flex; width: 100%; justify-content: center; } .CallingPendingParticipants { width: 420px; height: auto; margin-block-start: auto; margin-block-end: 36px; margin-inline-start: auto; margin-inline-end: auto; } .CallingPendingParticipants--Compact { width: 364px; padding-inline: 0; padding-block-start: 0; outline: 0; } .CallingPendingParticipants--Expandable { background: #343434; } .CallingPendingParticipants--Expanded { padding-block-end: 2px; } .CallingPendingParticipants__CompactParticipant { display: flex; padding-block: 12px; padding-inline: 12px; outline: none; align-items: center; } .CallingPendingParticipants__CompactParticipantNameColumn { margin-inline-start: 8px; } .CallingPendingParticipants__ParticipantButton { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .CallingPendingParticipants__ParticipantButton { border: 1px solid WindowText; } } .keyboard-mode .CallingPendingParticipants__ParticipantButton:focus { outline: 3px solid #2c6bed; outline-offset: 1px; } .CallingPendingParticipants__ParticipantName { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; color: #dedede; } .CallingPendingParticipants__ParticipantAboutIcon { display: inline-block; height: 14px; width: 14px; position: relative; inset-block-start: 3px; } .CallingPendingParticipants__ParticipantAboutIcon { -webkit-mask: url("../images/icons/v3/chevron/chevron-right-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #e9e9e9; } @media (forced-colors: active) { .CallingPendingParticipants__ParticipantAboutIcon { background-color: WindowText; } } :dir(rtl) .CallingPendingParticipants__ParticipantAboutIcon { -webkit-mask: url("../images/icons/v3/chevron/chevron-left-bold.svg") no-repeat center; } .CallingPendingParticipants__WouldLikeToJoin { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; color: #c6c6c6; } .CallingPendingParticipants__PendingActionButton { width: 28px; height: 28px; flex-shrink: 0; padding-inline: 0; margin-inline-end: 16px; } .CallingPendingParticipants__PendingActionButton:first-child { margin-inline-start: 8px; } .CallingPendingParticipants__PendingActionButton:last-child { margin-inline-end: 8px; } .CallingPendingParticipants__PendingActionButtonIcon { width: 16px; height: 16px; } .CallingPendingParticipants--Compact .CallingPendingParticipants__PendingActionButton { width: 36px; height: 36px; margin-inline-end: 20px; } .CallingPendingParticipants--Compact .CallingPendingParticipants__PendingActionButton:last-child { margin-inline-end: 0; } .CallingPendingParticipants--Compact .CallingPendingParticipants__PendingActionButtonIcon { width: 20px; height: 20px; } .CallingPendingParticipants__PendingActionButtonIcon--Approve { -webkit-mask: url("../images/icons/v3/check/check-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .CallingPendingParticipants__PendingActionButtonIcon--Approve { background-color: WindowText; } } .CallingPendingParticipants__PendingActionButtonIcon--Deny { -webkit-mask: url("../images/icons/v3/x/x-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .CallingPendingParticipants__PendingActionButtonIcon--Deny { background-color: WindowText; } } .CallingPendingParticipants__ActionPanel { padding-block: 15px; text-align: end; } .CallingPendingParticipants__ActionPanelButton { border-radius: 4px; margin-inline-end: 16px; } .CallingPendingParticipants__ActionPanelButton:last-child { margin-inline-end: 10px; } .CallingPendingParticipants__ShowAllRequestsButton { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .CallingPendingParticipants__ShowAllRequestsButton { border: 1px solid WindowText; } } .CallingPendingParticipants__ShowAllRequestsButton { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; font-weight: 600; display: flex; padding-block: 5px; padding-inline: 15px; margin-block: 12px; margin-inline: auto; color: rgba(255, 255, 255, 0.9); background: #4a4a4a; border-radius: 46px; outline: none; } .keyboard-mode .CallingPendingParticipants__ShowAllRequestsButton:focus { outline: 3px solid #2c6bed; outline-offset: 1px; } .CallingPendingParticipants__ShowAllRequestsButtonContainer { background: rgba(0, 0, 0, 0.24); } .module-CallingPreCallInfo { text-align: center; user-select: none; } .module-CallingPreCallInfo__title, .module-CallingPreCallInfo__subtitle { -webkit-box-orient: vertical; color: #ffffff; display: -webkit-box; overflow: hidden; text-overflow: ellipsis; text-shadow: 0 0 4px rgba(0, 0, 0, 0.4); } .module-CallingPreCallInfo__title { -webkit-line-clamp: 1; font-weight: 600; font-size: 20px; line-height: 26px; letter-spacing: -0.34px; margin-top: 16px; } .module-CallingPreCallInfo__subtitle { -webkit-line-clamp: 2; font-size: 14px; line-height: 20px; letter-spacing: -0.08px; margin-top: 8px; } .module-CallingPreCallInfo-spacer { flex-basis: 64px; margin-block-start: 12px; } .module-CallingScreenSharingController { display: flex; width: 100%; height: 100%; padding-block: 9vh; padding-inline: 3.3vw; overflow: hidden; align-items: center; justify-content: space-between; -webkit-app-region: drag; } body.context-menu-open .module-CallingScreenSharingController { -webkit-app-region: no-drag; } .module-CallingScreenSharingController__text { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; overflow: hidden; text-overflow: ellipsis; user-select: none; white-space: nowrap; width: 73vw; } .module-CallingScreenSharingController__button { height: 82vh; padding-block: 18vh; padding-inline: 3.5vw; line-height: 45.5vh; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .module-CallingScreenSharingController__buttons { align-items: center; display: flex; margin-inline-start: 1.25vw; -webkit-app-region: no-drag; } .module-CallingScreenSharingController__close { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-CallingScreenSharingController__close { border: 1px solid WindowText; } } .module-CallingScreenSharingController__close { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .module-CallingScreenSharingController__close { background-color: WindowText; } } .module-CallingScreenSharingController__close { width: 4.5vw; height: 45.5vh; margin-inline-start: 2.5vw; cursor: pointer; } .module-CallingSelectPresentingSourcesModal__width-container { max-width: 665px; position: relative; } .module-CallingSelectPresentingSourcesModal .module-Modal__button-footer { background-color: #121212; } .module-CallingSelectPresentingSourcesModal__sources { margin-bottom: 34px; display: flex; flex-wrap: wrap; align-items: center; gap: 12px; } .module-CallingSelectPresentingSourcesModal__sources:last-child { margin-bottom: 0; } .module-CallingSelectPresentingSourcesModal__title { margin-bottom: 12px; } .module-CallingSelectPresentingSourcesModal__source { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-CallingSelectPresentingSourcesModal__source { border: 1px solid WindowText; } } .module-CallingSelectPresentingSourcesModal__source { border-radius: 4px; border: 1px solid #5e5e5e; overflow: hidden; padding: 8px; text-align: center; width: 200px; } .module-CallingSelectPresentingSourcesModal__source--selected { background-color: #1851b4; border: 1px solid #1851b4; } .module-CallingSelectPresentingSourcesModal__source img { display: inline-block; } .module-CallingSelectPresentingSourcesModal__screenshot { max-height: 102px; max-width: 184px; } .module-CallingSelectPresentingSourcesModal__name--container { align-items: center; display: flex; margin-top: 8px; } .module-CallingSelectPresentingSourcesModal__name--text { display: inline-block; overflow: hidden; text-overflow: ellipsis; vertical-align: middle; white-space: nowrap; width: 100%; } .module-CallingSelectPresentingSourcesModal__name--icon { margin-inline-end: 8px; } .CallingToasts { position: fixed; z-index: 200; top: 32px; width: 100%; display: flex; justify-content: center; pointer-events: none; } .CallingToasts__inner { display: flex; flex-direction: column; justify-content: center; align-items: center; pointer-events: auto; gap: 8px; } .CallingToast--dismissable { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .CallingToast--dismissable { border: 1px solid WindowText; } } .CallingToast { font-size: 12px; line-height: 16px; letter-spacing: 0; padding-block: 8px; padding-inline: 12px; border-radius: 22px; background-color: #2e2e2e; color: #dedede; text-align: center; user-select: none; } .CallingToast__reconnecting { display: flex; align-items: center; gap: 8px; } .CallingButtonToasts__outer { position: absolute; inset-block-end: 96px; width: 100%; z-index: 2; } .CallingButtonToasts { display: flex; flex-grow: 1; flex-shrink: 0; flex-basis: 480px; max-width: 640px; } .CallingButtonToasts .CallingToasts { position: absolute; top: -16px; transform: translateY(-100%); inset-inline-start: 0; } .CallingToast__viewChanged { display: flex; align-items: center; gap: 8px; } .CallingToast__viewChanged__icon { width: 18px; height: 18px; } .CallLinkAddNameModal__Row { display: flex; gap: 12px; } .CallLinkAddNameModal__SrOnly { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border-width: 0; } .CallLinkAddNameModal__Input__container.Input__container { flex: 1; } .CallLinkDetails__Container { max-width: 750px; margin-block: 0; margin-inline: auto; user-select: none; } .CallLinkDetails__Header { display: flex; align-items: center; gap: 16px; width: 100%; margin-bottom: 24px; } .CallLinkDetails__HeaderAvatar, .CallLinkDetails__HeaderActions { flex-shrink: 0; } .CallLinkDetails__HeaderDetails { flex: 1; } .CallLinkDetails__HeaderTitle { margin: 0; font-weight: 600; font-size: 18px; line-height: 25px; letter-spacing: -0.25px; } .CallLinkDetails__HeaderDescription { margin: 0; user-select: text; font-size: 14px; line-height: 20px; letter-spacing: -0.08px; } .CallLinkDetails__HeaderDescription { color: #5e5e5e; } .dark-theme .CallLinkDetails__HeaderDescription { color: #b9b9b9; } .CallLinkDetails__HeaderButton { font-weight: 600; } .CallLinkDetails__HeaderButton--active-call { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; font-weight: 600; border-radius: 9999px; display: flex; width: auto; align-items: center; background-color: #4caf50; color: #ffffff; outline: none; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; user-select: none; } .CallLinkDetails__HeaderButton--active-call:before { -webkit-mask: url("../images/icons/v3/video/video-compact-fill.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .CallLinkDetails__HeaderButton--active-call:before { background-color: WindowText; } } .CallLinkDetails__HeaderButton--active-call:before { content: ""; display: block; height: 16px; margin-inline-end: 4px; min-width: 16px; width: 16px; } .CallLinkDetails__HeaderButton--active-call:not(:disabled):hover, .dark-theme .CallLinkDetails__HeaderButton--active-call:not(:disabled):hover { background-color: rgb(51.2924302789, 118.1075697211, 53.9920318725); } .keyboard-mode .CallLinkDetails__HeaderButton--active-call:not(:disabled):focus { background-color: rgb(51.2924302789, 118.1075697211, 53.9920318725); } .CallLinkDetails__DeleteLink .ConversationDetails-icon__icon--trash::after, .dark-theme .CallLinkDetails__DeleteLink .ConversationDetails-icon__icon--trash::after { background-color: #f44336; } .CallLinkDetails__DeleteLink .ConversationDetails-panel-row__label { color: #f44336; } .CallLinkDetails__DeleteLink--disabled-for-active-call .ConversationDetails-icon__icon--trash::after, .dark-theme .CallLinkDetails__DeleteLink--disabled-for-active-call .ConversationDetails-icon__icon--trash::after { background-color: #848484; } .CallLinkDetails__DeleteLink--disabled-for-active-call .ConversationDetails-panel-row__label { color: #848484; } .CallLinkDetails__ApproveAllMembersDisabledTooltip, .CallLinkDetails__DeleteLinkTooltip { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; } .CallLinkDetails__ApproveAllMembersDisabledTooltip, .CallLinkDetails__DeleteLinkTooltip { background-color: #f0f0f0; color: #000000; outline: 1px solid #c6c6c6; } .dark-theme .CallLinkDetails__ApproveAllMembersDisabledTooltip, .dark-theme .CallLinkDetails__DeleteLinkTooltip { background-color: #2e2e2e; color: #dedede; outline: 1px solid #545454; } .CallLinkDetails__ApproveAllMembersDisabledTooltip, .CallLinkDetails__DeleteLinkTooltip { padding-block: 5px; padding-inline: 12px; border-radius: 6px; filter: drop-shadow(0px 4px 3px rgba(0, 0, 0, 0.16)); pointer-events: none; } .CallLinkDetails__ApproveAllMembersDisabledTooltip .module-tooltip-arrow::before, .CallLinkDetails__DeleteLinkTooltip .module-tooltip-arrow::before { position: absolute; content: ""; border-style: solid; border-width: 7px; border-color: light-dark(#f0f0f0, #2e2e2e); } .CallLinkDetails__ApproveAllMembersDisabledTooltip[data-placement=bottom] .module-tooltip-arrow::before, .CallLinkDetails__DeleteLinkTooltip[data-placement=bottom] .module-tooltip-arrow::before { border-color: transparent transparent #c6c6c6 transparent; } .dark-theme .CallLinkDetails__ApproveAllMembersDisabledTooltip[data-placement=bottom] .module-tooltip-arrow::before, .dark-theme .CallLinkDetails__DeleteLinkTooltip[data-placement=bottom] .module-tooltip-arrow::before { border-color: transparent transparent #545454 transparent; } .CallLinkDetails__ApproveAllMembersDisabledTooltip[data-placement=bottom] .module-tooltip-arrow::before, .CallLinkDetails__DeleteLinkTooltip[data-placement=bottom] .module-tooltip-arrow::before { margin-top: -14px; /* stylelint-disable-next-line liberty/use-logical-spec */ margin-left: -7px; } .CallLinkDetails__ApproveAllMembersDisabledTooltip[data-placement=top] .module-tooltip-arrow::before, .CallLinkDetails__DeleteLinkTooltip[data-placement=top] .module-tooltip-arrow::before { border-color: #c6c6c6 transparent transparent transparent; } .dark-theme .CallLinkDetails__ApproveAllMembersDisabledTooltip[data-placement=top] .module-tooltip-arrow::before, .dark-theme .CallLinkDetails__DeleteLinkTooltip[data-placement=top] .module-tooltip-arrow::before { border-color: #545454 transparent transparent transparent; } .CallLinkDetails__ApproveAllMembersDisabledTooltip[data-placement=top] .module-tooltip-arrow::before, .CallLinkDetails__DeleteLinkTooltip[data-placement=top] .module-tooltip-arrow::before { margin-top: 0; /* stylelint-disable-next-line liberty/use-logical-spec */ margin-left: -7px; } .CallLinkDetails__ApproveAllMembersDisabledTooltip[data-placement=left] .module-tooltip-arrow::before, .CallLinkDetails__DeleteLinkTooltip[data-placement=left] .module-tooltip-arrow::before { border-color: transparent transparent transparent #c6c6c6; } .dark-theme .CallLinkDetails__ApproveAllMembersDisabledTooltip[data-placement=left] .module-tooltip-arrow::before, .dark-theme .CallLinkDetails__DeleteLinkTooltip[data-placement=left] .module-tooltip-arrow::before { border-color: transparent transparent transparent #545454; } .CallLinkDetails__ApproveAllMembersDisabledTooltip[data-placement=left] .module-tooltip-arrow::before, .CallLinkDetails__DeleteLinkTooltip[data-placement=left] .module-tooltip-arrow::before { margin-top: -7px; /* stylelint-disable-next-line liberty/use-logical-spec */ margin-left: 0px; } .CallLinkDetails__ApproveAllMembersDisabledTooltip[data-placement=right] .module-tooltip-arrow::before, .CallLinkDetails__DeleteLinkTooltip[data-placement=right] .module-tooltip-arrow::before { border-color: transparent #c6c6c6 transparent transparent; } .dark-theme .CallLinkDetails__ApproveAllMembersDisabledTooltip[data-placement=right] .module-tooltip-arrow::before, .dark-theme .CallLinkDetails__DeleteLinkTooltip[data-placement=right] .module-tooltip-arrow::before { border-color: transparent #545454 transparent transparent; } .CallLinkDetails__ApproveAllMembersDisabledTooltip[data-placement=right] .module-tooltip-arrow::before, .CallLinkDetails__DeleteLinkTooltip[data-placement=right] .module-tooltip-arrow::before { margin-top: -7px; /* stylelint-disable-next-line liberty/use-logical-spec */ margin-left: -14px; } .module-Modal__body.CallLinkEditModal__body { padding-inline: 12px 3px; scrollbar-gutter: stable; } .CallLinkEditModal__SrOnly { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border-width: 0; } .CallLinkEditModal__Header { display: flex; gap: 16px; align-items: center; margin-bottom: 26px; } .CallLinkEditModal__Header__Details { flex: 1; display: flex; flex-direction: column; gap: 0; min-width: 0; } .CallLinkEditModal__Header__Title { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; } .CallLinkEditModal__Header__CallLinkButton { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .CallLinkEditModal__Header__CallLinkButton { border: 1px solid WindowText; } } .CallLinkEditModal__Header__CallLinkButton { font-size: 12px; line-height: 16px; letter-spacing: 0; } .CallLinkEditModal__Header__CallLinkButton { color: #5e5e5e; } .dark-theme .CallLinkEditModal__Header__CallLinkButton { color: #b9b9b9; } .CallLinkEditModal__Header__CallLinkButton__Text { overflow: hidden; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; } .CallLinkEditModal__Header__Actions { display: flex; gap: 14px; align-items: center; } .CallLinkEditModal__JoinButton { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; } .CallLinkEditModal__Row { display: flex; padding: 12px; align-items: center; gap: 16px; } .CallLinkEditModal__RowButton { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .CallLinkEditModal__RowButton { border: 1px solid WindowText; } } .CallLinkEditModal__RowButton { width: 100%; padding-block: 1px; } .CallLinkEditModal__RowButton .CallLinkEditModal__Row { border-radius: 8px; } .CallLinkEditModal__RowButton:hover .CallLinkEditModal__Row, .CallLinkEditModal__RowButton:focus .CallLinkEditModal__Row { background: #f6f6f6; } .dark-theme .CallLinkEditModal__RowButton:hover .CallLinkEditModal__Row, .dark-theme .CallLinkEditModal__RowButton:focus .CallLinkEditModal__Row { background: #3b3b3b; } .CallLinkEditModal__Row--Button { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; display: flex; gap: 8px; align-items: center; width: 100%; } .CallLinkEditModal__Row--Button { color: #000000; } .dark-theme .CallLinkEditModal__Row--Button { color: #dedede; } .CallLinkEditModal__RowLabel { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; flex: 1; } .CallLinkEditModal__RowIcon { display: flex; align-items: center; justify-content: center; width: 20px; height: 20px; } .CallLinkEditModal__RowIcon::after { content: ""; display: block; width: 20px; height: 20px; background-size: contain; background-repeat: no-repeat; background-position: center; } .CallLinkEditModal__RowIcon--Edit::after { -webkit-mask: url("../images/icons/v3/edit/edit.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .CallLinkEditModal__RowIcon--Edit::after { background-color: WindowText; } } .dark-theme .CallLinkEditModal__RowIcon--Edit::after { -webkit-mask: url("../images/icons/v3/edit/edit.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .CallLinkEditModal__RowIcon--Edit::after { background-color: WindowText; } } .CallLinkEditModal__RowIcon--Approve::after { -webkit-mask: url("../images/icons/v3/person/person-check-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .CallLinkEditModal__RowIcon--Approve::after { background-color: WindowText; } } .dark-theme .CallLinkEditModal__RowIcon--Approve::after { -webkit-mask: url("../images/icons/v3/person/person-check-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .CallLinkEditModal__RowIcon--Approve::after { background-color: WindowText; } } .CallLinkEditModal__RowIcon--Copy::after { -webkit-mask: url("../images/icons/v3/copy/copy.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .CallLinkEditModal__RowIcon--Copy::after { background-color: WindowText; } } .dark-theme .CallLinkEditModal__RowIcon--Copy::after { -webkit-mask: url("../images/icons/v3/copy/copy.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .CallLinkEditModal__RowIcon--Copy::after { background-color: WindowText; } } .CallLinkEditModal__RowIcon--Share::after { -webkit-mask: url("../images/icons/v3/forward/forward.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .CallLinkEditModal__RowIcon--Share::after { background-color: WindowText; } } .dark-theme .CallLinkEditModal__RowIcon--Share::after { -webkit-mask: url("../images/icons/v3/forward/forward.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .CallLinkEditModal__RowIcon--Share::after { background-color: WindowText; } } .CallLinkEditModal__Hr { border: none; height: 1px; background: rgba(0, 0, 0, 0.12); } .module-Modal__body_inner.CallLinkPendingParticipantModal__body_inner { align-items: center; display: flex; flex-direction: column; justify-content: center; margin-top: 4px; margin-bottom: 14px; padding-inline: 8px; } .CallLinkPendingParticipantModal__NameButton { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .CallLinkPendingParticipantModal__NameButton { border: 1px solid WindowText; } } .CallLinkPendingParticipantModal__NameButton { font-weight: 600; font-size: 26px; line-height: 32px; letter-spacing: -0.56px; display: flex; flex-direction: row; align-items: baseline; max-width: 100%; margin-top: 12px; font-weight: 500; color: #e9e9e9; cursor: pointer; } .CallLinkPendingParticipantModal__InContactsIcon { height: 22px; width: 22px; } .CallLinkPendingParticipantModal__InContactsIcon, .dark-theme .CallLinkPendingParticipantModal__InContactsIcon { background-color: currentColor; } .CallLinkPendingParticipantModal__AboutIcon { display: inline-block; height: 20px; width: 20px; position: relative; inset-block-start: 2px; } .CallLinkPendingParticipantModal__AboutIcon { -webkit-mask: url("../images/icons/v3/chevron/chevron-right-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .CallLinkPendingParticipantModal__AboutIcon { background-color: WindowText; } } :dir(rtl) .CallLinkPendingParticipantModal__AboutIcon { -webkit-mask: url("../images/icons/v3/chevron/chevron-left-bold.svg") no-repeat center; } .CallLinkPendingParticipantModal__SharedGroupInfo { margin-top: 10px; color: #b9b9b9; text-align: center; } .CallLinkPendingParticipantModal__Hr { width: 100%; margin-block: 24px; border: none; height: 1px; background: #4a4a4a; } .CallLinkPendingParticipantModal__ActionButton { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .CallLinkPendingParticipantModal__ActionButton { border: 1px solid WindowText; } } .CallLinkPendingParticipantModal__ActionButton { display: flex; padding-block: 6px; width: 100%; align-items: center; color: #e9e9e9; } .CallLinkPendingParticipantModal__ActionButton:last-child { margin-bottom: 0; } .keyboard-mode .CallLinkPendingParticipantModal__ActionButton:focus { background: #4a4a4a; } .CallLinkPendingParticipantModal__ButtonIcon { display: flex; justify-content: center; align-items: center; margin-inline-end: 12px; width: 20px; } .CallLinkPendingParticipantModal__ButtonIconContent { width: 20px; height: 20px; } .CallLinkPendingParticipantModal__ButtonIconContent--approve { -webkit-mask: url("../images/icons/v3/check/check-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .CallLinkPendingParticipantModal__ButtonIconContent--approve { background-color: WindowText; } } .CallLinkPendingParticipantModal__ButtonIconContent--deny { -webkit-mask: url("../images/icons/v3/x/x-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .CallLinkPendingParticipantModal__ButtonIconContent--deny { background-color: WindowText; } } .CallLinkRestrictionsSelect.module-select select { min-width: 0; } .CallingRaisedHandsList { width: 100%; height: auto; margin-block-end: auto; overflow: auto; } .CallingRaisedHandsList__width-container { display: flex; flex-direction: column; width: 320px; height: auto; padding-block: 1px; padding-inline: 1px; margin-block-end: 72px; margin-inline-start: 8px; overflow: hidden; } .CallingRaisedHandsList__overlay { background: transparent; } .CallingRaisedHandsList__overlay-container { flex-direction: column; padding: 0; justify-content: flex-end; align-items: start; } .CallingRaisedHandsList__Overlay { align-items: start; } .CallingRaisedHandsList__TitleHint { font-weight: normal; } .CallingRaisedHandsList .module-calling-participants-list__contact:last-child { margin-block-end: 4px; } .CallingRaisedHandsList__Button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .CallingRaisedHandsList__Button { border: 1px solid WindowText; } } .CallingRaisedHandsList__Button { position: absolute; inset-inline-start: 16px; inset-block-end: 16px; display: flex; padding-block: 14px; padding-inline: 12px; background: #ffffff; border-radius: 24px; color: #000000; font-size: 14px; z-index: 3; } .keyboard-mode .CallingRaisedHandsList__Button:focus { outline: 2px solid #2c6bed; } .CallingRaisedHandsList__ButtonIcon { display: inline-block; width: 20px; height: 20px; margin-inline-end: 4px; content: ""; } .CallingRaisedHandsList__ButtonIcon { -webkit-mask: url("../images/icons/v3/raise_hand/raise_hand-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .CallingRaisedHandsList__ButtonIcon { background-color: WindowText; } } .CallingRaisedHandsList__NameHandIcon { display: inline-block; width: 16px; height: 16px; content: ""; } .CallingRaisedHandsList__NameHandIcon { -webkit-mask: url("../images/icons/v3/raise_hand/raise_hand-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .CallingRaisedHandsList__NameHandIcon { background-color: WindowText; } } .CallingRaisedHandsList__LowerMyHandLink { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .CallingRaisedHandsList__LowerMyHandLink { border: 1px solid WindowText; } } .CallingRaisedHandsList__LowerMyHandLink { display: flex; margin-inline-end: 16px; font-size: 13px; font-weight: 500; color: #abc4f8; } .keyboard-mode .CallingRaisedHandsList__LowerMyHandLink:focus { outline: 2px solid #2c6bed; } .CallingRaisedHandsToast__Content { display: flex; margin-block: 4px; margin-inline: 8px; font-weight: 500; } .CallingRaisedHandsToast__HandIcon { display: inline-block; width: 16px; height: 16px; margin-inline-end: 8px; content: ""; } .CallingRaisedHandsToast__HandIcon { -webkit-mask: url("../images/icons/v3/raise_hand/raise_hand-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .CallingRaisedHandsToast__HandIcon { background-color: WindowText; } } .CallingRaisedHandsToasts__Link { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .CallingRaisedHandsToasts__Link { border: 1px solid WindowText; } } .CallingRaisedHandsToasts__Link { color: #abc4f8; font-weight: 600; margin-inline-start: 16px; } .keyboard-mode .CallingRaisedHandsToasts__Link:focus { outline: 2px solid #2c6bed; } .module-calling-participants-list__status { flex-basis: auto; } .CallingReactionsToasts { position: absolute; inset-block-end: 112px; inset-inline-start: 65px; width: 100%; } .CallingReactionsToasts .CallingToasts { position: absolute; inset-block-start: 0; transform: translateY(-100%) rotate(180deg); } .CallingReactionsToasts .CallingToast { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; padding-inline: 16px; color: #c6c6c6; font-size: 15px; line-height: 20px; transform: rotate(-180deg); } .CallingReactionsToasts .CallingToasts__inner { width: 100%; align-items: flex-end; justify-content: flex-end; pointer-events: none; gap: 12px; } .CallingReactionsToasts .CallingToasts__inner div:nth-child(4) .CallingToast { opacity: 0.9; } .CallingReactionsToasts .CallingToasts__inner div:nth-child(5) .CallingToast { opacity: 0.7; } .CallingReactionsToasts__reaction { position: relative; } .CallingReactionsToasts__reaction .FunStaticEmoji { position: absolute; inset-inline-start: -60px; inset-block-start: -5px; } .CallingReactionsBurstToasts { position: absolute; width: 100%; inset-block-end: 112px; inset-inline-start: 15px; } .CallReactionBursts { position: absolute; z-index: 200; display: flex; } .CallReactionBurstEmoji { position: absolute; } .ChatColorPicker__container { max-width: 748px; margin-block: 0; margin-inline: auto; } .ChatColorPicker__container hr { border-color: #dedede; } .dark-theme .ChatColorPicker__container hr { border-color: #3b3b3b; } .ChatColorPicker__modal__body.module-Modal__body { overflow-x: hidden; } .ChatColorPicker__bubbles { align-items: center; display: grid; grid-gap: 24px; grid-template-columns: repeat(auto-fit, 52px); justify-content: center; margin-block: 20px; margin-inline: 0; } .ChatColorPicker__bubble { align-items: center; display: flex; justify-content: center; background-clip: content-box; border-color: transparent; border-radius: 52px; border-style: solid; border-width: 4px; cursor: pointer; height: 52px; padding: 2px; width: 52px; } .ChatColorPicker__bubble--blue { background-color: #336ba3; } .ChatColorPicker__bubble--burlap { background-color: #6f6a58; } .ChatColorPicker__bubble--crimson { background-color: #cf163e; } .ChatColorPicker__bubble--forest { background-color: #3b7845; } .ChatColorPicker__bubble--indigo { background-color: #6058ca; } .ChatColorPicker__bubble--plum { background-color: #aa377a; } .ChatColorPicker__bubble--steel { background-color: #71717f; } .ChatColorPicker__bubble--taupe { background-color: #8f616a; } .ChatColorPicker__bubble--teal { background-color: #077d92; } .ChatColorPicker__bubble--vermilion { background-color: #c73f0a; } .ChatColorPicker__bubble--violet { background-color: #9932c8; } .ChatColorPicker__bubble--wintergreen { background-color: #1d8663; } .ChatColorPicker__bubble--ultramarine { background-image: linear-gradient(180deg, #0552f0, #2c6bed); } .ChatColorPicker__bubble--basil { background-image: linear-gradient(180deg, #2f9373, #077343); } .ChatColorPicker__bubble--ember { background-image: linear-gradient(168deg, #e57c00, #5e0000); } .ChatColorPicker__bubble--fluorescent { background-image: linear-gradient(192deg, #ec13dd, #1b36c6); } .ChatColorPicker__bubble--infrared { background-image: linear-gradient(192deg, #f65560, #442ced); } .ChatColorPicker__bubble--lagoon { background-image: linear-gradient(180deg, #004066, #32867d); } .ChatColorPicker__bubble--midnight { background-image: linear-gradient(180deg, #2c2c3a, #787891); } .ChatColorPicker__bubble--sea { background-image: linear-gradient(180deg, #498fd4, #2c66a0); } .ChatColorPicker__bubble--sublime { background-image: linear-gradient(180deg, #6281d5, #974460); } .ChatColorPicker__bubble--tangerine { background-image: linear-gradient(192deg, #db7133, #911231); } .ChatColorPicker__bubble--selected { border-color: #3b3b3b; } .dark-theme .ChatColorPicker__bubble--selected { border-color: #ffffff; } .ChatColorPicker__bubble:focus { border-color: #2c6bed; outline: none; } .ChatColorPicker__bubble--custom-selected::after { content: ""; display: block; height: 24px; width: 24px; } .ChatColorPicker__bubble--custom-selected::after { -webkit-mask: url("../images/icons/v3/more/more.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #e9e9e9; } @media (forced-colors: active) { .ChatColorPicker__bubble--custom-selected::after { background-color: WindowText; } } .ChatColorPicker__bubble--custom { background-color: #e9e9e9; } .ChatColorPicker__add-icon { -webkit-mask: url("../images/icons/v3/plus/plus.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #1b1b1b; } @media (forced-colors: active) { .ChatColorPicker__add-icon { background-color: WindowText; } } .ChatColorPicker__add-icon { display: block; height: 24px; width: 24px; } .Checkbox__container { align-items: center; display: flex; } .Checkbox__container input { height: 18px; width: 18px; } .mouse-mode .Checkbox__container input:focus, .mouse-mode .Checkbox__container input:active { outline: none; } .keyboard-mode .Checkbox__container input:focus, .keyboard-mode .Checkbox__container input:active { outline: 1px solid #2c6bed; } .Checkbox__checkbox { height: 18px; margin-inline-end: 20px; width: 18px; } .Checkbox__description { font-size: 12px; line-height: 16px; letter-spacing: 0; } .Checkbox__description { color: #5e5e5e; } .dark-theme .Checkbox__description { color: #b9b9b9; } .CircleCheckbox__checkbox { position: relative; height: 20px; width: 20px; } .CircleCheckbox__checkbox input { cursor: pointer; height: 0; position: absolute; width: 0; } .keyboard-mode .CircleCheckbox__checkbox input:focus { outline: none; } .keyboard-mode .CircleCheckbox__checkbox input:focus::before { border-color: #2c6bed; } .CircleCheckbox__checkbox input::before { border-radius: 9999px; background: inherit; content: ""; display: block; height: 20px; position: absolute; width: 20px; } .CircleCheckbox__checkbox input::before { border: 1.5px solid #b9b9b9; } .dark-theme .CircleCheckbox__checkbox input::before { border: 1.5px solid #4a4a4a; } .CircleCheckbox__checkbox input:disabled { cursor: inherit; } .CircleCheckbox__checkbox input:disabled::before { border-color: #dedede; } .CircleCheckbox__checkbox input:disabled:checked::before { background: #dedede; border-color: #dedede; } .dark-theme .CircleCheckbox__checkbox input:disabled::before { border-color: #848484; } .dark-theme .CircleCheckbox__checkbox input:disabled:checked::before { background: #848484; border-color: #848484; } .CircleCheckbox__checkbox input:checked::after { content: ""; display: block; position: absolute; } .CircleCheckbox__checkbox input[type=checkbox]:checked:not([disabled])::before { background: #2c6bed; border: 1.5px solid #2c6bed; } .CircleCheckbox__checkbox input[type=checkbox]:checked::after { -webkit-mask: url("../images/icons/v3/check/check-compact-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .CircleCheckbox__checkbox input[type=checkbox]:checked::after { background-color: WindowText; } } .CircleCheckbox__checkbox input[type=checkbox]:checked::after { width: 14px; height: 14px; top: 3px; inset-inline-start: 3px; } .CircleCheckbox__checkbox input[type=radio]:checked::before { border: 2px solid #2c6bed; } .CircleCheckbox__checkbox input[type=radio]:checked::after { background: #2c6bed; top: 4px; inset-inline-start: 4px; width: 12px; height: 12px; border-radius: 6px; } .CircleCheckbox__checkbox--small { height: 18px; width: 18px; } .CircleCheckbox__checkbox--small input::before { height: 18px; width: 18px; } .CircleCheckbox__checkbox--small input[type=checkbox]:checked::before { background: #2c6bed; border: 1.5px solid #2c6bed; } .CircleCheckbox__checkbox--small input[type=checkbox]:checked::after { border: solid #ffffff; border-width: 0 2px 2px 0; height: 10px; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 7px; top: 3px; transform: rotate(45deg); width: 5px; } .CircleCheckbox__checkbox--small input[type=radio]:checked::before { border: 2px solid #2c6bed; } .CircleCheckbox__checkbox--small input[type=radio]:checked::after { background: #2c6bed; top: 4px; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 4px; width: 10px; height: 10px; border-radius: 5px; } .ClearFilterButton { display: flex; justify-content: center; align-items: flex-start; } .ClearFilterButton__inner-vertical-center { align-self: center; } .ClearFilterButton__inner { border-radius: 50px; padding-block: 5px; padding-inline: 15px; } .dark-theme .ClearFilterButton__inner { background-color: rgb(62.8, 62.8, 62.8); color: #ffffff; } .dark-theme .ClearFilterButton__inner:hover:not(:disabled):not([aria-disabled=true]) { background-color: #4a4a4a; } .ClearFilterButton__inner { background-color: rgb(252.75, 252.75, 252.75); color: #000000; } .ClearFilterButton__inner:hover:not(:disabled):not([aria-disabled=true]) { background-color: rgb(229.2, 229.2, 229.2); } .ClearingData { position: relative; display: flex; width: 100vw; height: 100vh; flex-direction: column; align-items: center; } .ClearingData__content { display: flex; flex-direction: column; justify-content: center; text-align: center; margin-top: calc(64px + var(--title-bar-drag-area-height)); flex: 1; } .ClearingData__title { font-weight: 600; font-size: 20px; line-height: 26px; letter-spacing: -0.34px; margin-block: 0 20px; } .ClearingData .ProgressBar { margin-block-end: 18px; } .ClearingData__description { font-size: 11px; line-height: 14px; letter-spacing: 0.06px; } .ClearingData__description { color: #5e5e5e; } .dark-theme .ClearingData__description { color: #b9b9b9; } .CollidingAvatars { position: relative; width: 36px; height: 36px; } .CollidingAvatars__avatar { position: absolute; inset-block-start: 0; inset-inline-start: 0; } .CollidingAvatars__avatar:nth-child(1) { clip-path: var(--clip-path); } .CollidingAvatars__avatar:nth-child(2) { inset-block-start: 12px; inset-inline-start: 12px; } .CollidingAvatars__clip_svg { position: absolute; } .ComposeStepButton__icon { display: flex; justify-content: center; align-items: center; width: 32px; height: 32px; border-radius: 16px; } .ComposeStepButton__icon { background-color: rgba(0, 0, 0, 0.06); } .dark-theme .ComposeStepButton__icon { background-color: rgba(255, 255, 255, 0.12); } .ComposeStepButton__icon::before { content: ""; display: block; width: 20px; height: 20px; -webkit-mask-repeat: no-repeat; -webkit-mask-position: center; } .ComposeStepButton__icon::before { background-color: #000000; } .dark-theme .ComposeStepButton__icon::before { background-color: #e9e9e9; } .ComposeStepButton__icon--call-link { width: 36px; height: 36px; border-radius: 9999px; } .ComposeStepButton__icon--call-link::before { -webkit-mask-image: url("../images/icons/v3/link/link.svg"); } .ComposeStepButton__icon--group::before { -webkit-mask-image: url("../images/icons/v3/group/group.svg"); } .ComposeStepButton__icon--username::before { -webkit-mask-image: url("../images/icons/v3/at/at.svg"); } .ComposeStepButton__icon--phone-number::before { -webkit-mask-image: url("../images/icons/v3/number/number-light.svg"); } .CompositionArea { position: relative; min-height: 42px; padding-block: 10px; padding-inline: 0; } .CompositionArea__placeholder { flex-grow: 1; margin-bottom: 6px; } .CompositionArea__row { display: flex; flex-direction: row; align-items: end; } .CompositionArea__row--center { justify-content: center; } .CompositionArea__row--padded { padding-block: 0; padding-inline: 12px; } .CompositionArea__row--control-row { margin-top: 12px; } .CompositionArea__row--column { flex-direction: column; align-items: stretch; } .CompositionArea__button-cell { margin-block: 0; margin-inline: 4px; display: flex; justify-content: center; align-items: center; height: 100%; flex-shrink: 0; } .CompositionArea__button-cell:first-child { margin-inline-start: 12px; } .CompositionArea__button-cell:last-child { margin-inline-end: 12px; } .CompositionArea__button-edit { margin-bottom: 4px; } .CompositionArea__edit-button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .CompositionArea__edit-button { border: 1px solid WindowText; } } .CompositionArea__edit-button { border-radius: 9999px; align-items: center; background-color: #848484; display: flex; height: 28px; justify-content: center; width: 28px; } .CompositionArea__edit-button::before { content: ""; height: 20px; width: 20px; } .CompositionArea__edit-button--discard::before { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .CompositionArea__edit-button--discard::before { background-color: WindowText; } } .CompositionArea__edit-button--accept { background-color: #2c6bed; margin-inline-start: 16px; } .CompositionArea__edit-button--accept::before { -webkit-mask: url("../images/icons/v3/check/check.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .CompositionArea__edit-button--accept::before { background-color: WindowText; } } .CompositionArea__edit-button--accept:disabled { opacity: 0.5; } .CompositionArea__send-button { display: flex; justify-content: center; align-items: center; background: none; border: none; width: 32px; height: 32px; } .CompositionArea__send-button::after { display: block; content: ""; width: 20px; height: 20px; flex-shrink: 0; } .CompositionArea__send-button::after { -webkit-mask: url("../images/icons/v3/send/send-fill.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #2c6bed; } @media (forced-colors: active) { .CompositionArea__send-button::after { background-color: WindowText; } } .CompositionArea__input { flex-grow: 1; position: relative; margin-block: 0; margin-inline: 6px; } .CompositionArea__input--large { margin: 0; } .CompositionArea__toggle-large { width: 48px; height: 24px; position: absolute; inset-inline-start: calc(50% - 24px); top: -18px; border-radius: 12px 12px 0 0; pointer-events: none; opacity: 0; transition: opacity 200ms ease-out; } .CompositionArea:hover .CompositionArea__toggle-large { opacity: 1; pointer-events: all; } .CompositionArea__toggle-large { background-color: #ffffff; } .dark-theme .CompositionArea__toggle-large { background-color: #121212; } .CompositionArea__toggle-large__button { width: 48px; height: 24px; border: none; } .CompositionArea__toggle-large__button { -webkit-mask: url("../images/icons/v3/chevron/chevron-shallow-up.svg") no-repeat center; background-color: #848484; } @media (forced-colors: active) { .CompositionArea__toggle-large__button { background-color: WindowText; } } .dark-theme .CompositionArea__toggle-large__button { -webkit-mask: url("../images/icons/v3/chevron/chevron-shallow-up.svg") no-repeat center; background-color: #848484; } @media (forced-colors: active) { .dark-theme .CompositionArea__toggle-large__button { background-color: WindowText; } } .CompositionArea__toggle-large__button--large-active { -webkit-mask: url("../images/icons/v3/chevron/chevron-shallow-down.svg") no-repeat center; background-color: #848484; } @media (forced-colors: active) { .CompositionArea__toggle-large__button--large-active { background-color: WindowText; } } .dark-theme .CompositionArea__toggle-large__button--large-active { -webkit-mask: url("../images/icons/v3/chevron/chevron-shallow-down.svg") no-repeat center; background-color: #848484; } @media (forced-colors: active) { .dark-theme .CompositionArea__toggle-large__button--large-active { background-color: WindowText; } } .CompositionArea__attachment-list { width: 100%; } .CompositionArea--sms-only { display: flex; flex-direction: column; align-items: center; padding-block: 14px 18px; padding-inline: 16px; } .CompositionArea--sms-only:not(.module-composition-area--pending) { border-top: 1px solid #e9e9e9; } .dark-theme .CompositionArea--sms-only:not(.module-composition-area--pending) { border-top: 1px solid #3b3b3b; } .CompositionArea--sms-only__title { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; font-weight: 600; margin-block: 0 2px; margin-inline: 0; } .CompositionArea--sms-only__title { color: #5e5e5e; } .dark-theme .CompositionArea--sms-only__title { color: #e9e9e9; } .CompositionArea--sms-only__body { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; text-align: center; margin: 0; } .CompositionArea--sms-only__body { color: #5e5e5e; } .dark-theme .CompositionArea--sms-only__body { color: #e9e9e9; } .CompositionArea__attach-file { width: 32px; height: 32px; border-radius: 4px; padding: 0; border: none; background: transparent; display: flex; align-items: center; justify-content: center; outline: none; } .keyboard-mode .CompositionArea__attach-file:focus { outline: 2px solid #2c6bed; } .CompositionArea__attach-file:before { content: ""; display: inline-block; width: 20px; height: 20px; } .CompositionArea__attach-file:before { -webkit-mask: url("../images/icons/v3/attach/attach.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .CompositionArea__attach-file:before { background-color: WindowText; } } .dark-theme .CompositionArea__attach-file:before { -webkit-mask: url("../images/icons/v3/attach/attach.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .CompositionArea__attach-file:before { background-color: WindowText; } } .CompositionRecording { display: flex; align-items: center; gap: 12px; padding-block: 10px; padding-inline: 18px; } .CompositionRecording__wave { display: flex; align-items: center; gap: 8px; flex: 1; border-radius: 16px; height: 32px; padding-block: 6px; padding-inline: 12px; } .CompositionRecording__wave { background: #e9e9e9; } .dark-theme .CompositionRecording__wave { background: #3b3b3b; } .CompositionRecording__microphone { display: inline-block; height: 20px; width: 20px; } .CompositionRecording__microphone { -webkit-mask: url("../images/icons/v3/mic/mic-fill.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #f44336; } @media (forced-colors: active) { .CompositionRecording__microphone { background-color: WindowText; } } .CompositionRecording__microphone { animation: pulse 2s infinite; } .CompositionRecording__timer { min-width: 40px; text-align: end; } .CompositionRecordingDraft { display: flex; align-items: center; gap: 12px; padding-block: 10px; padding-inline: 18px; } .CompositionRecordingDraft__sizer { flex: 1; flex-basis: 0; overflow: hidden; } .module-composition-input__quill { height: 100%; padding-inline: 12px; } .module-composition-input__quill .ql-editor { caret-color: transparent; padding: 0; text-align: start; white-space: break-spaces; line-height: inherit; } .module-composition-input__quill .ql-editor--loaded { caret-color: auto; } .module-composition-input__quill .ql-editor.ql-blank::before { inset-inline: 0; font-style: normal; } .module-composition-input__at-mention { background-color: #c6c6c6; border-radius: 4px; display: inline; padding-inline: 4px; height: 22px; line-height: 22px; } .dark-theme .module-composition-input__at-mention { background-color: #5e5e5e; } .module-composition-input__input { border-radius: 18px; overflow: hidden; word-break: break-word; } .module-composition-input__input .ql-container { font-family: inherit; font-size: 14px; line-height: 20px; letter-spacing: -0.08px; } .module-composition-input__input .ql-blank::before { color: #848484; } .dark-theme .module-composition-input__input .ql-blank::before { color: #b9b9b9; } .module-composition-input__input { background-color: #e9e9e9; color: #1b1b1b; } .dark-theme .module-composition-input__input { background-color: #3b3b3b; color: #e9e9e9; } .module-composition-input__input__scroller { padding-block: 6px; padding-inline: 0; min-height: 30px; max-height: 70px; overflow: auto; } .module-composition-input__input__scroller--large { height: 210px; max-height: 210px; min-height: 210px; } .module-composition-input__input__scroller--large .DraftEditor-root { height: 198px; } .module-composition-input__input__scroller--large .ql-editor { margin-inline-end: -9px; padding-inline-end: 9px; } .module-composition-input__input__scroller--link-preview { padding-top: 0; } .module-composition-input__input { border: 1px solid transparent; } .module-composition-input__input:focus-within { outline: 0; } .keyboard-mode .module-composition-input__input:focus-within { border: 1px solid #2c6bed; } .module-composition-input__format-menu { padding-block: 6px; padding-inline: 12px; border-radius: 8px; z-index: 103; display: flex; flex-direction: row; opacity: 0; transition: opacity ease 200ms; box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.3), 0px 0px 4px rgba(0, 0, 0, 0.05); } .module-composition-input__format-menu { background: #ffffff; } .dark-theme .module-composition-input__format-menu { background: #4a4a4a; } .module-composition-input__format-menu__item { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-composition-input__format-menu__item { border: 1px solid WindowText; } } .module-composition-input__format-menu__item { height: 24px; width: 24px; border-radius: 4px; margin-inline-end: 8px; } .module-composition-input__format-menu__item:last-child { margin-inline-end: 0; } .mouse-mode .module-composition-input__format-menu__item:hover { background-color: #e9e9e9; } .dark-theme.mouse-mode .module-composition-input__format-menu__item:hover { background-color: #5e5e5e; } .module-composition-input__format-menu__item--active { background-color: #e9e9e9; } .dark-theme .module-composition-input__format-menu__item--active { background-color: rgba(132, 132, 132, 0.3); } .mouse-mode .module-composition-input__format-menu__item--active:hover { background-color: #dedede; } .dark-theme.mouse-mode .module-composition-input__format-menu__item--active:hover { background-color: rgba(132, 132, 132, 0.5); } .module-composition-input__format-menu__item__popover { font-size: 12px; line-height: 16px; letter-spacing: 0; } .module-composition-input__format-menu__item__popover { font-weight: 600; } .module-composition-input__format-menu__item__popover { padding-block: 5px; padding-inline: 8px; text-align: center; border-radius: 4px; margin-bottom: 8px; opacity: 0; transition: opacity 120ms ease-out; } .module-composition-input__format-menu__item__popover { background-color: #000000; color: #e9e9e9; } .dark-theme .module-composition-input__format-menu__item__popover { background-color: #4a4a4a; color: #e9e9e9; } .module-composition-input__format-menu__item__popover__shortcut { font-size: 11px; line-height: 14px; letter-spacing: 0.06px; font-weight: 600; } .module-composition-input__format-menu__item__popover__shortcut { color: #dedede; } .dark-theme .module-composition-input__format-menu__item__popover__shortcut { color: #b9b9b9; } .module-composition-input__format-menu__item__icon { height: 20px; width: 20px; margin: 2px; } .dark-theme .module-composition-input__format-menu__item__icon--bold { -webkit-mask: url("../images/icons/v3/text_format/textformat-bold-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .dark-theme .module-composition-input__format-menu__item__icon--bold { background-color: WindowText; } } .module-composition-input__format-menu__item__icon--bold { -webkit-mask: url("../images/icons/v3/text_format/textformat-bold-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .module-composition-input__format-menu__item__icon--bold { background-color: WindowText; } } .dark-theme .module-composition-input__format-menu__item__icon--italic { -webkit-mask: url("../images/icons/v3/text_format/textformat-italic-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .dark-theme .module-composition-input__format-menu__item__icon--italic { background-color: WindowText; } } .module-composition-input__format-menu__item__icon--italic { -webkit-mask: url("../images/icons/v3/text_format/textformat-italic-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .module-composition-input__format-menu__item__icon--italic { background-color: WindowText; } } .dark-theme .module-composition-input__format-menu__item__icon--strike { -webkit-mask: url("../images/icons/v3/text_format/textformat-strikethrough-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .dark-theme .module-composition-input__format-menu__item__icon--strike { background-color: WindowText; } } .module-composition-input__format-menu__item__icon--strike { -webkit-mask: url("../images/icons/v3/text_format/textformat-strikethrough-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .module-composition-input__format-menu__item__icon--strike { background-color: WindowText; } } .dark-theme .module-composition-input__format-menu__item__icon--monospace { -webkit-mask: url("../images/icons/v3/text_format/textformat-monospace-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .dark-theme .module-composition-input__format-menu__item__icon--monospace { background-color: WindowText; } } .module-composition-input__format-menu__item__icon--monospace { -webkit-mask: url("../images/icons/v3/text_format/textformat-monospace-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .module-composition-input__format-menu__item__icon--monospace { background-color: WindowText; } } .dark-theme .module-composition-input__format-menu__item__icon--spoiler { -webkit-mask: url("../images/icons/v3/text_format/textformat-spoiler-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .dark-theme .module-composition-input__format-menu__item__icon--spoiler { background-color: WindowText; } } .module-composition-input__format-menu__item__icon--spoiler { -webkit-mask: url("../images/icons/v3/text_format/textformat-spoiler-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .module-composition-input__format-menu__item__icon--spoiler { background-color: WindowText; } } .mouse-mode .module-composition-input__format-menu__item:hover .module-composition-input__format-menu__item__icon { background-color: #1b1b1b; } .dark-theme.mouse-mode .module-composition-input__format-menu__item:hover .module-composition-input__format-menu__item__icon { background-color: #dedede; } .dark-theme .module-composition-input__format-menu__item__icon--active { background-color: #6191f3; } .module-composition-input__format-menu__item__icon--active { background-color: #2c6bed; } .mouse-mode .module-composition-input__format-menu__item:hover .module-composition-input__format-menu__item__icon--active { background-color: #2c6bed; } .dark-theme.mouse-mode .module-composition-input__format-menu__item:hover .module-composition-input__format-menu__item__icon--active { background-color: #6191f3; } .module-composition-input__suggestions { padding: 0; margin-bottom: 6px; border-radius: 8px; z-index: 103; overflow: hidden; } .module-composition-input__suggestions--scroller { max-height: 300px; overflow-y: auto; } .module-composition-input__suggestions { box-shadow: 0px 8px 20px rgba(0, 0, 0, 0.3), 0px 0px 8px rgba(0, 0, 0, 0.05); } @media (forced-colors: active) { .module-composition-input__suggestions { border: 1px solid WindowText; } } .module-composition-input__suggestions { background: #ffffff; } .dark-theme .module-composition-input__suggestions { background: #3b3b3b; } .module-composition-input__suggestions__row { height: 34px; padding-block: 0; padding-inline: 12px; display: flex; flex-direction: row; align-items: center; justify-content: flex-start; background: none; border: none; width: 100%; } .module-composition-input__suggestions__row--mention { height: 40px; } .module-composition-input__suggestions__row:focus { outline: 0; } .module-composition-input__suggestions__row { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; } .module-composition-input__suggestions__row { color: #5e5e5e; } .dark-theme .module-composition-input__suggestions__row { color: #b9b9b9; } .module-composition-input__suggestions__row__short-name { margin-inline-start: 4px; } .module-composition-input__suggestions__row--selected, .module-composition-input__suggestions__row:hover { background: #e9e9e9; color: #1b1b1b; } .dark-theme .module-composition-input__suggestions__row--selected, .dark-theme .module-composition-input__suggestions__row:hover { background: #5e5e5e; color: #e9e9e9; } .module-composition-input__suggestions__title { padding-inline-start: 8px; } .module-composition-input__suggestions { stroke: #ffffff; } .module-composition-input__editing-message { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; font-weight: 600; margin-top: 10px; user-select: none; } .module-composition-input__editing-message::before { content: ""; display: inline-block; height: 16px; margin-block: 0; margin-inline: 10px 8px; width: 16px; vertical-align: middle; } .module-composition-input__editing-message::before { -webkit-mask: url("../images/icons/v3/edit/edit.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .module-composition-input__editing-message::before { background-color: WindowText; } } .dark-theme .module-composition-input__editing-message::before { -webkit-mask: url("../images/icons/v3/edit/edit.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .module-composition-input__editing-message::before { background-color: WindowText; } } .module-composition-input__editing-message__attachment img { border-radius: 4px; height: 18px; position: absolute; inset-inline-end: 8px; top: 8px; width: 18px; } div.CompositionInput__link-preview { background: #f6f6f6; border-radius: 8px; flex-direction: row-reverse; justify-content: space-between; margin: 6px; min-height: 74px; overflow: hidden; } .dark-theme div.CompositionInput__link-preview { background: #2e2e2e; } div.CompositionInput__link-preview__icon-container { align-items: center; display: flex; margin-inline: 8px 0; } div.CompositionInput__link-preview__content { margin-inline-end: 0; padding-bottom: 8px; padding-inline-start: 12px; padding-top: 8px; } div.CompositionInput__link-preview__no-image { margin-inline-end: 0; min-width: 74px; } button.CompositionInput__link-preview__close-button { -webkit-mask: none; border-radius: 9999px; align-items: center; backdrop-filter: blur(12px); background: rgba(233, 233, 233, 0.8); display: flex; height: 20px; justify-content: center; inset-inline-end: 6px; top: 6px; width: 20px; } .dark-theme button.CompositionInput__link-preview__close-button { background-color: rgba(59, 59, 59, 0.8); -webkit-mask: none; } button.CompositionInput__link-preview__close-button::before { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: rgba(0, 0, 0, 0.5); } @media (forced-colors: active) { button.CompositionInput__link-preview__close-button::before { background-color: WindowText; } } .dark-theme button.CompositionInput__link-preview__close-button::before { background-color: rgba(255, 255, 255, 0.55); } button.CompositionInput__link-preview__close-button::before { content: ""; height: 16px; width: 16px; } .quill--monospace { font-family: "SF Mono", SFMono-Regular, ui-monospace, "DejaVu Sans Mono", Menlo, Consolas, monospace; } .quill--spoiler { background-color: #b9b9b9; } .dark-theme .quill--spoiler { background-color: #848484; } .CompositionTextArea { position: relative; } .CompositionTextArea__input__input { background: inherit; border: none; border-radius: 0; height: 100%; } .CompositionTextArea__input__input:focus-within { border: none; } .dark-theme .CompositionTextArea__input__input { border: none; } .dark-theme .CompositionTextArea__input__input:focus-within { border: none; } .keyboard-mode .CompositionTextArea__input__input:focus-within { border: solid 1px #2c6bed; } .CompositionTextArea__input__input__scroller { max-height: 300px; min-height: 100px; padding: 16px; padding-inline-end: 36px; } .CompositionTextArea__emoji { position: absolute; inset-inline-end: 8px; top: 8px; } .CompositionTextArea__emoji button::after { background-color: #000000; } .CompositionTextArea__remaining-character-count { font-size: 12px; line-height: 16px; letter-spacing: 0; color: #848484; position: absolute; bottom: 0; inset-inline-start: 0; padding-block: 12px; padding-inline: 24px 12px; } .CompositionTextArea .module-composition-input__input { background: transparent; } .dark-theme .ContactListItem__context-menu__chat-icon { -webkit-mask: url("../images/icons/v3/chat/chat-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .dark-theme .ContactListItem__context-menu__chat-icon { background-color: WindowText; } } .ContactListItem__context-menu__chat-icon { -webkit-mask: url("../images/icons/v3/chat/chat-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .ContactListItem__context-menu__chat-icon { background-color: WindowText; } } .dark-theme .ContactListItem__context-menu__phone-icon { -webkit-mask: url("../images/icons/v3/phone/phone-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .dark-theme .ContactListItem__context-menu__phone-icon { background-color: WindowText; } } .ContactListItem__context-menu__phone-icon { -webkit-mask: url("../images/icons/v3/phone/phone-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .ContactListItem__context-menu__phone-icon { background-color: WindowText; } } .dark-theme .ContactListItem__context-menu__video-icon { -webkit-mask: url("../images/icons/v3/video/video-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .dark-theme .ContactListItem__context-menu__video-icon { background-color: WindowText; } } .ContactListItem__context-menu__video-icon { -webkit-mask: url("../images/icons/v3/video/video-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .ContactListItem__context-menu__video-icon { background-color: WindowText; } } .dark-theme .ContactListItem__context-menu__delete-icon { -webkit-mask: url("../images/icons/v3/minus/minus-circle-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .dark-theme .ContactListItem__context-menu__delete-icon { background-color: WindowText; } } .ContactListItem__context-menu__delete-icon { -webkit-mask: url("../images/icons/v3/minus/minus-circle-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .ContactListItem__context-menu__delete-icon { background-color: WindowText; } } .dark-theme .ContactListItem__context-menu__block-icon { -webkit-mask: url("../images/icons/v3/block/block-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .dark-theme .ContactListItem__context-menu__block-icon { background-color: WindowText; } } .ContactListItem__context-menu__block-icon { -webkit-mask: url("../images/icons/v3/block/block-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .ContactListItem__context-menu__block-icon { background-color: WindowText; } } .ContactListItem__context-menu__popper.ContextMenu__popper { min-width: 240px; } .ContactListItem__context-menu__button.ContextMenu__button { opacity: 0; width: 28px; height: 28px; padding: 4px; border-radius: 4px; } .ContactListItem:hover .ContactListItem__context-menu__button.ContextMenu__button { opacity: 1; } .ContactListItem__context-menu__button.ContextMenu__button:hover { background-color: #c6c6c6; } .dark-theme .ContactListItem__context-menu__button.ContextMenu__button:hover { background-color: #2e2e2e; } .ContactListItem__context-menu__button.ContextMenu__button::after { display: block; width: 20px; height: 20px; content: ""; } .dark-theme .ContactListItem__context-menu__button.ContextMenu__button::after { -webkit-mask: url("../images/icons/v3/more/more.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .dark-theme .ContactListItem__context-menu__button.ContextMenu__button::after { background-color: WindowText; } } .ContactListItem__context-menu__button.ContextMenu__button::after { -webkit-mask: url("../images/icons/v3/more/more.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .ContactListItem__context-menu__button.ContextMenu__button::after { background-color: WindowText; } } .ContactListItem__contact-icon { width: 14px; height: 14px; color: currentColor; } .ContactModal { align-items: center; display: flex; flex-direction: column; justify-content: center; margin-top: 4px; margin-bottom: 24px; padding-inline: 24px; } .ContactModal__name { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .ContactModal__name { border: 1px solid WindowText; } } .ContactModal__name { font-weight: 600; font-size: 26px; line-height: 32px; letter-spacing: -0.56px; font-weight: 400; display: flex; flex-direction: row; align-items: baseline; max-width: 100%; margin-top: 12px; cursor: pointer; } .ContactModal__name__text { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .ContactModal__name__contact-icon { height: 22px; width: 22px; } .ContactModal__name__contact-icon, .dark-theme .ContactModal__name__contact-icon { background-color: currentColor; } .ContactModal__name__chevron { flex-shrink: 0; display: inline-block; height: 20px; width: 20px; position: relative; inset-block-start: 2px; } .ContactModal__name__chevron { -webkit-mask: url("../images/icons/v3/chevron/chevron-right-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #1b1b1b; } @media (forced-colors: active) { .ContactModal__name__chevron { background-color: WindowText; } } :dir(rtl) .ContactModal__name__chevron { -webkit-mask: url("../images/icons/v3/chevron/chevron-left-bold.svg") no-repeat center; } .dark-theme .ContactModal__name__chevron { -webkit-mask: url("../images/icons/v3/chevron/chevron-right-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #e9e9e9; } @media (forced-colors: active) { .dark-theme .ContactModal__name__chevron { background-color: WindowText; } } :dir(rtl) .dark-theme .ContactModal__name__chevron { -webkit-mask: url("../images/icons/v3/chevron/chevron-left-bold.svg") no-repeat center; } .ContactModal__member-label { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .ContactModal__member-label { border: 1px solid WindowText; } } .keyboard-mode .ContactModal__member-label:focus { box-shadow: 0px 0px 0px 3px #2c6bed; } .dark-theme.keyboard-mode .ContactModal__member-label:focus { box-shadow: 0px 0px 0px 3px #6191f3; } .ContactModal__member-label { border-radius: 9px; margin-top: 6px; margin-bottom: 4px; max-width: 100%; } .ContactModal__info { text-align: center; max-width: 248px; margin-top: 8px; } .ContactModal__button-container { display: flex; flex-direction: column; align-items: flex-start; margin-top: 12px; width: 100%; } .ContactModal__button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .ContactModal__button { border: 1px solid WindowText; } } .ContactModal__button { display: flex; align-items: center; padding-block: 6px; width: 100%; } .ContactModal__button:last-child { margin-bottom: 0; } .ContactModal__button:hover { background-color: #f6f6f6; } .dark-theme .ContactModal__button:hover { background-color: #2e2e2e; } .keyboard-mode .ContactModal__button:focus { background-color: #f6f6f6; } .dark-theme.keyboard-mode .ContactModal__button:focus { background-color: #2e2e2e; } .ContactModal__bubble-icon { display: flex; justify-content: center; align-items: center; margin-inline-end: 12px; width: 20px; } .ContactModal__nickname__bubble-icon { height: 20px; width: 20px; } .ContactModal__nickname__bubble-icon { -webkit-mask: url("../images/icons/v3/edit/edit.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .ContactModal__nickname__bubble-icon { background-color: WindowText; } } .dark-theme .ContactModal__nickname__bubble-icon { -webkit-mask: url("../images/icons/v3/edit/edit.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .ContactModal__nickname__bubble-icon { background-color: WindowText; } } .ContactModal__send-message__bubble-icon { height: 20px; width: 20px; } .ContactModal__send-message__bubble-icon { -webkit-mask: url("../images/icons/v3/chat/chat.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .ContactModal__send-message__bubble-icon { background-color: WindowText; } } .dark-theme .ContactModal__send-message__bubble-icon { -webkit-mask: url("../images/icons/v3/chat/chat.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .ContactModal__send-message__bubble-icon { background-color: WindowText; } } .ContactModal__safety-number__bubble-icon { height: 20px; width: 20px; } .ContactModal__safety-number__bubble-icon { -webkit-mask: url("../images/icons/v3/safety_number/safety_number.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .ContactModal__safety-number__bubble-icon { background-color: WindowText; } } .dark-theme .ContactModal__safety-number__bubble-icon { -webkit-mask: url("../images/icons/v3/safety_number/safety_number.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .ContactModal__safety-number__bubble-icon { background-color: WindowText; } } .ContactModal__block__bubble-icon { height: 20px; width: 20px; } .ContactModal__block__bubble-icon { -webkit-mask: url("../images/icons/v3/block/block.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .ContactModal__block__bubble-icon { background-color: WindowText; } } .dark-theme .ContactModal__block__bubble-icon { -webkit-mask: url("../images/icons/v3/block/block.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .ContactModal__block__bubble-icon { background-color: WindowText; } } .ContactModal__make-admin__bubble-icon { height: 20px; width: 20px; } .ContactModal__make-admin__bubble-icon { -webkit-mask: url("../images/icons/v3/key/key.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .ContactModal__make-admin__bubble-icon { background-color: WindowText; } } .dark-theme .ContactModal__make-admin__bubble-icon { -webkit-mask: url("../images/icons/v3/key/key.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .ContactModal__make-admin__bubble-icon { background-color: WindowText; } } .ContactModal__add-to-another-group__bubble-icon { height: 20px; width: 20px; } .ContactModal__add-to-another-group__bubble-icon { -webkit-mask: url("../images/icons/v3/plus/plus-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .ContactModal__add-to-another-group__bubble-icon { background-color: WindowText; } } .dark-theme .ContactModal__add-to-another-group__bubble-icon { -webkit-mask: url("../images/icons/v3/plus/plus-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .ContactModal__add-to-another-group__bubble-icon { background-color: WindowText; } } .ContactModal__remove-from-group__bubble-icon { height: 20px; width: 20px; } .ContactModal__remove-from-group__bubble-icon { -webkit-mask: url("../images/icons/v3/leave/leave.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .ContactModal__remove-from-group__bubble-icon { background-color: WindowText; } } .dark-theme .ContactModal__remove-from-group__bubble-icon { -webkit-mask: url("../images/icons/v3/leave/leave.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .ContactModal__remove-from-group__bubble-icon { background-color: WindowText; } } .ContactModal__official-badge, .ContactModal__official-badge__large { display: inline-block; position: relative; } .ContactModal__official-badge::before, .ContactModal__official-badge::after, .ContactModal__official-badge__large::before, .ContactModal__official-badge__large::after { content: ""; display: block; position: absolute; } .ContactModal__official-badge::before, .ContactModal__official-badge__large::before { top: 2px; inset-inline-start: 2px; width: 10px; height: 10px; border-radius: 5px; background: #ffffff; } .ContactModal__official-badge { height: 14px; margin-inline-start: 4px; width: 14px; } .ContactModal__official-badge::after { top: 0; inset-inline-start: 0; width: 100%; height: 100%; } .ContactModal__official-badge::after { -webkit-mask: url("../images/icons/v3/official/official-fill-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #2c6bed; } @media (forced-colors: active) { .ContactModal__official-badge::after { background-color: WindowText; } } .ContactModal__official-badge__large { height: 24px; margin-inline-start: 9px; width: 24px; } .ContactModal__official-badge__large::before { top: 4px; inset-inline-start: 4px; width: 16px; height: 16px; border-radius: 8px; } .ContactModal__official-badge__large::after { top: 0; inset-inline-start: 0; width: 100%; height: 100%; } .ContactModal__official-badge__large::after { -webkit-mask: url("../images/icons/v3/official/official-fill.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #2c6bed; } @media (forced-colors: active) { .ContactModal__official-badge__large::after { background-color: WindowText; } } .ContactModal__quick-actions { display: flex; flex-direction: row; justify-content: center; gap: 16px; margin-block: 16px; } .ContactModal__divider { width: 100%; border-style: solid; border-bottom: none; border-width: 1px; } .ContactModal__divider { border-color: #dedede; } .dark-theme .ContactModal__divider { border-color: #3b3b3b; } .ContactModal__divider { margin-block: 8px 5px; } button.module-contact-name { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { button.module-contact-name { border: 1px solid WindowText; } } button.module-contact-name:hover, button.module-contact-name:focus { text-decoration: underline; } .keyboard-mode button.module-contact-name:focus { outline: auto; text-decoration: none; } .module-contact-name--label-pill { font-size: 12px; line-height: 16px; letter-spacing: 0px; border-radius: 9px; font-weight: 400; display: inline-block; padding-inline: 6px; padding-block: 1px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 100%; } .module-contact-name--label-pill--inner { display: flex; align-items: center; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 100%; } .module-contact-name--label-pill--inner--contact-modal { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; border-radius: 11px; align-items: start; white-space: normal; } .module-contact-name--label-pill--bubble { margin-inline-start: 2px; margin-bottom: -4px; max-width: calc(100% - 2px); } .module-contact-name--label-pill--emoji { display: inline-block; padding-block: 2px; padding-inline-end: 3px; line-height: 12px; } .module-contact-name--label-pill--quote { margin-top: 1px; font-size: 12px; line-height: 16px; letter-spacing: 0px; color: #1b1b1b; background-color: rgba(255, 255, 255, 0.36); } .dark-theme .module-contact-name--label-pill--quote { color: #e9e9e9; background-color: rgba(255, 255, 255, 0.2); } .module-contact-name--label-pill--contact-modal { margin-bottom: -5px; } .module-contact-name--label-pill--text { display: inline-block; overflow: hidden; text-overflow: ellipsis; } .module-contact-name--000 { color: #d00b0b; } .dark-theme .module-contact-name--000 { color: #ff7070; } .module-contact-name--000--label-pill--bubble { color: rgb(145.6, 7.7, 7.7); background-color: rgba(208, 11, 11, 0.14); } .dark-theme .module-contact-name--000--label-pill--bubble { color: rgb(255, 157.76, 157.76); background-color: rgba(255, 112, 112, 0.32); } .module-contact-name--000--label-pill--list, .module-contact-name--000--label-pill--contact-modal { color: rgb(145.6, 7.7, 7.7); background-color: rgba(208, 11, 11, 0.1); } .dark-theme .module-contact-name--000--label-pill--list, .dark-theme .module-contact-name--000--label-pill--contact-modal { color: rgb(255, 147.75, 147.75); background-color: rgba(255, 112, 112, 0.32); } .module-contact-name--010 { color: #c13215; } .dark-theme .module-contact-name--010 { color: #ff6f52; } .module-contact-name--010--label-pill--bubble { color: rgb(135.1, 35, 14.7); background-color: rgba(193, 50, 21, 0.14); } .dark-theme .module-contact-name--010--label-pill--bubble { color: rgb(255, 157.08, 137.36); background-color: rgba(255, 111, 82, 0.32); } .module-contact-name--010--label-pill--list, .module-contact-name--010--label-pill--contact-modal { color: rgb(135.1, 35, 14.7); background-color: rgba(193, 50, 21, 0.1); } .dark-theme .module-contact-name--010--label-pill--list, .dark-theme .module-contact-name--010--label-pill--contact-modal { color: rgb(255, 147, 125.25); background-color: rgba(255, 111, 82, 0.32); } .module-contact-name--020 { color: #b34209; } .dark-theme .module-contact-name--020 { color: #f57a3d; } .module-contact-name--020--label-pill--bubble { color: rgb(125.3, 46.2, 6.3); background-color: rgba(179, 66, 9, 0.14); } .dark-theme .module-contact-name--020--label-pill--bubble { color: rgb(248.2, 164.56, 123.08); background-color: rgba(245, 122, 61, 0.32); } .module-contact-name--020--label-pill--list, .module-contact-name--020--label-pill--contact-modal { color: rgb(125.3, 46.2, 6.3); background-color: rgba(179, 66, 9, 0.1); } .dark-theme .module-contact-name--020--label-pill--list, .dark-theme .module-contact-name--020--label-pill--contact-modal { color: rgb(247.5, 155.25, 109.5); background-color: rgba(245, 122, 61, 0.32); } .module-contact-name--030 { color: #9c5711; } .dark-theme .module-contact-name--030 { color: #d5920b; } .module-contact-name--030--label-pill--bubble { color: rgb(109.2, 60.9, 11.9); background-color: rgba(156, 87, 17, 0.14); } .dark-theme .module-contact-name--030--label-pill--bubble { color: rgb(226.44, 180.88, 89.08); background-color: rgba(213, 146, 11, 0.32); } .module-contact-name--030--label-pill--list, .module-contact-name--030--label-pill--contact-modal { color: rgb(109.2, 60.9, 11.9); background-color: rgba(156, 87, 17, 0.1); } .dark-theme .module-contact-name--030--label-pill--list, .dark-theme .module-contact-name--030--label-pill--contact-modal { color: rgb(223.5, 173.25, 72); background-color: rgba(213, 146, 11, 0.32); } .module-contact-name--040 { color: #866118; } .dark-theme .module-contact-name--040 { color: #d68f00; } .module-contact-name--040--label-pill--bubble { color: rgb(93.8, 67.9, 16.8); background-color: rgba(134, 97, 24, 0.14); } .dark-theme .module-contact-name--040--label-pill--bubble { color: rgb(227.12, 178.84, 81.6); background-color: rgba(214, 143, 0, 0.32); } .module-contact-name--040--label-pill--list, .module-contact-name--040--label-pill--contact-modal { color: rgb(93.8, 67.9, 16.8); background-color: rgba(134, 97, 24, 0.1); } .dark-theme .module-contact-name--040--label-pill--list, .dark-theme .module-contact-name--040--label-pill--contact-modal { color: rgb(224.25, 171, 63.75); background-color: rgba(214, 143, 0, 0.32); } .module-contact-name--050 { color: #76681e; } .dark-theme .module-contact-name--050 { color: #b89b0a; } .module-contact-name--050--label-pill--bubble { color: rgb(82.6, 72.8, 21); background-color: rgba(118, 104, 30, 0.14); } .dark-theme .module-contact-name--050--label-pill--bubble { color: rgb(206.72, 187, 88.4); background-color: rgba(184, 155, 10, 0.32); } .module-contact-name--050--label-pill--list, .module-contact-name--050--label-pill--contact-modal { color: rgb(82.6, 72.8, 21); background-color: rgba(118, 104, 30, 0.1); } .dark-theme .module-contact-name--050--label-pill--list, .dark-theme .module-contact-name--050--label-pill--contact-modal { color: rgb(201.75, 180, 71.25); background-color: rgba(184, 155, 10, 0.32); } .module-contact-name--060 { color: #6b6b24; } .dark-theme .module-contact-name--060 { color: #a4a437; } .module-contact-name--060--label-pill--bubble { color: rgb(74.9, 74.9, 25.2); background-color: rgba(107, 107, 36, 0.14); } .dark-theme .module-contact-name--060--label-pill--bubble { color: rgb(193.12, 193.12, 119); background-color: rgba(164, 164, 55, 0.32); } .module-contact-name--060--label-pill--list, .module-contact-name--060--label-pill--contact-modal { color: rgb(74.9, 74.9, 25.2); background-color: rgba(107, 107, 36, 0.1); } .dark-theme .module-contact-name--060--label-pill--list, .dark-theme .module-contact-name--060--label-pill--contact-modal { color: rgb(186.75, 186.75, 105); background-color: rgba(164, 164, 55, 0.32); } .module-contact-name--070 { color: #5e6e0c; } .dark-theme .module-contact-name--070 { color: #8faa09; } .module-contact-name--070--label-pill--bubble { color: rgb(65.8, 77, 8.4); background-color: rgba(94, 110, 12, 0.14); } .dark-theme .module-contact-name--070--label-pill--bubble { color: rgb(178.84, 197.2, 87.72); background-color: rgba(143, 170, 9, 0.32); } .module-contact-name--070--label-pill--list, .module-contact-name--070--label-pill--contact-modal { color: rgb(65.8, 77, 8.4); background-color: rgba(94, 110, 12, 0.1); } .dark-theme .module-contact-name--070--label-pill--list, .dark-theme .module-contact-name--070--label-pill--contact-modal { color: rgb(171, 191.25, 70.5); background-color: rgba(143, 170, 9, 0.32); } .module-contact-name--080 { color: #4b7000; } .dark-theme .module-contact-name--080 { color: #74ad00; } .module-contact-name--080--label-pill--bubble { color: rgb(52.5, 78.4, 0); background-color: rgba(75, 112, 0, 0.14); } .dark-theme .module-contact-name--080--label-pill--bubble { color: rgb(160.48, 199.24, 81.6); background-color: rgba(116, 173, 0, 0.32); } .module-contact-name--080--label-pill--list, .module-contact-name--080--label-pill--contact-modal { color: rgb(52.5, 78.4, 0); background-color: rgba(75, 112, 0, 0.1); } .dark-theme .module-contact-name--080--label-pill--list, .dark-theme .module-contact-name--080--label-pill--contact-modal { color: rgb(150.75, 193.5, 63.75); background-color: rgba(116, 173, 0, 0.32); } .module-contact-name--090 { color: #3d7406; } .dark-theme .module-contact-name--090 { color: #5eb309; } .module-contact-name--090--label-pill--bubble { color: rgb(42.7, 81.2, 4.2); background-color: rgba(61, 116, 6, 0.14); } .dark-theme .module-contact-name--090--label-pill--bubble { color: rgb(145.52, 203.32, 87.72); background-color: rgba(94, 179, 9, 0.32); } .module-contact-name--090--label-pill--list, .module-contact-name--090--label-pill--contact-modal { color: rgb(42.7, 81.2, 4.2); background-color: rgba(61, 116, 6, 0.1); } .dark-theme .module-contact-name--090--label-pill--list, .dark-theme .module-contact-name--090--label-pill--contact-modal { color: rgb(134.25, 198, 70.5); background-color: rgba(94, 179, 9, 0.32); } .module-contact-name--100 { color: #2d7906; } .dark-theme .module-contact-name--100 { color: #42b309; } .module-contact-name--100--label-pill--bubble { color: rgb(31.5, 84.7, 4.2); background-color: rgba(45, 121, 6, 0.14); } .dark-theme .module-contact-name--100--label-pill--bubble { color: rgb(126.48, 203.32, 87.72); background-color: rgba(66, 179, 9, 0.32); } .module-contact-name--100--label-pill--list, .module-contact-name--100--label-pill--contact-modal { color: rgb(31.5, 84.7, 4.2); background-color: rgba(45, 121, 6, 0.1); } .dark-theme .module-contact-name--100--label-pill--list, .dark-theme .module-contact-name--100--label-pill--contact-modal { color: rgb(113.25, 198, 70.5); background-color: rgba(66, 179, 9, 0.32); } .module-contact-name--110 { color: #2d761e; } .dark-theme .module-contact-name--110 { color: #43b42d; } .module-contact-name--110--label-pill--bubble { color: rgb(31.5, 82.6, 21); background-color: rgba(45, 118, 30, 0.14); } .dark-theme .module-contact-name--110--label-pill--bubble { color: rgb(127.16, 204, 112.2); background-color: rgba(67, 180, 45, 0.32); } .module-contact-name--110--label-pill--list, .module-contact-name--110--label-pill--contact-modal { color: rgb(31.5, 82.6, 21); background-color: rgba(45, 118, 30, 0.1); } .dark-theme .module-contact-name--110--label-pill--list, .dark-theme .module-contact-name--110--label-pill--contact-modal { color: rgb(114, 198.75, 97.5); background-color: rgba(67, 180, 45, 0.32); } .module-contact-name--120 { color: #067906; } .dark-theme .module-contact-name--120 { color: #0ab80a; } .module-contact-name--120--label-pill--bubble { color: rgb(4.2, 84.7, 4.2); background-color: rgba(6, 121, 6, 0.14); } .dark-theme .module-contact-name--120--label-pill--bubble { color: rgb(88.4, 206.72, 88.4); background-color: rgba(10, 184, 10, 0.32); } .module-contact-name--120--label-pill--list, .module-contact-name--120--label-pill--contact-modal { color: rgb(4.2, 84.7, 4.2); background-color: rgba(6, 121, 6, 0.1); } .dark-theme .module-contact-name--120--label-pill--list, .dark-theme .module-contact-name--120--label-pill--contact-modal { color: rgb(71.25, 201.75, 71.25); background-color: rgba(10, 184, 10, 0.32); } .module-contact-name--130 { color: #32763e; } .dark-theme .module-contact-name--130 { color: #4baf5c; } .module-contact-name--130--label-pill--bubble { color: rgb(35, 82.6, 43.4); background-color: rgba(50, 118, 62, 0.14); } .dark-theme .module-contact-name--130--label-pill--bubble { color: rgb(132.6, 200.6, 144.16); background-color: rgba(75, 175, 92, 0.32); } .module-contact-name--130--label-pill--list, .module-contact-name--130--label-pill--contact-modal { color: rgb(35, 82.6, 43.4); background-color: rgba(50, 118, 62, 0.1); } .dark-theme .module-contact-name--130--label-pill--list, .dark-theme .module-contact-name--130--label-pill--contact-modal { color: rgb(120, 195, 132.75); background-color: rgba(75, 175, 92, 0.32); } .module-contact-name--140 { color: #06792d; } .dark-theme .module-contact-name--140 { color: #0ab844; } .module-contact-name--140--label-pill--bubble { color: rgb(4.2, 84.7, 31.5); background-color: rgba(6, 121, 45, 0.14); } .dark-theme .module-contact-name--140--label-pill--bubble { color: rgb(88.4, 206.72, 127.84); background-color: rgba(10, 184, 68, 0.32); } .module-contact-name--140--label-pill--list, .module-contact-name--140--label-pill--contact-modal { color: rgb(4.2, 84.7, 31.5); background-color: rgba(6, 121, 45, 0.1); } .dark-theme .module-contact-name--140--label-pill--list, .dark-theme .module-contact-name--140--label-pill--contact-modal { color: rgb(71.25, 201.75, 114.75); background-color: rgba(10, 184, 68, 0.32); } .module-contact-name--150 { color: #007a3d; } .dark-theme .module-contact-name--150 { color: #00b85c; } .module-contact-name--150--label-pill--bubble { color: rgb(0, 85.4, 42.7); background-color: rgba(0, 122, 61, 0.14); } .dark-theme .module-contact-name--150--label-pill--bubble { color: rgb(81.6, 206.72, 144.16); background-color: rgba(0, 184, 92, 0.32); } .module-contact-name--150--label-pill--list, .module-contact-name--150--label-pill--contact-modal { color: rgb(0, 85.4, 42.7); background-color: rgba(0, 122, 61, 0.1); } .dark-theme .module-contact-name--150--label-pill--list, .dark-theme .module-contact-name--150--label-pill--contact-modal { color: rgb(63.75, 201.75, 132.75); background-color: rgba(0, 184, 92, 0.32); } .module-contact-name--160 { color: #067953; } .dark-theme .module-contact-name--160 { color: #00b87a; } .module-contact-name--160--label-pill--bubble { color: rgb(4.2, 84.7, 58.1); background-color: rgba(6, 121, 83, 0.14); } .dark-theme .module-contact-name--160--label-pill--bubble { color: rgb(81.6, 206.72, 164.56); background-color: rgba(0, 184, 122, 0.32); } .module-contact-name--160--label-pill--list, .module-contact-name--160--label-pill--contact-modal { color: rgb(4.2, 84.7, 58.1); background-color: rgba(6, 121, 83, 0.1); } .dark-theme .module-contact-name--160--label-pill--list, .dark-theme .module-contact-name--160--label-pill--contact-modal { color: rgb(63.75, 201.75, 155.25); background-color: rgba(0, 184, 122, 0.32); } .module-contact-name--170 { color: #067462; } .dark-theme .module-contact-name--170 { color: #09b397; } .module-contact-name--170--label-pill--bubble { color: rgb(4.2, 81.2, 68.6); background-color: rgba(6, 116, 98, 0.14); } .dark-theme .module-contact-name--170--label-pill--bubble { color: rgb(87.72, 203.32, 184.28); background-color: rgba(9, 179, 151, 0.32); } .module-contact-name--170--label-pill--list, .module-contact-name--170--label-pill--contact-modal { color: rgb(4.2, 81.2, 68.6); background-color: rgba(6, 116, 98, 0.1); } .dark-theme .module-contact-name--170--label-pill--list, .dark-theme .module-contact-name--170--label-pill--contact-modal { color: rgb(70.5, 198, 177); background-color: rgba(9, 179, 151, 0.32); } .module-contact-name--180 { color: #007575; } .dark-theme .module-contact-name--180 { color: #00b2b2; } .module-contact-name--180--label-pill--bubble { color: rgb(0, 81.9, 81.9); background-color: rgba(0, 117, 117, 0.14); } .dark-theme .module-contact-name--180--label-pill--bubble { color: rgb(81.6, 202.64, 202.64); background-color: rgba(0, 178, 178, 0.32); } .module-contact-name--180--label-pill--list, .module-contact-name--180--label-pill--contact-modal { color: rgb(0, 81.9, 81.9); background-color: rgba(0, 117, 117, 0.1); } .dark-theme .module-contact-name--180--label-pill--list, .dark-theme .module-contact-name--180--label-pill--contact-modal { color: rgb(63.75, 197.25, 197.25); background-color: rgba(0, 178, 178, 0.32); } .module-contact-name--190 { color: #077288; } .dark-theme .module-contact-name--190 { color: #00aed1; } .module-contact-name--190--label-pill--bubble { color: rgb(4.9, 79.8, 95.2); background-color: rgba(7, 114, 136, 0.14); } .dark-theme .module-contact-name--190--label-pill--bubble { color: rgb(81.6, 199.92, 223.72); background-color: rgba(0, 174, 209, 0.32); } .module-contact-name--190--label-pill--list, .module-contact-name--190--label-pill--contact-modal { color: rgb(4.9, 79.8, 95.2); background-color: rgba(7, 114, 136, 0.1); } .dark-theme .module-contact-name--190--label-pill--list, .dark-theme .module-contact-name--190--label-pill--contact-modal { color: rgb(63.75, 194.25, 220.5); background-color: rgba(0, 174, 209, 0.32); } .module-contact-name--200 { color: #006da3; } .dark-theme .module-contact-name--200 { color: #00a7fa; } .module-contact-name--200--label-pill--bubble { color: rgb(0, 76.3, 114.1); background-color: rgba(0, 109, 163, 0.14); } .dark-theme .module-contact-name--200--label-pill--bubble { color: rgb(81.6, 195.16, 251.6); background-color: rgba(0, 167, 250, 0.32); } .module-contact-name--200--label-pill--list, .module-contact-name--200--label-pill--contact-modal { color: rgb(0, 76.3, 114.1); background-color: rgba(0, 109, 163, 0.1); } .dark-theme .module-contact-name--200--label-pill--list, .dark-theme .module-contact-name--200--label-pill--contact-modal { color: rgb(63.75, 189, 251.25); background-color: rgba(0, 167, 250, 0.32); } .module-contact-name--210 { color: #5b6976; } .dark-theme .module-contact-name--210 { color: #8ba1b6; } .module-contact-name--210--label-pill--bubble { color: rgb(63.7, 73.5, 82.6); background-color: rgba(91, 105, 118, 0.14); } .dark-theme .module-contact-name--210--label-pill--bubble { color: rgb(176.12, 191.08, 205.36); background-color: rgba(139, 161, 182, 0.32); } .module-contact-name--210--label-pill--list, .module-contact-name--210--label-pill--contact-modal { color: rgb(63.7, 73.5, 82.6); background-color: rgba(91, 105, 118, 0.1); } .dark-theme .module-contact-name--210--label-pill--list, .dark-theme .module-contact-name--210--label-pill--contact-modal { color: rgb(168, 184.5, 200.25); background-color: rgba(139, 161, 182, 0.32); } .module-contact-name--220 { color: #2662d9; } .dark-theme .module-contact-name--220 { color: #7da1e8; } .module-contact-name--220--label-pill--bubble { color: rgb(26.6, 68.6, 151.9); background-color: rgba(38, 98, 217, 0.14); } .dark-theme .module-contact-name--220--label-pill--bubble { color: rgb(166.6, 191.08, 239.36); background-color: rgba(125, 161, 232, 0.32); } .module-contact-name--220--label-pill--list, .module-contact-name--220--label-pill--contact-modal { color: rgb(26.6, 68.6, 151.9); background-color: rgba(38, 98, 217, 0.1); } .dark-theme .module-contact-name--220--label-pill--list, .dark-theme .module-contact-name--220--label-pill--contact-modal { color: rgb(157.5, 184.5, 237.75); background-color: rgba(125, 161, 232, 0.32); } .module-contact-name--230 { color: #2e51ff; } .dark-theme .module-contact-name--230 { color: #8599ff; } .module-contact-name--230--label-pill--bubble { color: rgb(32.2, 56.7, 178.5); background-color: rgba(46, 81, 255, 0.14); } .dark-theme .module-contact-name--230--label-pill--bubble { color: rgb(172.04, 185.64, 255); background-color: rgba(133, 153, 255, 0.32); } .module-contact-name--230--label-pill--list, .module-contact-name--230--label-pill--contact-modal { color: rgb(32.2, 56.7, 178.5); background-color: rgba(46, 81, 255, 0.1); } .dark-theme .module-contact-name--230--label-pill--list, .dark-theme .module-contact-name--230--label-pill--contact-modal { color: rgb(163.5, 178.5, 255); background-color: rgba(133, 153, 255, 0.32); } .module-contact-name--240 { color: #5151f6; } .dark-theme .module-contact-name--240 { color: #9494ff; } .module-contact-name--240--label-pill--bubble { color: rgb(56.7, 56.7, 172.2); background-color: rgba(81, 81, 246, 0.14); } .dark-theme .module-contact-name--240--label-pill--bubble { color: rgb(182.24, 182.24, 255); background-color: rgba(148, 148, 255, 0.32); } .module-contact-name--240--label-pill--list, .module-contact-name--240--label-pill--contact-modal { color: rgb(56.7, 56.7, 172.2); background-color: rgba(81, 81, 246, 0.1); } .dark-theme .module-contact-name--240--label-pill--list, .dark-theme .module-contact-name--240--label-pill--contact-modal { color: rgb(174.75, 174.75, 255); background-color: rgba(148, 148, 255, 0.32); } .module-contact-name--250 { color: #6447f5; } .dark-theme .module-contact-name--250 { color: #a18ff9; } .module-contact-name--250--label-pill--bubble { color: rgb(70, 49.7, 171.5); background-color: rgba(100, 71, 245, 0.14); } .dark-theme .module-contact-name--250--label-pill--bubble { color: rgb(191.08, 178.84, 250.92); background-color: rgba(161, 143, 249, 0.32); } .module-contact-name--250--label-pill--list, .module-contact-name--250--label-pill--contact-modal { color: rgb(70, 49.7, 171.5); background-color: rgba(100, 71, 245, 0.1); } .dark-theme .module-contact-name--250--label-pill--list, .dark-theme .module-contact-name--250--label-pill--contact-modal { color: rgb(184.5, 171, 250.5); background-color: rgba(161, 143, 249, 0.32); } .module-contact-name--260 { color: #7a3df5; } .dark-theme .module-contact-name--260 { color: #af8af9; } .module-contact-name--260--label-pill--bubble { color: rgb(85.4, 42.7, 171.5); background-color: rgba(122, 61, 245, 0.14); } .dark-theme .module-contact-name--260--label-pill--bubble { color: rgb(200.6, 175.44, 250.92); background-color: rgba(175, 138, 249, 0.32); } .module-contact-name--260--label-pill--list, .module-contact-name--260--label-pill--contact-modal { color: rgb(85.4, 42.7, 171.5); background-color: rgba(122, 61, 245, 0.1); } .dark-theme .module-contact-name--260--label-pill--list, .dark-theme .module-contact-name--260--label-pill--contact-modal { color: rgb(195, 167.25, 250.5); background-color: rgba(175, 138, 249, 0.32); } .module-contact-name--270 { color: #8f2af4; } .dark-theme .module-contact-name--270 { color: #bf80ff; } .module-contact-name--270--label-pill--bubble { color: rgb(100.1, 29.4, 170.8); background-color: rgba(143, 42, 244, 0.14); } .dark-theme .module-contact-name--270--label-pill--bubble { color: rgb(211.48, 168.64, 255); background-color: rgba(191, 128, 255, 0.32); } .module-contact-name--270--label-pill--list, .module-contact-name--270--label-pill--contact-modal { color: rgb(100.1, 29.4, 170.8); background-color: rgba(143, 42, 244, 0.1); } .dark-theme .module-contact-name--270--label-pill--list, .dark-theme .module-contact-name--270--label-pill--contact-modal { color: rgb(207, 159.75, 255); background-color: rgba(191, 128, 255, 0.32); } .module-contact-name--280 { color: #a20ced; } .dark-theme .module-contact-name--280 { color: #cf7cf8; } .module-contact-name--280--label-pill--bubble { color: rgb(113.4, 8.4, 165.9); background-color: rgba(162, 12, 237, 0.14); } .dark-theme .module-contact-name--280--label-pill--bubble { color: rgb(222.36, 165.92, 250.24); background-color: rgba(207, 124, 248, 0.32); } .module-contact-name--280--label-pill--list, .module-contact-name--280--label-pill--contact-modal { color: rgb(113.4, 8.4, 165.9); background-color: rgba(162, 12, 237, 0.1); } .dark-theme .module-contact-name--280--label-pill--list, .dark-theme .module-contact-name--280--label-pill--contact-modal { color: rgb(219, 156.75, 249.75); background-color: rgba(207, 124, 248, 0.32); } .module-contact-name--290 { color: #af0bd0; } .dark-theme .module-contact-name--290 { color: #e06ef7; } .module-contact-name--290--label-pill--bubble { color: rgb(122.5, 7.7, 145.6); background-color: rgba(175, 11, 208, 0.14); } .dark-theme .module-contact-name--290--label-pill--bubble { color: rgb(233.92, 156.4, 249.56); background-color: rgba(224, 110, 247, 0.32); } .module-contact-name--290--label-pill--list, .module-contact-name--290--label-pill--contact-modal { color: rgb(122.5, 7.7, 145.6); background-color: rgba(175, 11, 208, 0.1); } .dark-theme .module-contact-name--290--label-pill--list, .dark-theme .module-contact-name--290--label-pill--contact-modal { color: rgb(231.75, 146.25, 249); background-color: rgba(224, 110, 247, 0.32); } .module-contact-name--300 { color: #b814b8; } .dark-theme .module-contact-name--300 { color: #f65af6; } .module-contact-name--300--label-pill--bubble { color: rgb(128.8, 14, 128.8); background-color: rgba(184, 20, 184, 0.14); } .dark-theme .module-contact-name--300--label-pill--bubble { color: rgb(248.88, 142.8, 248.88); background-color: rgba(246, 90, 246, 0.32); } .module-contact-name--300--label-pill--list, .module-contact-name--300--label-pill--contact-modal { color: rgb(128.8, 14, 128.8); background-color: rgba(184, 20, 184, 0.1); } .dark-theme .module-contact-name--300--label-pill--list, .dark-theme .module-contact-name--300--label-pill--contact-modal { color: rgb(248.25, 131.25, 248.25); background-color: rgba(246, 90, 246, 0.32); } .module-contact-name--310 { color: #c20aa3; } .dark-theme .module-contact-name--310 { color: #f75fdd; } .module-contact-name--310--label-pill--bubble { color: rgb(135.8, 7, 114.1); background-color: rgba(194, 10, 163, 0.14); } .dark-theme .module-contact-name--310--label-pill--bubble { color: rgb(249.56, 146.2, 231.88); background-color: rgba(247, 95, 221, 0.32); } .module-contact-name--310--label-pill--list, .module-contact-name--310--label-pill--contact-modal { color: rgb(135.8, 7, 114.1); background-color: rgba(194, 10, 163, 0.1); } .dark-theme .module-contact-name--310--label-pill--list, .dark-theme .module-contact-name--310--label-pill--contact-modal { color: rgb(249, 135, 229.5); background-color: rgba(247, 95, 221, 0.32); } .module-contact-name--320 { color: #c70a88; } .dark-theme .module-contact-name--320 { color: #f76ec9; } .module-contact-name--320--label-pill--bubble { color: rgb(139.3, 7, 95.2); background-color: rgba(199, 10, 136, 0.14); } .dark-theme .module-contact-name--320--label-pill--bubble { color: rgb(249.56, 156.4, 218.28); background-color: rgba(247, 110, 201, 0.32); } .module-contact-name--320--label-pill--list, .module-contact-name--320--label-pill--contact-modal { color: rgb(139.3, 7, 95.2); background-color: rgba(199, 10, 136, 0.1); } .dark-theme .module-contact-name--320--label-pill--list, .dark-theme .module-contact-name--320--label-pill--contact-modal { color: rgb(249, 146.25, 214.5); background-color: rgba(247, 110, 201, 0.32); } .module-contact-name--330 { color: #cc0066; } .dark-theme .module-contact-name--330 { color: #f76eb2; } .module-contact-name--330--label-pill--bubble { color: rgb(142.8, 0, 71.4); background-color: rgba(204, 0, 102, 0.14); } .dark-theme .module-contact-name--330--label-pill--bubble { color: rgb(249.56, 156.4, 202.64); background-color: rgba(247, 110, 178, 0.32); } .module-contact-name--330--label-pill--list, .module-contact-name--330--label-pill--contact-modal { color: rgb(142.8, 0, 71.4); background-color: rgba(204, 0, 102, 0.1); } .dark-theme .module-contact-name--330--label-pill--list, .dark-theme .module-contact-name--330--label-pill--contact-modal { color: rgb(249, 146.25, 197.25); background-color: rgba(247, 110, 178, 0.32); } .module-contact-name--340 { color: #d00b4d; } .dark-theme .module-contact-name--340 { color: #ff6b9c; } .module-contact-name--340--label-pill--bubble { color: rgb(145.6, 7.7, 53.9); background-color: rgba(208, 11, 77, 0.14); } .dark-theme .module-contact-name--340--label-pill--bubble { color: rgb(255, 154.36, 187.68); background-color: rgba(255, 107, 156, 0.32); } .module-contact-name--340--label-pill--list, .module-contact-name--340--label-pill--contact-modal { color: rgb(145.6, 7.7, 53.9); background-color: rgba(208, 11, 77, 0.1); } .dark-theme .module-contact-name--340--label-pill--list, .dark-theme .module-contact-name--340--label-pill--contact-modal { color: rgb(255, 144, 180.75); background-color: rgba(255, 107, 156, 0.32); } .module-contact-name--350 { color: #d00b2c; } .dark-theme .module-contact-name--350 { color: #f77389; } .module-contact-name--350--label-pill--bubble { color: rgb(145.6, 7.7, 30.8); background-color: rgba(208, 11, 44, 0.14); } .dark-theme .module-contact-name--350--label-pill--bubble { color: rgb(249.56, 159.8, 174.76); background-color: rgba(247, 115, 137, 0.32); } .module-contact-name--350--label-pill--list, .module-contact-name--350--label-pill--contact-modal { color: rgb(145.6, 7.7, 30.8); background-color: rgba(208, 11, 44, 0.1); } .dark-theme .module-contact-name--350--label-pill--list, .dark-theme .module-contact-name--350--label-pill--contact-modal { color: rgb(249, 150, 166.5); background-color: rgba(247, 115, 137, 0.32); } .module-ContactPill { align-items: center; display: inline-flex; user-select: none; overflow: hidden; padding-block: 4px; padding-inline: 8px; border-radius: 6px; } .module-ContactPill { background: rgba(0, 0, 0, 0.08); color: #1b1b1b; } .dark-theme .module-ContactPill { background: rgba(255, 255, 255, 0.12); color: #e9e9e9; } .keyboard-mode .module-ContactPill:focus-within { background: #848484; color: #ffffff; } .dark-theme .keyboard-mode .module-ContactPill:focus-within { background: #b9b9b9; color: #1b1b1b; } .module-ContactPill__contact-name { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; padding-block: 0; padding-inline: 6px; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; } .module-ContactPill__remove { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-ContactPill__remove { border: 1px solid WindowText; } } .module-ContactPill__remove { height: 100%; display: flex; width: 16px; height: 16px; justify-content: center; align-items: center; padding: 0; } .module-ContactPill__remove::before { content: ""; width: 100%; height: 100%; display: block; } .module-ContactPill__remove::before { -webkit-mask: url("../images/icons/v3/x/x-compact-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .module-ContactPill__remove::before { background-color: WindowText; } } .dark-theme .module-ContactPill__remove::before { -webkit-mask: url("../images/icons/v3/x/x-compact-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .dark-theme .module-ContactPill__remove::before { background-color: WindowText; } } .keyboard-mode .module-ContactPill__remove:focus::before { -webkit-mask: url("../images/icons/v3/x/x-compact-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .keyboard-mode .module-ContactPill__remove:focus::before { background-color: WindowText; } } .dark-theme.keyboard-mode .module-ContactPill__remove:focus::before { -webkit-mask: url("../images/icons/v3/x/x-compact-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #1b1b1b; } @media (forced-colors: active) { .dark-theme.keyboard-mode .module-ContactPill__remove:focus::before { background-color: WindowText; } } .module-ContactPills { scroll-behavior: smooth; } @media (prefers-reduced-motion) { .module-ContactPills { scroll-behavior: auto; } } .module-ContactPills { display: flex; flex-wrap: wrap; margin-bottom: 10px; max-height: 88px; overflow-x: hidden; overflow-y: scroll; padding-block: 4px; padding-inline: 16px; gap: 8px 12px; } .module-ContactPills .module-ContactPill { max-width: calc(100% - 15px); } .module-ContactSpoofingReviewDialog { user-select: none; } .module-ContactSpoofingReviewDialog p { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; } .module-ContactSpoofingReviewDialog p { color: #5e5e5e; } .dark-theme .module-ContactSpoofingReviewDialog p { color: #e9e9e9; } .module-ContactSpoofingReviewDialog__description { margin-block: 0 16px; } .module-ContactSpoofingReviewDialog h2 { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; margin-top: 28px; margin-bottom: 20px; } .module-ContactSpoofingReviewDialog hr { border: 0; height: 1px; margin-block: 12px; margin-inline: 0; } .module-ContactSpoofingReviewDialog hr { background: #e9e9e9; } .dark-theme .module-ContactSpoofingReviewDialog hr { background: #3b3b3b; } .module-ContactSpoofingReviewDialog__buttons { margin-top: 4px; } .module-ContactSpoofingReviewDialog__buttons .module-Button:not(:last-child) { margin-inline-end: 12px; } .module-ContactSpoofingReviewDialogPerson { display: flex; padding-block: 8px; gap: 16px; } .module-ContactSpoofingReviewDialogPerson:is(button) { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-ContactSpoofingReviewDialogPerson:is(button) { border: 1px solid WindowText; } } .module-ContactSpoofingReviewDialogPerson__info { display: flex; flex-direction: column; gap: 12px; } .module-ContactSpoofingReviewDialogPerson__info__contact-name { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; display: block; } .module-ContactSpoofingReviewDialogPerson__info__property { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; } .module-ContactSpoofingReviewDialogPerson__info__property { color: #5e5e5e; } .dark-theme .module-ContactSpoofingReviewDialogPerson__info__property { color: #e9e9e9; } .module-ContactSpoofingReviewDialogPerson__info__property { display: flex; gap: 12px; } .module-ContactSpoofingReviewDialogPerson__info__property__icon { display: inline-block; height: 20px; width: 20px; vertical-align: text-top; flex-shrink: 0; } .module-ContactSpoofingReviewDialogPerson__info__property__icon--connections { -webkit-mask: url("../images/icons/v3/connections/connections.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #1b1b1b; } @media (forced-colors: active) { .module-ContactSpoofingReviewDialogPerson__info__property__icon--connections { background-color: WindowText; } } .dark-theme .module-ContactSpoofingReviewDialogPerson__info__property__icon--connections { -webkit-mask: url("../images/icons/v3/connections/connections.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #e9e9e9; } @media (forced-colors: active) { .dark-theme .module-ContactSpoofingReviewDialogPerson__info__property__icon--connections { background-color: WindowText; } } .module-ContactSpoofingReviewDialogPerson__info__property__icon--person { -webkit-mask: url("../images/icons/v3/person/person.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #1b1b1b; } @media (forced-colors: active) { .module-ContactSpoofingReviewDialogPerson__info__property__icon--person { background-color: WindowText; } } .dark-theme .module-ContactSpoofingReviewDialogPerson__info__property__icon--person { -webkit-mask: url("../images/icons/v3/person/person.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #e9e9e9; } @media (forced-colors: active) { .dark-theme .module-ContactSpoofingReviewDialogPerson__info__property__icon--person { background-color: WindowText; } } .module-ContactSpoofingReviewDialogPerson__info__property__icon--phone { -webkit-mask: url("../images/icons/v3/phone/phone-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #1b1b1b; } @media (forced-colors: active) { .module-ContactSpoofingReviewDialogPerson__info__property__icon--phone { background-color: WindowText; } } .dark-theme .module-ContactSpoofingReviewDialogPerson__info__property__icon--phone { -webkit-mask: url("../images/icons/v3/phone/phone-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #e9e9e9; } @media (forced-colors: active) { .dark-theme .module-ContactSpoofingReviewDialogPerson__info__property__icon--phone { background-color: WindowText; } } .module-ContactSpoofingReviewDialogPerson__info__property__icon--group { -webkit-mask: url("../images/icons/v3/group/group.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #1b1b1b; } @media (forced-colors: active) { .module-ContactSpoofingReviewDialogPerson__info__property__icon--group { background-color: WindowText; } } .dark-theme .module-ContactSpoofingReviewDialogPerson__info__property__icon--group { -webkit-mask: url("../images/icons/v3/group/group.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #e9e9e9; } @media (forced-colors: active) { .dark-theme .module-ContactSpoofingReviewDialogPerson__info__property__icon--group { background-color: WindowText; } } .module-ContactSpoofingReviewDialogPerson__info__property__signal-connection { display: flex; flex-direction: row; align-items: center; } .module-ContactSpoofingReviewDialogPerson__info__property__signal-connection { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-ContactSpoofingReviewDialogPerson__info__property__signal-connection { border: 1px solid WindowText; } } .module-ContactSpoofingReviewDialogPerson__info__property__signal-connection { cursor: pointer; } .module-ContactSpoofingReviewDialogPerson__info__property__signal-connection::after { content: ""; display: inline-block; height: 20px; width: 20px; } .module-ContactSpoofingReviewDialogPerson__info__property__signal-connection::after { -webkit-mask: url("../images/icons/v3/chevron/chevron-right-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #848484; } @media (forced-colors: active) { .module-ContactSpoofingReviewDialogPerson__info__property__signal-connection::after { background-color: WindowText; } } :dir(rtl) .module-ContactSpoofingReviewDialogPerson__info__property__signal-connection::after { -webkit-mask: url("../images/icons/v3/chevron/chevron-left-bold.svg") no-repeat center; } .ContextMenu__container { align-items: center; display: flex; justify-content: center; } .ContextMenu__popper { width: 332px; border-radius: 4px; margin-bottom: 6px; z-index: 125; user-select: none; overflow: hidden; } .ContextMenu__popper { box-shadow: 0px 8px 20px rgba(0, 0, 0, 0.3), 0px 0px 8px rgba(0, 0, 0, 0.05); } @media (forced-colors: active) { .ContextMenu__popper { border: 1px solid WindowText; } } .ContextMenu__popper { background: #f6f6f6; } .dark-theme .ContextMenu__popper { background: #3b3b3b; } .ContextMenu__popper { margin: 0; padding-block: 6px; padding-inline: 0px; width: auto; } .ContextMenu__popper--single-item { padding: 0; } .ContextMenu__title { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; margin-bottom: 12px; } .ContextMenu__button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .ContextMenu__button { border: 1px solid WindowText; } } .ContextMenu__option { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .ContextMenu__option { border: 1px solid WindowText; } } .ContextMenu__option { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; align-items: center; display: flex; justify-content: space-between; min-width: 150px; width: 100%; } .dark-theme .ContextMenu__option { color: #e9e9e9; } .ContextMenu__option--container { display: flex; align-items: center; padding-block: 7px; padding-inline: 12px; } .ContextMenu__option--container--with-selection { padding-inline-start: 8px; padding-inline-end: 24px; } .ContextMenu__option--container--with-selection::before { content: ""; width: 16px; height: 16px; margin-inline-end: 8px; } .ContextMenu__option--container--selected::before { -webkit-mask: url("../images/icons/v3/check/check.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .ContextMenu__option--container--selected::before { background-color: WindowText; } } .dark-theme .ContextMenu__option--container--selected::before { -webkit-mask: url("../images/icons/v3/check/check.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .dark-theme .ContextMenu__option--container--selected::before { background-color: WindowText; } } .ContextMenu__option--icon { height: 16px; margin-inline-end: 8px; width: 16px; } .ContextMenu__option--container--with-selection .ContextMenu__option--icon { margin-inline-end: 12px; } .ContextMenu__option--title { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; } .ContextMenu__option--description { font-size: 12px; line-height: 16px; letter-spacing: 0; } .ContextMenu__option:hover { background-color: #e9e9e9; } .dark-theme .ContextMenu__option:hover { background-color: #4a4a4a; } .keyboard-mode .ContextMenu__option--focused, .keyboard-mode .ContextMenu__option:focus, .keyboard-mode .ContextMenu__option:active { box-shadow: 0 0 1px 1px #2c6bed; outline: none; } .ContextMenu__popper--single-item .ContextMenu__option--container { padding-block: 12px; } .ContextMenu__popper--single-item .ContextMenu__divider { border-style: solid; border-width: 0 0 1px 0; margin-top: 2px; margin-bottom: 2px; } .ContextMenu__popper--single-item .ContextMenu__divider { border-color: #dedede; } .dark-theme .ContextMenu__popper--single-item .ContextMenu__divider { border-color: #4a4a4a; } .ConversationDetails__chat-color { background-clip: content-box; border-color: transparent; border-radius: 32px; border-style: solid; border-width: 4px; cursor: pointer; height: 32px; padding: 2px; width: 32px; } .ConversationDetails__chat-color--blue { background-color: #336ba3; } .ConversationDetails__chat-color--burlap { background-color: #6f6a58; } .ConversationDetails__chat-color--crimson { background-color: #cf163e; } .ConversationDetails__chat-color--forest { background-color: #3b7845; } .ConversationDetails__chat-color--indigo { background-color: #6058ca; } .ConversationDetails__chat-color--plum { background-color: #aa377a; } .ConversationDetails__chat-color--steel { background-color: #71717f; } .ConversationDetails__chat-color--taupe { background-color: #8f616a; } .ConversationDetails__chat-color--teal { background-color: #077d92; } .ConversationDetails__chat-color--vermilion { background-color: #c73f0a; } .ConversationDetails__chat-color--violet { background-color: #9932c8; } .ConversationDetails__chat-color--wintergreen { background-color: #1d8663; } .ConversationDetails__chat-color--ultramarine { background-image: linear-gradient(180deg, #0552f0, #2c6bed); } .ConversationDetails__chat-color--basil { background-image: linear-gradient(180deg, #2f9373, #077343); } .ConversationDetails__chat-color--ember { background-image: linear-gradient(168deg, #e57c00, #5e0000); } .ConversationDetails__chat-color--fluorescent { background-image: linear-gradient(192deg, #ec13dd, #1b36c6); } .ConversationDetails__chat-color--infrared { background-image: linear-gradient(192deg, #f65560, #442ced); } .ConversationDetails__chat-color--lagoon { background-image: linear-gradient(180deg, #004066, #32867d); } .ConversationDetails__chat-color--midnight { background-image: linear-gradient(180deg, #2c2c3a, #787891); } .ConversationDetails__chat-color--sea { background-image: linear-gradient(180deg, #498fd4, #2c66a0); } .ConversationDetails__chat-color--sublime { background-image: linear-gradient(180deg, #6281d5, #974460); } .ConversationDetails__chat-color--tangerine { background-image: linear-gradient(192deg, #db7133, #911231); } .ConversationDetails-membership-list__add-members-icon, .ConversationDetails-membership-list__add-to-group-icon, .ConversationDetails-groups__add-members-icon, .ConversationDetails-groups__add-to-group-icon { align-items: center; border-radius: 100%; display: flex; height: 32px; justify-content: center; width: 32px; background: light-dark(#f6f6f6, #1b1b1b); } .ConversationDetails-membership-list__add-members-icon::before, .ConversationDetails-membership-list__add-to-group-icon::before, .ConversationDetails-groups__add-members-icon::before, .ConversationDetails-groups__add-to-group-icon::before { -webkit-mask: url("../images/icons/v3/plus/plus-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#000000, #dedede); } @media (forced-colors: active) { .ConversationDetails-membership-list__add-members-icon::before, .ConversationDetails-membership-list__add-to-group-icon::before, .ConversationDetails-groups__add-members-icon::before, .ConversationDetails-groups__add-to-group-icon::before { background-color: WindowText; } } .ConversationDetails-membership-list__add-members-icon::before, .ConversationDetails-membership-list__add-to-group-icon::before, .ConversationDetails-groups__add-members-icon::before, .ConversationDetails-groups__add-to-group-icon::before { content: ""; display: block; height: 18px; width: 18px; } .ConversationDetails-membership-list__member-label { font-size: 12px; line-height: 16px; letter-spacing: 0px; } .ConversationDetails-membership-list__member-label-button { font-size: 12px; line-height: 16px; letter-spacing: 0px; margin-inline-start: -5px; padding-inline-start: 5px; font-weight: 500; outline: none; border-radius: 5px; display: flex; align-items: center; color: light-dark(rgba(0, 0, 0, 0.55), rgba(255, 255, 255, 0.55)); } .keyboard-mode .ConversationDetails-membership-list__member-label-button:focus { box-shadow: 0px 0px 0px 2px #2c6bed; } .dark-theme.keyboard-mode .ConversationDetails-membership-list__member-label-button:focus { box-shadow: 0px 0px 0px 2px #6191f3; } .mouse-mode .ConversationDetails-membership-list__member-label-button:hover { background-color: light-dark(#f6f6f6, #1b1b1b); } .ConversationDetails-membership-list__member-label-button__chevron-icon { height: 16px; width: 16px; margin-bottom: 1px; } .ConversationDetails-membership-list__member-label-button__chevron-icon { -webkit-mask: url("../images/icons/v3/chevron/chevron-right.svg") no-repeat center; -webkit-mask-size: 100%; background-color: rgba(0, 0, 0, 0.55); } @media (forced-colors: active) { .ConversationDetails-membership-list__member-label-button__chevron-icon { background-color: WindowText; } } :dir(rtl) .ConversationDetails-membership-list__member-label-button__chevron-icon { -webkit-mask: url("../images/icons/v3/chevron/chevron-left.svg") no-repeat center; } .dark-theme .ConversationDetails-membership-list__member-label-button__chevron-icon { -webkit-mask: url("../images/icons/v3/chevron/chevron-right.svg") no-repeat center; -webkit-mask-size: 100%; background-color: rgba(255, 255, 255, 0.55); } @media (forced-colors: active) { .dark-theme .ConversationDetails-membership-list__member-label-button__chevron-icon { background-color: WindowText; } } :dir(rtl) .dark-theme .ConversationDetails-membership-list__member-label-button__chevron-icon { -webkit-mask: url("../images/icons/v3/chevron/chevron-left.svg") no-repeat center; } .ConversationDetails__block-group { color: #f44336; } .ConversationDetails__unblock-group { color: #2c6bed; } .ConversationDetails__tabs.ConversationDetails__tabs { border-bottom: none; } .ConversationDetails__pending--info { font-size: 12px; line-height: 16px; letter-spacing: 0; color: light-dark(#5e5e5e, #b9b9b9); } .ConversationDetails__pending--info { padding-block: 0; padding-inline: 28px; padding-top: 16px; } .ConversationDetails-icon__button { background: none; border: none; padding: none; } .ConversationDetails-icon__button:focus { outline: none; } .keyboard-mode .ConversationDetails-icon__button:focus .ConversationDetails-icon__icon::after { background-color: #2c6bed; } .ConversationDetails-icon__icon { height: 32px; width: 32px; display: flex; align-items: center; justify-content: center; } .ConversationDetails-icon__icon::after { display: block; content: ""; width: 20px; height: 20px; } .ConversationDetails-icon__icon--color::after { -webkit-mask: url("../images/icons/v3/color/color.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#3b3b3b, #dedede); } @media (forced-colors: active) { .ConversationDetails-icon__icon--color::after { background-color: WindowText; } } .ConversationDetails-icon__icon--timer::after { -webkit-mask: url("../images/icons/v3/timer/timer-slash.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#3b3b3b, #dedede); } @media (forced-colors: active) { .ConversationDetails-icon__icon--timer::after { background-color: WindowText; } } .ConversationDetails-icon__icon--notifications::after { -webkit-mask: url("../images/icons/v3/bell/bell.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#3b3b3b, #dedede); } @media (forced-colors: active) { .ConversationDetails-icon__icon--notifications::after { background-color: WindowText; } } .ConversationDetails-icon__icon--mute::after { -webkit-mask: url("../images/icons/v3/bell/bell-slash.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#3b3b3b, #dedede); } @media (forced-colors: active) { .ConversationDetails-icon__icon--mute::after { background-color: WindowText; } } .ConversationDetails-icon__icon--media::after { -webkit-mask: url("../images/icons/v3/album/album-tilt.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#3b3b3b, #dedede); } @media (forced-colors: active) { .ConversationDetails-icon__icon--media::after { background-color: WindowText; } } .ConversationDetails-icon__icon--mention::after { -webkit-mask: url("../images/icons/v3/at/at.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#3b3b3b, #dedede); } @media (forced-colors: active) { .ConversationDetails-icon__icon--mention::after { background-color: WindowText; } } .ConversationDetails-icon__icon--lock::after { -webkit-mask: url("../images/icons/v3/key/key.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#3b3b3b, #dedede); } @media (forced-colors: active) { .ConversationDetails-icon__icon--lock::after { background-color: WindowText; } } .ConversationDetails-icon__icon--approve::after { -webkit-mask: url("../images/icons/v3/check/check.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#3b3b3b, #dedede); } @media (forced-colors: active) { .ConversationDetails-icon__icon--approve::after { background-color: WindowText; } } .ConversationDetails-icon__icon--approveAllMembers::after { -webkit-mask: url("../images/icons/v3/person/person-check-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#3b3b3b, #dedede); } @media (forced-colors: active) { .ConversationDetails-icon__icon--approveAllMembers::after { background-color: WindowText; } } .ConversationDetails-icon__icon--bell::after { -webkit-mask: url("../images/icons/v3/bell/bell-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#3b3b3b, #dedede); } @media (forced-colors: active) { .ConversationDetails-icon__icon--bell::after { background-color: WindowText; } } .ConversationDetails-icon__icon--link::after { -webkit-mask: url("../images/icons/v3/link/link.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#3b3b3b, #dedede); } @media (forced-colors: active) { .ConversationDetails-icon__icon--link::after { background-color: WindowText; } } .ConversationDetails-icon__icon--share::after { -webkit-mask: url("../images/icons/v3/copy/copy.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#3b3b3b, #dedede); } @media (forced-colors: active) { .ConversationDetails-icon__icon--share::after { background-color: WindowText; } } .ConversationDetails-icon__icon--reset::after { -webkit-mask: url("../images/icons/v3/refresh/refresh.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#3b3b3b, #dedede); } @media (forced-colors: active) { .ConversationDetails-icon__icon--reset::after { background-color: WindowText; } } .ConversationDetails-icon__icon--trash::after { -webkit-mask: url("../images/icons/v3/trash/trash.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#3b3b3b, #dedede); } @media (forced-colors: active) { .ConversationDetails-icon__icon--trash::after { background-color: WindowText; } } .ConversationDetails-icon__icon--invites::after { -webkit-mask: url("../images/icons/v3/group/group.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#3b3b3b, #dedede); } @media (forced-colors: active) { .ConversationDetails-icon__icon--invites::after { background-color: WindowText; } } .ConversationDetails-icon__icon--edit::after { -webkit-mask: url("../images/icons/v3/edit/edit.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#3b3b3b, #dedede); } @media (forced-colors: active) { .ConversationDetails-icon__icon--edit::after { background-color: WindowText; } } .ConversationDetails-icon__icon--forward::after { -webkit-mask: url("../images/icons/v3/forward/forward.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#3b3b3b, #dedede); } @media (forced-colors: active) { .ConversationDetails-icon__icon--forward::after { background-color: WindowText; } } .ConversationDetails-icon__icon--down { border-radius: 18px; background-color: light-dark(#f6f6f6, #1b1b1b); } .ConversationDetails-icon__icon--down::after { width: 18px; height: 18px; } .ConversationDetails-icon__icon--down::after { -webkit-mask: url("../images/icons/v3/chevron/chevron-down-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#3b3b3b, #dedede); } @media (forced-colors: active) { .ConversationDetails-icon__icon--down::after { background-color: WindowText; } } .ConversationDetails-icon__icon--leave::after { -webkit-mask: url("../images/icons/v3/leave/leave.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#3b3b3b, #dedede); } @media (forced-colors: active) { .ConversationDetails-icon__icon--leave::after { background-color: WindowText; } } .ConversationDetails-icon__icon--block::after { -webkit-mask: url("../images/icons/v3/block/block.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#f44336, #f44336); } @media (forced-colors: active) { .ConversationDetails-icon__icon--block::after { background-color: WindowText; } } .ConversationDetails-icon__icon--unblock::after { -webkit-mask: url("../images/icons/v3/block/block.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#2c6bed, #2c6bed); } @media (forced-colors: active) { .ConversationDetails-icon__icon--unblock::after { background-color: WindowText; } } .ConversationDetails-icon__icon--verify::after { -webkit-mask: url("../images/icons/v3/safety_number/safety_number.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#3b3b3b, #dedede); } @media (forced-colors: active) { .ConversationDetails-icon__icon--verify::after { background-color: WindowText; } } .ConversationDetails-icon__icon--help::after { -webkit-mask: url("../images/icons/v3/help/help-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#3b3b3b, #dedede); } @media (forced-colors: active) { .ConversationDetails-icon__icon--help::after { background-color: WindowText; } } .ConversationDetails-icon__icon--invite::after { -webkit-mask: url("../images/icons/v3/invite/invite.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#3b3b3b, #dedede); } @media (forced-colors: active) { .ConversationDetails-icon__icon--invite::after { background-color: WindowText; } } .ConversationDetails-icon__icon--official::after { -webkit-mask: url("../images/icons/v3/official/official-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#3b3b3b, #dedede); } @media (forced-colors: active) { .ConversationDetails-icon__icon--official::after { background-color: WindowText; } } .ConversationDetails-icon__icon--heart::after { -webkit-mask: url("../images/icons/v3/heart/heart.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#3b3b3b, #dedede); } @media (forced-colors: active) { .ConversationDetails-icon__icon--heart::after { background-color: WindowText; } } .ConversationDetails-icon__icon--tag::after { -webkit-mask: url("../images/icons/v3/tag/tag.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#3b3b3b, #dedede); } @media (forced-colors: active) { .ConversationDetails-icon__icon--tag::after { background-color: WindowText; } } .ConversationDetails-icon__icon--tag--disabled { opacity: 0.5; } .ConversationDetails-panel-row__root { border-radius: 5px; border: 2px solid transparent; padding-block: 8px; padding-inline: 24px; user-select: none; font-size: 13px; line-height: 18px; letter-spacing: -0.03px; } .ConversationDetails-panel-row__root--button { color: inherit; background: none; } .ConversationDetails-panel-row__root--button[data-hovered]:not(:disabled) { background-color: light-dark(#f6f6f6, #1b1b1b); } .ConversationDetails-panel-row__root--button[data-hovered]:not(:disabled) .ConversationDetails-panel-row__actions { opacity: 1; } .ConversationDetails-panel-row__root:focus { outline: none; } .keyboard-mode .ConversationDetails-panel-row__root[data-focused=true] { border-color: #2c6bed; } .dark-theme.keyboard-mode .ConversationDetails-panel-row__root[data-focused=true] { border-color: #6191f3; } .ConversationDetails-panel-row__inner { align-items: center; display: flex; width: 100%; } .ConversationDetails-panel-row__icon { margin-inline-end: 12px; flex-shrink: 0; } .ConversationDetails-panel-row__label { flex-grow: 1; text-align: start; margin-inline-end: 12px; min-width: 0; } .ConversationDetails-panel-row__info { margin-top: 4px; color: light-dark(#5e5e5e, #b9b9b9); } .ConversationDetails-panel-row__info .ConversationDetails__panel-row__group-link { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .ConversationDetails-panel-row__info .ConversationDetails__panel-row__group-link { border: 1px solid WindowText; } } .ConversationDetails-panel-row__info .ConversationDetails__panel-row__group-link { word-break: break-all; } .ConversationDetails-panel-row__right { position: relative; color: #848484; min-width: 100px; } .ConversationDetails-panel-row__actions { position: static; margin-inline-start: 12px; overflow: hidden; opacity: 0; } .ConversationDetails-panel-row__root:hover .ConversationDetails-panel-row__actions, .ConversationDetails-panel-row__root:focus-within .ConversationDetails-panel-row__actions { opacity: 1; } .ConversationDetails-panel-section__root { position: relative; } .ConversationDetails-panel-section__root:not(:first-child)::before { border-top: 1px solid transparent; border-top-color: light-dark(#dedede, #4a4a4a); } .ConversationDetails-panel-section__root:not(:first-child)::before { content: ""; display: block; margin-block: 8px; margin-inline: 0; } .ConversationDetails-panel-section__root--borderless:not(:first-child)::before { border-top: none; } .ConversationDetails-panel-section__header { display: flex; justify-content: space-between; padding-block: 18px 12px; padding-inline: 24px; } .ConversationDetails-panel-section__header--center { justify-content: center; } .ConversationDetails-panel-section__title { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; } .ConversationDetails__header-buttons { display: flex; justify-content: center; margin-bottom: 24px; } .ConversationDetails__header-buttons .module-Button { margin-block: 0; margin-inline: 8px; } .ConversationDetails__radio__container { padding-block: 12px; padding-inline: 0; } .ConversationDetails__MemberName { user-select: text; } .ConversationDetails__MemberLabel--disabled { opacity: 0.5; } .ConversationDetails__CallHistoryGroup__List { list-style: none; margin: 0; padding: 0; } .ConversationDetails__CallHistoryGroup__Item { display: flex; align-items: center; gap: 8px; margin: 0; padding-block: 10px; padding-inline: 24px; } .ConversationDetails__CallHistoryGroup__ItemIcon { display: block; width: 20px; height: 20px; } .ConversationDetails__CallHistoryGroup__ItemIcon--Audio { -webkit-mask: url("../images/icons/v3/phone/phone.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#000000, #dedede); } @media (forced-colors: active) { .ConversationDetails__CallHistoryGroup__ItemIcon--Audio { background-color: WindowText; } } .ConversationDetails__CallHistoryGroup__ItemIcon--Video { -webkit-mask: url("../images/icons/v3/video/video.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#000000, #dedede); } @media (forced-colors: active) { .ConversationDetails__CallHistoryGroup__ItemIcon--Video { background-color: WindowText; } } .ConversationDetails__CallHistoryGroup__ItemIcon--Adhoc { -webkit-mask: url("../images/icons/v3/link/link.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#000000, #dedede); } @media (forced-colors: active) { .ConversationDetails__CallHistoryGroup__ItemIcon--Adhoc { background-color: WindowText; } } .ConversationDetails__CallHistoryGroup__ItemLabel { flex: 1; } .ConversationDetails__CallHistoryGroup__ItemTimestamp { flex-shrink: 0; } .ConversationDetails--nickname-actions { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .ConversationDetails--nickname-actions { border: 1px solid WindowText; } } .ConversationDetails--nickname-actions { width: 32px; height: 32px; } .ConversationDetails--nickname-actions::before { display: inline-block; content: ""; width: 20px; height: 20px; } .ConversationDetails--nickname-actions::before { -webkit-mask: url("../images/icons/v3/chevron/chevron-down.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#000000, #ffffff); } @media (forced-colors: active) { .ConversationDetails--nickname-actions::before { background-color: WindowText; } } .ConversationDetails--nickname-actions-label { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border-width: 0; } .ConversationDetails--nickname-actions--delete { width: 16px; height: 16px; } .ConversationDetails--nickname-actions--delete { -webkit-mask: url("../images/icons/v3/trash/trash.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#000000, #ffffff); } @media (forced-colors: active) { .ConversationDetails--nickname-actions--delete { background-color: WindowText; } } .Input__input--textarea.GroupMemberLabelEditor__input--textarea { line-height: 32px; margin-top: 0px; } .ConversationDetailsHeader { align-items: center; display: flex; flex-direction: column; margin-block: 0 20px; margin-inline: 0; padding-block: 0; padding-inline: 24px; text-align: center; width: 100%; } .ConversationDetailsHeader__edit-button, .ConversationDetailsHeader__about-button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .ConversationDetailsHeader__edit-button, .ConversationDetailsHeader__about-button { border: 1px solid WindowText; } } .ConversationDetailsHeader__edit-button, .ConversationDetailsHeader__about-button { cursor: pointer; } .ConversationDetailsHeader__title { font-weight: 600; font-size: 26px; line-height: 32px; letter-spacing: -0.56px; font-weight: 400; padding-bottom: 8px; padding-top: 12px; user-select: text; display: flex; align-items: center; } .ConversationDetailsHeader__title-contact-icon { width: 22px; height: 22px; background-color: currentColor; } .ConversationDetailsHeader__subtitle { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; color: #5e5e5e; justify-content: center; padding-bottom: 6px; } .dark-theme .ConversationDetailsHeader__subtitle { color: #b9b9b9; } .ConversationDetailsHeader__subtitle__about { user-select: text; } .ConversationDetailsHeader__edit-button .ConversationDetailsHeader__title::after { display: inline-block; vertical-align: middle; content: ""; height: 24px; inset-inline-start: 37px; margin-inline-start: -24px; opacity: 0; position: relative; transition: opacity 100ms ease-out; width: 24px; } .ConversationDetailsHeader__edit-button .ConversationDetailsHeader__title::after { -webkit-mask: url("../images/icons/v3/edit/edit.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .ConversationDetailsHeader__edit-button .ConversationDetailsHeader__title::after { background-color: WindowText; } } .dark-theme .ConversationDetailsHeader__edit-button .ConversationDetailsHeader__title::after { -webkit-mask: url("../images/icons/v3/edit/edit.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .dark-theme .ConversationDetailsHeader__edit-button .ConversationDetailsHeader__title::after { background-color: WindowText; } } .ConversationDetailsHeader__edit-button:hover .ConversationDetailsHeader__title::after { opacity: 1; } .ConversationDetailsHeader__about-icon { display: inline-block; height: 20px; width: 20px; position: relative; inset-block-start: 2px; } .ConversationDetailsHeader__about-icon { -webkit-mask: url("../images/icons/v3/chevron/chevron-right-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .ConversationDetailsHeader__about-icon { background-color: WindowText; } } :dir(rtl) .ConversationDetailsHeader__about-icon { -webkit-mask: url("../images/icons/v3/chevron/chevron-left-bold.svg") no-repeat center; } .dark-theme .ConversationDetailsHeader__about-icon { -webkit-mask: url("../images/icons/v3/chevron/chevron-right-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #e9e9e9; } @media (forced-colors: active) { .dark-theme .ConversationDetailsHeader__about-icon { background-color: WindowText; } } :dir(rtl) .dark-theme .ConversationDetailsHeader__about-icon { -webkit-mask: url("../images/icons/v3/chevron/chevron-left-bold.svg") no-repeat center; } .module-ConversationHeader { --button-spacing: 12px; -webkit-app-region: drag; padding-top: var(--title-bar-drag-area-height); display: flex; flex-direction: row; align-items: center; height: calc(52px + var(--title-bar-drag-area-height)); } .module-ConversationHeader.module-ConversationHeader--narrow { --button-spacing: 4px; } body.context-menu-open .module-ConversationHeader { -webkit-app-region: no-drag; } body:not(.window-focused) .module-ConversationHeader { -webkit-app-region: no-drag; } .module-ConversationHeader { color: #1b1b1b; background-color: #ffffff; } .dark-theme .module-ConversationHeader { color: #f6f6f6; background-color: #121212; } .module-ConversationHeader__header { align-items: center; display: flex; flex-direction: row; flex-grow: 1; margin-inline: 4px var(--button-spacing); padding: 4px 12px; overflow: hidden; min-width: 0; transition: margin-inline-end 200ms ease-out; } .module-ConversationHeader__header--clickable { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-ConversationHeader__header--clickable { border: 1px solid WindowText; } } .module-ConversationHeader__header--clickable { flex: 1; border-radius: 4px; -webkit-app-region: no-drag; margin-inline: 4px var(--button-spacing); padding: 4px 12px; padding-inline-start: 0; } .keyboard-mode .module-ConversationHeader__header--clickable:focus { color: #2c6bed; } .dark-theme.keyboard-mode .module-ConversationHeader__header--clickable:focus { color: #6191f3; } .module-ConversationHeader__header__avatar { min-width: 32px; margin-inline-end: 12px; padding-top: 4px; padding-bottom: 4px; } .module-ConversationHeader__header__info { display: flex; flex-direction: column; min-width: 0; } .module-ConversationHeader__header__info__title { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; display: flex; align-items: center; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; user-select: none; } .module-ConversationHeader__header__info__title__in-contacts-icon { margin-inline-start: 4px; } .module-ConversationHeader__header__info__subtitle { display: flex; font-size: 13px; line-height: 18px; letter-spacing: -0.03px; } .module-ConversationHeader__header__info__subtitle { color: #5e5e5e; } .dark-theme .module-ConversationHeader__header__info__subtitle { color: #b9b9b9; } .module-ConversationHeader__header__info__subtitle__expiration { display: flex; align-items: center; user-select: none; white-space: nowrap; text-overflow: ellipsis; overflow: hidden; } .module-ConversationHeader__header__info__subtitle__expiration::before { content: ""; width: 14px; height: 14px; display: block; margin-inline-end: 4px; } .module-ConversationHeader__header__info__subtitle__expiration::before { -webkit-mask: url("../images/icons/v3/timer/timer-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .module-ConversationHeader__header__info__subtitle__expiration::before { background-color: WindowText; } } .dark-theme .module-ConversationHeader__header__info__subtitle__expiration::before { -webkit-mask: url("../images/icons/v3/timer/timer-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .dark-theme .module-ConversationHeader__header__info__subtitle__expiration::before { background-color: WindowText; } } .module-ConversationHeader__header__info__subtitle__expiration { margin-inline-end: 12px; } .module-ConversationHeader__header__info__subtitle__verified { display: flex; align-items: center; user-select: none; white-space: nowrap; text-overflow: ellipsis; overflow: hidden; } .module-ConversationHeader__header__info__subtitle__verified::before { content: ""; width: 14px; height: 14px; display: block; margin-inline-end: 4px; } .module-ConversationHeader__header__info__subtitle__verified::before { -webkit-mask: url("../images/icons/v3/safety_number/safety_number-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .module-ConversationHeader__header__info__subtitle__verified::before { background-color: WindowText; } } .dark-theme .module-ConversationHeader__header__info__subtitle__verified::before { -webkit-mask: url("../images/icons/v3/safety_number/safety_number-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .dark-theme .module-ConversationHeader__header__info__subtitle__verified::before { background-color: WindowText; } } .module-ConversationHeader__button { -webkit-app-region: no-drag; } .module-ConversationHeader__button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-ConversationHeader__button { border: 1px solid WindowText; } } .module-ConversationHeader__button { align-items: center; justify-content: center; border-radius: 4px; border: 2px solid transparent; display: flex; height: 32px; margin-inline-end: var(--button-spacing); min-width: 32px; padding: 2px; transition: margin-inline-end 200ms ease-out, opacity 200ms ease-out, background 100ms ease-out; width: 32px; } .module-ConversationHeader__button:disabled { cursor: default; opacity: 0.5; } .module-ConversationHeader__button--show-disabled { opacity: 0.5; } .module-ConversationHeader__button--in-another-call { opacity: 0.5; } .dark-theme .module-ConversationHeader__button--in-another-call { opacity: 0.4; } .module-ConversationHeader__button:not(:disabled):hover { background: #f6f6f6; } .keyboard-mode .module-ConversationHeader__button:not(:disabled):focus { background: #f6f6f6; } .module-ConversationHeader__button:not(:disabled):active { background: #e9e9e9; } .dark-theme .module-ConversationHeader__button:not(:disabled):hover { background: #2e2e2e; } .keyboard-mode .dark-theme .module-ConversationHeader__button:not(:disabled):focus { background: #f6f6f6; } .dark-theme .module-ConversationHeader__button:not(:disabled):active { background: #3b3b3b; } .keyboard-mode .module-ConversationHeader__button:not(:disabled):focus { border-color: #2c6bed; } .dark-theme.keyboard-mode .module-ConversationHeader__button:not(:disabled):focus { border-color: #6191f3; } .module-ConversationHeader__button--video::before { content: ""; display: block; width: 20px; height: 20px; } .module-ConversationHeader__button--video::before { -webkit-mask: url("../images/icons/v3/video/video.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .module-ConversationHeader__button--video::before { background-color: WindowText; } } .module-ConversationHeader__button--video::before:hover, .module-ConversationHeader__button--video::before:active, .module-ConversationHeader__button--video::before:focus { -webkit-mask: url("../images/icons/v3/video/video.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #1b1b1b; } @media (forced-colors: active) { .module-ConversationHeader__button--video::before:hover, .module-ConversationHeader__button--video::before:active, .module-ConversationHeader__button--video::before:focus { background-color: WindowText; } } .dark-theme .module-ConversationHeader__button--video::before { -webkit-mask: url("../images/icons/v3/video/video.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .module-ConversationHeader__button--video::before { background-color: WindowText; } } .dark-theme .module-ConversationHeader__button--video::before:hover, .dark-theme .module-ConversationHeader__button--video::before:active, .dark-theme .module-ConversationHeader__button--video::before:focus { -webkit-mask: url("../images/icons/v3/video/video.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #f6f6f6; } @media (forced-colors: active) { .dark-theme .module-ConversationHeader__button--video::before:hover, .dark-theme .module-ConversationHeader__button--video::before:active, .dark-theme .module-ConversationHeader__button--video::before:focus { background-color: WindowText; } } .module-ConversationHeader__button--audio::before { content: ""; display: block; width: 20px; height: 20px; } .module-ConversationHeader__button--audio::before { -webkit-mask: url("../images/icons/v3/phone/phone.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .module-ConversationHeader__button--audio::before { background-color: WindowText; } } .module-ConversationHeader__button--audio::before:hover, .module-ConversationHeader__button--audio::before:active, .module-ConversationHeader__button--audio::before:focus { -webkit-mask: url("../images/icons/v3/phone/phone.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #1b1b1b; } @media (forced-colors: active) { .module-ConversationHeader__button--audio::before:hover, .module-ConversationHeader__button--audio::before:active, .module-ConversationHeader__button--audio::before:focus { background-color: WindowText; } } .dark-theme .module-ConversationHeader__button--audio::before { -webkit-mask: url("../images/icons/v3/phone/phone.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .module-ConversationHeader__button--audio::before { background-color: WindowText; } } .dark-theme .module-ConversationHeader__button--audio::before:hover, .dark-theme .module-ConversationHeader__button--audio::before:active, .dark-theme .module-ConversationHeader__button--audio::before:focus { -webkit-mask: url("../images/icons/v3/phone/phone.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #f6f6f6; } @media (forced-colors: active) { .dark-theme .module-ConversationHeader__button--audio::before:hover, .dark-theme .module-ConversationHeader__button--audio::before:active, .dark-theme .module-ConversationHeader__button--audio::before:focus { background-color: WindowText; } } .module-ConversationHeader__button--search::before { content: ""; display: block; width: 20px; height: 20px; } .module-ConversationHeader__button--search::before { -webkit-mask: url("../images/icons/v3/search/search.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .module-ConversationHeader__button--search::before { background-color: WindowText; } } .module-ConversationHeader__button--search::before:hover, .module-ConversationHeader__button--search::before:active, .module-ConversationHeader__button--search::before:focus { -webkit-mask: url("../images/icons/v3/search/search.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #1b1b1b; } @media (forced-colors: active) { .module-ConversationHeader__button--search::before:hover, .module-ConversationHeader__button--search::before:active, .module-ConversationHeader__button--search::before:focus { background-color: WindowText; } } .dark-theme .module-ConversationHeader__button--search::before { -webkit-mask: url("../images/icons/v3/search/search.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .module-ConversationHeader__button--search::before { background-color: WindowText; } } .dark-theme .module-ConversationHeader__button--search::before:hover, .dark-theme .module-ConversationHeader__button--search::before:active, .dark-theme .module-ConversationHeader__button--search::before:focus { -webkit-mask: url("../images/icons/v3/search/search.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #f6f6f6; } @media (forced-colors: active) { .dark-theme .module-ConversationHeader__button--search::before:hover, .dark-theme .module-ConversationHeader__button--search::before:active, .dark-theme .module-ConversationHeader__button--search::before:focus { background-color: WindowText; } } .module-ConversationHeader__button--more::before { content: ""; display: block; width: 20px; height: 20px; } .module-ConversationHeader__button--more::before { -webkit-mask: url("../images/icons/v3/more/more.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .module-ConversationHeader__button--more::before { background-color: WindowText; } } .module-ConversationHeader__button--more::before:hover, .module-ConversationHeader__button--more::before:active, .module-ConversationHeader__button--more::before:focus { -webkit-mask: url("../images/icons/v3/more/more.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #1b1b1b; } @media (forced-colors: active) { .module-ConversationHeader__button--more::before:hover, .module-ConversationHeader__button--more::before:active, .module-ConversationHeader__button--more::before:focus { background-color: WindowText; } } .dark-theme .module-ConversationHeader__button--more::before { -webkit-mask: url("../images/icons/v3/more/more.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .module-ConversationHeader__button--more::before { background-color: WindowText; } } .dark-theme .module-ConversationHeader__button--more::before:hover, .dark-theme .module-ConversationHeader__button--more::before:active, .dark-theme .module-ConversationHeader__button--more::before:focus { -webkit-mask: url("../images/icons/v3/more/more.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #f6f6f6; } @media (forced-colors: active) { .dark-theme .module-ConversationHeader__button--more::before:hover, .dark-theme .module-ConversationHeader__button--more::before:active, .dark-theme .module-ConversationHeader__button--more::before:focus { background-color: WindowText; } } .module-ConversationHeader__button--more { margin-inline-end: 16px; } .module-ConversationHeader__button--join-call { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; border-radius: 9999px; align-items: center; background-color: #4caf50; color: #ffffff; display: flex; outline: none; overflow: hidden; padding-block: 5px; padding-inline: 10px; text-overflow: ellipsis; white-space: nowrap; user-select: none; width: auto; height: 28px; } .module-ConversationHeader__button--join-call:before { -webkit-mask: url("../images/icons/v3/video/video-compact-fill.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .module-ConversationHeader__button--join-call:before { background-color: WindowText; } } .module-ConversationHeader__button--join-call:before { content: ""; display: block; height: 16px; margin-inline-end: 4px; min-width: 16px; width: 16px; } .module-ConversationHeader__button--join-call:not(:disabled):hover, .dark-theme .module-ConversationHeader__button--join-call:not(:disabled):hover, .module-ConversationHeader__button--join-call:not(:disabled):active, .dark-theme .module-ConversationHeader__button--join-call:not(:disabled):active { background-color: rgb(51.2924302789, 118.1075697211, 53.9920318725); } .keyboard-mode .module-ConversationHeader__button--join-call:not(:disabled):focus { background-color: rgb(51.2924302789, 118.1075697211, 53.9920318725); } .module-conversation-hero { padding-block: 32px 28px; padding-inline: 0; text-align: center; } .module-conversation-hero__avatar { margin-bottom: 12px; } .module-conversation-hero__title { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-conversation-hero__title { border: 1px solid WindowText; } } .module-conversation-hero__title { cursor: pointer; } .module-conversation-hero__title span { font-weight: 600; font-size: 26px; line-height: 32px; letter-spacing: -0.56px; font-weight: 400; } .module-conversation-hero__title__chevron { display: inline-block; height: 20px; width: 20px; position: relative; inset-block-start: 2px; } .module-conversation-hero__title__chevron { -webkit-mask: url("../images/icons/v3/chevron/chevron-right-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#1b1b1b, #e9e9e9); } @media (forced-colors: active) { .module-conversation-hero__title__chevron { background-color: WindowText; } } :dir(rtl) .module-conversation-hero__title__chevron { -webkit-mask: url("../images/icons/v3/chevron/chevron-left-bold.svg") no-repeat center; } .module-conversation-hero__profile-name { display: flex; align-items: center; justify-content: center; font-weight: 600; font-size: 26px; line-height: 32px; letter-spacing: -0.56px; margin-bottom: 2px; margin-top: 0; color: light-dark(#1b1b1b, #e9e9e9); } .module-conversation-hero__profile-name .module-contact-name { display: inline-flex; align-items: center; } .module-conversation-hero__with { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; margin-block: 0; margin-inline: auto; margin-bottom: 20px; max-width: 500px; color: light-dark(#5e5e5e, #b9b9b9); } .module-conversation-hero__note-to-self { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; padding-block: 0; padding-inline: 16px; color: light-dark(#5e5e5e, #b9b9b9); } .module-conversation-hero__members-count__button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-conversation-hero__members-count__button { border: 1px solid WindowText; } } .module-conversation-hero__members-count__button { cursor: pointer; text-decoration: underline; text-underline-offset: 2px; text-decoration-color: #b9b9b9; } .module-conversation-hero__safety-tips-button { border-radius: 9999px; padding-block: 6px; padding-inline: 14px; margin-top: 5px; font-size: 12px; line-height: 16px; letter-spacing: 0; } .module-conversation-hero__review-carefully { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; font-weight: 600; color: #a98b52; } .module-conversation-hero__group-question-icon { display: inline-block; height: 16px; width: 22px; vertical-align: text-top; margin-inline-end: 8px; } .module-conversation-hero__group-question-icon { -webkit-mask: url("../images/icons/v3/group/group-questionmark-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#000000, #e9e9e9); } @media (forced-colors: active) { .module-conversation-hero__group-question-icon { background-color: WindowText; } } .module-conversation-hero__direct-question-icon { display: inline-block; height: 16px; width: 16px; vertical-align: text-top; margin-inline-end: 8px; } .module-conversation-hero__direct-question-icon { -webkit-mask: url("../images/icons/v3/person/person-questionmark-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#000000, #e9e9e9); } @media (forced-colors: active) { .module-conversation-hero__direct-question-icon { background-color: WindowText; } } .module-conversation-hero__name-not-verified__button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-conversation-hero__name-not-verified__button { border: 1px solid WindowText; } } .module-conversation-hero__name-not-verified__button { cursor: pointer; text-decoration: underline; text-underline-offset: 2px; text-decoration-color: #b9b9b9; } .module-conversation-hero--release-notes-notice { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; user-select: none; max-width: 255px; margin-inline: auto; margin-block-start: 10px; padding-block: 16px; padding-inline: 20px; border-radius: 18px; background-color: light-dark(#eeefff, #3b3d50); display: flex; flex-direction: column; gap: 8px; color: light-dark(#3b3b3b, #f6f6f6); } .module-conversation-hero__release-notes-notice-content { text-align: center; } .module-conversation-hero__release-notes-notice-check-icon { display: inline-block; height: 16px; width: 16px; margin-inline-end: 4px; position: relative; top: 3px; } .module-conversation-hero__release-notes-notice-check-icon { -webkit-mask: url("../images/icons/v3/official/official-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#3b3b3b, #e9e9e9); } @media (forced-colors: active) { .module-conversation-hero__release-notes-notice-check-icon { background-color: WindowText; } } .module-conversation-hero__release-notes-notice-bell-icon { display: inline-block; height: 16px; width: 16px; margin-inline-end: 4px; position: relative; top: 3px; } .module-conversation-hero__release-notes-notice-bell-icon { -webkit-mask: url("../images/icons/v3/bell/bell-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#3b3b3b, #e9e9e9); } @media (forced-colors: active) { .module-conversation-hero__release-notes-notice-bell-icon { background-color: WindowText; } } .module-conversation-hero__membership { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; user-select: none; max-width: 255px; margin-inline: auto; margin-block-start: 10px; padding-block: 16px; padding-inline: 20px; border-radius: 18px; border-style: solid; border-width: 2.5px; display: flex; flex-direction: column; gap: 10px; border-color: light-dark(#f0f0f0, #2e2e2e); color: light-dark(#1b1b1b, #f6f6f6); } .module-conversation-hero__membership__chevron { display: inline-block; height: 18px; width: 18px; vertical-align: text-top; margin-inline-end: 8px; } .module-conversation-hero__membership__chevron { -webkit-mask: url("../images/icons/v3/group/group.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#000000, #e9e9e9); } @media (forced-colors: active) { .module-conversation-hero__membership__chevron { background-color: WindowText; } } .module-conversation-hero__membership__name { font-weight: normal; } .module-conversation-hero__membership__review-carefully-icon { display: inline-block; height: 18px; width: 18px; vertical-align: text-top; margin-inline-end: 8px; } .module-conversation-hero__membership__review-carefully-icon { -webkit-mask: url("../images/icons/v3/error/error-triangle-fill-compact-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #a98b52; } @media (forced-colors: active) { .module-conversation-hero__membership__review-carefully-icon { background-color: WindowText; } } .module-conversation-hero__membership__warning { line-height: 20px; } .module-conversation-hero__members-count-icon { display: inline-block; height: 16px; width: 16px; vertical-align: text-top; margin-inline-end: 8px; } .module-conversation-hero__members-count-icon { -webkit-mask: url("../images/icons/v3/group/group-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#000000, #e9e9e9); } @media (forced-colors: active) { .module-conversation-hero__members-count-icon { background-color: WindowText; } } .module-conversation-merge-notification__dialog__image { text-align: center; margin-inline: auto; } .module-conversation-merge-notification__dialog__text-1 { text-align: center; margin-top: 32px; margin-inline: 5px; } .module-conversation-merge-notification__dialog__text-2 { text-align: center; margin-top: 24px; margin-bottom: 37px; margin-inline: 5px; } .ConversationPanel { display: flex; flex-direction: column; height: 100%; inset-inline-start: 0; position: absolute; top: 0; width: 100%; z-index: 2; } .ConversationPanel { background-color: #ffffff; } .dark-theme .ConversationPanel { background-color: #121212; } .ConversationPanel__body { position: relative; overflow-y: auto; flex-grow: 1; } .ConversationPanel__body--padding { padding-inline: 24px; } .ConversationPanel__header { flex-shrink: 0; align-items: center; display: flex; flex-direction: row; height: calc(52px + var(--title-bar-drag-area-height)); padding-top: var(--title-bar-drag-area-height); width: 100%; z-index: 1; } .ConversationPanel__header { color: #1b1b1b; background-color: #ffffff; } .dark-theme .ConversationPanel__header { color: #f6f6f6; background-color: #121212; } .ConversationPanel__header__info { display: flex; flex-direction: column; min-width: 0; } .ConversationPanel__header__info__title { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; display: flex; align-items: center; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; user-select: none; } .ConversationPanel__header__info__title__in-contacts-icon { margin-inline-start: 4px; } .ConversationPanel__header__back-button { border: none; display: inline-block; height: 20px; margin-inline: 24px 6px; min-width: 20px; opacity: 0; opacity: 1; vertical-align: text-bottom; -webkit-app-region: no-drag; width: 20px; } .ConversationPanel__header__back-button:disabled { cursor: default; } .ConversationPanel__header__back-button { -webkit-mask: url("../images/icons/v3/chevron/chevron-left.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #1b1b1b; } @media (forced-colors: active) { .ConversationPanel__header__back-button { background-color: WindowText; } } :dir(rtl) .ConversationPanel__header__back-button { -webkit-mask: url("../images/icons/v3/chevron/chevron-right.svg") no-repeat center; } .dark-theme .ConversationPanel__header__back-button { -webkit-mask: url("../images/icons/v3/chevron/chevron-left.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #f6f6f6; } @media (forced-colors: active) { .dark-theme .ConversationPanel__header__back-button { background-color: WindowText; } } :dir(rtl) .dark-theme .ConversationPanel__header__back-button { -webkit-mask: url("../images/icons/v3/chevron/chevron-right.svg") no-repeat center; } .keyboard-mode .ConversationPanel__header__back-button:focus { background-color: #2c6bed; } .dark-theme.keyboard-mode .ConversationPanel__header__back-button:focus { background-color: #6191f3; } .ConversationPanel__overlay { height: 100%; inset-inline-start: 0; position: absolute; top: 0; width: 100%; z-index: 2; } .ConversationPanel__hidden { display: none; } .ConversationView { display: flex; flex-direction: column; overflow: initial; } .ConversationView__pane { display: flex; position: relative; flex: 1; flex-direction: column; overflow-y: auto; z-index: 1; } .ConversationView__pane { background-color: #ffffff; } .dark-theme .ConversationView__pane { background-color: #121212; } .ConversationView__timeline--container { display: flex; flex-grow: 1; margin: 0; z-index: 0; min-height: 0; } .ConversationView__timeline { position: relative; flex-grow: 1; min-height: 0; margin: 0; overflow-x: hidden; overflow-y: auto; padding: 0; } .ConversationView__composition-area { position: relative; z-index: 1; } .ConversationView__composition-area .quote-wrapper, .ConversationView__composition-area .preview-wrapper { margin-block: 0 10px; margin-inline: 16px; } .ConversationView__header { z-index: 2; } .CountryCodeSelect { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .CountryCodeSelect { border: 1px solid WindowText; } } .CountryCodeSelect { display: flex; flex-direction: row; gap: 12px; align-items: center; font-size: 13px; line-height: 18px; letter-spacing: -0.03px; border: solid 1px transparent; border-radius: 8px; height: 28px; padding-inline: 12px; width: 100%; } .CountryCodeSelect { background-color: rgba(0, 0, 0, 0.06); color: #1b1b1b; } .dark-theme .CountryCodeSelect { background-color: rgba(255, 255, 255, 0.12); color: #e9e9e9; } .CountryCodeSelect__text { flex-grow: 1; } .CountryCodeSelect__arrow { flex-shrink: 0; width: 16px; height: 16px; } .CountryCodeSelect__arrow { -webkit-mask: url("../images/icons/v3/dropdown/dropdown-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .CountryCodeSelect__arrow { background-color: WindowText; } } .dark-theme .CountryCodeSelect__arrow { -webkit-mask: url("../images/icons/v3/dropdown/dropdown-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #e9e9e9; } @media (forced-colors: active) { .dark-theme .CountryCodeSelect__arrow { background-color: WindowText; } } .CountryCodeSelect__Modal__body { padding-inline: 10px; padding-block: 16px 0; } .CountryCodeSelect__Modal__Search__container.module-SearchInput__container { margin-block: 8px; margin-inline: 10px; } .CountryCodeSelect__table { flex-grow: 1; min-height: min(89vh - 90px, 344px); max-height: 344px; overflow-y: scroll; scrollbar-width: none; } .CountryCodeSelect__CountryButton { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .CountryCodeSelect__CountryButton { border: 1px solid WindowText; } } .CountryCodeSelect__CountryButton { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; width: 100%; display: flex; flex-direction: row; align-items: center; height: 40px; padding-inline: 14px; border-radius: 8px; } .mouse-mode .CountryCodeSelect__CountryButton:hover { background-color: rgba(0, 0, 0, 0.06); } .dark-theme .mouse-mode .CountryCodeSelect__CountryButton:hover { background-color: rgba(255, 255, 255, 0.12); } .keyboard-mode .CountryCodeSelect__CountryButton:focus { box-shadow: inset 0px 0px 0px 2px #2c6bed; } .CountryCodeSelect__CountryButton__name { flex-grow: 1; } .CountryCodeSelect__CountryButton__code { opacity: 0.5; } .CriticalIdlePrimaryDeviceModal__content { max-width: 440px; padding-block: 12px; padding-inline: 4px; display: flex; flex-direction: column; align-items: center; text-align: center; } .CriticalIdlePrimaryDeviceModal__icon::after { content: ""; display: block; width: 52px; height: 52px; } .CriticalIdlePrimaryDeviceModal__icon::after { -webkit-mask: url("../images/icons/v3/error/error-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ff9500; } @media (forced-colors: active) { .CriticalIdlePrimaryDeviceModal__icon::after { background-color: WindowText; } } .CriticalIdlePrimaryDeviceModal__header { font-weight: 600; font-size: 18px; line-height: 25px; letter-spacing: -0.25px; margin-block: 12px; } .CriticalIdlePrimaryDeviceModal__description { margin-block: 12px; margin-inline: 8px; color: light-dark(#5e5e5e, #b9b9b9); } .CriticalIdlePrimaryDeviceModal__description a { text-decoration: none; } .CriticalIdlePrimaryDeviceModal__button { display: flex; justify-content: center; margin-block-start: 18px; } .CriticalIdlePrimaryDeviceModal__button button { padding-inline: 26px; } .CustomColorEditor__messages { border-radius: 8px; border: 1px solid #dedede; padding-block: 27px; padding-inline: 0; margin-top: 16px; position: relative; } .CustomColorEditor__tabs { margin-inline: -16px; } .CustomColorEditor__gradient-knob { background-clip: content-box; border-color: transparent; border-radius: 42px; border-style: solid; border-width: 4px; cursor: pointer; height: 42px; padding: 2px; width: 42px; } .CustomColorEditor__gradient-knob--blue { background-color: #336ba3; } .CustomColorEditor__gradient-knob--burlap { background-color: #6f6a58; } .CustomColorEditor__gradient-knob--crimson { background-color: #cf163e; } .CustomColorEditor__gradient-knob--forest { background-color: #3b7845; } .CustomColorEditor__gradient-knob--indigo { background-color: #6058ca; } .CustomColorEditor__gradient-knob--plum { background-color: #aa377a; } .CustomColorEditor__gradient-knob--steel { background-color: #71717f; } .CustomColorEditor__gradient-knob--taupe { background-color: #8f616a; } .CustomColorEditor__gradient-knob--teal { background-color: #077d92; } .CustomColorEditor__gradient-knob--vermilion { background-color: #c73f0a; } .CustomColorEditor__gradient-knob--violet { background-color: #9932c8; } .CustomColorEditor__gradient-knob--wintergreen { background-color: #1d8663; } .CustomColorEditor__gradient-knob--ultramarine { background-image: linear-gradient(180deg, #0552f0, #2c6bed); } .CustomColorEditor__gradient-knob--basil { background-image: linear-gradient(180deg, #2f9373, #077343); } .CustomColorEditor__gradient-knob--ember { background-image: linear-gradient(168deg, #e57c00, #5e0000); } .CustomColorEditor__gradient-knob--fluorescent { background-image: linear-gradient(192deg, #ec13dd, #1b36c6); } .CustomColorEditor__gradient-knob--infrared { background-image: linear-gradient(192deg, #f65560, #442ced); } .CustomColorEditor__gradient-knob--lagoon { background-image: linear-gradient(180deg, #004066, #32867d); } .CustomColorEditor__gradient-knob--midnight { background-image: linear-gradient(180deg, #2c2c3a, #787891); } .CustomColorEditor__gradient-knob--sea { background-image: linear-gradient(180deg, #498fd4, #2c66a0); } .CustomColorEditor__gradient-knob--sublime { background-image: linear-gradient(180deg, #6281d5, #974460); } .CustomColorEditor__gradient-knob--tangerine { background-image: linear-gradient(192deg, #db7133, #911231); } .CustomColorEditor__gradient-knob { cursor: move; position: absolute; } .CustomColorEditor__slider-container { margin-top: 26px; } .CustomColorEditor__hue-slider.Slider { background-image: linear-gradient(90deg, hsl(0, 100%, 45%), hsl(45, 100%, 30%), hsl(90, 100%, 30%), hsl(135, 100%, 30%), hsl(180, 100%, 30%), hsl(270, 100%, 50%), hsl(0, 100%, 45%)); border-radius: 4px; margin-top: 8px; margin-bottom: 30px; } .CustomColorEditor__hue-slider__handle:focus { outline: none; border: 2px solid #ffffff; border-radius: 8px; } .CustomColorEditor__saturation-slider.Slider { margin-top: 8px; margin-bottom: 30px; } .CustomColorEditor__footer { display: flex; justify-content: flex-end; margin-top: 16px; } .CustomColorEditor__footer .module-Button { margin-inline-start: 8px; } .module-CustomizingPreferredReactionsModal__overlay-container { z-index: 126; } .module-CustomizingPreferredReactionsModal__small-emoji-picker-wrapper { font-size: 12px; line-height: 16px; letter-spacing: 0; align-items: center; display: flex; flex-direction: column; justify-content: center; padding-block: 4rem; padding-inline: 0; text-align: center; user-select: none; } .module-CustomizingPreferredReactionsModal__small-emoji-picker-wrapper { color: #848484; } .dark-theme .module-CustomizingPreferredReactionsModal__small-emoji-picker-wrapper { color: #b9b9b9; } .module-CustomizingPreferredReactionsModal__small-emoji-picker-wrapper .module-ReactionPickerPicker { margin-bottom: 2rem; } .DebugLogWindow { display: flex; flex-direction: column; height: 100%; margin: 0; max-width: 100%; padding: 16px; width: 100%; } .DebugLogWindow__container { align-items: center; display: flex; flex-grow: 1; justify-content: center; } .DebugLogWindow__scroll_area { overflow-x: hidden; overflow-y: scroll; max-height: 100%; border: 1px solid #848484; } .dark-theme .DebugLogWindow__scroll_area { background-color: #1b1b1b; color: #f6f6f6; } .DebugLogWindow__scroll_area__text { font-family: "SF Mono", SFMono-Regular, ui-monospace, "DejaVu Sans Mono", Menlo, Consolas, monospace; font-size: 12px; margin: 0; user-select: none; white-space: pre-line; } .DebugLogWindow__title { font-weight: 600; font-size: 20px; line-height: 26px; letter-spacing: -0.34px; } .DebugLogWindow__subtitle { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; } .DebugLogWindow__subtitle { color: #5e5e5e; } .dark-theme .DebugLogWindow__subtitle { color: #b9b9b9; } .DebugLogWindow__footer { align-items: center; display: flex; justify-content: flex-end; margin-top: 16px; } .DebugLogWindow__footer .module-Button { margin-inline-start: 8px; } .DebugLogWindow__link { border-radius: 4px; height: 36px; padding-block: 0; padding-inline: 10px; width: 100%; } .DebugLogWindow__link { border: solid 1px #b9b9b9; } .dark-theme .DebugLogWindow__link { background-color: #1b1b1b; border: solid 1px #848484; color: #f6f6f6; } .DeleteMessagesModal__ModalHost__width-container { min-width: fit-content; } .module-disappearing-time-dialog__title.module-Modal__title { margin-bottom: 2px; } .module-disappearing-time-dialog__body p { margin-block: 0 25px; margin-inline: 0; } .module-disappearing-time-dialog__time-boxes { display: flex; flex-direction: row; } .module-disappearing-time-dialog__time-boxes .module-select { flex-grow: 1; } .module-disappearing-time-dialog__time-boxes__units { margin-inline-start: 9px; } .DonationThanksModal { display: flex; flex-direction: column; align-items: center; text-align: center; padding: 0; user-select: none; } .DonationThanksModal__badge-icon { width: 88px; height: 88px; margin-bottom: 24px; display: flex; align-items: center; justify-content: center; } .DonationThanksModal__content { margin-bottom: 24px; } .DonationThanksModal__title { font-weight: 600; font-size: 18px; line-height: 25px; letter-spacing: -0.25px; margin-bottom: 16px; color: light-dark(rgba(0, 0, 0, 0.85), rgba(255, 255, 255, 0.85)); } .DonationThanksModal__description { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; max-width: 308px; color: light-dark(#1b1b1b, #e9e9e9); line-height: 18px; } .DonationThanksModal__separator { width: 100%; height: 0.5px; border: none; margin-block: 0 24px; margin-inline: 0; background-color: light-dark(rgba(0, 0, 0, 0.12), rgba(255, 255, 255, 0.12)); } .DonationThanksModal__toggle-section { display: flex; align-items: center; width: 100%; padding-block: 0; } .DonationThanksModal__toggle-text { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; color: light-dark(rgba(0, 0, 0, 0.85), rgba(255, 255, 255, 0.85)); } .DonationThanksModal__help-text { font-size: 11px; line-height: 14px; letter-spacing: 0.06px; text-align: start; margin-top: 12px; color: light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.5)); } .DonationErrorModal__width-container { max-width: 420px; } .module-Modal__title.DonationErrorModal__title { font-weight: 600; font-size: 18px; line-height: 25px; letter-spacing: -0.25px; } .DonationErrorModal__body_inner { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; } .DonationForm { max-width: 439px; align-self: center; text-align: center; } .DonationForm__CurrencySelect { width: 78px; margin-inline: auto; } .DonationForm__CurrencySelect.module-select::after { top: 7px; } .DonationForm__CurrencySelect.module-select select { height: auto; min-width: auto; padding-block: 5px; } .DonationForm .DonationForm__CurrencySelect.module-select select { border-color: light-dark(#b9b9b9, rgba(255, 255, 255, 0.12)); } .DonationForm__HelpFooter { font-size: 12px; line-height: 16px; letter-spacing: 0px; flex-grow: 1; color: light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.5)); align-content: flex-end; text-align: center; } .DonationForm__HelpFooterDesktopOneTimeOnlyNotice { margin-block: 10px 17px; } a.DonationFormHelpFooter__ContactSupportLink { color: #2c6bed; text-decoration: none; } .DonationAmountPicker__AmountOptions { display: flex; flex-wrap: wrap; max-width: 340px; justify-content: center; } .DonationAmountPicker__PresetButton, .DonationForm.PreferencesDonations .DonationAmountPicker__CustomInput, .DonationForm .DonationAmountPicker__CustomInput--selected, .DonationForm .DonationAmountPicker__CustomInput--with-error { margin-block: 5px; margin-inline: 5px; border-width: 0.5px; border-style: solid; border-radius: 6px; font-weight: 400; } .DonationAmountPicker__PresetButton, .DonationForm .DonationForm__CurrencySelect.module-select select, .DonationForm.PreferencesDonations .DonationAmountPicker__CustomInput, .DonationForm.PreferencesDonations .DonationAmountPicker__CustomInput--selected, .DonationForm.PreferencesDonations .DonationAmountPicker__CustomInput--with-error { background-color: light-dark(#ffffff, #262626); border-color: light-dark(#b9b9b9, rgba(255, 255, 255, 0.12)); } .DonationAmountPicker__PresetButton { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; width: 100px; padding-inline: 12px; padding-block: 14px; margin-block: 5px; margin-inline: 5px; font-weight: 400; } .DonationAmountPicker__PresetButton--selected, .DonationForm .DonationAmountPicker__CustomInput--selected, .DonationForm .DonationAmountPicker__CustomInput:focus { border-color: #2c6bed; outline: 2.5px solid #2c6bed; outline-offset: -2.5px; } .DonationForm .DonationAmountPicker__CustomInput, .DonationForm .DonationAmountPicker__CustomInput--selected, .DonationForm .DonationAmountPicker__CustomInput--with-error { width: 320px; padding-block: 0; border-width: 0.5px; } .DonationForm .DonationAmountPicker__CustomInput--with-error { border-color: #ff261f; outline: 2.5px solid #ff261f; outline-offset: -2.5px; } .DonationForm .DonationAmountPicker__CustomInput, .DonationForm .DonationAmountPicker__CustomInput--selected, .DonationForm .DonationAmountPicker__CustomInput--with-error { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; padding-inline: 12px; padding-block: 14px; text-align: center; } .DonationAmountPicker__CustomInput:not(:focus)::placeholder { color: light-dark(rgba(0, 0, 0, 0.85), rgba(255, 255, 255, 0.85)); opacity: 1; } .DonationAmountPicker__CustomInput:focus::placeholder, .DonationAmountPicker__CustomInput--selected:focus::placeholder, .DonationAmountPicker__CustomInput--with-error:focus::placeholder { color: transparent; } .DonationAmountPicker__CustomAmountError { font-size: 11px; line-height: 14px; letter-spacing: 0.06px; width: 320px; margin-block: 0 -7px; margin-inline-start: 12px; text-align: start; color: #ff261f; } .DonationAmountPicker__PrimaryButtonContainer { margin-block-start: 11px; margin-inline-end: 10px; text-align: end; } .DonationCardForm { margin-inline: 3px; } .DonationCardForm .DonationCardForm__Header--Info { padding-inline: 0; margin-block: 8px; text-align: start; } .DonationCardForm__Info { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; text-align: start; margin-block-end: 26px; color: light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.5)); } .DonationCardForm__Info__read-more { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .DonationCardForm__Info__read-more { border: 1px solid WindowText; } } .DonationCardForm__Info__read-more { color: #2c6bed; } .DonationCardForm__Info__read-more:hover { text-decoration: underline; } .DonationCardForm_Field { display: flex; margin-block: 12px; } .DonationCardForm_Field input { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; display: flex; padding-block: 5px; padding-inline: 12px 6px; background-color: light-dark(#ffffff, #262626); border-radius: 6px; border: 0.5px solid rgba(0, 0, 0, 0.16); box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.08); outline-offset: -2.5px; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ direction: ltr; } .DonationCardForm_Field input:dir(rtl) { text-align: right; } .DonationCardForm_Field input:focus { outline: 2.5px solid #abc4f8; } .DonationCardForm_Label, .DonationCardForm_Field input { color: light-dark(rgba(0, 0, 0, 0.85), rgba(255, 255, 255, 0.85)); } .DonationCardForm_Label { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; display: flex; flex-basis: 33%; line-height: 20px; padding-block: 5px; margin-inline-end: 12px; justify-content: flex-end; } .DonationCardForm_InputContainer--with-error input { outline: 2.5px solid #ff261f; } .DonationCardForm_FieldError { font-size: 11px; line-height: 14px; letter-spacing: 0.06px; margin-block-start: 6px; margin-inline-start: 12px; text-align: start; color: #ff261f; } .DonationCardForm_CardNumberField input { width: 196px; } .DonationCardForm_CardExpirationField input, .DonationCardForm_CardCvcField input { width: 84px; } .DonationCardForm__PrimaryButtonContainer { margin-block-start: 20px; text-align: end; } .DonationCardFormHero__Badge { width: 72px; height: 72px; background: url("../images/rocket-160.svg"); background-size: 100%; } .DonationInterruptedModal__width-container { max-width: 420px; } .module-Modal__title.DonationInterruptedModal__title { font-weight: 600; font-size: 18px; line-height: 25px; letter-spacing: -0.25px; } .DonationInterruptedModal__body_inner { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; } .DonationProgressModal__width-container { max-width: 204px; } .DonationProgressModal { padding-top: 15px; padding-bottom: 15px; text-align: center; outline: none; } .DonationProgressModal__text { margin-top: 20px; color: light-dark(#5e5e5e, #b9b9b9); user-select: none; font-size: 13px; line-height: 18px; letter-spacing: -0.03px; } .DonationProgressModal__SpinnerV2 { display: inline-block; margin-inline: auto; } .DonationStillProcessingModal__width-container { max-width: 420px; } .module-Modal__title.DonationStillProcessingModal__title { font-weight: 600; font-size: 18px; line-height: 25px; letter-spacing: -0.25px; } .DonationStillProcessingModal__body_inner { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; } .DonationVerificationModal__width-container { max-width: 420px; } .module-Modal__title.DonationVerificationModal__title { font-weight: 600; font-size: 18px; line-height: 25px; letter-spacing: -0.25px; } .DonationVerificationModal__body_inner { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; } .DraftGifMessageSendModal__GifPreview { display: flex; justify-content: center; padding-inline: 8px; } .module-EditConversationAttributesModal .module-AvatarInput { margin-block: 24px; margin-inline: 0; } .module-EditConversationAttributesModal__error-message { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; margin-block: 16px; margin-inline: 0; } .module-EditConversationAttributesModal__description-warning { font-size: 12px; line-height: 16px; letter-spacing: 0; color: #848484; margin-block: 0; margin-inline: 16px; } .EditHistoryMessagesModal__divider { border-bottom: 0; border-style: solid; margin-block: 24px; } .EditHistoryMessagesModal__divider { border-color: #dedede; } .dark-theme .EditHistoryMessagesModal__divider { border-color: #3b3b3b; } .EditHistoryMessagesModal__title { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; } .EditHistoryMessagesModal .module-message { padding-inline: 0; } .dark-theme .EditHistoryMessagesModal .module-message__link-preview__content { background-color: #3b3b3b; } .dark-theme .EditHistoryMessagesModal .module-message__container--incoming { background-color: #4a4a4a; } .EditNicknameAndNoteModal__width-container { max-width: 360px; } .EditNicknameAndNoteModal__Description { margin-block: 12px 24px; font-size: 13px; line-height: 18px; letter-spacing: -0.03px; } .EditNicknameAndNoteModal__Description { color: #3b3b3b; } .dark-theme .EditNicknameAndNoteModal__Description { color: #b9b9b9; } .EditNicknameAndNoteModal__Avatar { margin-block: 0 24px; display: flex; justify-content: center; } .EditNicknameAndNoteModal__Label { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border-width: 0; } .module-ForwardMessageModal { flex-direction: column; margin-block: 0; margin-inline: auto; max-width: 360px; width: 95%; } .module-ForwardMessageModal .module-conversation-list { padding: 0; } .module-ForwardMessageModal--link-preview { border-bottom: 1px solid #dedede; padding-block: 12px; padding-inline: 16px; } .dark-theme .module-ForwardMessageModal--link-preview { border-color: #5e5e5e; } .module-ForwardMessageModal__list-wrapper { flex-grow: 1; overflow: hidden; } .module-ForwardMessageModal__main-body { display: flex; flex-direction: column; min-height: 300px; } .module-ForwardMessageModal__no-candidate-contacts { flex-grow: 1; display: flex; align-items: center; justify-content: center; } .module-ForwardMessageModal__send-button { align-items: center; border: none; border-radius: 100%; display: flex; height: 32px; justify-content: center; width: 32px; } .module-ForwardMessageModal__send-button::after { content: ""; display: block; flex-shrink: 0; height: 20px; width: 20px; } .module-ForwardMessageModal__send-button--continue::after { height: 24px; width: 24px; } .module-ForwardMessageModal__send-button--continue::after { -webkit-mask: url("../images/icons/v3/arrow/arrow-right.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .module-ForwardMessageModal__send-button--continue::after { background-color: WindowText; } } :dir(rtl) .module-ForwardMessageModal__send-button--continue::after { -webkit-mask: url("../images/icons/v3/arrow/arrow-left.svg") no-repeat center; } .module-ForwardMessageModal__send-button--forward::after { -webkit-mask: url("../images/icons/v3/send/send-fill.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .module-ForwardMessageModal__send-button--forward::after { background-color: WindowText; } } .module-ForwardMessageModal .module-Modal__body { overflow-y: hidden; } .module-ForwardMessageModal__footer { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; display: flex; align-items: center; flex-grow: 1; justify-content: space-between; } .module-ForwardMessageModal .module-image__image { cursor: inherit; } .FunButton { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .FunButton { border: 1px solid WindowText; } } .FunButton { border-radius: 4px; background: none; width: 32px; height: 32px; display: flex; justify-content: center; align-items: center; } .FunButton:focus { outline: none; } .keyboard-mode .FunButton:focus { outline: 2px solid #2c6bed; } .FunButton[aria-expanded=true] { background: light-dark(#e9e9e9, #3b3b3b); } .FunButton__Icon { display: block; width: 20px; height: 20px; flex-shrink: 0; } .FunButton__Icon--FunPicker, .FunButton__Icon--EmojiPicker { -webkit-mask: url("../images/icons/v3/emoji/emoji.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#3b3b3b, #dedede); } @media (forced-colors: active) { .FunButton__Icon--FunPicker, .FunButton__Icon--EmojiPicker { background-color: WindowText; } } .FunButton__Icon--StickerPicker { -webkit-mask: url("../images/icons/v3/sticker/sticker.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#3b3b3b, #dedede); } @media (forced-colors: active) { .FunButton__Icon--StickerPicker { background-color: WindowText; } } .FunStaticEmoji { contain: strict; display: inline-block; position: relative; z-index: 0; flex: none; content-visibility: auto; vertical-align: top; } .FunStaticEmoji--Blot { display: inline-block; margin-bottom: round(-0.4em + 1px, 1px); vertical-align: baseline; } .FunStaticEmoji--Size12 { width: 12px; height: 12px; background-image: url("../images/emoji-sheet-32.webp"); background-size: 790.5px; background-position-x: calc(var(--fun-emoji-sheet-x) * -12.75px - 0.375px); background-position-y: calc(var(--fun-emoji-sheet-y) * -12.75px - 0.375px); background-repeat: no-repeat; } .FunStaticEmoji--Size14 { width: 14px; height: 14px; background-image: url("../images/emoji-sheet-32.webp"); background-size: 922.25px; background-position-x: calc(var(--fun-emoji-sheet-x) * -14.875px - 0.4375px); background-position-y: calc(var(--fun-emoji-sheet-y) * -14.875px - 0.4375px); background-repeat: no-repeat; } .FunStaticEmoji--Size16 { width: 16px; height: 16px; background-image: url("../images/emoji-sheet-32.webp"); background-size: 1054px; background-position-x: calc(var(--fun-emoji-sheet-x) * -17px - 0.5px); background-position-y: calc(var(--fun-emoji-sheet-y) * -17px - 0.5px); background-repeat: no-repeat; } .FunStaticEmoji--Size18 { width: 18px; height: 18px; background-image: url("../images/emoji-sheet-32.webp"); background-size: 1185.75px; background-position-x: calc(var(--fun-emoji-sheet-x) * -19.125px - 0.5625px); background-position-y: calc(var(--fun-emoji-sheet-y) * -19.125px - 0.5625px); background-repeat: no-repeat; } @media (resolution > 1x) { .FunStaticEmoji--Size18 { background-image: url("../images/emoji-sheet-64.webp"); background-size: 1150.875px; background-position-x: calc(var(--fun-emoji-sheet-x) * -18.5625px - 0.28125px); background-position-y: calc(var(--fun-emoji-sheet-y) * -18.5625px - 0.28125px); background-repeat: no-repeat; } } .FunStaticEmoji--Size20 { width: 20px; height: 20px; background-image: url("../images/emoji-sheet-32.webp"); background-size: 1317.5px; background-position-x: calc(var(--fun-emoji-sheet-x) * -21.25px - 0.625px); background-position-y: calc(var(--fun-emoji-sheet-y) * -21.25px - 0.625px); background-repeat: no-repeat; } @media (resolution > 1x) { .FunStaticEmoji--Size20 { background-image: url("../images/emoji-sheet-64.webp"); background-size: 1278.75px; background-position-x: calc(var(--fun-emoji-sheet-x) * -20.625px - 0.3125px); background-position-y: calc(var(--fun-emoji-sheet-y) * -20.625px - 0.3125px); background-repeat: no-repeat; } } .FunStaticEmoji--Size24 { width: 24px; height: 24px; background-image: url("../images/emoji-sheet-32.webp"); background-size: 1581px; background-position-x: calc(var(--fun-emoji-sheet-x) * -25.5px - 0.75px); background-position-y: calc(var(--fun-emoji-sheet-y) * -25.5px - 0.75px); background-repeat: no-repeat; } @media (resolution > 1x) { .FunStaticEmoji--Size24 { background-image: url("../images/emoji-sheet-64.webp"); background-size: 1534.5px; background-position-x: calc(var(--fun-emoji-sheet-x) * -24.75px - 0.375px); background-position-y: calc(var(--fun-emoji-sheet-y) * -24.75px - 0.375px); background-repeat: no-repeat; } } .FunStaticEmoji--Size28 { width: 28px; height: 28px; background-image: url("../images/emoji-sheet-32.webp"); background-size: 1844.5px; background-position-x: calc(var(--fun-emoji-sheet-x) * -29.75px - 0.875px); background-position-y: calc(var(--fun-emoji-sheet-y) * -29.75px - 0.875px); background-repeat: no-repeat; } @media (resolution > 1x) { .FunStaticEmoji--Size28 { background-image: url("../images/emoji-sheet-64.webp"); background-size: 1790.25px; background-position-x: calc(var(--fun-emoji-sheet-x) * -28.875px - 0.4375px); background-position-y: calc(var(--fun-emoji-sheet-y) * -28.875px - 0.4375px); background-repeat: no-repeat; } } .FunStaticEmoji--Size32 { width: 32px; height: 32px; background-image: url("../images/emoji-sheet-64.webp"); background-size: 2046px; background-position-x: calc(var(--fun-emoji-sheet-x) * -33px - 0.5px); background-position-y: calc(var(--fun-emoji-sheet-y) * -33px - 0.5px); background-repeat: no-repeat; } .FunStaticEmoji--Size36 { width: 36px; height: 36px; background-image: url("../images/emoji-sheet-64.webp"); background-size: 2301.75px; background-position-x: calc(var(--fun-emoji-sheet-x) * -37.125px - 0.5625px); background-position-y: calc(var(--fun-emoji-sheet-y) * -37.125px - 0.5625px); background-repeat: no-repeat; } .FunStaticEmoji--Size40 { width: 40px; height: 40px; background-image: url("../images/emoji-sheet-64.webp"); background-size: 2557.5px; background-position-x: calc(var(--fun-emoji-sheet-x) * -41.25px - 0.625px); background-position-y: calc(var(--fun-emoji-sheet-y) * -41.25px - 0.625px); background-repeat: no-repeat; } .FunStaticEmoji--Size48 { width: 48px; height: 48px; background-image: url("../images/emoji-sheet-64.webp"); background-size: 3069px; background-position-x: calc(var(--fun-emoji-sheet-x) * -49.5px - 0.75px); background-position-y: calc(var(--fun-emoji-sheet-y) * -49.5px - 0.75px); background-repeat: no-repeat; } .FunStaticEmoji--Size56 { width: 56px; height: 56px; background-image: url("../images/emoji-sheet-64.webp"); background-size: 3580.5px; background-position-x: calc(var(--fun-emoji-sheet-x) * -57.75px - 0.875px); background-position-y: calc(var(--fun-emoji-sheet-y) * -57.75px - 0.875px); background-repeat: no-repeat; } @media (resolution > 1x) { .FunStaticEmoji--Size56 { background-image: var(--fun-emoji-jumbo-image); background-size: contain; background-position: center; background-repeat: no-repeat; } } .FunStaticEmoji--Size64 { width: 64px; height: 64px; background-image: url("../images/emoji-sheet-64.webp"); background-size: 4092px; background-position-x: calc(var(--fun-emoji-sheet-x) * -66px - 1px); background-position-y: calc(var(--fun-emoji-sheet-y) * -66px - 1px); background-repeat: no-repeat; } .FunStaticEmoji--Size66 { width: 66px; height: 66px; } @media (resolution > 1x) { .FunStaticEmoji--has-jumbo { background-image: var(--fun-emoji-jumbo-image); background-size: contain; background-position: center; background-repeat: no-repeat; } } .FunStaticEmoji--Size66.FunStaticEmoji--has-jumbo { background-image: var(--fun-emoji-jumbo-image); background-size: contain; background-position: center; background-repeat: no-repeat; } .FunInlineEmoji { position: relative; z-index: 0; contain: strict; container: inline-emoji/inline-size; display: inline-block; flex: none; width: var(--fun-inline-emoji-size, round(1.4em, 1px)); height: var(--fun-inline-emoji-size, round(1.4em, 1px)); margin-bottom: round(-0.4em + 1px, 1px); vertical-align: baseline; content-visibility: auto; user-select: none; } .FunEmojiSelectionText { display: block; position: absolute; inset: 0; color: transparent; font-size: 64px; line-height: 64px; user-select: text; } .FunInlineEmoji__Image { position: relative; display: inline-block; width: 64px; height: 64px; z-index: 1; user-select: none; background-image: url("../images/emoji-sheet-32.webp"); background-size: 4216px; background-position-x: calc(var(--fun-emoji-sheet-x) * -68px - 2px); background-position-y: calc(var(--fun-emoji-sheet-y) * -68px - 2px); background-repeat: no-repeat; } @container inline-emoji (width > 16px) { @media (resolution > 1x) { .FunInlineEmoji__Image { background-image: url("../images/emoji-sheet-64.webp"); background-size: 4092px; background-position-x: calc(var(--fun-emoji-sheet-x) * -66px - 1px); background-position-y: calc(var(--fun-emoji-sheet-y) * -66px - 1px); background-repeat: no-repeat; } } } @container inline-emoji (width >= 32px) { .FunInlineEmoji__Image { background-image: url("../images/emoji-sheet-64.webp"); background-size: 4092px; background-position-x: calc(var(--fun-emoji-sheet-x) * -66px - 1px); background-position-y: calc(var(--fun-emoji-sheet-y) * -66px - 1px); background-repeat: no-repeat; } } @container inline-emoji (width > 32px) { @media (resolution > 1x) { .FunInlineEmoji__Image.FunInlineEmoji--has-jumbo { background-image: var(--fun-emoji-jumbo-image); background-size: contain; background-position: center; background-repeat: no-repeat; } } } @container inline-emoji (width > 64px) { .FunInlineEmoji__Image.FunInlineEmoji--has-jumbo { background-image: var(--fun-emoji-jumbo-image); background-size: contain; background-position: center; background-repeat: no-repeat; } } .FunErrorBoundary { width: 352px; height: 476px; } .FunGif { width: auto; height: auto; max-width: 100%; vertical-align: top; border-radius: 8px; } .FunGifPreview { position: relative; z-index: 0; width: fit-content; height: fit-content; contain: layout; } .FunGifPreview__Sizer { z-index: 0; width: auto; height: auto; max-width: 100%; max-height: var(--fun-gif-preview-sizer-max-height); } .FunGifPreview__Backdrop { position: absolute; z-index: 0; inset: 0; display: flex; justify-content: center; align-items: center; background: light-dark(#e9e9e9, #3b3b3b); border-radius: 8px; } .FunGifPreview__ErrorIcon { width: 36px; height: 36px; } .FunGifPreview__ErrorIcon { -webkit-mask: url("../images/icons/v3/error/error-triangle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#b9b9b9, #848484); } @media (forced-colors: active) { .FunGifPreview__ErrorIcon { background-color: WindowText; } } .FunGifPreview__Video { position: absolute; z-index: 1; inset: 0; width: 100%; height: 100%; border-radius: 8px; } .FunGrid__Container { contain: strict; position: relative; width: 100%; height: var(--fun-grid-container-total-size); } .FunGrid__ScrollerSection { contain: strict; position: absolute; top: 0; inset-inline-start: 0; width: 100%; height: var(--fun-grid-scroller-section-size); transform: translateY(var(--fun-grid-scroller-section-offset)); } .FunGrid__Header { contain: strict; position: absolute; top: 0; inset-inline-start: 0; width: 100%; height: var(--fun-grid-header-size); transform: translateY(var(--fun-grid-header-offset)); display: flex; align-items: center; margin: 0; } .FunGrid__HeaderText { padding-block: 4px; flex: 1; font-size: 13px; line-height: 18px; letter-spacing: -0.03px; font-weight: 600; color: light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.5)); } .FunGrid__HeaderButton { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .FunGrid__HeaderButton { border: 1px solid WindowText; } } .FunGrid__HeaderButton { display: flex; width: 24px; height: 24px; align-items: center; justify-content: center; border-radius: 9999px; } .FunGrid__HeaderButton:hover, .FunGrid__HeaderButton:focus { background: light-dark(#f6f6f6, #343434); } .FunGrid__HeaderButton:focus { outline: none; } .keyboard-mode .FunGrid__HeaderButton:focus { outline: 2px solid #2c6bed; outline-offset: -2px; } .FunGrid__HeaderIcon { width: 16px; height: 16px; } .FunGrid__HeaderIcon--More { -webkit-mask: url("../images/icons/v3/more/more-circle-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.5)); } @media (forced-colors: active) { .FunGrid__HeaderIcon--More { background-color: WindowText; } } .FunGrid__HeaderPopoverDialog { width: 328px; border-radius: 8px; box-shadow: 0 7px 18px rgba(0, 0, 0, 0.3); background: light-dark(#ffffff, #3b3b3b); user-select: none; overflow: clip; padding: 16px; display: flex; flex-direction: column; align-items: center; gap: 12px; } .FunGrid__HeaderPopoverDialog:focus { outline: none; } .keyboard-mode .FunGrid__HeaderPopoverDialog:focus { outline: 2px solid #2c6bed; outline-offset: -2px; } .FunGrid__HeaderPopoverHeader { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; color: light-dark(#1b1b1b, #e9e9e9); } .FunGrid__RowGroup { contain: strict; position: absolute; top: 0; inset-inline-start: 0; width: 100%; height: var(--fun-grid-row-group-size); transform: translateY(var(--fun-grid-row-group-offset)); display: grid; grid-template-columns: repeat(var(--fun-grid-container-column-count), var(--fun-grid-container-cell-width)); grid-auto-rows: var(--fun-grid-container-cell-height); justify-items: center; } .FunGrid__Row { display: grid; grid-column: 1/-1; grid-row: var(--fun-grid-row-index); grid-template-columns: subgrid; } .FunGrid__Cell { contain: strict; content-visibility: auto; } .FunImage { display: contents; } .FunImage--Hidden { visibility: hidden; } .FunItem__Button { position: relative; z-index: 0; } .FunItem__Button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .FunItem__Button { border: 1px solid WindowText; } } .FunItem__Button { display: flex; align-items: center; justify-content: center; width: 100%; height: 100%; vertical-align: top; padding: 2px; border-radius: 10px; border: 1px solid light-dark(#ffffff, #3b3b3b); } .FunItem__Button:hover, .FunItem__Button:focus { background: light-dark(#f6f6f6, #343434); } .FunItem__Button:focus { outline: none; } .keyboard-mode .FunItem__Button:focus { outline: 2px solid #2c6bed; outline-offset: -2px; } .FunLightbox__Backdrop { position: absolute; z-index: 100001; inset: 0; display: flex; align-items: center; justify-content: center; background: rgba(0, 0, 0, 0.6); pointer-events: none; transition: all ease-out 400ms; } .FunLightbox__Dialog { max-height: 80vh; max-width: 80vh; pointer-events: none; filter: drop-shadow(0 4px 6px rgba(0, 0, 0, 0.2)); transition: all ease-out 400ms; } @starting-style { .FunLightbox__Backdrop { opacity: 0; } .FunLightbox__Dialog { opacity: 0; transform: scale(95%); } } .FunPanel { display: grid; width: 352px; height: 476px; max-height: 100%; contain: size layout; grid-template: "FunPanel__Header" auto "FunPanel__Body" 1fr "FunPanel__Footer" auto; } .FunPanel__Header { grid-area: FunPanel__Header; display: flex; gap: 6px; padding-block: 12px; padding-inline: 12px; } .FunTabs__TabPanelInner .FunPanel__Header { padding-top: 0; } .FunPanel__Body { position: relative; grid-area: FunPanel__Body; } .FunPanel__Footer { grid-area: FunPanel__Footer; min-width: 0; } .FunPanelEmojis__CustomizePreferredReactionsButton { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .FunPanelEmojis__CustomizePreferredReactionsButton { border: 1px solid WindowText; } } .FunPanelEmojis__CustomizePreferredReactionsButton { flex-shrink: 0; display: flex; width: 32px; height: 32px; align-items: center; justify-content: center; border-radius: 9999px; } .FunPanelEmojis__CustomizePreferredReactionsButton:hover, .FunPanelEmojis__CustomizePreferredReactionsButton:focus { background: light-dark(#f6f6f6, #343434); } .FunPanelEmojis__CustomizePreferredReactionsButton:focus { outline: none; } .keyboard-mode .FunPanelEmojis__CustomizePreferredReactionsButton:focus { outline: 2px solid #2c6bed; outline-offset: -2px; } .FunPanelEmojis__CustomizePreferredReactionsButton__Icon { width: 20px; height: 20px; } .FunPanelEmojis__CustomizePreferredReactionsButton__Icon { -webkit-mask: url("../images/icons/v3/settings/settings-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#3b3b3b, #dedede); } @media (forced-colors: active) { .FunPanelEmojis__CustomizePreferredReactionsButton__Icon { background-color: WindowText; } } .FunPanelEmojis__CellPopover { filter: drop-shadow(0 7px 18px rgba(0, 0, 0, 0.3)); } .FunPanelEmojis__CellPopover[data-placement=bottom] .FunPanelEmojis__CellPopoverOverlayArrow svg { transform: rotate(180deg); } .FunPanelEmojis__CellPopover[data-placement=right] .FunPanelEmojis__CellPopoverOverlayArrow svg { transform: rotate(90deg); } .FunPanelEmojis__CellPopover[data-placement=left] .FunPanelEmojis__CellPopoverOverlayArrow svg { transform: rotate(-90deg); } .FunPanelEmojis__CellPopoverDialog { padding: 8px; border-radius: 8px; background: light-dark(#ffffff, #3b3b3b); user-select: none; } .FunPanelEmojis__CellPopoverDialog:focus { outline: none; } .keyboard-mode .FunPanelEmojis__CellPopoverDialog:focus { outline: 2px solid #2c6bed; outline-offset: -2px; } .FunPanelEmojis__CellPopoverOverlayArrow svg { display: block; fill: light-dark(#ffffff, #3b3b3b); } .FunPanelStickers__TimeStickerWrapper { width: 100%; height: 100%; } .FunPanelStickers__DigitalTimeSticker { font-family: Hatsuishi, Inter, "Source Sans Pro", "Source Han Sans", -apple-system, system-ui, "Segoe UI", "Noto Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; /* Japanese */ /* Farsi (Persian) */ /* Urdu */ } .FunPanelStickers__DigitalTimeSticker:lang(ja) { font-family: Inter, "SF Pro", "SF Pro JP", "BIZ UDGothic", "Hiragino Kaku Gothic Pro", "ヒラギノ角ゴ Pro W3", メイリオ, Meiryo, "MS Pゴシック", "Helvetica Neue", Helvetica, Arial, sans-serif; } .FunPanelStickers__DigitalTimeSticker:lang(fa) { font-family: "Vazirmatn", -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Tahoma, "Noto Sans Arabic", Helvetica, Arial, sans-serif; } .FunPanelStickers__DigitalTimeSticker:lang(ur) { font-family: "Noto Nastaliq Urdu", Gulzar, "Jameel Noori Nastaleeq", "Faiz Lahori Nastaleeq", "Urdu Typesetting", Helvetica, Arial, sans-serif; } .FunPanelStickers__DigitalTimeSticker { display: flex; align-items: center; justify-content: center; width: 100%; height: 100%; color: #ffffff; font-size: 256px; margin-top: -16px; font-display: block; } .FunPanelStickers__AnalogTimeSticker { display: block; position: relative; width: 512px; height: 512px; background: url("../images/analog-time/Arabic.svg") center no-repeat; background-size: contain; } .FunPanelStickers__AnalogTimeSticker__HourHand { display: block; position: absolute; top: 50%; inset-inline-start: 50%; width: 16px; height: 112px; margin-top: -112px; margin-inline-start: -8px; background: url("../images/analog-time/Arabic-hour.svg") center no-repeat; transform-origin: 50% 100%; transform: rotate(var(--fun-analog-time-sticker-hour)); } .FunPanelStickers__AnalogTimeSticker__MinuteHand { display: block; position: absolute; top: 50%; inset-inline-start: 50%; width: 16px; height: 176px; margin-top: -176px; margin-inline-start: -8px; background: url("../images/analog-time/Arabic-minute.svg") center no-repeat; transform-origin: 50% 100%; transform: rotate(var(--fun-analog-time-sticker-minute)); } .FunResults { width: 100cqw; height: 100cqh; padding-block: 12px; padding-inline: 8px; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 12px; } .FunResults__Header { display: flex; gap: 0.5ch; align-items: center; text-align: center; text-wrap: balance; font-size: 14px; line-height: 20px; letter-spacing: -0.08px; color: light-dark(#1b1b1b, #e9e9e9); } .FunResults__Actions { display: flex; flex-direction: row; gap: 6px; } .FunResults__Button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .FunResults__Button { border: 1px solid WindowText; } } .FunResults__Button { border-radius: 9999px; padding-block: 6px; padding-inline: 28px; background: light-dark(#f6f6f6, #343434); color: light-dark(#000000, #e9e9e9); font-size: 12px; line-height: 16px; letter-spacing: 0; } .FunResults__Button:focus { outline: none; } .keyboard-mode .FunResults__Button:focus { outline: 2px solid #2c6bed; } .FunPopover { display: flex; color: red; } .FunPopover__Dialog { border-radius: 8px; box-shadow: 0 8px 20px rgba(0, 0, 0, 0.3); background: light-dark(#ffffff, #3b3b3b); user-select: none; overflow: clip; -webkit-app-region: no-drag; } .FunPopover__Dialog:focus { outline: none; } .keyboard-mode .FunPopover__Dialog:focus { outline: 2px solid #2c6bed; } .FunScroller__Container { position: relative; z-index: 0; height: 100%; min-height: 0; } .keyboard-mode .FunScroller__Container:has(.FunScroller__Viewport:focus)::before { content: ""; display: block; position: absolute; width: 100%; height: 100%; z-index: 1; pointer-events: none; border-radius: 4px; outline: 2px solid #2c6bed; outline-offset: -2px; } .FunScroller__Hint { display: block; position: absolute; inset-inline: 0; z-index: 1; height: 2px; opacity: 0; transition: opacity 100ms ease; pointer-events: none; } .FunScroller__Hint.FunScroller__Hint--Top { top: 0; background-image: linear-gradient(to bottom, light-dark(rgba(0, 0, 0, 0.08), rgba(0, 0, 0, 0.12)), transparent); } .FunScroller__Hint.FunScroller__Hint--Bottom { bottom: 0; background-image: linear-gradient(to top, light-dark(rgba(0, 0, 0, 0.08), rgba(0, 0, 0, 0.12)), transparent); } .FunScroller__Hint.FunScroller__Hint--Visible { opacity: 1; } .FunScroller__Viewport { container-type: size; position: relative; width: 100%; height: 100%; scrollbar-width: thin; scrollbar-gutter: stable; overflow-y: auto; overflow-x: clip; padding-inline: 12px 1px; overscroll-behavior: contain; scrollbar-color: light-dark(#b9b9b9, #848484) transparent; } .FunScroller__Viewport:focus { /* Handled by .FunScroller__Container */ outline: none; } .FunScroller__ViewportInner { position: relative; z-index: 0; display: block flow-root; min-height: 100%; } .FunSearch__Container { position: relative; width: 100%; } .FunSearch__Icon { position: absolute; width: 20px; height: 20px; top: 50%; transform: translateY(-50%); inset-inline-start: 12px; pointer-events: none; } .FunSearch__Icon { -webkit-mask: url("../images/icons/v3/search/search.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.5)); } @media (forced-colors: active) { .FunSearch__Icon { background-color: WindowText; } } .FunSearch__Input { appearance: none; width: 100%; border-radius: 8px; border: none; padding-block: 6px; padding-inline-end: 12px; padding-inline-start: 42px; font-size: 14px; line-height: 20px; letter-spacing: -0.08px; color: light-dark(#000000, #ffffff); background: light-dark(#e9e9e9, #2e2e2e); } .FunSearch__Input:focus { outline: none; } .keyboard-mode .FunSearch__Input:focus { outline: 2px solid #2c6bed; } .FunSearch__Clear { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .FunSearch__Clear { border: 1px solid WindowText; } } .FunSearch__Clear { position: absolute; display: flex; align-items: center; inset-block: 0; inset-inline-end: 0; padding-inline: 6px; } .FunSearch__Clear:focus { outline: none; } .FunSearch__ClearButton { display: flex; align-items: center; justify-content: center; width: 20px; height: 20px; border-radius: 9999px; color: light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.5)); } .FunSearch__Clear:hover .FunSearch__ClearButton, .FunSearch__Clear:focus .FunSearch__ClearButton { color: light-dark(#3b3b3b, #b9b9b9); } .keyboard-mode .FunSearch__Clear:focus .FunSearch__ClearButton { outline: 2px solid #2c6bed; } .FunSearch__ClearButton::before { content: ""; display: block; width: 16px; height: 16px; } .FunSearch__ClearButton::before { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .FunSearch__ClearButton::before { background-color: WindowText; } } .FunSkinTones__ListBox { display: flex; flex-direction: row; } .FunSkinTones__ListBoxItem { padding: 1px; } .FunSkinTones__ListBoxItem:focus { outline: none; } .FunSkinTones__ListBoxItemButton { padding: 4px; border-radius: 10px; } .FunSkinTones__ListBoxItem:hover .FunSkinTones__ListBoxItemButton, .FunSkinTones__ListBoxItem:focus .FunSkinTones__ListBoxItemButton { background: light-dark(#f6f6f6, #343434); } .keyboard-mode .FunSkinTones__ListBoxItem:focus .FunSkinTones__ListBoxItemButton { outline: 2px solid #2c6bed; outline-offset: -2px; } .FunSkinTones__ListBoxItem[data-selected=true] .FunSkinTones__ListBoxItemButton { background: light-dark(#e9e9e9, #5e5e5e); } .FunSticker { width: auto; height: auto; max-width: 100%; max-height: 100%; border-radius: 4px; vertical-align: top; } .FunSubNav__Container { min-width: 0; display: flex; align-items: center; } .FunSubNav__Scroller { position: relative; flex: 1; min-width: 0; } .FunSubNav__Scroller::before, .FunSubNav__Scroller::after { content: ""; z-index: 1; display: block; pointer-events: none; position: absolute; top: 0; width: 6px; height: 100%; } .FunSubNav__Scroller::before { /* stylelint-disable-next-line liberty/use-logical-spec */ left: 0; background: linear-gradient(to right, light-dark(#ffffff, #3b3b3b) 20%, transparent); } .FunSubNav__Scroller::after { /* stylelint-disable-next-line liberty/use-logical-spec */ right: 0; background: linear-gradient(to left, light-dark(#ffffff, #3b3b3b) 20%, transparent); } .FunSubNav__ScrollerMask { content: ""; z-index: 1; display: block; pointer-events: none; position: absolute; top: 0; width: 40px; height: 100%; } .FunSubNav__ScrollerMask--Left { /* stylelint-disable-next-line liberty/use-logical-spec */ left: 0; background: linear-gradient(to right, light-dark(#ffffff, #3b3b3b) 20%, transparent); } .FunSubNav__ScrollerMask--Right { /* stylelint-disable-next-line liberty/use-logical-spec */ right: 0; background: linear-gradient(to left, light-dark(#ffffff, #3b3b3b) 20%, transparent); } .FunSubNav__ScrollerViewport { position: relative; z-index: 0; overflow-x: auto; overflow-y: clip; scroll-behavior: smooth; scrollbar-width: none; scroll-padding: 100px; outline: none; } .FunSubNav__ScrollerViewportInner { position: relative; display: inline flow-root; } .FunSubNav__Buttons { display: flex; padding-block: 6px; z-index: 1; } .FunSubNav__Buttons:first-of-type { padding-inline-start: 6px; } .FunSubNav__Buttons:last-of-type { padding-inline-end: 6px; } .FunSubNav__Button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .FunSubNav__Button { border: 1px solid WindowText; } } .FunSubNav__Button { position: relative; display: flex; flex-shrink: 0; width: 32px; height: 32px; background: transparent; border-radius: 10px; align-items: center; justify-content: center; } .FunSubNav__Button:hover { background: light-dark(#f6f6f6, #343434); } .FunSubNav__Button:focus { outline: none; } .keyboard-mode .FunSubNav__Button:focus { outline: 2px solid #2c6bed; } .FunSubNav__ListBox { display: flex; padding-block: 6px; flex: 1; } .FunSubNav__ListBoxItem { position: relative; flex: 1; padding: 1px; cursor: pointer; } .FunSubNav__ListBoxItem:focus { outline: none; } .FunSubNav__ListBoxItem:first-of-type { padding-inline-start: 6px; } .FunSubNav__ListBoxItem:last-of-type { padding-inline-end: 6px; } .FunSubNav__ListBoxItem__TooltipTarget { display: block; position: absolute; inset: 0; z-index: 2; } .FunSubNav__ListBoxItem__Button { position: relative; display: flex; width: 32px; height: 32px; background: transparent; border-radius: 10px; align-items: center; justify-content: center; } .FunSubNav__ListBoxItem:hover .FunSubNav__ListBoxItem__Button { background: light-dark(#f6f6f6, #343434); } .FunSubNav__ListBoxItem__ButtonIndicator { z-index: 0; position: absolute; border-radius: 10px; top: 0; inset-inline-start: 0; width: 100%; height: 100%; background: light-dark(#e9e9e9, #5e5e5e); } .FunSubNav__ListBoxItem[data-focused=true] .FunSubNav__ListBoxItem__ButtonIndicator { outline: none; } .keyboard-mode .FunSubNav__ListBoxItem[data-focused=true] .FunSubNav__ListBoxItem__ButtonIndicator { outline: 2px solid #2c6bed; } .FunSubNav__ListBoxItem__ButtonIcon { position: relative; z-index: 1; } .FunSubNav__Icon { width: 20px; height: 20px; } /* Shared */ .FunSubNav__Icon--Recents { -webkit-mask: url("../images/icons/v3/recent/recent.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.5)); } @media (forced-colors: active) { .FunSubNav__Icon--Recents { background-color: WindowText; } } /* Emoji */ .FunSubNav__Icon--SmileysAndPeople { -webkit-mask: url("../images/icons/v3/emoji/emoji.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.5)); } @media (forced-colors: active) { .FunSubNav__Icon--SmileysAndPeople { background-color: WindowText; } } .FunSubNav__Icon--AnimalsAndNature { -webkit-mask: url("../images/icons/v3/emoji/emoji-animal.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.5)); } @media (forced-colors: active) { .FunSubNav__Icon--AnimalsAndNature { background-color: WindowText; } } .FunSubNav__Icon--FoodAndDrink { -webkit-mask: url("../images/icons/v3/emoji/emoji-food.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.5)); } @media (forced-colors: active) { .FunSubNav__Icon--FoodAndDrink { background-color: WindowText; } } .FunSubNav__Icon--Activities { -webkit-mask: url("../images/icons/v3/emoji/emoji-activity.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.5)); } @media (forced-colors: active) { .FunSubNav__Icon--Activities { background-color: WindowText; } } .FunSubNav__Icon--TravelAndPlaces { -webkit-mask: url("../images/icons/v3/emoji/emoji-travel.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.5)); } @media (forced-colors: active) { .FunSubNav__Icon--TravelAndPlaces { background-color: WindowText; } } .FunSubNav__Icon--Objects { -webkit-mask: url("../images/icons/v3/emoji/emoji-object.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.5)); } @media (forced-colors: active) { .FunSubNav__Icon--Objects { background-color: WindowText; } } .FunSubNav__Icon--Symbols { -webkit-mask: url("../images/icons/v3/emoji/emoji-symbol.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.5)); } @media (forced-colors: active) { .FunSubNav__Icon--Symbols { background-color: WindowText; } } .FunSubNav__Icon--Flags { -webkit-mask: url("../images/icons/v3/emoji/emoji-flag.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.5)); } @media (forced-colors: active) { .FunSubNav__Icon--Flags { background-color: WindowText; } } /* Stickers */ .FunSubNav__Icon--Plus { -webkit-mask: url("../images/icons/v3/plus/plus-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.5)); } @media (forced-colors: active) { .FunSubNav__Icon--Plus { background-color: WindowText; } } /* GIFs */ .FunSubNav__Icon--Trending { -webkit-mask: url("../images/icons/v3/trending/trending.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.5)); } @media (forced-colors: active) { .FunSubNav__Icon--Trending { background-color: WindowText; } } .FunSubNav__Icon--Celebrate { -webkit-mask: url("../images/icons/v3/emoji/emoji-celebrate.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.5)); } @media (forced-colors: active) { .FunSubNav__Icon--Celebrate { background-color: WindowText; } } .FunSubNav__Icon--Love { -webkit-mask: url("../images/icons/v3/heart/heart.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.5)); } @media (forced-colors: active) { .FunSubNav__Icon--Love { background-color: WindowText; } } .FunSubNav__Icon--ThumbsUp { -webkit-mask: url("../images/icons/v3/emoji/emoji-thumbs_up.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.5)); } @media (forced-colors: active) { .FunSubNav__Icon--ThumbsUp { background-color: WindowText; } } .FunSubNav__Icon--Surprised { -webkit-mask: url("../images/icons/v3/emoji/emoji-surprised.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.5)); } @media (forced-colors: active) { .FunSubNav__Icon--Surprised { background-color: WindowText; } } .FunSubNav__Icon--Excited { -webkit-mask: url("../images/icons/v3/emoji/emoji-excited.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.5)); } @media (forced-colors: active) { .FunSubNav__Icon--Excited { background-color: WindowText; } } .FunSubNav__Icon--Sad { -webkit-mask: url("../images/icons/v3/emoji/emoji-sad.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.5)); } @media (forced-colors: active) { .FunSubNav__Icon--Sad { background-color: WindowText; } } .FunSubNav__Icon--Angry { -webkit-mask: url("../images/icons/v3/emoji/emoji-angry.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.5)); } @media (forced-colors: active) { .FunSubNav__Icon--Angry { background-color: WindowText; } } .FunSubNav__Image { width: 26px; height: 26px; border-radius: 7px; transform: scale(100%); transition: transform 200ms ease; } .FunSubNav__ListBoxItem[data-selected=true] .FunSubNav__Image { transform: scale(90%); } .FunTabs__Tabs { position: relative; display: grid; grid-template-rows: min-content 1fr; z-index: 0; width: 100%; height: 100%; } .FunTabs__TabList { display: flex; flex-direction: row; align-items: center; padding-inline: 10px; height: 48px; } .FunTabs__Tab { position: relative; flex: 1; padding-block: 12px; padding-inline: 2px; cursor: pointer !important; } .FunTabs__Tab[data-selected=true] { z-index: 1; } .FunTabs__Tab:focus { outline: none; } .FunTabs__TabButton { position: relative; padding-block: 5px; padding-inline: 12px; border-radius: 9999px; text-align: center; font-size: 14px; line-height: 20px; letter-spacing: -0.08px; color: light-dark(#1b1b1b, #e9e9e9); } .FunTabs__Tab:hover .FunTabs__TabButton, .FunTabs__Tab:focus .FunTabs__TabButton { background: light-dark(#f6f6f6, #343434); } .FunTabs__TabButtonIndicator { position: absolute; z-index: 1; border-radius: 9999px; top: 0; inset-inline-start: 0; width: 100%; height: 100%; cursor: pointer; pointer-events: none; background: light-dark(#e9e9e9, #5e5e5e); } .FunTabs__Tab[data-focused=true] .FunTabs__TabButtonIndicator { outline: none; } .keyboard-mode .FunTabs__Tab[data-focused=true] .FunTabs__TabButtonIndicator { outline: 2px solid #2c6bed; } .FunTabs__TabButtonText { position: relative; z-index: 2; } .FunTabs__TabPanel { position: relative; display: flex; grid-column: 1; grid-row: 2; min-height: 0; } .FunTabs__TabPanelInner { background: light-dark(#ffffff, #3b3b3b); } .FunTooltip { position: relative; z-index: 100000; max-width: calc(32ch + 16px); padding-block: 4px; padding-inline: 8px; background: light-dark(#ffffff, #3b3b3b); color: light-dark(rgba(0, 0, 0, 0.8), rgba(255, 255, 255, 0.8)); border-radius: 6px; box-shadow: 0px 4px 12px rgba(0, 0, 0, 0.3), 0px 0px 4px rgba(0, 0, 0, 0.05); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; pointer-events: none; user-select: none; font-size: 13px; line-height: 18px; letter-spacing: -0.03px; } .FunWaterfall__Container { contain: strict; position: relative; width: 100%; height: var(--fun-waterfall-container-total-size); } .FunWaterfall__Item { position: absolute; top: 0; left: 0; width: var(--fun-waterfall-item-width); height: var(--fun-waterfall-item-height); transform: translate(var(--fun-waterfall-item-offset-x), var(--fun-waterfall-item-offset-y)); } .GradientDial__container { height: 100%; position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); width: 100%; } .GradientDial__bar--container { height: 100%; width: 100%; overflow: hidden; position: relative; } .GradientDial__bar--node { background: #ffffff; border: 1px solid rgba(0, 0, 0, 0.2); height: 100%; height: 1000px; inset-inline-start: 50%; position: absolute; top: 50%; transform-origin: center; width: 4px; } .GradientDial__knob { background-clip: content-box; border-color: transparent; border-radius: 42px; border-style: solid; border-width: 4px; cursor: pointer; height: 42px; padding: 2px; width: 42px; } .GradientDial__knob--blue { background-color: #336ba3; } .GradientDial__knob--burlap { background-color: #6f6a58; } .GradientDial__knob--crimson { background-color: #cf163e; } .GradientDial__knob--forest { background-color: #3b7845; } .GradientDial__knob--indigo { background-color: #6058ca; } .GradientDial__knob--plum { background-color: #aa377a; } .GradientDial__knob--steel { background-color: #71717f; } .GradientDial__knob--taupe { background-color: #8f616a; } .GradientDial__knob--teal { background-color: #077d92; } .GradientDial__knob--vermilion { background-color: #c73f0a; } .GradientDial__knob--violet { background-color: #9932c8; } .GradientDial__knob--wintergreen { background-color: #1d8663; } .GradientDial__knob--ultramarine { background-image: linear-gradient(180deg, #0552f0, #2c6bed); } .GradientDial__knob--basil { background-image: linear-gradient(180deg, #2f9373, #077343); } .GradientDial__knob--ember { background-image: linear-gradient(168deg, #e57c00, #5e0000); } .GradientDial__knob--fluorescent { background-image: linear-gradient(192deg, #ec13dd, #1b36c6); } .GradientDial__knob--infrared { background-image: linear-gradient(192deg, #f65560, #442ced); } .GradientDial__knob--lagoon { background-image: linear-gradient(180deg, #004066, #32867d); } .GradientDial__knob--midnight { background-image: linear-gradient(180deg, #2c2c3a, #787891); } .GradientDial__knob--sea { background-image: linear-gradient(180deg, #498fd4, #2c66a0); } .GradientDial__knob--sublime { background-image: linear-gradient(180deg, #6281d5, #974460); } .GradientDial__knob--tangerine { background-image: linear-gradient(192deg, #db7133, #911231); } .GradientDial__knob { box-shadow: 0 0 4px rgba(0, 0, 0, 0.2); cursor: move; margin-inline-start: -20px; margin-top: -20px; padding: 2px; position: absolute; z-index: 1; } .GradientDial__knob--selected { border-color: #3b3b3b; } .dark-theme .GradientDial__knob--selected { border-color: #ffffff; } .GradientDial__knob:focus { outline: none; } .keyboard-mode .GradientDial__knob:focus { border-color: #2c6bed; outline: none; } .GroupDescription__text { -webkit-box-orient: vertical; -webkit-line-clamp: 2; display: -webkit-box; overflow: hidden; user-select: text; } .GroupDescription__read-more { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .GroupDescription__read-more { border: 1px solid WindowText; } } .GroupDescription__read-more { display: inline-block; font-weight: bold; } .GroupDescriptionText a { text-decoration: underline; } .GroupDescriptionText a { color: #1b1b1b; } .dark-theme .GroupDescriptionText a { color: #f6f6f6; } .module-GroupDialog { box-shadow: 0px 8px 20px rgba(0, 0, 0, 0.3), 0px 0px 8px rgba(0, 0, 0, 0.05); } @media (forced-colors: active) { .module-GroupDialog { border: 1px solid WindowText; } } .module-GroupDialog { border-radius: 8px; margin-block: 0; margin-inline: auto; max-height: 80vh; max-width: 360px; padding: 16px; position: relative; width: 95%; display: flex; flex-direction: column; } .module-GroupDialog { background: #ffffff; color: #1b1b1b; } .dark-theme .module-GroupDialog { background: #121212; color: #e9e9e9; } .module-GroupDialog__close-button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-GroupDialog__close-button { border: 1px solid WindowText; } } .module-GroupDialog__close-button { position: absolute; inset-inline-end: 12px; top: 12px; height: 24px; width: 24px; } .module-GroupDialog__close-button { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .module-GroupDialog__close-button { background-color: WindowText; } } .dark-theme .module-GroupDialog__close-button { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .module-GroupDialog__close-button { background-color: WindowText; } } .keyboard-mode .module-GroupDialog__close-button:focus { background-color: #2c6bed; } .dark-theme.keyboard-mode .module-GroupDialog__close-button:focus { background-color: #6191f3; } .module-GroupDialog__title { font-weight: 600; font-size: 20px; line-height: 26px; letter-spacing: -0.34px; text-align: center; margin-bottom: 20px; flex-grow: 0; flex-shrink: 0; } .module-GroupDialog__body { overflow-x: scroll; flex-grow: 1; flex-shrink: 1; } .module-GroupDialog__paragraph, .module-GroupDialog__contacts { margin-block: 0 16px; margin-inline: 0; padding-block: 0; padding-inline: 28px 16px; position: relative; } .module-GroupDialog__paragraph::before, .module-GroupDialog__contacts::before { content: ""; display: block; height: 11px; inset-inline-start: 4px; position: absolute; top: 4px; width: 4px; } .module-GroupDialog__paragraph::before, .module-GroupDialog__contacts::before { background-color: #dedede; } .dark-theme .module-GroupDialog__paragraph::before, .dark-theme .module-GroupDialog__contacts::before { background-color: #4a4a4a; } .module-GroupDialog__contacts { list-style-type: none; } .module-GroupDialog__contacts__contact { margin-top: 16px; } .module-GroupDialog__contacts__contact__name { margin-inline-start: 8px; } .module-GroupDialog__button-container { display: flex; justify-content: center; margin-top: 16px; flex-grow: 0; flex-shrink: 0; } .module-GroupDialog__button-container .module-Button { flex-grow: 1; max-width: 152px; } .module-GroupDialog__button-container .module-Button:not(:first-child) { margin-inline-start: 16px; } .module-GroupInput { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; padding-block: 8px; padding-inline: 12px; border-radius: 6px; border-width: 2px; border-style: solid; width: 100%; } .module-GroupInput { background: #ffffff; color: #000000; border-color: #dedede; } .module-GroupInput:disabled { background: #f6f6f6; border-color: #e9e9e9; color: #1b1b1b; } .dark-theme .module-GroupInput { background: #2e2e2e; color: #e9e9e9; border-color: #848484; } .dark-theme .module-GroupInput:disabled { background: #121212; border-color: #5e5e5e; color: #c6c6c6; } .module-GroupInput:focus { outline: none; } .module-GroupInput:focus { border-color: #2c6bed; } .dark-theme .module-GroupInput:focus { border-color: #6191f3; } .module-GroupInput__description { resize: none; } .module-GroupInput__description--container { margin-bottom: 12px; margin-top: 0; } .module-GroupInput__description--remaining { font-size: 12px; line-height: 16px; letter-spacing: 0; bottom: 0; color: #848484; margin: 12px; position: absolute; inset-inline-end: 0; } .module-GroupInput__description--large { height: 280px; } .module-GroupInput--container { position: relative; margin: 16px; } .HueSlider.Slider { background-image: linear-gradient(90deg, hsl(0, 0%, 0%), hsl(0, 100%, 50%), hsl(45, 100%, 50%), hsl(90, 100%, 50%), hsl(135, 100%, 50%), hsl(180, 100%, 50%), hsl(225, 100%, 50%), hsl(270, 100%, 50%), hsl(315, 100%, 50%), hsl(0, 0%, 100%)); border-radius: 4px; height: 8px; margin-inline-start: 7px; width: 280px; } .HueSlider__handle.Slider__handle { border: 7px solid #ffffff; margin-top: -7px; margin-inline-start: -11px; height: 22px; width: 22px; } .InAnotherCallTooltip { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; } .InAnotherCallTooltip { background-color: #f0f0f0; color: #000000; outline: 1px solid #c6c6c6; } .dark-theme .InAnotherCallTooltip { background-color: #2e2e2e; color: #dedede; outline: 1px solid #545454; } .InAnotherCallTooltip { padding-block: 5px; padding-inline: 12px; border-radius: 6px; filter: drop-shadow(0px 4px 3px rgba(0, 0, 0, 0.16)); pointer-events: none; } .InAnotherCallTooltip .module-tooltip-arrow::before { position: absolute; content: ""; border-style: solid; border-width: 7px; border-color: light-dark(#f0f0f0, #2e2e2e); } .InAnotherCallTooltip[data-placement=bottom] .module-tooltip-arrow::before { border-color: transparent transparent #c6c6c6 transparent; } .dark-theme .InAnotherCallTooltip[data-placement=bottom] .module-tooltip-arrow::before { border-color: transparent transparent #545454 transparent; } .InAnotherCallTooltip[data-placement=bottom] .module-tooltip-arrow::before { margin-top: -14px; /* stylelint-disable-next-line liberty/use-logical-spec */ margin-left: -7px; } .InAnotherCallTooltip[data-placement=top] .module-tooltip-arrow::before { border-color: #c6c6c6 transparent transparent transparent; } .dark-theme .InAnotherCallTooltip[data-placement=top] .module-tooltip-arrow::before { border-color: #545454 transparent transparent transparent; } .InAnotherCallTooltip[data-placement=top] .module-tooltip-arrow::before { margin-top: 0; /* stylelint-disable-next-line liberty/use-logical-spec */ margin-left: -7px; } .InAnotherCallTooltip[data-placement=left] .module-tooltip-arrow::before { border-color: transparent transparent transparent #c6c6c6; } .dark-theme .InAnotherCallTooltip[data-placement=left] .module-tooltip-arrow::before { border-color: transparent transparent transparent #545454; } .InAnotherCallTooltip[data-placement=left] .module-tooltip-arrow::before { margin-top: -7px; /* stylelint-disable-next-line liberty/use-logical-spec */ margin-left: 0px; } .InAnotherCallTooltip[data-placement=right] .module-tooltip-arrow::before { border-color: transparent #c6c6c6 transparent transparent; } .dark-theme .InAnotherCallTooltip[data-placement=right] .module-tooltip-arrow::before { border-color: transparent #545454 transparent transparent; } .InAnotherCallTooltip[data-placement=right] .module-tooltip-arrow::before { margin-top: -7px; /* stylelint-disable-next-line liberty/use-logical-spec */ margin-left: -14px; } .Inbox { display: flex; flex-direction: row; height: 100%; } .Inbox__conversation-stack { flex-grow: 1; height: 100%; overflow: hidden; position: relative; } .Inbox__no-conversation-open { align-items: center; display: flex; flex-direction: column; height: 100%; justify-content: center; overflow: hidden; position: relative; text-align: center; } .Inbox .__conversation { background-color: #ffffff; } .dark-theme .Inbox .__conversation { background-color: #121212; } .Inbox__no-conversation-open .module-splash-screen__logo { margin: 0; } .Inbox__logo { flex-shrink: 0; display: block; width: 128px; height: 128px; margin-block: 24px; position: relative; } .Inbox__logo { --Inbox__logo__bg: #3b45fd; } .dark-theme .Inbox__logo { --Inbox__logo__bg: #ffffff; } .Inbox__logo .Inbox__logo__part { width: 100%; height: 100%; position: absolute; } .Inbox__logo .Inbox__logo__part--base { -webkit-mask: url("../images/logo-parts/base.svg") no-repeat center; -webkit-mask-size: 100%; background-color: var(--Inbox__logo__bg); } @media (forced-colors: active) { .Inbox__logo .Inbox__logo__part--base { background-color: WindowText; } } .Inbox__logo .Inbox__logo__part--base { z-index: 1; } .Inbox__logo .Inbox__logo__part--segment { opacity: 0; z-index: 2; } .Inbox__logo .Inbox__logo__part--animated { transition: opacity 250ms, transform 250ms; } .Inbox__logo .Inbox__logo__part--segment:nth-child(2) { -webkit-mask: url("../images/logo-parts/p1.svg") no-repeat center; -webkit-mask-size: 100%; background-color: var(--Inbox__logo__bg); } @media (forced-colors: active) { .Inbox__logo .Inbox__logo__part--segment:nth-child(2) { background-color: WindowText; } } .Inbox__logo .Inbox__logo__part--segment:nth-child(2) { transform: rotate(337.5deg); } .Inbox__logo .Inbox__logo__part--segment:nth-child(3) { -webkit-mask: url("../images/logo-parts/p2.svg") no-repeat center; -webkit-mask-size: 100%; background-color: var(--Inbox__logo__bg); } @media (forced-colors: active) { .Inbox__logo .Inbox__logo__part--segment:nth-child(3) { background-color: WindowText; } } .Inbox__logo .Inbox__logo__part--segment:nth-child(3) { transform: rotate(315deg); } .Inbox__logo .Inbox__logo__part--segment:nth-child(4) { -webkit-mask: url("../images/logo-parts/p3.svg") no-repeat center; -webkit-mask-size: 100%; background-color: var(--Inbox__logo__bg); } @media (forced-colors: active) { .Inbox__logo .Inbox__logo__part--segment:nth-child(4) { background-color: WindowText; } } .Inbox__logo .Inbox__logo__part--segment:nth-child(4) { transform: rotate(292.5deg); } .Inbox__logo .Inbox__logo__part--segment:nth-child(5) { -webkit-mask: url("../images/logo-parts/p4.svg") no-repeat center; -webkit-mask-size: 100%; background-color: var(--Inbox__logo__bg); } @media (forced-colors: active) { .Inbox__logo .Inbox__logo__part--segment:nth-child(5) { background-color: WindowText; } } .Inbox__logo .Inbox__logo__part--segment:nth-child(5) { transform: rotate(270deg); } .Inbox__logo .Inbox__logo__part--segment:nth-child(6) { -webkit-mask: url("../images/logo-parts/p5.svg") no-repeat center; -webkit-mask-size: 100%; background-color: var(--Inbox__logo__bg); } @media (forced-colors: active) { .Inbox__logo .Inbox__logo__part--segment:nth-child(6) { background-color: WindowText; } } .Inbox__logo .Inbox__logo__part--segment:nth-child(6) { transform: rotate(247.5deg); } .Inbox__logo .Inbox__logo__part--segment:nth-child(7) { -webkit-mask: url("../images/logo-parts/p6.svg") no-repeat center; -webkit-mask-size: 100%; background-color: var(--Inbox__logo__bg); } @media (forced-colors: active) { .Inbox__logo .Inbox__logo__part--segment:nth-child(7) { background-color: WindowText; } } .Inbox__logo .Inbox__logo__part--segment:nth-child(7) { transform: rotate(225deg); } .Inbox__logo .Inbox__logo__part--segment:nth-child(8) { -webkit-mask: url("../images/logo-parts/p7.svg") no-repeat center; -webkit-mask-size: 100%; background-color: var(--Inbox__logo__bg); } @media (forced-colors: active) { .Inbox__logo .Inbox__logo__part--segment:nth-child(8) { background-color: WindowText; } } .Inbox__logo .Inbox__logo__part--segment:nth-child(8) { transform: rotate(202.5deg); } .Inbox__logo .Inbox__logo__part--segment:nth-child(9) { -webkit-mask: url("../images/logo-parts/p8.svg") no-repeat center; -webkit-mask-size: 100%; background-color: var(--Inbox__logo__bg); } @media (forced-colors: active) { .Inbox__logo .Inbox__logo__part--segment:nth-child(9) { background-color: WindowText; } } .Inbox__logo .Inbox__logo__part--segment:nth-child(9) { transform: rotate(180deg); } .Inbox__logo .Inbox__logo__part--segment:nth-child(10) { -webkit-mask: url("../images/logo-parts/p9.svg") no-repeat center; -webkit-mask-size: 100%; background-color: var(--Inbox__logo__bg); } @media (forced-colors: active) { .Inbox__logo .Inbox__logo__part--segment:nth-child(10) { background-color: WindowText; } } .Inbox__logo .Inbox__logo__part--segment:nth-child(10) { transform: rotate(157.5deg); } .Inbox__logo .Inbox__logo__part--segment:nth-child(11) { -webkit-mask: url("../images/logo-parts/p10.svg") no-repeat center; -webkit-mask-size: 100%; background-color: var(--Inbox__logo__bg); } @media (forced-colors: active) { .Inbox__logo .Inbox__logo__part--segment:nth-child(11) { background-color: WindowText; } } .Inbox__logo .Inbox__logo__part--segment:nth-child(11) { transform: rotate(135deg); } .Inbox__logo .Inbox__logo__part--segment:nth-child(12) { -webkit-mask: url("../images/logo-parts/p11.svg") no-repeat center; -webkit-mask-size: 100%; background-color: var(--Inbox__logo__bg); } @media (forced-colors: active) { .Inbox__logo .Inbox__logo__part--segment:nth-child(12) { background-color: WindowText; } } .Inbox__logo .Inbox__logo__part--segment:nth-child(12) { transform: rotate(112.5deg); } .Inbox__logo .Inbox__logo__part--segment:nth-child(13) { -webkit-mask: url("../images/logo-parts/p12.svg") no-repeat center; -webkit-mask-size: 100%; background-color: var(--Inbox__logo__bg); } @media (forced-colors: active) { .Inbox__logo .Inbox__logo__part--segment:nth-child(13) { background-color: WindowText; } } .Inbox__logo .Inbox__logo__part--segment:nth-child(13) { transform: rotate(90deg); } .Inbox__logo .Inbox__logo__part--segment:nth-child(14) { -webkit-mask: url("../images/logo-parts/p13.svg") no-repeat center; -webkit-mask-size: 100%; background-color: var(--Inbox__logo__bg); } @media (forced-colors: active) { .Inbox__logo .Inbox__logo__part--segment:nth-child(14) { background-color: WindowText; } } .Inbox__logo .Inbox__logo__part--segment:nth-child(14) { transform: rotate(67.5deg); } .Inbox__logo .Inbox__logo__part--segment:nth-child(15) { -webkit-mask: url("../images/logo-parts/p14.svg") no-repeat center; -webkit-mask-size: 100%; background-color: var(--Inbox__logo__bg); } @media (forced-colors: active) { .Inbox__logo .Inbox__logo__part--segment:nth-child(15) { background-color: WindowText; } } .Inbox__logo .Inbox__logo__part--segment:nth-child(15) { transform: rotate(45deg); } .Inbox__logo .Inbox__logo__part--segment:nth-child(16) { -webkit-mask: url("../images/logo-parts/p15.svg") no-repeat center; -webkit-mask-size: 100%; background-color: var(--Inbox__logo__bg); } @media (forced-colors: active) { .Inbox__logo .Inbox__logo__part--segment:nth-child(16) { background-color: WindowText; } } .Inbox__logo .Inbox__logo__part--segment:nth-child(16) { transform: rotate(22.5deg); } .Inbox__logo .Inbox__logo__part--segment:nth-child(17) { -webkit-mask: url("../images/logo-parts/p16.svg") no-repeat center; -webkit-mask-size: 100%; background-color: var(--Inbox__logo__bg); } @media (forced-colors: active) { .Inbox__logo .Inbox__logo__part--segment:nth-child(17) { background-color: WindowText; } } .Inbox__logo .Inbox__logo__part--segment:nth-child(17) { transform: rotate(0deg); } .Inbox__logo .Inbox__logo__part--segment:nth-child(n).Inbox__logo__part--visible { transform: rotate(0deg); opacity: 1; } .Inbox__welcome { margin-block: 20px 6px; font-weight: 600; font-size: 18px; line-height: 25px; letter-spacing: -0.25px; line-height: 24px; } .Inbox__whatsnew { margin: 0; } .Inbox__padding { flex-grow: 1; max-height: 28px; } .IncomingCallBar__container { -webkit-app-region: no-drag; animation: IncomingCallBar--animation 0.2s forwards ease-out; position: fixed; top: 22px; user-select: none; width: 100%; z-index: 101; padding-inline: 1rem; } .IncomingCallBar__bar { -webkit-app-region: no-drag; align-items: center; background-color: #3b3b3b; border-radius: 8px; display: flex; height: 70px; justify-content: space-between; margin-block: 0; margin-inline: auto; max-width: 600px; user-select: none; width: 100%; } .IncomingCallBar__conversation { align-items: center; display: flex; min-width: 0; } .IncomingCallBar__conversation--avatar { margin-bottom: 8px; margin-inline-start: 16px; margin-top: 8px; position: relative; } .IncomingCallBar__conversation--name { align-items: stretch; display: flex; flex-direction: column; margin-inline-start: 12px; min-width: 0; } .IncomingCallBar__conversation--name-header { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; color: #ffffff; overflow-x: hidden; text-overflow: ellipsis; white-space: nowrap; } .IncomingCallBar__conversation--message-text { -webkit-box-orient: vertical; -webkit-line-clamp: 2; font-size: 13px; line-height: 18px; letter-spacing: -0.03px; color: #ffffff; display: -webkit-box; overflow: hidden; text-overflow: ellipsis; } .IncomingCallBar__actions { display: flex; margin-inline-end: 16px; } .IncomingCallBar__button { align-items: center; border-radius: 40px; border: none; display: flex; height: 40px; justify-content: center; outline: none; width: 40px; } .IncomingCallBar__button__container { border-radius: 40px; height: 40px; margin-inline: 12px; width: 40px; } .IncomingCallBar__button--accept-video-as-audio { background-color: #848484; } .keyboard-mode .IncomingCallBar__button--accept-video-as-audio:focus { box-shadow: 0px 0px 0px 4px #2c6bed; } .mouse-mode .IncomingCallBar__button--accept-video-as-audio:hover { box-shadow: 0px 0px 0px 2px #2c6bed; } .IncomingCallBar__button--accept-video-as-audio div { -webkit-mask: url("../images/icons/v3/video/video-slash-fill.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .IncomingCallBar__button--accept-video-as-audio div { background-color: WindowText; } } .IncomingCallBar__button--accept-video-as-audio div { height: 24px; width: 24px; } .IncomingCallBar__button--accept-video { background-color: #4caf50; } .keyboard-mode .IncomingCallBar__button--accept-video:focus { box-shadow: 0px 0px 0px 4px #2c6bed; } .mouse-mode .IncomingCallBar__button--accept-video:hover { box-shadow: 0px 0px 0px 2px #2c6bed; } .IncomingCallBar__button--accept-video div { -webkit-mask: url("../images/icons/v3/video/video-fill.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .IncomingCallBar__button--accept-video div { background-color: WindowText; } } .IncomingCallBar__button--accept-video div { height: 24px; width: 24px; } .IncomingCallBar__button--accept-audio { background-color: #4caf50; } .keyboard-mode .IncomingCallBar__button--accept-audio:focus { box-shadow: 0px 0px 0px 4px #2c6bed; } .mouse-mode .IncomingCallBar__button--accept-audio:hover { box-shadow: 0px 0px 0px 2px #2c6bed; } .IncomingCallBar__button--accept-audio div { -webkit-mask: url("../images/icons/v3/phone/phone-fill.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .IncomingCallBar__button--accept-audio div { background-color: WindowText; } } .IncomingCallBar__button--accept-audio div { height: 24px; width: 24px; } .IncomingCallBar__button--decline { background-color: #f44336; } .keyboard-mode .IncomingCallBar__button--decline:focus { box-shadow: 0px 0px 0px 4px #2c6bed; } .mouse-mode .IncomingCallBar__button--decline:hover { box-shadow: 0px 0px 0px 2px #2c6bed; } .IncomingCallBar__button--decline div { -webkit-mask: url("../images/icons/v3/phone/phone-down-fill.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .IncomingCallBar__button--decline div { background-color: WindowText; } } .IncomingCallBar__button--decline div { height: 24px; width: 24px; } @keyframes IncomingCallBar--animation { from { transform: translateY(-100px); opacity: 0; } to { transform: translateY(0px); opacity: 1; } } .Input__container { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; border-radius: 6px; border-style: solid; border-width: 2px; margin-block: 16px; margin-inline: 0; padding-block: 2px; padding-inline: 12px; display: flex; position: relative; } .Input__container { background: #ffffff; border-color: #dedede; color: #000000; } .dark-theme .Input__container { background: #2e2e2e; border-color: #848484; color: #e9e9e9; } .Input__container--disabled { background: #f6f6f6; border-color: #e9e9e9; color: #1b1b1b; } .dark-theme .Input__container--disabled { background: #121212; border-color: #5e5e5e; color: #c6c6c6; } .Input__container:focus-within { outline: none; } .Input__container:focus-within { border-color: #2c6bed; } .dark-theme .Input__container:focus-within { border-color: #6191f3; } .Input__icon { font-size: 24px; height: 32px; width: 32px; margin-inline-end: 8px; } .Input__input { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; background: inherit; border: none; resize: none; width: 100%; } .Input__input--large { height: 280px; } .Input__input--textarea { margin-top: 4px; } .Input__input:placeholder { color: #848484; } .Input__input { color: #000000; } .dark-theme .Input__input { color: #e9e9e9; } .Input__input:focus { outline: none; } .Input__controls { align-items: center; display: flex; flex-shrink: 0; height: 22px; justify-content: flex-end; min-height: 32px; } .Input__clear-icon { height: 18px; width: 18px; } .Input__clear-icon { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .Input__clear-icon { background-color: WindowText; } } .dark-theme .Input__clear-icon { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .dark-theme .Input__clear-icon { background-color: WindowText; } } .Input__remaining-count { font-size: 12px; line-height: 16px; letter-spacing: 0; color: #848484; } .Input__remaining-count--large { position: absolute; bottom: 0; inset-inline-end: 0; margin: 12px; } .Input__remaining-count--warn { color: #f44336; } .InstallScreenBackupImportStep { position: relative; display: flex; width: 100vw; height: 100vh; flex-direction: column; align-items: center; } .InstallScreenBackupImportStep__content { display: flex; flex-direction: column; justify-content: center; text-align: center; margin-top: calc(64px + var(--title-bar-drag-area-height)); flex: 1; } .InstallScreenBackupImportStep__title { font-weight: 600; font-size: 20px; line-height: 26px; letter-spacing: -0.34px; margin-block: 0 20px; } .InstallScreenBackupImportStep .ProgressBar { margin-block-end: 18px; min-width: 326px; } .InstallScreenBackupImportStep__progressbar-hint { font-size: 11px; line-height: 14px; letter-spacing: 0.06px; font-weight: 500; margin-block-end: 8px; } .InstallScreenBackupImportStep__progressbar-hint { color: rgba(0, 0, 0, 0.8); } .dark-theme .InstallScreenBackupImportStep__progressbar-hint { color: #b9b9b9; } .InstallScreenBackupImportStep__description { font-size: 11px; line-height: 14px; letter-spacing: 0.06px; } .InstallScreenBackupImportStep__description { color: #5e5e5e; } .dark-theme .InstallScreenBackupImportStep__description { color: #b9b9b9; } .InstallScreenBackupImportStep__cancel { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .InstallScreenBackupImportStep__cancel { border: 1px solid WindowText; } } .InstallScreenBackupImportStep__cancel { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; } .InstallScreenBackupImportStep__cancel { color: #2c6bed; } .dark-theme .InstallScreenBackupImportStep__cancel { color: #6191f3; } .keyboard-mode .InstallScreenBackupImportStep__cancel:focus { box-shadow: 0px 0px 0px 3px #2c6bed; } .dark-theme.keyboard-mode .InstallScreenBackupImportStep__cancel:focus { box-shadow: 0px 0px 0px 3px #6191f3; } .dark-theme .InstallScreenBackupImportStep__cancel { color: #2e2e2e; } .InstallScreenBackupImportStep__cancel { padding-block: 8px; padding-inline: 24px; border-radius: 48px; background-color: #e9e9e9; } .InstallScreenBackupImportStep__footer { display: flex; flex-direction: column; align-items: center; margin-bottom: 36px; min-height: 110px; gap: 26px; } .InstallScreenBackupImportStep__security { display: flex; flex-direction: column; align-items: center; max-width: 336px; } .InstallScreenBackupImportStep__security--icon::after { -webkit-mask: url("../images/icons/v3/lock/lock.svg") no-repeat center; -webkit-mask-size: 100%; background-color: rgba(94, 94, 94, 0.8); } @media (forced-colors: active) { .InstallScreenBackupImportStep__security--icon::after { background-color: WindowText; } } .dark-theme .InstallScreenBackupImportStep__security--icon::after { -webkit-mask: url("../images/icons/v3/lock/lock.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .dark-theme .InstallScreenBackupImportStep__security--icon::after { background-color: WindowText; } } .InstallScreenBackupImportStep__security--icon::after { content: ""; display: block; height: 16px; width: 16px; margin-bottom: 4px; } .InstallScreenBackupImportStep__security--description { font-size: 11px; line-height: 14px; letter-spacing: 0.06px; text-align: center; } .InstallScreenBackupImportStep__security--description { color: rgba(94, 94, 94, 0.8); } .dark-theme .InstallScreenBackupImportStep__security--description { color: #b9b9b9; } .InstallScreenBackupImportStep__security--description a { text-decoration: none; } .module-InstallScreenErrorStep { align-items: center; display: flex; width: 100vw; height: 100vh; justify-content: center; line-height: 30px; user-select: none; } .module-InstallScreenErrorStep { background: #f6f6f6; color: #000000; } .dark-theme .module-InstallScreenErrorStep { background: #121212; color: #ffffff; } .module-InstallScreenErrorStep h1 { font-weight: 600; font-size: 20px; line-height: 26px; letter-spacing: -0.34px; } .module-InstallScreenErrorStep h2 { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: normal; } .module-InstallScreenErrorStep { flex-direction: column; padding-inline: 2rem; text-align: center; } .module-InstallScreenErrorStep__buttons { margin-top: 1rem; } .module-InstallScreenErrorStep__buttons .module-Button { margin-inline-start: 1rem; } .module-InstallScreenErrorStep__buttons .module-Button:first-child { margin-inline-start: 0; } .module-InstallScreenLinkInProgressStep { align-items: center; display: flex; width: 100vw; height: 100vh; justify-content: center; line-height: 30px; user-select: none; } .module-InstallScreenLinkInProgressStep { background: #f6f6f6; color: #000000; } .dark-theme .module-InstallScreenLinkInProgressStep { background: #121212; color: #ffffff; } .module-InstallScreenLinkInProgressStep h1 { font-weight: 600; font-size: 20px; line-height: 26px; letter-spacing: -0.34px; } .module-InstallScreenLinkInProgressStep h2 { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: normal; } .module-InstallScreenLinkInProgressStep { flex-direction: column; text-align: center; } .module-InstallScreenLinkInProgressStep h1 { font-weight: 600; font-size: 20px; line-height: 26px; letter-spacing: -0.34px; margin-top: 18px; } .module-InstallScreenLinkInProgressStep h2 { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: normal; margin-block-start: 0; } .module-InstallScreenLinkInProgressStep h2 { color: #5e5e5e; } .dark-theme .module-InstallScreenLinkInProgressStep h2 { color: #b9b9b9; } .module-InstallScreenQrCodeNotScannedStep { align-items: center; display: flex; width: 100vw; height: 100vh; justify-content: center; line-height: 30px; user-select: none; } .module-InstallScreenQrCodeNotScannedStep { background: #f6f6f6; color: #000000; } .dark-theme .module-InstallScreenQrCodeNotScannedStep { background: #121212; color: #ffffff; } .module-InstallScreenQrCodeNotScannedStep h1 { font-weight: 600; font-size: 20px; line-height: 26px; letter-spacing: -0.34px; } .module-InstallScreenQrCodeNotScannedStep h2 { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: normal; } .module-InstallScreenQrCodeNotScannedStep__contents { align-items: center; background: #ffffff; border-radius: 8px; color: #000000; display: flex; flex-direction: row; animation: 500ms module-InstallScreenQrCodeNotScannedStep__slide-in; position: relative; top: 0; } .module-InstallScreenQrCodeNotScannedStep__contents { max-width: 760px; padding: 22px; } .dark-theme .module-InstallScreenQrCodeNotScannedStep__contents { max-width: 804px; padding: 44px; margin-top: 44px; } .module-InstallScreenQrCodeNotScannedStep__qr-code { align-items: center; border: 1.5px solid transparent; box-sizing: content-box; display: flex; flex-direction: column; justify-content: center; margin-block: 8px; margin-inline: 8px 38px; min-height: 256px; min-width: 256px; width: 256px; } .module-InstallScreenQrCodeNotScannedStep__qr-code--loaded { background: #ffffff; } .module-InstallScreenQrCodeNotScannedStep__qr-code--load-failed { font-size: 12px; line-height: 16px; letter-spacing: 0; border-color: #e9e9e9; border-radius: 10px; color: #5e5e5e; } .module-InstallScreenQrCodeNotScannedStep__qr-code--just-button { background: #e9e9e9; } .module-InstallScreenQrCodeNotScannedStep__qr-code--just-button .module-InstallScreenQrCodeNotScannedStep__qr-code__link { background: #ffffff; color: #000000; padding-block: 8px; padding-inline: 16px; border-radius: 34px; font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 500; margin-block-start: 0; } .module-InstallScreenQrCodeNotScannedStep__qr-code--just-button .module-InstallScreenQrCodeNotScannedStep__qr-code__link::before { -webkit-mask: url("../images/icons/v3/refresh/refresh-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .module-InstallScreenQrCodeNotScannedStep__qr-code--just-button .module-InstallScreenQrCodeNotScannedStep__qr-code__link::before { background-color: WindowText; } } .module-InstallScreenQrCodeNotScannedStep__qr-code__link { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-InstallScreenQrCodeNotScannedStep__qr-code__link { border: 1px solid WindowText; } } .module-InstallScreenQrCodeNotScannedStep__qr-code__link { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; font-weight: 600; display: flex; gap: 4px; align-items: center; color: #2c6bed; margin-block-start: 16px; } .module-InstallScreenQrCodeNotScannedStep__qr-code__link::before { -webkit-mask: url("../images/icons/v3/refresh/refresh-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #2c6bed; } @media (forced-colors: active) { .module-InstallScreenQrCodeNotScannedStep__qr-code__link::before { background-color: WindowText; } } .module-InstallScreenQrCodeNotScannedStep__qr-code__link::before { content: ""; display: block; height: 16px; width: 16px; } .module-InstallScreenQrCodeNotScannedStep__qr-code__code { height: 256px; width: 256px; background: #ffffff; animation: 1s module-InstallScreenQrCodeNotScannedStep__slide-in; position: relative; transition: opacity 125ms; } .module-InstallScreenQrCodeNotScannedStep__qr-code__code--copying { opacity: 0.5; } .module-InstallScreenQrCodeNotScannedStep__qr-code__error-message { text-align: center; font-size: 13px; line-height: 18px; letter-spacing: -0.03px; } .module-InstallScreenQrCodeNotScannedStep__qr-code__error-message::before { -webkit-mask: url("../images/icons/v3/error/error-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #f44336; } @media (forced-colors: active) { .module-InstallScreenQrCodeNotScannedStep__qr-code__error-message::before { background-color: WindowText; } } .module-InstallScreenQrCodeNotScannedStep__qr-code__error-message::before { content: ""; display: block; height: 22px; margin-block: 0 8px; margin-inline: auto; width: 22px; } .module-InstallScreenQrCodeNotScannedStep__qr-code__error-message { margin-inline: 24px; } .module-InstallScreenQrCodeNotScannedStep__qr-code__error-message p { margin-block: 0; } .module-InstallScreenQrCodeNotScannedStep__qr-code__get-help { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; font-weight: 600; display: flex; gap: 4px; align-items: center; margin-block-start: 16px; color: #2c6bed; text-decoration: none; } .module-InstallScreenQrCodeNotScannedStep__qr-code__get-help::before { -webkit-mask: url("../images/icons/v3/open/open-compact-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #2c6bed; } @media (forced-colors: active) { .module-InstallScreenQrCodeNotScannedStep__qr-code__get-help::before { background-color: WindowText; } } .module-InstallScreenQrCodeNotScannedStep__qr-code__get-help::before { content: ""; display: block; height: 16px; width: 16px; } .module-InstallScreenQrCodeNotScannedStep ol { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; line-height: 26px; list-style-type: decimal; list-style-position: inside; margin-block: 8px; padding-inline-start: 0; } .module-InstallScreenQrCodeNotScannedStep a { color: #2c6bed; } @keyframes module-InstallScreenQrCodeNotScannedStep__slide-in { from { transform: translateY(-8px); opacity: 0; } to { transform: translateY(0px); opacity: 1; } } .InstallScreenSignalLogo { font-weight: 600; font-size: 26px; line-height: 32px; letter-spacing: -0.56px; align-items: center; display: flex; font-weight: bold; position: absolute; top: calc(35px + var(--title-bar-drag-area-height)); inset-inline-start: 32px; } .InstallScreenSignalLogo::before { -webkit-mask: url("../images/signal-logo-and-wordmark.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b45fd; } @media (forced-colors: active) { .InstallScreenSignalLogo::before { background-color: WindowText; } } .dark-theme .InstallScreenSignalLogo::before { -webkit-mask: url("../images/signal-logo-and-wordmark.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .dark-theme .InstallScreenSignalLogo::before { background-color: WindowText; } } .InstallScreenSignalLogo::before { content: ""; display: block; height: 32px; width: 112px; } .InstallScreenUpdateDialog__download-size { font-weight: 400; } .InstallScreenUpdateDialog__progress--container { background-color: #dedede; } .dark-theme .InstallScreenUpdateDialog__progress--container { background-color: #4a4a4a; } .InstallScreenUpdateDialog__progress--container { border-radius: 2px; height: 4px; overflow: hidden; width: 100%; margin-block: 16px; margin-inline: 0; } .InstallScreenUpdateDialog__progress--bar { background-color: #2c6bed; border-radius: 2px; display: block; height: 100%; width: 100%; transition: transform 500ms ease-out; } .InstallScreenUpdateDialog__progress--bar:dir(ltr) { /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translateX(-100%); } .InstallScreenUpdateDialog__progress--bar:dir(rtl) { /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translateX(100%); } .InstallScreenUpdateDialog a { display: inline-block; } .LeftPaneBanner { margin-block: 4px 8px; margin-inline: 10px; padding-block: 12px 16px; padding-inline-start: 12px; padding-inline-end: 7px; border-radius: 8px; } .LeftPaneBanner { background-color: #dedede; color: #3b3b3b; } .dark-theme .LeftPaneBanner { background-color: #3b3b3b; color: #dedede; } .LeftPaneBanner { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; } .LeftPaneBanner__content { margin-bottom: 8px; } .LeftPaneBanner__footer { display: flex; justify-content: end; margin-inline-end: 9px; } .LeftPaneBanner__footer__action-button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .LeftPaneBanner__footer__action-button { border: 1px solid WindowText; } } .keyboard-mode .LeftPaneBanner__footer__action-button:focus { box-shadow: 0px 0px 0px 3px #2c6bed; } .dark-theme.keyboard-mode .LeftPaneBanner__footer__action-button:focus { box-shadow: 0px 0px 0px 3px #6191f3; } .LeftPaneBanner__footer__action-button { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; } .LeftPaneBanner__footer__action-button { color: #1b1b1b; } .dark-theme .LeftPaneBanner__footer__action-button { color: #e9e9e9; } @keyframes progress-animation { 0% { background-position: 100%; } 100% { background-position: -100%; } } .LeftPaneDialog { background: #2c6bed; color: #ffffff; cursor: inherit; display: flex; min-height: 64px; padding-block: 12px; padding-inline: 16px 14px; user-select: none; width: 100%; position: relative; font-size: 13px; line-height: 18px; letter-spacing: -0.0025em; font-weight: 400; } .LeftPaneDialog__retry { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .LeftPaneDialog__retry { border: 1px solid WindowText; } } .LeftPaneDialog__retry { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; } .LeftPaneDialog--clickable { cursor: pointer; } .LeftPaneDialog__container { display: flex; align-items: center; flex-grow: 1; } .LeftPaneDialog--width-narrow .LeftPaneDialog__container { justify-content: center; } .LeftPaneDialog__container-close { display: flex; justify-content: flex-end; } .LeftPaneDialog__spinner-container { margin-inline-end: 18px; } .LeftPaneDialog__spinner__arc { background-color: #000000; } .dark-theme .LeftPaneDialog__spinner__arc { background-color: #000000; } .LeftPaneDialog__spinner__circle { background-color: #ffd624; } .LeftPaneDialog__icon-container { width: 24px; height: 24px; flex-shrink: 0; margin-inline-end: 18px; position: relative; } .LeftPaneDialog--width-narrow .LeftPaneDialog__icon-container { margin-inline-end: 0; } .LeftPaneDialog__icon { width: 100%; height: 100%; background-color: #ffffff; -webkit-mask-size: contain; } @media (forced-colors: active) { .LeftPaneDialog__icon { background-color: WindowText; } } .LeftPaneDialog__icon--relink { -webkit-mask: url("../images/icons/v3/link/link-slash.svg") no-repeat center; } .LeftPaneDialog__icon--network { -webkit-mask: url("../images/icons/v3/wifi/wifi-error.svg") no-repeat center; } .LeftPaneDialog__icon--update { -webkit-mask: url("../images/icons/v3/refresh/refresh.svg") no-repeat center; } .LeftPaneDialog__icon--warning { -webkit-mask: url("../images/icons/v3/error/error-triangle.svg") no-repeat center; } .LeftPaneDialog__icon--error { -webkit-mask: url("../images/icons/v3/error/error-circle.svg") no-repeat center; } .LeftPaneDialog__icon-background { width: 100%; height: 100%; border-radius: 50%; outline-width: 5px; outline-offset: -1px; outline-style: solid; } .LeftPaneDialog__icon-background--warning { outline-color: #ffd624; background-color: #ffd624; } .LeftPaneDialog__icon-background--warning .LeftPaneDialog__icon { background-color: #000000; } @media (forced-colors: active) { .LeftPaneDialog__icon-background--warning .LeftPaneDialog__icon { background-color: WindowText; } } .LeftPaneDialog__action-text { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .LeftPaneDialog__action-text { border: 1px solid WindowText; } } .LeftPaneDialog__action-text { text-decoration: none; color: rgba(255, 255, 255, 0.8); } .LeftPaneDialog__close-button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .LeftPaneDialog__close-button { border: 1px solid WindowText; } } .LeftPaneDialog__close-button { border-radius: 4px; float: inline-end; height: 20px; width: 20px; } .LeftPaneDialog__close-button::before { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; background-color: #ffffff; content: ""; display: block; width: 100%; height: 100%; } @media (forced-colors: active) { .LeftPaneDialog__close-button::before { background-color: WindowText; } .dark-theme .LeftPaneDialog__close-button::before { background-color: WindowText; } } .LeftPaneDialog__close-button:hover, .LeftPaneDialog__close-button:focus { background-color: rgba(255, 255, 255, 0.2); } .LeftPaneDialog__close-button:active { background-color: rgba(255, 255, 255, 0.2); } @media (forced-colors: active) { .LeftPaneDialog__close-button:hover, .LeftPaneDialog__close-button:focus, .LeftPaneDialog__close-button:active { background-color: none; } .dark-theme .LeftPaneDialog__close-button:hover, .dark-theme .LeftPaneDialog__close-button:focus, .dark-theme .LeftPaneDialog__close-button:active { background-color: none; } } .LeftPaneDialog__message { width: 100%; } .LeftPaneDialog__message, .LeftPaneDialog__tooltip { max-width: 250px; } .LeftPaneDialog__message h3, .LeftPaneDialog__tooltip h3 { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; padding: 0px; margin: 0px; } .LeftPaneDialog__message span, .LeftPaneDialog__tooltip span { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; display: inline-block; } .LeftPaneDialog__message a, .LeftPaneDialog__tooltip a { font-weight: bold; text-decoration: none; } .LeftPaneDialog__tooltip { --tooltip-background-color: #2c6bed; --tooltip-text-color: #ffffff; min-width: 280px; text-align: inherit; } .LeftPaneDialog--error, .LeftPaneDialog__tooltip--error { background-color: #f44336; color: #ffffff; } .LeftPaneDialog--error, .dark-theme .LeftPaneDialog--error, .LeftPaneDialog__tooltip--error, .dark-theme .LeftPaneDialog__tooltip--error { --tooltip-background-color: #f44336; --tooltip-text-color: #ffffff; } .LeftPaneDialog--error a, .LeftPaneDialog__tooltip--error a { color: #ffffff; } .LeftPaneDialog--error .LeftPaneDialog__action-text, .LeftPaneDialog__tooltip--error .LeftPaneDialog__action-text { color: #ffffff; } .LeftPaneDialog--info, .LeftPaneDialog__tooltip--info { width: unset; margin-inline: 10px; margin-block-end: 6px; margin-block-start: 2px; border-radius: 10px; color: inherit; } .LeftPaneDialog--info, .LeftPaneDialog__tooltip--info { background-color: #ffffff; --tooltip-background-color: variables.$color-white; border: 1px solid #c6c6c6; } .dark-theme .LeftPaneDialog--info, .dark-theme .LeftPaneDialog__tooltip--info { background: #3b3b3b; border: 1px solid #5e5e5e; } .LeftPaneDialog--info .LeftPaneDialog__close-button::before, .LeftPaneDialog__tooltip--info .LeftPaneDialog__close-button::before { background-color: #848484; } .dark-theme .LeftPaneDialog--info .LeftPaneDialog__close-button::before, .dark-theme .LeftPaneDialog__tooltip--info .LeftPaneDialog__close-button::before { background-color: #c6c6c6; } .LeftPaneDialog--info .LeftPaneDialog__action-text, .LeftPaneDialog--info .LeftPaneDialog__tooltip__action-text, .LeftPaneDialog__tooltip--info .LeftPaneDialog__action-text, .LeftPaneDialog__tooltip--info .LeftPaneDialog__tooltip__action-text { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .LeftPaneDialog--info .LeftPaneDialog__action-text, .LeftPaneDialog--info .LeftPaneDialog__tooltip__action-text, .LeftPaneDialog__tooltip--info .LeftPaneDialog__action-text, .LeftPaneDialog__tooltip--info .LeftPaneDialog__tooltip__action-text { border: 1px solid WindowText; } } .LeftPaneDialog--info .LeftPaneDialog__action-text, .LeftPaneDialog--info .LeftPaneDialog__tooltip__action-text, .LeftPaneDialog__tooltip--info .LeftPaneDialog__action-text, .LeftPaneDialog__tooltip--info .LeftPaneDialog__tooltip__action-text { font-size: 12px; line-height: 16px; letter-spacing: 0; } .LeftPaneDialog--info .LeftPaneDialog__action-text, .LeftPaneDialog--info .LeftPaneDialog__tooltip__action-text, .LeftPaneDialog__tooltip--info .LeftPaneDialog__action-text, .LeftPaneDialog__tooltip--info .LeftPaneDialog__tooltip__action-text { font-weight: 600; } .LeftPaneDialog--info .LeftPaneDialog__action-text, .LeftPaneDialog--info .LeftPaneDialog__tooltip__action-text, .LeftPaneDialog__tooltip--info .LeftPaneDialog__action-text, .LeftPaneDialog__tooltip--info .LeftPaneDialog__tooltip__action-text { color: #2c6bed; } .dark-theme .LeftPaneDialog--info .LeftPaneDialog__action-text, .dark-theme .LeftPaneDialog--info .LeftPaneDialog__tooltip__action-text, .dark-theme .LeftPaneDialog__tooltip--info .LeftPaneDialog__action-text, .dark-theme .LeftPaneDialog__tooltip--info .LeftPaneDialog__tooltip__action-text { color: #6191f3; } .LeftPaneDialog--warning, .LeftPaneDialog__tooltip--warning { background-color: #ffd624; color: #000000; } .LeftPaneDialog--warning, .dark-theme .LeftPaneDialog--warning, .LeftPaneDialog__tooltip--warning, .dark-theme .LeftPaneDialog__tooltip--warning { --tooltip-background-color: #ffd624; --tooltip-text-color: #000000; } .LeftPaneDialog--warning a, .LeftPaneDialog__tooltip--warning a { color: #000000; } .LeftPaneDialog--warning .LeftPaneDialog__icon, .LeftPaneDialog__tooltip--warning .LeftPaneDialog__icon { background-color: #000000; } @media (forced-colors: active) { .LeftPaneDialog--warning .LeftPaneDialog__icon, .LeftPaneDialog__tooltip--warning .LeftPaneDialog__icon { background-color: WindowText; } } .LeftPaneDialog--warning .LeftPaneDialog__close-button::before, .LeftPaneDialog__tooltip--warning .LeftPaneDialog__close-button::before { background-color: #000000; } @media (forced-colors: active) { .LeftPaneDialog--warning .LeftPaneDialog__close-button::before, .LeftPaneDialog__tooltip--warning .LeftPaneDialog__close-button::before { background-color: WindowText; } } .LeftPaneDialog--warning .LeftPaneDialog__action-text, .LeftPaneDialog__tooltip--warning .LeftPaneDialog__action-text { color: #000000; } .LeftPaneDialog__progress--container { background: rgba(255, 255, 255, 0.2); border-radius: 2px; height: 4px; max-width: 210px; overflow: hidden; width: 100%; margin-block: 10px 6px; margin-inline: 0; } .LeftPaneDialog__progress--bar { animation: progress-animation 2s linear infinite; background: linear-gradient(90deg, rgba(255, 255, 255, 0.4), rgba(255, 255, 255, 0.6), rgba(255, 255, 255, 0.9), rgba(255, 255, 255, 0.6), rgba(255, 255, 255, 0.4)); background-size: 200% 100%; border-radius: 2px; display: block; height: 100%; width: 100%; transition: transform 500ms ease-out; } .LeftPaneDialog__progress--bar:dir(ltr) { /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translateX(-100%); } .LeftPaneDialog__progress--bar:dir(rtl) { /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translateX(100%); } .LeftPaneFindByPhoneNumberHelper__search-input__input.module-SearchInput__input { padding-inline: 12px; } .LeftPaneFindByPhoneNumberHelper__container { margin-block-start: 8px; display: flex; width: 100%; flex-direction: column; gap: 12px; } .LeftPaneFindByUsernameHelper__search-input__input.module-SearchInput__input { margin-block-start: 8px; padding-inline: 12px; } .LeftPaneSearchInput__input--with-children.module-SearchInput__input--with-children { padding-inline-start: 50px; } .LeftPaneSearchInput__in-conversation-pill { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .LeftPaneSearchInput__in-conversation-pill { border: 1px solid WindowText; } } .LeftPaneSearchInput__in-conversation-pill { border-radius: 9999px; align-items: center; bottom: 4px; display: flex; flex-direction: row; inset-inline-start: 3px; padding-block: 0; padding-inline: 0 3px; position: absolute; top: 4px; } .LeftPaneSearchInput__in-conversation-pill { background-color: #b9b9b9; } .dark-theme .LeftPaneSearchInput__in-conversation-pill { background-color: #2e2e2e; } .LeftPaneSearchInput__in-conversation-pill__x-button { height: 16px; margin-inline-start: 2px; width: 16px; } .LeftPaneSearchInput__in-conversation-pill__x-button { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .LeftPaneSearchInput__in-conversation-pill__x-button { background-color: WindowText; } } .dark-theme .LeftPaneSearchInput__in-conversation-pill__x-button { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .dark-theme .LeftPaneSearchInput__in-conversation-pill__x-button { background-color: WindowText; } } .LeftPaneSearchInput__in-conversation-pill__x-button:hover, .LeftPaneSearchInput__in-conversation-pill__x-button:focus, .LeftPaneSearchInput__in-conversation-pill__x-button:active { background: #2c6bed; } .dark-theme .LeftPaneSearchInput__in-conversation-pill__x-button:hover, .dark-theme .LeftPaneSearchInput__in-conversation-pill__x-button:focus, .dark-theme .LeftPaneSearchInput__in-conversation-pill__x-button:active { background: #6191f3; } .module-left-pane--width-narrow .LeftPaneSearchInput__container { display: none; } .LeftPaneSearchInput__FilterButtonWrapper { margin-inline-end: 8px; } .LeftPaneSearchInput__FilterButton { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .LeftPaneSearchInput__FilterButton { border: 1px solid WindowText; } } .LeftPaneSearchInput__FilterButton { flex-shrink: 0; padding: 4px; border-radius: 4px; } .LeftPaneSearchInput__FilterButton:not(.LeftPaneSearchInput__FilterButton--pressed):hover { background-color: rgba(0, 0, 0, 0.06); } .dark-theme .LeftPaneSearchInput__FilterButton:not(.LeftPaneSearchInput__FilterButton--pressed):hover { background-color: rgba(255, 255, 255, 0.06); } .LeftPaneSearchInput__FilterButton:focus { outline: none; } .keyboard-mode .LeftPaneSearchInput__FilterButton:focus { box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px #2c6bed; } .LeftPaneSearchInput__FilterButton::before { content: ""; display: block; width: 20px; height: 20px; } .LeftPaneSearchInput__FilterButton::before { -webkit-mask: url("../images/icons/v3/filter/filter.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .LeftPaneSearchInput__FilterButton::before { background-color: WindowText; } } .dark-theme .LeftPaneSearchInput__FilterButton::before { -webkit-mask: url("../images/icons/v3/filter/filter.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .LeftPaneSearchInput__FilterButton::before { background-color: WindowText; } } .LeftPaneSearchInput__FilterButton--pressed { border-radius: 9999px; background: #2c6bed; } .LeftPaneSearchInput__FilterButton--pressed::before { -webkit-mask: url("../images/icons/v3/filter/filter.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .LeftPaneSearchInput__FilterButton--pressed::before { background-color: WindowText; } } .LeftPaneSearchInput__FilterLabel { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border-width: 0; } .Lightbox__container { background-color: #000000; bottom: 0; inset-inline: 0; position: absolute; top: 0; z-index: 100; } .Lightbox__animated { bottom: 0; inset-inline: 0; position: absolute; top: 0; display: flex; flex-direction: column; } .Lightbox__main-container { display: flex; flex-direction: column; flex-grow: 1; min-height: 50px; outline: none; } .Lightbox__buttons { align-items: center; display: flex; flex-direction: column; justify-content: center; min-height: 56px; } .Lightbox__thumbnails { align-items: center; display: flex; justify-content: center; inset-inline-start: 50%; position: absolute; } .Lightbox__thumbnails--container { height: 44px; position: relative; } .Lightbox__thumbnail { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .Lightbox__thumbnail { border: 1px solid WindowText; } } .Lightbox__thumbnail { position: relative; border-radius: 6px; height: 44px; margin-inline-end: 8px; overflow: hidden; width: 44px; } .Lightbox__thumbnail img { height: 100%; object-fit: contain; width: 100%; opacity: 0.8; } .Lightbox__thumbnail--selected::after { position: absolute; top: 0; inset-inline-start: 0; content: ""; width: 100%; height: 100%; border-radius: 6px; box-shadow: inset 0px 0px 0px 2px #ffffff; } .Lightbox__thumbnail--unavailable { -webkit-mask: url("../images/image.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .Lightbox__thumbnail--unavailable { background-color: WindowText; } } .Lightbox__thumbnail--unavailable { height: 100%; width: 100%; } .Lightbox__object { height: auto; max-height: 100%; max-width: 100%; object-fit: contain; outline: none; width: auto; } .Lightbox__object--container { display: inline-flex; flex-grow: 1; justify-content: center; overflow: hidden; position: relative; z-index: 1; } .Lightbox__object--container--zoom { backface-visibility: hidden; } .Lightbox__object--video { height: 100%; inset-inline-start: 0; position: absolute; top: 0; width: 100%; } @media (max-height: 500px) { .Lightbox__object--video { inset-inline-start: 40px; width: calc(100% - 80px); } } .Lightbox__unsupported { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .Lightbox__unsupported { border: 1px solid WindowText; } } .Lightbox__unsupported { flex-grow: 1; height: 100%; max-width: 200px; width: 100%; } .Lightbox__unsupported--image { -webkit-mask: url("../images/image.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .Lightbox__unsupported--image { background-color: WindowText; } } .Lightbox__unsupported--video { -webkit-mask: url("../images/movie.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .Lightbox__unsupported--video { background-color: WindowText; } } .Lightbox__unsupported--file { -webkit-mask: url("../images/file.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .Lightbox__unsupported--file { background-color: WindowText; } } .Lightbox__unsupported--missing { -webkit-mask: url("../images/full-screen-flow/alert-outline.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .Lightbox__unsupported--missing { background-color: WindowText; } } .Lightbox__zoomable-container { display: flex; flex-direction: column; justify-content: center; align-items: center; margin-block: 0; margin-inline: 40px; } .Lightbox__zoom-button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .Lightbox__zoom-button { border: 1px solid WindowText; } } .Lightbox__zoom-button { max-height: 100%; max-width: 100%; cursor: zoom-in; } .Lightbox__object--container--zoom .Lightbox__zoom-button, .Lightbox__object--container--fill .Lightbox__zoom-button { cursor: zoom-out; } .Lightbox__caption { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; color: #ffffff; margin-block: 12px; margin-inline: 0; text-align: center; } .Lightbox__countdown { padding: 8px; } .Lightbox__timestamp { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; background-color: #000000; border-radius: 15px; color: #eeefef; padding-block: 6px; padding-inline: 18px; text-align: center; } .Lightbox__toast-container { opacity: 0; transition: opacity 500ms; position: absolute; bottom: 45px; pointer-events: none; z-index: 2; } .Lightbox__toast-container .Toast { background-color: rgba(0, 0, 0, 0.8); } .Lightbox__toast-container .Toast__content { padding-block: 7px; padding-inline: 12px; font-size: 11px; line-height: 14px; letter-spacing: 0.06px; } .Lightbox__toast-container--visible { opacity: 1; } .Lightbox__nav-next, .Lightbox__nav-prev { --height: 224px; position: absolute; top: calc(50% - var(--height) / 2); height: var(--height); z-index: 2; } @media (min-height: 500px) { .Lightbox__nav-next, .Lightbox__nav-prev { width: 25%; max-width: 96px; } } .Lightbox__nav-next { inset-inline-end: 0; align-items: end; } .Lightbox__nav-prev { inset-inline-start: 0; align-items: start; } .Lightbox__header { align-items: center; display: flex; height: 52px; justify-content: space-between; margin-top: var(--title-bar-drag-area-height); margin-bottom: 16px; min-height: 52px; opacity: 1; padding-block: 0; padding-inline: 16px; transition: opacity 150ms cubic-bezier(0.17, 0.17, 0, 1); } .Lightbox__header--container { display: flex; } .Lightbox__header--avatar { margin-inline-end: 10px; } .Lightbox__header--name { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; font-weight: 600; color: #ffffff; } .Lightbox__header--timestamp { font-size: 11px; line-height: 14px; letter-spacing: 0.06px; color: #b9b9b9; } .Lightbox__footer { opacity: 1; padding-block: 16px 24px; padding-inline: 16px; transition: opacity 150ms cubic-bezier(0.17, 0.17, 0, 1); } .Lightbox__container--zoom .Lightbox__header, .Lightbox__container--zoom .Lightbox__footer { opacity: 0; } .Lightbox__controls { display: flex; gap: 32px; } .Lightbox__button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .Lightbox__button { border: 1px solid WindowText; } } .Lightbox__button { border-radius: 4px; display: inline-block; height: 24px; width: 24px; } .Lightbox__button::before { content: ""; display: block; height: 100%; width: 100%; } .Lightbox__button:focus { outline: 4px solid #2c6bed; } .Lightbox__button:disabled::before { background: #4a4a4a; } .Lightbox__button--forward::before { -webkit-mask: url("../images/icons/v3/forward/forward.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .Lightbox__button--forward::before { background-color: WindowText; } } .Lightbox__button--save::before { -webkit-mask: url("../images/icons/v3/save/save.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .Lightbox__button--save::before { background-color: WindowText; } } .Lightbox__button--close::before { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .Lightbox__button--close::before { background-color: WindowText; } } .Lightbox__button--previous, .Lightbox__button--next { width: 100%; height: 100%; opacity: 0; transition: opacity 200ms ease-in-out; display: flex; flex-direction: row; align-items: center; outline: none; } .Lightbox__button--previous::before, .Lightbox__button--next::before { width: 32px; height: 32px; -webkit-filter: drop-shadow(0 0 4px rgba(0, 0, 0, 0.4)); content: ""; display: block; background-size: 100%; } .Lightbox__button--previous:hover, .Lightbox__button--next:hover { opacity: 1; } .Lightbox__button--previous:focus, .Lightbox__button--next:focus { outline: none; } .keyboard-mode .Lightbox__button--previous:focus, .keyboard-mode .Lightbox__button--next:focus { opacity: 1; } .keyboard-mode .Lightbox__button--previous:focus, .keyboard-mode .Lightbox__button--next:focus { box-shadow: 0px 0px 0px 3px #2c6bed; } .dark-theme.keyboard-mode .Lightbox__button--previous:focus, .dark-theme.keyboard-mode .Lightbox__button--next:focus { box-shadow: 0px 0px 0px 3px #6191f3; } .Lightbox__button--previous { justify-content: start; padding-inline-start: 16px; } .Lightbox__button--previous::before { background-image: url("../images/icons/v3/chevron/chevron-left-white.svg"); } .Lightbox__button--next { justify-content: end; padding-inline-end: 16px; } .Lightbox__button--next::before { background-image: url("../images/icons/v3/chevron/chevron-right-white.svg"); } button.ListTile { width: 100%; } .ListTile { display: flex; align-items: center; padding-block: 6px; padding-inline: 14px; user-select: none; border: 2px solid transparent; border-width: 2px 10px; background-clip: padding-box; border-radius: 20px/12px; background-color: transparent; color: inherit; box-sizing: border-box; text-align: inherit; } .ListTile--variant-panelrow { padding-block: 8px; padding-inline: 16px; } .ListTile__content { min-width: 0; flex: 1; display: flex; flex-direction: column; font-family: Inter, "Source Sans Pro", "Source Han Sans", -apple-system, system-ui, "Segoe UI", "Noto Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; } .ListTile__title { display: -webkit-box; -webkit-line-clamp: 1; -webkit-box-orient: vertical; overflow: hidden; font-size: 14px; line-height: 20px; } .ListTile__subtitle { display: -webkit-box; -webkit-box-orient: vertical; overflow: hidden; font-size: 12px; color: #b9b9b9; line-height: 17px; } .ListTile__subtitle--max-lines-1 { -webkit-line-clamp: 1; } .ListTile__subtitle--max-lines-2 { -webkit-line-clamp: 2; } .ListTile__subtitle--max-lines-3 { -webkit-line-clamp: 3; } .ListTile__subtitle { color: #5e5e5e; } .dark-theme .ListTile__subtitle { color: #b9b9b9; } .ListTile[aria-disabled=true] { cursor: not-allowed; } .ListTile__leading { margin-inline-end: 12px; } .ListTile__trailing { margin-inline-start: 12px; } .ListTile--clickable { cursor: pointer; } .ListTile--clickable:hover:not([aria-disabled=true], [aria-selected=true]), .ListTile--clickable:focus-within:not([aria-disabled=true], [aria-selected=true]) { background-color: rgba(0, 0, 0, 0.06); } .dark-theme .ListTile--clickable:hover:not([aria-disabled=true], [aria-selected=true]), .dark-theme .ListTile--clickable:focus-within:not([aria-disabled=true], [aria-selected=true]) { background-color: rgba(255, 255, 255, 0.06); } .ListTile--clickable:hover:not([aria-disabled=true], [aria-selected=true]) .ConversationDetails-panel-row__actions, .ListTile--clickable:focus-within:not([aria-disabled=true], [aria-selected=true]) .ConversationDetails-panel-row__actions { opacity: 1; } .LowDiskSpaceBackupImportModal__content { max-width: 440px; padding-block: 12px; padding-inline: 4px; display: flex; flex-direction: column; align-items: center; } .LowDiskSpaceBackupImportModal__icon { background-color: #ffd624; padding-block: 12px; padding-inline: 12px; border-radius: 50%; } .LowDiskSpaceBackupImportModal__icon::after { content: ""; display: block; width: 32px; height: 32px; } .LowDiskSpaceBackupImportModal__icon::after { -webkit-mask: url("../images/icons/v3/backup/backup-warning.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .LowDiskSpaceBackupImportModal__icon::after { background-color: WindowText; } } .LowDiskSpaceBackupImportModal__header { font-weight: 600; font-size: 18px; line-height: 25px; letter-spacing: -0.25px; margin-block: 12px; } .LowDiskSpaceBackupImportModal__description { margin-block: 12px; margin-inline: 8px; color: light-dark(#5e5e5e, #b9b9b9); } .LowDiskSpaceBackupImportModal__button { display: flex; justify-content: center; margin-block-start: 18px; } .LowDiskSpaceBackupImportModal__button button { padding-inline: 26px; } .MediaEditor { background: #121212; display: flex; flex-direction: column; width: 100vw; height: 100vh; inset-inline-start: 0; top: 0; position: absolute; user-select: none; -webkit-app-region: no-drag; z-index: 99; } .MediaEditor__container { display: flex; flex: 1; padding-block: 64px; padding-inline: 64px; padding-bottom: 0; overflow: hidden; } .MediaEditor__media { align-items: center; display: flex; height: 100%; justify-content: center; position: relative; width: 100%; } .MediaEditor__media--canvas { border-radius: 12px; transition: border-radius 200ms ease-out; } .MediaEditor__media--canvas--cropping { border-radius: 0; } .MediaEditor__control { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .MediaEditor__control { border: 1px solid WindowText; } } .MediaEditor__control { align-items: center; border-radius: 20px; display: inline-flex; height: 32px; justify-content: center; margin-block: 0; margin-inline: 20px; opacity: 1; width: 32px; } .MediaEditor__control::after { content: " "; height: 20px; width: 20px; } .MediaEditor__control--crop::after { -webkit-mask: url("../images/icons/v3/crop/crop-rotate.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .MediaEditor__control--crop::after { background-color: WindowText; } } .MediaEditor__control--pen::after { -webkit-mask: url("../images/icons/v2/draw-24.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .MediaEditor__control--pen::after { background-color: WindowText; } } .MediaEditor__control--redo::after { -webkit-mask: url("../images/icons/v3/redo/redo.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .MediaEditor__control--redo::after { background-color: WindowText; } } .MediaEditor__control--redo:disabled::after { -webkit-mask: url("../images/icons/v3/redo/redo.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #848484; } @media (forced-colors: active) { .MediaEditor__control--redo:disabled::after { background-color: WindowText; } } .MediaEditor__control--sticker.module-sticker-button__button::after { -webkit-mask: url("../images/icons/v3/sticker/sticker-smiley.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .MediaEditor__control--sticker.module-sticker-button__button::after { background-color: WindowText; } } .MediaEditor__control--text::after { -webkit-mask: url("../images/icons/v2/text-24.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .MediaEditor__control--text::after { background-color: WindowText; } } .MediaEditor__control--undo::after { -webkit-mask: url("../images/icons/v3/undo/undo.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .MediaEditor__control--undo::after { background-color: WindowText; } } .MediaEditor__control--undo:disabled::after { -webkit-mask: url("../images/icons/v3/undo/undo.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #848484; } @media (forced-colors: active) { .MediaEditor__control--undo:disabled::after { background-color: WindowText; } } .MediaEditor__control--selected { background-color: #ffffff; } .MediaEditor__control--selected::after { background-color: #000000; } .MediaEditor__control:hover { background-color: #2e2e2e; } .MediaEditor__control:hover::after { background-color: #ffffff; } .MediaEditor__tools { align-items: center; display: flex; flex-direction: column; justify-content: center; padding: 22px; width: 100%; } .MediaEditor__tools--input { margin-inline: 24px; width: 400px; } .MediaEditor__tools--buttons { align-items: center; display: flex; justify-content: center; width: 100%; } .MediaEditor__tools__caption { height: 44px; } .MediaEditor__tools__caption__add-caption-button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .MediaEditor__tools__caption__add-caption-button { border: 1px solid WindowText; } } .MediaEditor__tools__caption__add-caption-button { border-radius: 9999px; background: #1b1b1b; color: #dedede; padding-block: 8px; padding-inline: 15px; border: none; } .MediaEditor__tools__caption__add-caption-button > span { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 1; overflow: hidden; } .MediaEditor__tools-row-1 { display: flex; flex-grow: 1; flex-wrap: wrap; height: 28px; justify-content: center; margin-bottom: 24px; max-width: 596px; } .MediaEditor__tools-row-2 { align-items: center; display: flex; flex-grow: 1; flex-wrap: wrap; justify-content: center; max-width: 596px; min-height: 36px; } .MediaEditor__toolbar__crop { align-items: center; color: #ffffff; display: flex; height: 36px; justify-content: center; padding-block: 14px; padding-inline: 12px; margin-inline: 16px; } .MediaEditor__toolbar__crop__button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .MediaEditor__toolbar__crop__button { border: 1px solid WindowText; } } .MediaEditor__toolbar__crop__button { display: flex; margin-block: 0; margin-inline: 20px; } .MediaEditor__toolbar { align-items: center; background-color: #1b1b1b; border-radius: 10px; color: #ffffff; display: flex; height: 36px; justify-content: center; padding-block: 14px; padding-inline: 12px; margin-inline: 16px; min-width: 418px; } .MediaEditor__toolbar__tool, .MediaEditor__toolbar__tool__button { margin-inline-start: 14px; } .MediaEditor__toolbar__button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .MediaEditor__toolbar__button { border: 1px solid WindowText; } } .MediaEditor__toolbar__button { display: flex; margin-block: 0; margin-inline: 8px; padding: 8px; } .MediaEditor__toolbar__button--draw-pen__button { -webkit-mask: url("../images/icons/v3/brush/brush-pen-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .MediaEditor__toolbar__button--draw-pen__button { background-color: WindowText; } } .MediaEditor__toolbar__button--draw-pen__button { opacity: 1; height: 20px; width: 20px; border-radius: 0; } .MediaEditor__toolbar__button--draw-pen__button::after { display: none; } .MediaEditor__toolbar__button--draw-highlighter__button { -webkit-mask: url("../images/icons/v3/brush/brush-highlighter-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .MediaEditor__toolbar__button--draw-highlighter__button { background-color: WindowText; } } .MediaEditor__toolbar__button--draw-highlighter__button { opacity: 1; height: 20px; width: 20px; border-radius: 0; } .MediaEditor__toolbar__button--draw-highlighter__button::after { display: none; } .MediaEditor__toolbar__button--width-thin__button { -webkit-mask: url("../images/icons/v3/brush_size/brush_size-thin-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .MediaEditor__toolbar__button--width-thin__button { background-color: WindowText; } } .MediaEditor__toolbar__button--width-thin__button { opacity: 1; height: 20px; width: 20px; border-radius: 0; } .MediaEditor__toolbar__button--width-thin__button::after { display: none; } .MediaEditor__toolbar__button--width-regular__button { -webkit-mask: url("../images/icons/v3/brush_size/brush_size-regular-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .MediaEditor__toolbar__button--width-regular__button { background-color: WindowText; } } .MediaEditor__toolbar__button--width-regular__button { opacity: 1; height: 20px; width: 20px; border-radius: 0; } .MediaEditor__toolbar__button--width-regular__button::after { display: none; } .MediaEditor__toolbar__button--width-medium__button { -webkit-mask: url("../images/icons/v3/brush_size/brush_size-medium-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .MediaEditor__toolbar__button--width-medium__button { background-color: WindowText; } } .MediaEditor__toolbar__button--width-medium__button { opacity: 1; height: 20px; width: 20px; border-radius: 0; } .MediaEditor__toolbar__button--width-medium__button::after { display: none; } .MediaEditor__toolbar__button--width-heavy__button { -webkit-mask: url("../images/icons/v3/brush_size/brush_size-heavy-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .MediaEditor__toolbar__button--width-heavy__button { background-color: WindowText; } } .MediaEditor__toolbar__button--width-heavy__button { opacity: 1; height: 20px; width: 20px; border-radius: 0; } .MediaEditor__toolbar__button--width-heavy__button::after { display: none; } .MediaEditor__toolbar__button--text-regular__button { -webkit-mask: url("../images/icons/v3/text/text-square-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .MediaEditor__toolbar__button--text-regular__button { background-color: WindowText; } } .MediaEditor__toolbar__button--text-regular__button { opacity: 1; height: 20px; width: 20px; border-radius: 0; } .MediaEditor__toolbar__button--text-regular__button::after { display: none; } .MediaEditor__toolbar__button--text-highlight__button { -webkit-mask: url("../images/icons/v3/text/text-square-fill-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .MediaEditor__toolbar__button--text-highlight__button { background-color: WindowText; } } .MediaEditor__toolbar__button--text-highlight__button { opacity: 1; height: 20px; width: 20px; border-radius: 0; } .MediaEditor__toolbar__button--text-highlight__button::after { display: none; } .MediaEditor__toolbar__button--text-outline__button { -webkit-mask: url("../images/icons/v3/text/text-outline-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .MediaEditor__toolbar__button--text-outline__button { background-color: WindowText; } } .MediaEditor__toolbar__button--text-outline__button { opacity: 1; height: 20px; width: 20px; border-radius: 0; } .MediaEditor__toolbar__button--text-outline__button::after { display: none; } .MediaEditor__toolbar__button--rotate { -webkit-mask: url("../images/icons/v2/rotate-outline-24.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .MediaEditor__toolbar__button--rotate { background-color: WindowText; } } .MediaEditor__toolbar__button--rotate { opacity: 1; height: 20px; width: 20px; border-radius: 0; } .MediaEditor__toolbar__button--rotate::after { display: none; } .MediaEditor__toolbar__button--flip { -webkit-mask: url("../images/icons/v2/flip-outline-24.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .MediaEditor__toolbar__button--flip { background-color: WindowText; } } .MediaEditor__toolbar__button--flip { opacity: 1; height: 20px; width: 20px; border-radius: 0; } .MediaEditor__toolbar__button--flip::after { display: none; } .MediaEditor__toolbar__button--crop-locked { -webkit-mask: url("../images/icons/v3/crop/crop-lock.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .MediaEditor__toolbar__button--crop-locked { background-color: WindowText; } } .MediaEditor__toolbar__button--crop-locked { opacity: 1; height: 20px; width: 20px; border-radius: 0; } .MediaEditor__toolbar__button--crop-locked::after { display: none; } .MediaEditor__toolbar__button--crop-unlocked { -webkit-mask: url("../images/icons/v3/crop/crop-unlock.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .MediaEditor__toolbar__button--crop-unlocked { background-color: WindowText; } } .MediaEditor__toolbar__button--crop-unlocked { opacity: 1; height: 20px; width: 20px; border-radius: 0; } .MediaEditor__toolbar__button--crop-unlocked::after { display: none; } .MediaEditor__icon--draw-pen { -webkit-mask: url("../images/icons/v3/brush/brush-pen-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .MediaEditor__icon--draw-pen { background-color: WindowText; } } .MediaEditor__icon--draw-highlighter { -webkit-mask: url("../images/icons/v3/brush/brush-highlighter-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .MediaEditor__icon--draw-highlighter { background-color: WindowText; } } .MediaEditor__icon--text-regular { -webkit-mask: url("../images/icons/v3/text/text-square-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .MediaEditor__icon--text-regular { background-color: WindowText; } } .MediaEditor__icon--text-highlight { -webkit-mask: url("../images/icons/v3/text/text-square-fill-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .MediaEditor__icon--text-highlight { background-color: WindowText; } } .MediaEditor__icon--text-outline { -webkit-mask: url("../images/icons/v3/text/text-outline-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .MediaEditor__icon--text-outline { background-color: WindowText; } } .MediaEditor__icon--width-thin { -webkit-mask: url("../images/icons/v3/brush_size/brush_size-thin-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .MediaEditor__icon--width-thin { background-color: WindowText; } } .MediaEditor__icon--width-regular { -webkit-mask: url("../images/icons/v3/brush_size/brush_size-regular-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .MediaEditor__icon--width-regular { background-color: WindowText; } } .MediaEditor__icon--width-medium { -webkit-mask: url("../images/icons/v3/brush_size/brush_size-medium-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .MediaEditor__icon--width-medium { background-color: WindowText; } } .MediaEditor__icon--width-heavy { -webkit-mask: url("../images/icons/v3/brush_size/brush_size-heavy-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .MediaEditor__icon--width-heavy { background-color: WindowText; } } .MediaEditor__history-buttons { inset-inline-start: 24px; position: absolute; top: 40px; } .MediaEditor__close { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .MediaEditor__close { border: 1px solid WindowText; } } .MediaEditor__close { border-radius: 4px; height: 20px; position: absolute; inset-inline-end: 24px; top: 40px; width: 20px; } .MediaEditor__close::before { content: ""; display: block; width: 100%; height: 100%; } .MediaEditor__close::before { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .MediaEditor__close::before { background-color: WindowText; } } .MediaEditor__close:hover, .MediaEditor__close:focus { box-shadow: 0 0 0 2px #2c6bed; } .MediaEditor__crop-preset { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .MediaEditor__crop-preset { border: 1px solid WindowText; } } .MediaEditor__crop-preset { color: #ffffff; height: 28px; margin-inline: 12px; padding-block: 5px; padding-inline: 12px; } .MediaEditor__crop-preset--selected { border-radius: 9999px; background: #2e2e2e; } .MediaPermissionsModal__headerTitle { padding-block: 10px; } .MediaPermissionsModal__body { display: flex; flex-direction: column; align-items: center; } .MediaPermissionsModal h1 { font-weight: 600; font-size: 18px; line-height: 25px; letter-spacing: -0.25px; margin-inline: 0; margin-block: 0 6px; line-height: 24px; } .MediaPermissionsModal__subtitle { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; margin-inline: 0; margin-block: 0 20px; } .MediaPermissionsModal__subtitle { color: rgba(94, 94, 94, 0.8); } .dark-theme .MediaPermissionsModal__subtitle { color: #b9b9b9; } .MediaPermissionsModal ol { display: flex; flex-direction: column; gap: 12px; margin-inline: 0; margin-block: 0 24px; text-align: start; } .MediaQualitySelector__popper { width: 332px; border-radius: 4px; margin-bottom: 6px; z-index: 125; user-select: none; overflow: hidden; } .MediaQualitySelector__popper { box-shadow: 0px 8px 20px rgba(0, 0, 0, 0.3), 0px 0px 8px rgba(0, 0, 0, 0.05); } @media (forced-colors: active) { .MediaQualitySelector__popper { border: 1px solid WindowText; } } .MediaQualitySelector__popper { background: #f6f6f6; } .dark-theme .MediaQualitySelector__popper { background: #3b3b3b; } .MediaQualitySelector__popper { padding-block: 12px; padding-inline: 16px; width: auto; } .MediaQualitySelector__title { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; margin-bottom: 12px; } .MediaQualitySelector__button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .MediaQualitySelector__button { border: 1px solid WindowText; } } .MediaQualitySelector__button { align-items: center; border-radius: 4px; display: flex; height: 32px; justify-content: center; width: 32px; } .keyboard-mode .MediaQualitySelector__button:focus { outline: 2px solid #2c6bed; } .MediaQualitySelector__button { outline: none; } .MediaQualitySelector__button::after { content: ""; display: block; flex-shrink: 0; height: 20px; width: 20px; } .MediaQualitySelector__button::after { -webkit-mask: url("../images/icons/v3/quality/quality-standard.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .MediaQualitySelector__button::after { background-color: WindowText; } } .dark-theme .MediaQualitySelector__button::after { -webkit-mask: url("../images/icons/v3/quality/quality-standard.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .MediaQualitySelector__button::after { background-color: WindowText; } } .MediaQualitySelector__button--hq::after { -webkit-mask: url("../images/icons/v3/quality/quality-high.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .MediaQualitySelector__button--hq::after { background-color: WindowText; } } .dark-theme .MediaQualitySelector__button--hq::after { -webkit-mask: url("../images/icons/v3/quality/quality-high.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .MediaQualitySelector__button--hq::after { background-color: WindowText; } } .MediaQualitySelector__button--active { opacity: 1; } .MediaQualitySelector__button--active { background-color: #e9e9e9; } .dark-theme .MediaQualitySelector__button--active { background-color: #3b3b3b; } .MediaQualitySelector__option { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .MediaQualitySelector__option { border: 1px solid WindowText; } } .MediaQualitySelector__option { align-items: center; border-radius: 6px; display: flex; height: 42px; margin-block: 2px; margin-inline: 0; min-width: 200px; } .MediaQualitySelector__option--checkmark { height: 12px; margin-block: 0; margin-inline: 6px; width: 16px; } .MediaQualitySelector__option--selected { -webkit-mask: url("../images/icons/v3/check/check-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #2c6bed; } @media (forced-colors: active) { .MediaQualitySelector__option--selected { background-color: WindowText; } } .MediaQualitySelector__option--title { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; } .MediaQualitySelector__option--description { font-size: 12px; line-height: 16px; letter-spacing: 0; } .MediaQualitySelector__option:hover { background-color: #e9e9e9; } .dark-theme .MediaQualitySelector__option:hover { background-color: #4a4a4a; } .MediaQualitySelector__option--focused, .MediaQualitySelector__option:focus, .MediaQualitySelector__option:active { border-radius: 6px; box-shadow: 0 0 1px 1px #2c6bed; outline: none; } .module-message__audio-attachment { display: flex; flex-direction: column; margin-top: 2px; /** * Players for audio or video content should always be left-to-right. * This overrides the default direction of the surrounding elements. */ /* stylelint-disable-next-line declaration-property-value-disallowed-list */ direction: ltr; } @media (min-width: 0px) and (max-width: 799px) { .module-message__audio-attachment .PlaybackButton { margin-inline-end: 4px; } } .module-message__audio-attachment__button-and-waveform { display: flex; flex-direction: row; align-items: center; margin-bottom: 5px; } /* The separator between audio and text */ .module-message__audio-attachment--with-content-below { border-bottom: 1px solid rgba(255, 255, 255, 0.2); padding-bottom: 12px; margin-bottom: 7px; } .module-message__audio-attachment--with-content-below.module-message__audio-attachment--incoming { border-color: rgba(0, 0, 0, 0.2); } .dark-theme .module-message__audio-attachment--with-content-below.module-message__audio-attachment--incoming { border-color: rgba(255, 255, 255, 0.2); } .module-message__container--outgoing .module-message__audio-attachment--with-content-below { border-color: rgba(255, 255, 255, 0.2); } .module-message__audio-attachment--with-content-above { margin-top: 6px; } .module-message__audio-attachment__controls { display: flex; flex: 1; margin-inline-end: 4px; } .module-message__audio-attachment__dot { display: flex; align-items: center; justify-content: flex-start; transition: width 100ms ease-out; width: 14px; } .module-message__audio-attachment__dot:before { content: ""; display: block; width: 6px; height: 6px; border-radius: 100%; } .module-message__audio-attachment--incoming .module-message__audio-attachment__dot:before { background: #5e5e5e; } .dark-theme .module-message__audio-attachment--incoming .module-message__audio-attachment__dot:before { background: #b9b9b9; } .module-message__audio-attachment--outgoing .module-message__audio-attachment__dot--unplayed:before { background: rgba(255, 255, 255, 0.8); } .module-message__audio-attachment__waveform { flex-shrink: 0; display: flex; align-items: center; cursor: pointer; outline: 0; } .keyboard-mode .PlaybackButton:focus, .keyboard-mode .PlaybackRateButton:focus, .keyboard-mode .module-message__audio-attachment__waveform:focus { outline: 2px solid #2c6bed; } .keyboard-mode .module-message__audio-attachment--outgoing .PlaybackButton:focus, .keyboard-mode .module-message__audio-attachment--outgoing .PlaybackRateButton:focus, .keyboard-mode .module-message__audio-attachment--outgoing .module-message__audio-attachment__waveform:focus { outline: 2px solid rgba(255, 255, 255, 0.6); } .module-message__audio-attachment__metadata { display: flex; flex-direction: row; justify-content: space-between; align-items: center; } @media (min-width: 0px) and (max-width: 799px) { .module-message__audio-attachment__metadata { margin-inline-start: 40px; } } .module-message__audio-attachment__countdown { font-size: 11px; line-height: 14px; letter-spacing: 0.06px; width: 36px; user-select: none; text-align: center; white-space: nowrap; margin-inline-end: 12px; } .module-message__audio-attachment--incoming .module-message__audio-attachment__countdown { color: rgba(0, 0, 0, 0.6); } .module-message__audio-attachment--incoming .module-message__audio-attachment__countdown--unplayed:after { background: rgba(0, 0, 0, 0.6); } .dark-theme .module-message__audio-attachment--incoming .module-message__audio-attachment__countdown { color: rgba(255, 255, 255, 0.8); } .dark-theme .module-message__audio-attachment--incoming .module-message__audio-attachment__countdown--unplayed:after { background: rgba(255, 255, 255, 0.8); } .module-message__audio-attachment--outgoing .module-message__audio-attachment__countdown { color: rgba(255, 255, 255, 0.8); } .module-message__audio-attachment--outgoing .module-message__audio-attachment__countdown--unplayed:after { background: rgba(255, 255, 255, 0.8); } .MessageBody__highlight { font-weight: bold; } .MessageBody__download-body, .MessageBody__read-more { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .MessageBody__download-body, .MessageBody__read-more { border: 1px solid WindowText; } } .MessageBody__download-body, .MessageBody__read-more { font-weight: bold; } .keyboard-mode .MessageBody__download-body:focus, .keyboard-mode .MessageBody__read-more:focus { border: 1px solid #000000; outline: none; } .MessageBody__message-too-long { font-weight: bold; } .MessageBody__at-mention { border-radius: 4px; cursor: pointer; display: inline-block; padding-inline: 4px; border: 1px solid transparent; } .MessageBody__at-mention { background-color: #c6c6c6; } .dark-theme .MessageBody__at-mention { background-color: rgba(0, 0, 0, 0.4); } .MessageBody__at-mention:focus { border: 1px solid #000000; outline: none; } .MessageBody__at-mention--incoming { background-color: #c6c6c6; } .dark-theme .MessageBody__at-mention--incoming { background-color: #5e5e5e; } .MessageBody__at-mention--outgoing { background-color: rgba(0, 0, 0, 0.4); } .MessageBody__at-mention--invisible { visibility: hidden; } .MessageBody__author { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; font-weight: 500; } .MessageRequestActionsConfirmation__ModalHost__width-container { min-width: 480px; } .MessageTextRenderer__formatting--monospace { font-family: "SF Mono", SFMono-Regular, ui-monospace, "DejaVu Sans Mono", Menlo, Consolas, monospace; } .MessageTextRenderer__formatting--keywordHighlight { color: #000000; } .dark-theme .MessageTextRenderer__formatting--keywordHighlight { color: #ffffff; } .MessageTextRenderer__formatting--spoiler { cursor: pointer; position: relative; opacity: 50%; border-radius: 4px; color: transparent; outline: none; } .keyboard-mode .MessageTextRenderer__formatting--spoiler:focus { box-shadow: 0 0 0px 1px #2c6bed; } .MessageTextRenderer__formatting--spoiler--noninteractive { cursor: inherit; box-shadow: none; } .MessageTextRenderer__formatting--spoiler-StoryViewer { background-color: #ffffff; } .MessageTextRenderer__formatting--spoiler-MediaEditor { background-color: #dedede; } .MessageTextRenderer__formatting--spoiler-ConversationList, .MessageTextRenderer__formatting--spoiler-SearchResult, .MessageTextRenderer__formatting--spoiler-PinnedMessagesBar { background-color: #5e5e5e; } .dark-theme .MessageTextRenderer__formatting--spoiler-ConversationList, .dark-theme .MessageTextRenderer__formatting--spoiler-SearchResult, .dark-theme .MessageTextRenderer__formatting--spoiler-PinnedMessagesBar { background-color: #b9b9b9; } .MessageTextRenderer__formatting--spoiler-Quote { background-color: #1b1b1b; } .dark-theme .MessageTextRenderer__formatting--spoiler-Quote { background-color: #e9e9e9; } .MessageTextRenderer__formatting--spoiler-Timeline--incoming { background-color: #1b1b1b; } .dark-theme .MessageTextRenderer__formatting--spoiler-Timeline--incoming { background-color: #e9e9e9; } .MessageTextRenderer__formatting--spoiler-Timeline--outgoing { background-color: rgba(255, 255, 255, 0.9); } .dark-theme .MessageTextRenderer__formatting--spoiler-Timeline--outgoing { background-color: rgba(255, 255, 255, 0.9); } .MessageTextRenderer__formatting--invisible { visibility: hidden; } .module-message-detail { max-width: 650px; margin-inline: auto; padding: 20px; outline: none; } .module-message-detail__message-container { padding-top: 20px; padding-bottom: 20px; } .module-message-detail__message-container::after { content: "."; visibility: hidden; display: block; height: 0; clear: both; } .module-message-detail__label { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; min-width: 72px; padding-inline-end: 1em; } .module-message-detail__unix-timestamp { color: #e9e9e9; } .dark-theme .module-message-detail__unix-timestamp { color: #848484; } .module-message-detail__contact-group__header { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; align-items: center; display: flex; justify-content: space-between; margin-top: 24px; padding-block: 10px; padding-inline: 0; user-select: none; } .module-message-detail__contact-group__header:first-child { margin-top: 36px; } .module-message-detail__contact-group__header--Failed:after, .module-message-detail__contact-group__header--Viewed:after, .module-message-detail__contact-group__header--Read:after, .module-message-detail__contact-group__header--Delivered:after, .module-message-detail__contact-group__header--Sent:after, .module-message-detail__contact-group__header--Pending:after { content: ""; display: block; flex-shrink: 0; height: 12px; margin-inline-start: 10px; } .module-message-detail__contact-group__header--Failed:after { width: 12px; } .module-message-detail__contact-group__header--Failed:after { -webkit-mask: url("../images/icons/v3/error/error-circle-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #f44336; } @media (forced-colors: active) { .module-message-detail__contact-group__header--Failed:after { background-color: WindowText; } } .dark-theme .module-message-detail__contact-group__header--Failed:after { -webkit-mask: url("../images/icons/v3/error/error-circle-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #f44336; } @media (forced-colors: active) { .dark-theme .module-message-detail__contact-group__header--Failed:after { background-color: WindowText; } } .module-message-detail__contact-group__header--Viewed:after, .module-message-detail__contact-group__header--Read:after { width: 18px; } .module-message-detail__contact-group__header--Viewed:after, .module-message-detail__contact-group__header--Read:after { -webkit-mask: url("../images/icons/v3/message_status/messagestatus-read.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .module-message-detail__contact-group__header--Viewed:after, .module-message-detail__contact-group__header--Read:after { background-color: WindowText; } } .dark-theme .module-message-detail__contact-group__header--Viewed:after, .dark-theme .module-message-detail__contact-group__header--Read:after { -webkit-mask: url("../images/icons/v3/message_status/messagestatus-read.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .dark-theme .module-message-detail__contact-group__header--Viewed:after, .dark-theme .module-message-detail__contact-group__header--Read:after { background-color: WindowText; } } .module-message-detail__contact-group__header--Delivered:after { width: 18px; } .module-message-detail__contact-group__header--Delivered:after { -webkit-mask: url("../images/icons/v3/message_status/messagestatus-delivered.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .module-message-detail__contact-group__header--Delivered:after { background-color: WindowText; } } .dark-theme .module-message-detail__contact-group__header--Delivered:after { -webkit-mask: url("../images/icons/v3/message_status/messagestatus-delivered.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .dark-theme .module-message-detail__contact-group__header--Delivered:after { background-color: WindowText; } } .module-message-detail__contact-group__header--Sent:after { width: 12px; } .module-message-detail__contact-group__header--Sent:after { -webkit-mask: url("../images/icons/v3/message_status/messagestatus-sent.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .module-message-detail__contact-group__header--Sent:after { background-color: WindowText; } } .dark-theme .module-message-detail__contact-group__header--Sent:after { -webkit-mask: url("../images/icons/v3/message_status/messagestatus-sent.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .dark-theme .module-message-detail__contact-group__header--Sent:after { background-color: WindowText; } } .module-message-detail__contact-group__header--Pending:after { width: 12px; animation: rotate 4s linear infinite; } .module-message-detail__contact-group__header--Pending:after { -webkit-mask: url("../images/icons/v3/message_status/messagestatus-sending.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .module-message-detail__contact-group__header--Pending:after { background-color: WindowText; } } .dark-theme .module-message-detail__contact-group__header--Pending:after { -webkit-mask: url("../images/icons/v3/message_status/messagestatus-sending.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .dark-theme .module-message-detail__contact-group__header--Pending:after { background-color: WindowText; } } .module-message-detail__contact { margin-bottom: 8px; padding-block: 8px; padding-inline: 0; display: flex; flex-direction: row; align-items: center; } .module-message-detail__contact:last-child { margin-bottom: 0; } .module-message-detail__contact__text { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; flex-grow: 1; margin-inline-start: 10px; } .module-message-detail__contact__error { color: #f44336; font-weight: bold; } .module-message-detail__contact__unidentified-delivery-icon { margin-inline-start: 6px; width: 18px; height: 18px; display: inline-block; } .module-message-detail__contact__unidentified-delivery-icon { -webkit-mask: url("../images/icons/v2/unidentified-delivery-solid-20.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .module-message-detail__contact__unidentified-delivery-icon { background-color: WindowText; } } .dark-theme .module-message-detail__contact__unidentified-delivery-icon { -webkit-mask: url("../images/icons/v2/unidentified-delivery-solid-20.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .dark-theme .module-message-detail__contact__unidentified-delivery-icon { background-color: WindowText; } } .module-message-detail__contact__error-buttons { text-align: end; } .module-message-detail__contact__show-safety-number { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-message-detail__contact__show-safety-number { border: 1px solid WindowText; } } .module-message-detail__contact__show-safety-number { padding: 4px; border-radius: 4px; color: #ffffff; } .module-message-detail__contact__show-safety-number { background-color: #848484; } .dark-theme .module-message-detail__contact__show-safety-number { background-color: #b9b9b9; } .module-message-detail__contact__send-anyway { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-message-detail__contact__send-anyway { border: 1px solid WindowText; } } .module-message-detail__contact__send-anyway { margin-inline-start: 5px; margin-top: 5px; padding: 4px; border-radius: 4px; color: #ffffff; background-color: #f44336; } .module-message-detail__status-timestamp { margin-inline-start: 6px; } .MiniPlayer { position: absolute; top: 0; inset-inline: 0; z-index: 4; display: flex; align-items: center; gap: 18px; padding-block: 8px; padding-inline: 16px; margin-top: calc(52px + var(--title-bar-drag-area-height)); text-align: start; } .MiniPlayer { background-color: #f6f6f6; } .dark-theme .MiniPlayer { background-color: #3b3b3b; } .MiniPlayer--flow { margin-top: 0; position: relative; } .MiniPlayer__playback-button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .MiniPlayer__playback-button { border: 1px solid WindowText; } } .MiniPlayer__playback-button::before { display: block; width: 14px; height: 14px; content: ""; } .MiniPlayer__playback-button--play::before { -webkit-mask: url("../images/icons/v3/play/play-fill.svg") no-repeat center; background-color: #5e5e5e; } @media (forced-colors: active) { .MiniPlayer__playback-button--play::before { background-color: WindowText; } } .MiniPlayer__playback-button--play::before { -webkit-mask-size: 100%; } .MiniPlayer__playback-button--pause::before { -webkit-mask: url("../images/icons/v3/pause/pause-fill.svg") no-repeat center; background-color: #5e5e5e; } @media (forced-colors: active) { .MiniPlayer__playback-button--pause::before { background-color: WindowText; } } .MiniPlayer__playback-button--pause::before { -webkit-mask-size: 100%; } .MiniPlayer__playback-button--pending::before { -webkit-mask: url("../images/icons/v2/audio-spinner-arc-22.svg") no-repeat center; background-color: #5e5e5e; } @media (forced-colors: active) { .MiniPlayer__playback-button--pending::before { background-color: WindowText; } } .MiniPlayer__playback-button--pending::before { -webkit-mask-size: 100%; } .dark-theme .MiniPlayer__playback-button--play::before { -webkit-mask: url("../images/icons/v3/play/play-fill.svg") no-repeat center; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .MiniPlayer__playback-button--play::before { background-color: WindowText; } } .dark-theme .MiniPlayer__playback-button--play::before { -webkit-mask-size: 100%; } .dark-theme .MiniPlayer__playback-button--pause::before { -webkit-mask: url("../images/icons/v3/pause/pause-fill.svg") no-repeat center; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .MiniPlayer__playback-button--pause::before { background-color: WindowText; } } .dark-theme .MiniPlayer__playback-button--pause::before { -webkit-mask-size: 100%; } .dark-theme .MiniPlayer__playback-button--pending::before { -webkit-mask: url("../images/icons/v2/audio-spinner-arc-22.svg") no-repeat center; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .MiniPlayer__playback-button--pending::before { background-color: WindowText; } } .dark-theme .MiniPlayer__playback-button--pending::before { -webkit-mask-size: 100%; } .MiniPlayer__playback-button--pending::before { animation: rotate 1000ms linear infinite; } .MiniPlayer__state { flex: 1; } .MiniPlayer__middot { padding-block: 0; padding-inline: 5px; } .MiniPlayer__close-button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .MiniPlayer__close-button { border: 1px solid WindowText; } } .MiniPlayer__close-button { border-radius: 4px; height: 16px; width: 16px; } .MiniPlayer__close-button::before { content: ""; display: block; width: 100%; height: 100%; } .MiniPlayer__close-button::before { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .MiniPlayer__close-button::before { background-color: WindowText; } } .dark-theme .MiniPlayer__close-button::before { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .MiniPlayer__close-button::before { background-color: WindowText; } } .MiniPlayer__close-button:hover, .MiniPlayer__close-button:focus { background: #f6f6f6; } .MiniPlayer__close-button:active { background: #e9e9e9; } .dark-theme .MiniPlayer__close-button:hover, .dark-theme .MiniPlayer__close-button:focus { background: #2e2e2e; } .dark-theme .MiniPlayer__close-button:active { background: #3b3b3b; } .module-Modal { box-shadow: 0px 8px 20px rgba(0, 0, 0, 0.3), 0px 0px 8px rgba(0, 0, 0, 0.05); } @media (forced-colors: active) { .module-Modal { border: 1px solid WindowText; } } .module-Modal { border-radius: 8px; overflow: hidden; max-height: 89vh; display: flex; flex-direction: column; } .module-Modal { background: #ffffff; color: #1b1b1b; } .dark-theme .module-Modal { background: #2e2e2e; color: #e9e9e9; } .module-Modal__header--with-back-button .module-Modal__title { text-align: center; } .module-Modal__headerTitle { align-items: center; display: flex; justify-content: space-between; padding-block: 16px 1em; padding-inline: 16px; } .module-Modal__title { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; margin: 0; padding: 0; flex: 1; } .module-Modal__back-button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-Modal__back-button { border: 1px solid WindowText; } } .module-Modal__back-button { border-radius: 4px; height: 20px; width: 20px; } .module-Modal__back-button::before { content: ""; display: block; width: 100%; height: 100%; } .module-Modal__back-button::before { -webkit-mask: url("../images/icons/v3/chevron/chevron-left.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .module-Modal__back-button::before { background-color: WindowText; } } :dir(rtl) .module-Modal__back-button::before { -webkit-mask: url("../images/icons/v3/chevron/chevron-right.svg") no-repeat center; } .dark-theme .module-Modal__back-button::before { -webkit-mask: url("../images/icons/v3/chevron/chevron-left.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .module-Modal__back-button::before { background-color: WindowText; } } :dir(rtl) .dark-theme .module-Modal__back-button::before { -webkit-mask: url("../images/icons/v3/chevron/chevron-right.svg") no-repeat center; } .module-Modal__back-button:hover, .module-Modal__back-button:focus { box-shadow: 0 0 0 2px #2c6bed; } .module-Modal__close-button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-Modal__close-button { border: 1px solid WindowText; } } .module-Modal__close-button { border-radius: 4px; height: 20px; width: 20px; } .module-Modal__close-button::before { content: ""; display: block; width: 100%; height: 100%; } .module-Modal__close-button::before { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .module-Modal__close-button::before { background-color: WindowText; } } .dark-theme .module-Modal__close-button::before { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .module-Modal__close-button::before { background-color: WindowText; } } .module-Modal__close-button:hover, .module-Modal__close-button:focus { box-shadow: 0 0 0 2px #2c6bed; } .module-Modal__body { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; margin: 0; overflow-y: auto; overflow-x: auto; transition: border-color 150ms ease-in-out; } .module-Modal__body:not(:hover, :focus-within) { scrollbar-color: transparent transparent; } .module-Modal--padded .module-Modal__body { padding: 16px; } .module-Modal--padded .module-Modal__body .module-Modal__button-footer { padding-block: 1em 0; padding-inline: 0; } .module-Modal--has-header.module-Modal--header-divider .module-Modal__body { border-top-color: #e9e9e9; } .dark-theme .module-Modal--has-header.module-Modal--header-divider .module-Modal__body { border-top-color: #1b1b1b; } .module-Modal--has-header .module-Modal__body { padding-top: 0; border-top: 1px solid transparent; border-bottom: 1px solid transparent; } .module-Modal--has-header .module-Modal__body--scrollVerticalOverflow:not(.module-Modal--has-header .module-Modal__body--scrollAtTop) { border-top-color: #e9e9e9; } .dark-theme .module-Modal--has-header .module-Modal__body--scrollVerticalOverflow:not(.module-Modal--has-header .module-Modal__body--scrollAtTop) { border-top-color: #1b1b1b; } .module-Modal--has-footer.module-Modal--footer-divider .module-Modal__body { border-bottom-color: #e9e9e9; } .dark-theme .module-Modal--has-footer.module-Modal--footer-divider .module-Modal__body { border-bottom-color: #1b1b1b; } .module-Modal--has-footer .module-Modal__body { border-bottom: 1px solid transparent; } .module-Modal--has-footer .module-Modal__body--scrollVerticalOverflow:not(.module-Modal--has-footer .module-Modal__body--scrollAtBottom) { border-bottom-color: #e9e9e9; } .dark-theme .module-Modal--has-footer .module-Modal__body--scrollVerticalOverflow:not(.module-Modal--has-footer .module-Modal__body--scrollAtBottom) { border-bottom-color: #1b1b1b; } .module-Modal__button-footer { display: flex; flex-wrap: wrap; justify-content: flex-end; align-items: center; padding-block: 1em 16px; padding-inline: 16px; gap: 8px; } .module-Modal__button-footer .module-Button:not(:first-child) { margin-inline-start: 4px; } .module-Modal__button-footer--one-button-per-line { flex-direction: column; align-items: flex-end; } .module-Modal--important { padding-block: 10px 16px; padding-inline: 12px; } .module-Modal--important .module-Modal__header { align-items: start; padding: 0; } .module-Modal--important .module-Modal__body { padding-block: 0 4px !important; padding-inline: 12px !important; } .module-Modal--important .module-Modal__body p { margin-block: 0 20px; margin-inline: 0; } .module-Modal--important .module-Modal__title { font-weight: 600; font-size: 20px; line-height: 26px; letter-spacing: -0.34px; text-align: center; margin-block: 10px 22px; margin-inline: 0; flex-shrink: 0; } .module-Modal--important .module-Modal__title--with-x-button { margin-block-start: 22px; } .module-Modal--important .module-Modal__button-footer { justify-content: center; margin-top: 27px; flex-grow: 0; flex-shrink: 0; padding-block: 0 4px; padding-inline: 12px; } .module-Modal--important .module-Modal__button-footer .module-Button { flex-grow: 1; max-width: 152px; } .module-Modal--important .module-Modal__button-footer .module-Button:not(:first-child) { margin-inline-start: 16px; } .MyStories__distribution__title { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; margin-block: 24px 8px; margin-inline: 10px; } .MyStories__distribution__title { color: #1b1b1b; } .dark-theme .MyStories__distribution__title { color: #e9e9e9; } .MyStories__story-button { flex: 1; } .MyStories__story { align-items: center; border-radius: 10px; display: flex; height: 96px; padding-inline-end: 10px; } .MyStories__story:hover { background: #dedede; } .dark-theme .MyStories__story:hover { background: #4a4a4a; } .MyStories__story:hover .MyStories__story__download, .MyStories__story:hover .MyStories__story__more__button { background: #c6c6c6; } .dark-theme .MyStories__story:hover .MyStories__story__download, .dark-theme .MyStories__story:hover .MyStories__story__more__button { background: #5e5e5e; } .MyStories__story__details { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; display: flex; flex-direction: column; flex: 1; margin-inline-start: 12px; } .MyStories__story__details { color: #1b1b1b; } .dark-theme .MyStories__story__details { color: #e9e9e9; } .MyStories__story__details__failed { align-items: center; display: flex; } .MyStories__story__details__failed::before { content: ""; display: block; height: 12px; margin-inline-end: 12px; width: 12px; } .MyStories__story__details__failed::before { -webkit-mask: url("../images/icons/v3/error/error-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #f44336; } @media (forced-colors: active) { .MyStories__story__details__failed::before { background-color: WindowText; } } .MyStories__story__details__failed__button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .MyStories__story__details__failed__button { border: 1px solid WindowText; } } .MyStories__story__details__failed__button { font-size: 12px; line-height: 16px; letter-spacing: 0; } .MyStories__story__details__failed__button { color: #1b1b1b; } .dark-theme .MyStories__story__details__failed__button { color: #b9b9b9; } .MyStories__story__timestamp { font-weight: normal; } .MyStories__story__timestamp { color: #1b1b1b; } .dark-theme .MyStories__story__timestamp { color: #b9b9b9; } .MyStories__story__download { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .MyStories__story__download { border: 1px solid WindowText; } } .MyStories__story__download { align-items: center; border-radius: 100%; display: flex; height: 28px; justify-content: center; width: 28px; } .MyStories__story__download { background: #c6c6c6; } .dark-theme .MyStories__story__download { background: #4a4a4a; } .MyStories__story__download::after { content: ""; height: 18px; width: 18px; } .MyStories__story__download::after { -webkit-mask: url("../images/icons/v3/save/save-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .MyStories__story__download::after { background-color: WindowText; } } .dark-theme .MyStories__story__download::after { -webkit-mask: url("../images/icons/v3/save/save-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .MyStories__story__download::after { background-color: WindowText; } } .MyStories__story__download:hover { background: #ffffff !important; } .dark-theme .MyStories__story__download:hover { background: #3b3b3b !important; } .MyStories__story__more__button { align-items: center; border-radius: 100%; display: flex; height: 28px; justify-content: center; margin-inline-start: 16px; width: 28px; } .MyStories__story__more__button { background: #dedede; } .dark-theme .MyStories__story__more__button { background: #4a4a4a; } .MyStories__story__more__button::after { content: ""; height: 18px; width: 18px; } .MyStories__story__more__button::after { -webkit-mask: url("../images/icons/v3/more/more-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .MyStories__story__more__button::after { background-color: WindowText; } } .dark-theme .MyStories__story__more__button::after { -webkit-mask: url("../images/icons/v3/more/more-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .MyStories__story__more__button::after { background-color: WindowText; } } .MyStories__story__more__button:hover { background: #ffffff !important; } .dark-theme .MyStories__story__more__button:hover { background: #3b3b3b !important; } .MyStories__icon--forward { -webkit-mask: url("../images/icons/v3/forward/forward-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .MyStories__icon--forward { background-color: WindowText; } } .dark-theme .MyStories__icon--forward { -webkit-mask: url("../images/icons/v3/forward/forward-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .dark-theme .MyStories__icon--forward { background-color: WindowText; } } .MyStories__icon--delete { -webkit-mask: url("../images/icons/v3/trash/trash-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .MyStories__icon--delete { background-color: WindowText; } } .dark-theme .MyStories__icon--delete { -webkit-mask: url("../images/icons/v3/trash/trash-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .dark-theme .MyStories__icon--delete { background-color: WindowText; } } .MyStories__avatar-container { position: relative; } .MyStories__avatar__add-story { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .MyStories__avatar__add-story { border: 1px solid WindowText; } } .MyStories__avatar__add-story { border-radius: 9999px; align-items: center; background: #406ec9; border: 2px solid; bottom: -2px; display: flex; height: 20px; justify-content: center; position: absolute; inset-inline-end: -4px; width: 20px; z-index: 1; } .MyStories__avatar__add-story { border-color: #f0f0f0; } .dark-theme .MyStories__avatar__add-story { border-color: #2e2e2e; } .MyStories__avatar__add-story::after { content: ""; height: 12px; width: 12px; } .MyStories__avatar__add-story::after { -webkit-mask: url("../images/icons/v3/plus/plus-compact-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .MyStories__avatar__add-story::after { background-color: WindowText; } } .StoryListItem__button:hover .MyStories__avatar__add-story, .StoryListItem__button--active .MyStories__avatar__add-story { border-color: #dedede; } .dark-theme .StoryListItem__button:hover .MyStories__avatar__add-story, .dark-theme .StoryListItem__button--active .MyStories__avatar__add-story { border-color: #4a4a4a; } .NavSidebar { position: relative; height: 100%; display: flex; flex-direction: column; flex-shrink: 0; padding-top: var(--title-bar-drag-area-height); user-select: none; } .NavSidebar { background-color: #f0f0f0; border-inline-end: 1px solid rgba(0, 0, 0, 0.16); } .dark-theme .NavSidebar { background-color: #2e2e2e; border-inline-end: 1px solid rgba(255, 255, 255, 0.16); } .NavSidebar__Header { display: flex; align-items: start; flex-shrink: 0; padding-bottom: 6px; -webkit-app-region: drag; } body.context-menu-open .NavSidebar__Header { -webkit-app-region: no-drag; } .NavSidebar__Header .NavTabs__Toggle { width: 80px; } .NavSidebar--narrow .NavSidebar__Header { flex-direction: column; align-items: center; } .NavSidebar__HeaderContent { display: flex; width: 100%; flex: 1; align-items: center; justify-content: center; padding-block: 12px; padding-inline: 24px; } .NavSidebar--narrow .NavSidebar__HeaderContent { padding-inline: 0; } .NavSidebar__HeaderContent--navTabsCollapsed:not(.NavSidebar__HeaderContent--withBackButton) { padding-inline-start: 0; } .NavSidebar__HeaderContent--withBackButton { padding-inline-start: 16px; } .NavSidebar__HeaderTitle { flex: 1 1 0%; margin: 0; font-weight: 600; font-size: 18px; line-height: 25px; letter-spacing: -0.25px; line-height: 20px; } .NavSidebar--narrow .NavSidebar__HeaderTitle { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border-width: 0; } .NavSidebar__HeaderTitle--withBackButton { text-align: center; font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; } .NavSidebar__BackButton { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .NavSidebar__BackButton { border: 1px solid WindowText; } } .NavSidebar__BackButton { margin-block: -4px; padding: 4px; border-radius: 4px; } .NavSidebar__BackButton:hover { background: #c6c6c6; } .dark-theme .NavSidebar__BackButton:hover { background: #545454; } .NavSidebar__BackButton:focus { outline: none; } .keyboard-mode .NavSidebar__BackButton:focus { box-shadow: 0 0 0 2px #2c6bed; } .NavSidebar__BackButton::before { content: ""; display: block; width: 20px; height: 20px; } .NavSidebar__BackButton::before { -webkit-mask: url("../images/icons/v3/chevron/chevron-left.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .NavSidebar__BackButton::before { background-color: WindowText; } } :dir(rtl) .NavSidebar__BackButton::before { -webkit-mask: url("../images/icons/v3/chevron/chevron-right.svg") no-repeat center; } .dark-theme .NavSidebar__BackButton::before { -webkit-mask: url("../images/icons/v3/chevron/chevron-left.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .NavSidebar__BackButton::before { background-color: WindowText; } } :dir(rtl) .dark-theme .NavSidebar__BackButton::before { -webkit-mask: url("../images/icons/v3/chevron/chevron-right.svg") no-repeat center; } .NavSidebar__BackButtonLabel { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border-width: 0; } .NavSidebar .module-SearchInput__container { margin: 0; } .NavSidebar__Content { flex: 1 1 0%; min-height: 0; display: flex; flex-direction: column; } .NavSidebar__DragHandle { position: absolute; z-index: 3; top: 0; bottom: 0; inset-inline-start: 100%; width: 8px; background: transparent; cursor: col-resize; touch-action: none; } .NavSidebar__DragHandle:focus { outline: none; } .keyboard-mode .NavSidebar__DragHandle:focus { box-shadow: inset 0 0 0 2px #2c6bed; } .NavSidebar__DragHandle--dragging { background-color: rgba(0, 0, 0, 0.12); } .dark-theme .NavSidebar__DragHandle--dragging { background-color: rgba(255, 255, 255, 0.12); } .NavSidebar__document--draggingHandle { cursor: col-resize; } .NavSidebar__HeaderActions { display: flex; gap: 8px; margin-block: -4px; align-items: center; justify-content: center; } .NavSidebar--narrow .NavSidebar__HeaderActions { flex-direction: column; } .NavSidebar__ActionButton { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .NavSidebar__ActionButton { border: 1px solid WindowText; } } .NavSidebar__ActionButton { padding: 4px; border-radius: 4px; } .NavSidebar__ActionButton:hover, .NavSidebar__ActionButton:focus { background-color: rgba(0, 0, 0, 0.06); } .dark-theme .NavSidebar__ActionButton:hover, .dark-theme .NavSidebar__ActionButton:focus { background-color: rgba(255, 255, 255, 0.06); } .NavSidebar__ActionButton:active { background: #c6c6c6; } .dark-theme .NavSidebar__ActionButton:active { background: #545454; } .NavSidebar__ActionButton:focus { outline: none; } .keyboard-mode .NavSidebar__ActionButton:focus { box-shadow: 0 0 0 2px #2c6bed; } .NavSidebar__ActionButtonLabel { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border-width: 0; } .NavSidebarSearchHeader { display: flex; margin-inline: 16px; margin-bottom: 8px; gap: 12px; } .NavSidebarSearchHeader .module-SearchInput__container { flex: 1 0 0; } .NavSidebarEmpty { position: absolute; top: 0; inset-inline-start: 0; pointer-events: none; align-items: center; display: flex; width: 100%; height: 100%; justify-content: center; padding-block: 0; padding-inline: 32px; text-align: center; } .module-left-pane--width-narrow .NavSidebarEmpty { display: none; } .NavSidebarEmpty__inner { padding-block: 100px 28px; } .NavSidebarEmpty__title { margin-block: 0px 6px; font-weight: 600; font-size: 18px; line-height: 25px; letter-spacing: -0.25px; color: #848484; } .NavSidebarEmpty__subtitle { margin-block: 0; color: #848484; } .NavTabs__Container { position: relative; z-index: 0; display: flex; width: 100%; height: 100%; } .NavTabs { display: flex; flex-shrink: 0; flex-direction: column; align-items: center; width: 80px; height: 100%; padding-top: var(--title-bar-drag-area-height); padding-bottom: 8px; } .NavTabs { background-color: #f0f0f0; border-inline-end: 1px solid rgba(0, 0, 0, 0.16); } .dark-theme .NavTabs { background-color: #2e2e2e; border-inline-end: 1px solid rgba(255, 255, 255, 0.16); } .NavTabs--collapsed { display: none; } .NavTabs__Item { width: 100%; padding-block: 2px; padding-inline: 10px; border: none; background: transparent; cursor: pointer; } .NavTabs__Item:focus { outline: none; } .NavTabs__Item.NavTabs__Toggle { padding-block: 8px; } .NavTabs__ItemButton { position: relative; display: flex; align-items: center; justify-content: center; padding-block: 10px; border-radius: 8px; } .NavTabs__Item:hover .NavTabs__ItemButton, .NavTabs__Item:focus .NavTabs__ItemButton { background-color: rgba(0, 0, 0, 0.06); } .dark-theme .NavTabs__Item:hover .NavTabs__ItemButton, .dark-theme .NavTabs__Item:focus .NavTabs__ItemButton { background-color: rgba(255, 255, 255, 0.06); } .NavTabs__Item:focus .NavTabs__ItemButton { outline: none; } .keyboard-mode .NavTabs__Item:focus .NavTabs__ItemButton { box-shadow: 0 0 0 2px #2c6bed; } .NavTabs__Item:active .NavTabs__ItemButton, .NavTabs__Item[aria-selected=true] .NavTabs__ItemButton { background: #c6c6c6; } .dark-theme .NavTabs__Item:active .NavTabs__ItemButton, .dark-theme .NavTabs__Item[aria-selected=true] .NavTabs__ItemButton { background: #545454; } .NavTabs__Toggle .NavTabs__ItemButton { width: fit-content; padding: 4px; margin-block: 0; margin-inline: auto; border-radius: 4px; } .NavTabs__Item--Profile .NavTabs__ItemButton { padding-block: 6px; } .NavTabs__ItemContent { display: inline-flex; position: relative; } .NavTabs__ItemLabel { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border-width: 0; } .NavTabs__ItemUnreadBadge { border-radius: 9999px; align-items: center; background-color: #f44336; color: #ffffff; display: flex; font-size: 10px; height: 16px; justify-content: center; min-width: 16px; overflow: hidden; padding-block: 0; padding-inline: 2px; position: absolute; inset-inline-end: -6px; top: -4px; user-select: none; z-index: 1; word-break: keep-all; } .NavTabs__ItemUpdateBadge { background: #2c6bed; border-radius: 100%; height: 8px; width: 8px; position: absolute; top: 0; inset-inline-end: 0; } .NavTabs__ItemUpdateBadge { border: 1px solid #ffffff; } .dark-theme .NavTabs__ItemUpdateBadge { border: 1px solid #2e2e2e; } .NavTabs__ItemIcon { display: block; width: 20px; height: 20px; } .NavTabs__ItemIcon--Menu { -webkit-mask: url("../images/icons/v3/menu/menu.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .NavTabs__ItemIcon--Menu { background-color: WindowText; } } .dark-theme .NavTabs__ItemIcon--Menu { -webkit-mask: url("../images/icons/v3/menu/menu.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .NavTabs__ItemIcon--Menu { background-color: WindowText; } } .NavTabs__ItemIcon--Settings { -webkit-mask: url("../images/icons/v3/settings/settings.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .NavTabs__ItemIcon--Settings { background-color: WindowText; } } .dark-theme .NavTabs__ItemIcon--Settings { -webkit-mask: url("../images/icons/v3/settings/settings.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .NavTabs__ItemIcon--Settings { background-color: WindowText; } } .NavTabs__Item:active .NavTabs__ItemIcon--Settings, .NavTabs__Item[aria-selected=true] .NavTabs__ItemIcon--Settings { -webkit-mask: url("../images/icons/v3/settings/settings-fill.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .NavTabs__Item:active .NavTabs__ItemIcon--Settings, .NavTabs__Item[aria-selected=true] .NavTabs__ItemIcon--Settings { background-color: WindowText; } } .dark-theme .NavTabs__Item:active .NavTabs__ItemIcon--Settings, .dark-theme .NavTabs__Item[aria-selected=true] .NavTabs__ItemIcon--Settings { -webkit-mask: url("../images/icons/v3/settings/settings-fill.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .NavTabs__Item:active .NavTabs__ItemIcon--Settings, .dark-theme .NavTabs__Item[aria-selected=true] .NavTabs__ItemIcon--Settings { background-color: WindowText; } } .NavTabs__ItemIcon--Chats { -webkit-mask: url("../images/icons/v3/chat/chat.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .NavTabs__ItemIcon--Chats { background-color: WindowText; } } .dark-theme .NavTabs__ItemIcon--Chats { -webkit-mask: url("../images/icons/v3/chat/chat.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .NavTabs__ItemIcon--Chats { background-color: WindowText; } } .NavTabs__Item:active .NavTabs__ItemIcon--Chats, .NavTabs__Item[aria-selected=true] .NavTabs__ItemIcon--Chats { -webkit-mask: url("../images/icons/v3/chat/chat-fill.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .NavTabs__Item:active .NavTabs__ItemIcon--Chats, .NavTabs__Item[aria-selected=true] .NavTabs__ItemIcon--Chats { background-color: WindowText; } } .dark-theme .NavTabs__Item:active .NavTabs__ItemIcon--Chats, .dark-theme .NavTabs__Item[aria-selected=true] .NavTabs__ItemIcon--Chats { -webkit-mask: url("../images/icons/v3/chat/chat-fill.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .NavTabs__Item:active .NavTabs__ItemIcon--Chats, .dark-theme .NavTabs__Item[aria-selected=true] .NavTabs__ItemIcon--Chats { background-color: WindowText; } } .NavTabs__ItemIcon--Calls { -webkit-mask: url("../images/icons/v3/phone/phone.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .NavTabs__ItemIcon--Calls { background-color: WindowText; } } .dark-theme .NavTabs__ItemIcon--Calls { -webkit-mask: url("../images/icons/v3/phone/phone.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .NavTabs__ItemIcon--Calls { background-color: WindowText; } } .NavTabs__Item:active .NavTabs__ItemIcon--Calls, .NavTabs__Item[aria-selected=true] .NavTabs__ItemIcon--Calls { -webkit-mask: url("../images/icons/v3/phone/phone-fill.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .NavTabs__Item:active .NavTabs__ItemIcon--Calls, .NavTabs__Item[aria-selected=true] .NavTabs__ItemIcon--Calls { background-color: WindowText; } } .dark-theme .NavTabs__Item:active .NavTabs__ItemIcon--Calls, .dark-theme .NavTabs__Item[aria-selected=true] .NavTabs__ItemIcon--Calls { -webkit-mask: url("../images/icons/v3/phone/phone-fill.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .NavTabs__Item:active .NavTabs__ItemIcon--Calls, .dark-theme .NavTabs__Item[aria-selected=true] .NavTabs__ItemIcon--Calls { background-color: WindowText; } } .NavTabs__ItemIcon--Stories { -webkit-mask: url("../images/icons/v3/stories/stories.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .NavTabs__ItemIcon--Stories { background-color: WindowText; } } .dark-theme .NavTabs__ItemIcon--Stories { -webkit-mask: url("../images/icons/v3/stories/stories.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .NavTabs__ItemIcon--Stories { background-color: WindowText; } } .NavTabs__Item:active .NavTabs__ItemIcon--Stories, .NavTabs__Item[aria-selected=true] .NavTabs__ItemIcon--Stories { -webkit-mask: url("../images/icons/v3/stories/stories-fill.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .NavTabs__Item:active .NavTabs__ItemIcon--Stories, .NavTabs__Item[aria-selected=true] .NavTabs__ItemIcon--Stories { background-color: WindowText; } } .dark-theme .NavTabs__Item:active .NavTabs__ItemIcon--Stories, .dark-theme .NavTabs__Item[aria-selected=true] .NavTabs__ItemIcon--Stories { -webkit-mask: url("../images/icons/v3/stories/stories-fill.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .NavTabs__Item:active .NavTabs__ItemIcon--Stories, .dark-theme .NavTabs__Item[aria-selected=true] .NavTabs__ItemIcon--Stories { background-color: WindowText; } } .NavTabs__ItemIconLabel { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border-width: 0; } .NavTabs__TabList { display: grid; grid-template-rows: [Chats] auto [Calls] auto [Stories] auto 1fr [Settings] auto; align-items: center; width: 100%; flex: 1; } .NavTabs__Item--Chats { grid-row: Chats; } .NavTabs__Item--Calls { grid-row: Calls; } .NavTabs__Item--Stories { grid-row: Stories; } .NavTabs__Item--Settings { grid-row: Settings; } .NavTabs__Misc { width: 100%; display: flex; flex-direction: column; align-items: center; } .NavTabs__TabPanel { position: relative; display: flex; flex: 1; min-width: 0; } .dark-theme .NavTabs__ContextMenuIcon--Settings { -webkit-mask: url("../images/icons/v3/settings/settings.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .dark-theme .NavTabs__ContextMenuIcon--Settings { background-color: WindowText; } } .NavTabs__ContextMenuIcon--Settings { -webkit-mask: url("../images/icons/v3/settings/settings.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .NavTabs__ContextMenuIcon--Settings { background-color: WindowText; } } .dark-theme .NavTabs__ContextMenuIcon--Update { -webkit-mask: url("../images/icons/v3/refresh/refresh.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .dark-theme .NavTabs__ContextMenuIcon--Update { background-color: WindowText; } } .NavTabs__ContextMenuIcon--Update { -webkit-mask: url("../images/icons/v3/refresh/refresh.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .NavTabs__ContextMenuIcon--Update { background-color: WindowText; } } .NotificationProfiles__NamePage__input { margin-top: 6px; margin-inline-start: 2px; } .NotificationProfiles__NamePage__container { max-width: 328px; margin-inline-start: auto; margin-inline-end: auto; width: 100%; margin-bottom: 12px; border-width: 1px; } .OutgoingGiftBadgeModal { text-align: center; } .OutgoingGiftBadgeModal__container { width: 420px; max-width: 420px; } .OutgoingGiftBadgeModal__title { font-weight: 600; font-size: 20px; line-height: 26px; letter-spacing: -0.34px; margin-top: 5px; } .OutgoingGiftBadgeModal__description { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; margin-top: 8px; margin-inline: auto; width: 328px; } .OutgoingGiftBadgeModal__badge { margin-top: 34px; height: 160px; width: 160px; } .OutgoingGiftBadgeModal__badge--missing { border-radius: 50%; margin-inline: auto; } .OutgoingGiftBadgeModal__badge--missing { background-color: #e9e9e9; } .dark-theme .OutgoingGiftBadgeModal__badge--missing { background-color: #5e5e5e; } .OutgoingGiftBadgeModal__badge-summary { margin-top: 16px; margin-bottom: 16px; font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; } .PermissionsPopup { align-items: center; display: flex; flex-direction: column; justify-content: center; padding: 16px; } .PermissionsPopup { background: #ffffff; color: #1b1b1b; } .dark-theme .PermissionsPopup { background: #121212; color: #e9e9e9; } .PermissionsPopup__body { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; } .PermissionsPopup__buttons { display: flex; justify-content: flex-end; margin-top: 12px; width: 100%; } .PermissionsPopup__buttons button { margin-inline-start: 16px; } .PlaybackButton { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .PlaybackButton { border: 1px solid WindowText; } } .PlaybackButton { position: relative; flex-shrink: 0; margin-inline-end: 12px; outline: none; border-radius: 18px; } .PlaybackButton::before { display: block; height: 100%; content: ""; } .PlaybackButton--variant-message { width: 36px; height: 36px; } .PlaybackButton--variant-mini { width: 14px; height: 14px; } .PlaybackButton--variant-mini::before { -webkit-mask-size: 100% !important; width: 16px !important; height: 16px !important; } .PlaybackButton--variant-draft { width: 18px; height: 18px; } .PlaybackButton--variant-draft::before { -webkit-mask-size: 100% !important; width: 10px !important; height: 10px !important; } .PlaybackButton--computing { cursor: auto; } .PlaybackButton__Spinner-container { position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); } .PlaybackButton.PlaybackButton--play::before { position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); } .PlaybackButton.PlaybackButton--play::before { -webkit-mask: url("../images/icons/v3/play/play-fill.svg") no-repeat center; background-color: var(--color-label-primary); } @media (forced-colors: active) { .PlaybackButton.PlaybackButton--play::before { background-color: WindowText; } } .PlaybackButton.PlaybackButton--play::before { height: 20px; width: 20px; } .PlaybackButton.PlaybackButton--pause::before { position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); } .PlaybackButton.PlaybackButton--pause::before { -webkit-mask: url("../images/icons/v3/pause/pause-fill.svg") no-repeat center; background-color: var(--color-label-primary); } @media (forced-colors: active) { .PlaybackButton.PlaybackButton--pause::before { background-color: WindowText; } } .PlaybackButton.PlaybackButton--pause::before { height: 20px; width: 20px; } .PlaybackButton.PlaybackButton--not-downloaded::before { position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); } .PlaybackButton.PlaybackButton--not-downloaded::before { -webkit-mask: url("../images/icons/v3/arrow/arrow-down.svg") no-repeat center; background-color: var(--color-label-primary); } @media (forced-colors: active) { .PlaybackButton.PlaybackButton--not-downloaded::before { background-color: WindowText; } } .PlaybackButton.PlaybackButton--not-downloaded::before { height: 20px; width: 20px; } .PlaybackButton.PlaybackButton--downloading::before { position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); } .PlaybackButton.PlaybackButton--downloading::before { -webkit-mask: url("../images/icons/v3/x/x-bold.svg") no-repeat center; background-color: var(--color-label-primary); } @media (forced-colors: active) { .PlaybackButton.PlaybackButton--downloading::before { background-color: WindowText; } } .PlaybackButton.PlaybackButton--downloading::before { height: 20px; width: 20px; } .PlaybackButton--context-incoming.PlaybackButton--variant-message { background: rgba(255, 255, 255, 0.8); } .PlaybackButton--context-incoming.PlaybackButton--variant-message:hover { background: rgba(255, 255, 255, 0.6); } .PlaybackButton--context-incoming.PlaybackButton--variant-message:active { background: rgba(255, 255, 255, 0.4); } .dark-theme .PlaybackButton.PlaybackButton--play::before { position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); } .dark-theme .PlaybackButton.PlaybackButton--play::before { -webkit-mask: url("../images/icons/v3/play/play-fill.svg") no-repeat center; background-color: var(--color-label-primary); } @media (forced-colors: active) { .dark-theme .PlaybackButton.PlaybackButton--play::before { background-color: WindowText; } } .dark-theme .PlaybackButton.PlaybackButton--play::before { height: 20px; width: 20px; } .dark-theme .PlaybackButton.PlaybackButton--pause::before { position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); } .dark-theme .PlaybackButton.PlaybackButton--pause::before { -webkit-mask: url("../images/icons/v3/pause/pause-fill.svg") no-repeat center; background-color: var(--color-label-primary); } @media (forced-colors: active) { .dark-theme .PlaybackButton.PlaybackButton--pause::before { background-color: WindowText; } } .dark-theme .PlaybackButton.PlaybackButton--pause::before { height: 20px; width: 20px; } .dark-theme .PlaybackButton.PlaybackButton--not-downloaded::before { position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); } .dark-theme .PlaybackButton.PlaybackButton--not-downloaded::before { -webkit-mask: url("../images/icons/v3/arrow/arrow-down.svg") no-repeat center; background-color: var(--color-label-primary); } @media (forced-colors: active) { .dark-theme .PlaybackButton.PlaybackButton--not-downloaded::before { background-color: WindowText; } } .dark-theme .PlaybackButton.PlaybackButton--not-downloaded::before { height: 20px; width: 20px; } .dark-theme .PlaybackButton.PlaybackButton--downloading::before { position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); } .dark-theme .PlaybackButton.PlaybackButton--downloading::before { -webkit-mask: url("../images/icons/v3/x/x-bold.svg") no-repeat center; background-color: var(--color-label-primary); } @media (forced-colors: active) { .dark-theme .PlaybackButton.PlaybackButton--downloading::before { background-color: WindowText; } } .dark-theme .PlaybackButton.PlaybackButton--downloading::before { height: 20px; width: 20px; } .dark-theme .PlaybackButton--context-incoming.PlaybackButton--variant-message { background: rgba(255, 255, 255, 0.2); } .dark-theme .PlaybackButton--context-incoming.PlaybackButton--variant-message:hover { background: rgba(255, 255, 255, 0.3); } .dark-theme .PlaybackButton--context-incoming.PlaybackButton--variant-message:active { background: rgba(255, 255, 255, 0.4); } .PlaybackButton--context-outgoing.PlaybackButton--variant-message { background: rgba(255, 255, 255, 0.2); } .PlaybackButton--context-outgoing.PlaybackButton--variant-message:hover { background: rgba(255, 255, 255, 0.3); } .PlaybackButton--context-outgoing.PlaybackButton--variant-message:active { background: rgba(255, 255, 255, 0.4); } .PlaybackButton--context-outgoing.PlaybackButton--play::before { position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); } .PlaybackButton--context-outgoing.PlaybackButton--play::before { -webkit-mask: url("../images/icons/v3/play/play-fill.svg") no-repeat center; background-color: var(--color-label-primary-on-color); } @media (forced-colors: active) { .PlaybackButton--context-outgoing.PlaybackButton--play::before { background-color: WindowText; } } .PlaybackButton--context-outgoing.PlaybackButton--play::before { height: 20px; width: 20px; } .PlaybackButton--context-outgoing.PlaybackButton--pause::before { position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); } .PlaybackButton--context-outgoing.PlaybackButton--pause::before { -webkit-mask: url("../images/icons/v3/pause/pause-fill.svg") no-repeat center; background-color: var(--color-label-primary-on-color); } @media (forced-colors: active) { .PlaybackButton--context-outgoing.PlaybackButton--pause::before { background-color: WindowText; } } .PlaybackButton--context-outgoing.PlaybackButton--pause::before { height: 20px; width: 20px; } .PlaybackButton--context-outgoing.PlaybackButton--not-downloaded::before { position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); } .PlaybackButton--context-outgoing.PlaybackButton--not-downloaded::before { -webkit-mask: url("../images/icons/v3/arrow/arrow-down.svg") no-repeat center; background-color: var(--color-label-primary-on-color); } @media (forced-colors: active) { .PlaybackButton--context-outgoing.PlaybackButton--not-downloaded::before { background-color: WindowText; } } .PlaybackButton--context-outgoing.PlaybackButton--not-downloaded::before { height: 20px; width: 20px; } .PlaybackButton--context-outgoing.PlaybackButton--downloading::before { position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); } .PlaybackButton--context-outgoing.PlaybackButton--downloading::before { -webkit-mask: url("../images/icons/v3/x/x-bold.svg") no-repeat center; background-color: var(--color-label-primary-on-color); } @media (forced-colors: active) { .PlaybackButton--context-outgoing.PlaybackButton--downloading::before { background-color: WindowText; } } .PlaybackButton--context-outgoing.PlaybackButton--downloading::before { height: 20px; width: 20px; } .dark-theme .PlaybackButton--context-outgoing.PlaybackButton--play::before { position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); } .dark-theme .PlaybackButton--context-outgoing.PlaybackButton--play::before { -webkit-mask: url("../images/icons/v3/play/play-fill.svg") no-repeat center; background-color: var(--color-label-primary-on-color); } @media (forced-colors: active) { .dark-theme .PlaybackButton--context-outgoing.PlaybackButton--play::before { background-color: WindowText; } } .dark-theme .PlaybackButton--context-outgoing.PlaybackButton--play::before { height: 20px; width: 20px; } .dark-theme .PlaybackButton--context-outgoing.PlaybackButton--pause::before { position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); } .dark-theme .PlaybackButton--context-outgoing.PlaybackButton--pause::before { -webkit-mask: url("../images/icons/v3/pause/pause-fill.svg") no-repeat center; background-color: var(--color-label-primary-on-color); } @media (forced-colors: active) { .dark-theme .PlaybackButton--context-outgoing.PlaybackButton--pause::before { background-color: WindowText; } } .dark-theme .PlaybackButton--context-outgoing.PlaybackButton--pause::before { height: 20px; width: 20px; } .dark-theme .PlaybackButton--context-outgoing.PlaybackButton--not-downloaded::before { position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); } .dark-theme .PlaybackButton--context-outgoing.PlaybackButton--not-downloaded::before { -webkit-mask: url("../images/icons/v3/arrow/arrow-down.svg") no-repeat center; background-color: var(--color-label-primary-on-color); } @media (forced-colors: active) { .dark-theme .PlaybackButton--context-outgoing.PlaybackButton--not-downloaded::before { background-color: WindowText; } } .dark-theme .PlaybackButton--context-outgoing.PlaybackButton--not-downloaded::before { height: 20px; width: 20px; } .dark-theme .PlaybackButton--context-outgoing.PlaybackButton--downloading::before { position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); } .dark-theme .PlaybackButton--context-outgoing.PlaybackButton--downloading::before { -webkit-mask: url("../images/icons/v3/x/x-bold.svg") no-repeat center; background-color: var(--color-label-primary-on-color); } @media (forced-colors: active) { .dark-theme .PlaybackButton--context-outgoing.PlaybackButton--downloading::before { background-color: WindowText; } } .dark-theme .PlaybackButton--context-outgoing.PlaybackButton--downloading::before { height: 20px; width: 20px; } .PlaybackRateButton { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .PlaybackRateButton { border: 1px solid WindowText; } } .PlaybackRateButton { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; font-weight: 600; width: 38px; height: 18px; text-align: center; font-weight: 700; border-radius: 4px; font-size: 11px; padding-block: 1px; padding-inline: 2px; margin-block: -2px; margin-inline: 0; line-height: 16px; letter-spacing: 0.05px; user-select: none; } .PlaybackRateButton--message-incoming { color: #5e5e5e; background: rgba(0, 0, 0, 0.08); } .dark-theme .PlaybackRateButton--message-incoming { color: #b9b9b9; background: rgba(255, 255, 255, 0.08); } .PlaybackRateButton--message-outgoing { color: rgba(255, 255, 255, 0.8); background: rgba(255, 255, 255, 0.2); } .PlaybackRateButton--mini-player { color: #5e5e5e; background: rgba(0, 0, 0, 0.08); } .dark-theme .PlaybackRateButton--mini-player { color: #b9b9b9; background: rgba(255, 255, 255, 0.08); } .PlaybackRateButton::after { content: "×"; } .PollCreateModalInput__container { margin-block: 0; } .Preferences { display: flex; overflow: hidden; user-select: none; height: 100%; width: 100%; align-items: stretch; } .Preferences { background: #ffffff; } .dark-theme .Preferences { background: #121212; } .Preferences__dialog-container { margin-bottom: 8px; } .Preferences__page-selector { padding-top: 2px; max-height: 100%; } .Preferences__page-selector { background: #f0f0f0; } .dark-theme .Preferences__page-selector { background: #2e2e2e; } .Preferences__scroll-area { overflow-y: scroll; max-height: 100%; scrollbar-gutter: stable; padding-inline-start: 11px; padding-inline-end: calc(11px - var(--axo-scrollbar-gutter-thin-vertical)); } .Preferences__scroll-area:not(:hover, :focus-within) { scrollbar-color: transparent transparent; } .Preferences__padding { padding-block: 0; padding-inline: 24px; } .Preferences legend { font-weight: 600; } .Preferences__profile-chip { position: relative; display: flex; flex-direction: row; align-items: center; margin-bottom: 4px; border-radius: 8px; padding-top: 14px; padding-bottom: 14px; padding-inline-start: 10px; padding-inline-end: 10px; } .Preferences__profile-chip__screenreader-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border-width: 0; } .Preferences__profile-chip--selected { background: #dedede; } .dark-theme .Preferences__profile-chip--selected { background: #4a4a4a; } .keyboard-mode .Preferences__profile-chip:has(.Preferences__profile-chip__button:focus) { background: #e9e9e9; } .dark-theme.keyboard-mode .Preferences__profile-chip:has(.Preferences__profile-chip__button:focus) { background: #3b3b3b; } .mouse-mode .Preferences__profile-chip:has(.Preferences__profile-chip__button:hover):not(.Preferences__profile-chip--selected) { background: #e9e9e9; } .dark-theme.mouse-mode .Preferences__profile-chip:has(.Preferences__profile-chip__button:hover):not(.Preferences__profile-chip--selected) { background: #3b3b3b; } .Preferences__profile-chip__button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .Preferences__profile-chip__button { border: 1px solid WindowText; } } .Preferences__profile-chip__button { position: absolute; z-index: 1; inset: 0; } .Preferences__profile-chip__avatar { margin-inline-end: 10px; } .Preferences__profile-chip__text-container { flex-grow: 1; margin-top: -4px; margin-bottom: -5px; overflow-x: hidden; } .Preferences__profile-chip__name { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; overflow-x: hidden; white-space: nowrap; overflow-wrap: anywhere; text-overflow: ellipsis; } .Preferences__profile-chip__number { font-size: 12px; line-height: 16px; letter-spacing: 0px; margin-top: 2px; overflow-x: hidden; white-space: nowrap; overflow-wrap: anywhere; text-overflow: ellipsis; } .Preferences__profile-chip__username { font-size: 12px; line-height: 16px; letter-spacing: 0px; margin-top: 2px; overflow-x: hidden; white-space: nowrap; overflow-wrap: anywhere; text-overflow: ellipsis; } .Preferences__profile-chip__qr-icon-button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .Preferences__profile-chip__qr-icon-button { border: 1px solid WindowText; } } .Preferences__profile-chip__qr-icon-button { z-index: 2; margin-inline-start: 2px; flex-shrink: 0; position: relative; height: 36px; width: 36px; border-radius: 50%; } .Preferences__profile-chip__qr-icon-button { background-color: #ffffff; } .dark-theme .Preferences__profile-chip__qr-icon-button { background-color: rgba(128, 128, 128, 0.2); } .mouse-mode .Preferences__profile-chip__qr-icon-button:active { background-color: #f6f6f6; } .dark-theme.mouse-mode .Preferences__profile-chip__qr-icon-button:active { background-color: rgba(128, 128, 128, 0.28); } .keyboard-mode .Preferences__profile-chip__qr-icon-button:focus { box-shadow: 0px 0px 0px 2.5px #a0a7fe; } .dark-theme.keyboard-mode .Preferences__profile-chip__qr-icon-button:focus { box-shadow: 0px 0px 0px 2.5px #c1c7fe; } .Preferences__profile-chip__qr-icon { height: 20px; width: 20px; position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); } .Preferences__profile-chip__qr-icon { -webkit-mask: url("../images/icons/v3/qr_code/qr_code.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .Preferences__profile-chip__qr-icon { background-color: WindowText; } } .dark-theme .Preferences__profile-chip__qr-icon { -webkit-mask: url("../images/icons/v3/qr_code/qr_code.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .dark-theme .Preferences__profile-chip__qr-icon { background-color: WindowText; } } .Preferences__button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .Preferences__button { border: 1px solid WindowText; } } .Preferences__button { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; align-items: center; display: flex; width: 100%; height: 40px; padding-block: 14px; padding-inline: 0; border-radius: 10px; margin-bottom: 4px; } .Preferences__button--selected { background: #dedede; } .dark-theme .Preferences__button--selected { background: #4a4a4a; } .keyboard-mode .Preferences__button:focus { background: #e9e9e9; } .dark-theme.keyboard-mode .Preferences__button:focus { background: #3b3b3b; } .mouse-mode .Preferences__button:hover:not(.Preferences__button--selected) { background: #e9e9e9; } .dark-theme.mouse-mode .Preferences__button:hover:not(.Preferences__button--selected) { background: #3b3b3b; } .Preferences__button::before { content: ""; display: block; height: 20px; margin-inline-start: 14px; margin-inline-end: 12px; width: 20px; } .Preferences__button--general::before { -webkit-mask: url("../images/icons/v3/settings/settings.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .Preferences__button--general::before { background-color: WindowText; } } .dark-theme .Preferences__button--general::before { -webkit-mask: url("../images/icons/v3/settings/settings.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .Preferences__button--general::before { background-color: WindowText; } } .Preferences__button--appearance::before { -webkit-mask: url("../images/icons/v3/appearance/appearance.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .Preferences__button--appearance::before { background-color: WindowText; } } .dark-theme .Preferences__button--appearance::before { -webkit-mask: url("../images/icons/v3/appearance/appearance.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .Preferences__button--appearance::before { background-color: WindowText; } } .Preferences__button--chats::before { -webkit-mask: url("../images/icons/v3/chat/chat.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .Preferences__button--chats::before { background-color: WindowText; } } .dark-theme .Preferences__button--chats::before { -webkit-mask: url("../images/icons/v3/chat/chat.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .Preferences__button--chats::before { background-color: WindowText; } } .Preferences__button--calls::before { -webkit-mask: url("../images/icons/v3/phone/phone.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .Preferences__button--calls::before { background-color: WindowText; } } .dark-theme .Preferences__button--calls::before { -webkit-mask: url("../images/icons/v3/phone/phone.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .Preferences__button--calls::before { background-color: WindowText; } } .Preferences__button--notifications::before { -webkit-mask: url("../images/icons/v3/bell/bell.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .Preferences__button--notifications::before { background-color: WindowText; } } .dark-theme .Preferences__button--notifications::before { -webkit-mask: url("../images/icons/v3/bell/bell.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .Preferences__button--notifications::before { background-color: WindowText; } } .Preferences__button--privacy::before { -webkit-mask: url("../images/icons/v3/lock/lock.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .Preferences__button--privacy::before { background-color: WindowText; } } .dark-theme .Preferences__button--privacy::before { -webkit-mask: url("../images/icons/v3/lock/lock.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .Preferences__button--privacy::before { background-color: WindowText; } } .Preferences__button--data-usage::before { -webkit-mask: url("../images/icons/v3/data/data.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .Preferences__button--data-usage::before { background-color: WindowText; } } .dark-theme .Preferences__button--data-usage::before { -webkit-mask: url("../images/icons/v3/data/data.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .Preferences__button--data-usage::before { background-color: WindowText; } } .Preferences__button--backups::before { -webkit-mask: url("../images/icons/v3/signal_backups/signal_backups.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .Preferences__button--backups::before { background-color: WindowText; } } .dark-theme .Preferences__button--backups::before { -webkit-mask: url("../images/icons/v3/signal_backups/signal_backups.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .Preferences__button--backups::before { background-color: WindowText; } } .Preferences__button--donations::before { -webkit-mask: url("../images/icons/v3/heart/heart.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .Preferences__button--donations::before { background-color: WindowText; } } .dark-theme .Preferences__button--donations::before { -webkit-mask: url("../images/icons/v3/heart/heart.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .Preferences__button--donations::before { background-color: WindowText; } } .Preferences__button--internal::before { -webkit-mask: url("../images/icons/v3/internal/internal.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .Preferences__button--internal::before { background-color: WindowText; } } .dark-theme .Preferences__button--internal::before { -webkit-mask: url("../images/icons/v3/internal/internal.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .Preferences__button--internal::before { background-color: WindowText; } } .Preferences__content { flex-grow: 1; height: 100%; display: flex; flex-direction: column; } .Preferences__page { display: flex; width: 100%; height: 100%; flex-direction: row; overflow-y: scroll; container-type: inline-size; } .Preferences__actions { display: flex; flex-direction: row; justify-content: flex-end; align-items: center; width: 100%; padding: 16px; gap: 16px; } .Preferences__settings-pane { display: flex; flex-grow: 1; flex-direction: column; height: 100%; width: 100%; padding-top: 8px; max-width: 750px; position: relative; } .Preferences__settings-pane-content--with-footer { height: 100%; } .Preferences__settings-pane-spacer { flex-grow: 1; min-width: 0; } .Preferences__title { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; align-items: center; display: flex; height: 52px; margin-top: var(--title-bar-drag-area-height); text-align: center; flex-grow: 0; flex-shrink: 0; position: relative; } .Preferences__title--backups { border: none; margin-bottom: 16px; } .Preferences__title--header { flex-grow: 1; text-align: center; } .Preferences__settings-row { border: none; padding: 0; padding-bottom: 20px; } .Preferences__settings-row h3 { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; margin: 0; margin-bottom: 8px; } .Preferences__settings-row--pnp-sharing { min-height: 185px; } .Preferences__settings-row:not(:last-child) { border-bottom: 1px solid #dedede; } .Preferences__settings-row:not(:last-child) { border-color: #dedede; } .dark-theme .Preferences__settings-row:not(:last-child) { border-color: #4a4a4a; } .Preferences__settings-row:not(:last-child) { margin-bottom: 24px; } .Preferences__pnp { padding-inline: 0; width: 100%; } .Preferences__pnp h3 { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 400; margin: 0; } .Preferences__light-icon-label { display: flex; } .Preferences__flow-control { display: block; padding-block: 4px; padding-inline: 24px; } .Preferences__one-third-flow { vertical-align: middle; display: inline-block; width: 33%; } @container (max-width: 350px) { .Preferences__one-third-flow { width: 100%; } } .Preferences__half-flow { vertical-align: middle; display: inline-block; width: 50%; } @container (max-width: 350px) { .Preferences__half-flow { width: 100%; } } .Preferences__two-thirds-flow { vertical-align: middle; display: inline-block; width: 66%; } @container (max-width: 350px) { .Preferences__two-thirds-flow { width: 100%; } } .Preferences__half-flow--align-right { text-align: end; } @container (max-width: 350px) { .Preferences__half-flow--align-right { text-align: start; } } .Preferences__one-third-flow--align-right { text-align: end; } @container (max-width: 350px) { .Preferences__one-third-flow--align-right { text-align: start; } } .Preferences__one-third-flow--justify-end { display: inline-flex; justify-content: flex-end; } @container (max-width: 350px) { .Preferences__one-third-flow--justify-end { justify-content: flex-start; } } .Preferences__full-flow { vertical-align: middle; display: inline-block; width: 100%; } .Preferences__flow-value, .Preferences__flow-description { vertical-align: middle; color: light-dark(#5e5e5e, #b9b9b9); } .Preferences__device-name-description { padding-top: 8px; } .Preferences__flow-button { padding-inline-start: 5px; } @container (max-width: 350px) { .Preferences__flow-button { padding-inline-start: 0px; padding-top: 8px; } } .Preferences__control { align-items: center; display: flex; justify-content: space-between; min-height: 48px; padding-block: 4px; padding-inline: 24px; } .Preferences__control--icon { width: 20px; height: 20px; flex-shrink: 0; margin-inline-end: 12px; } .Preferences__control--key { flex-grow: 1; padding-inline-end: 20px; } .Preferences__control--value { color: #848484; flex-shrink: 0; } .Preferences__control--clickable { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .Preferences__control--clickable { border: 1px solid WindowText; } } .Preferences__control--clickable { padding-block: 4px; padding-inline: 24px; width: 100%; } .Preferences__control--clickable:hover { background: #f6f6f6; } .dark-theme .Preferences__control--clickable:hover { background: #2e2e2e; } .Preferences__checkbox { padding-block: 10px; padding-inline: 24px; } .Preferences__option-name { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; } .Preferences__option-name { color: #1b1b1b; } .dark-theme .Preferences__option-name { color: #e9e9e9; } .Preferences__checkbox__description, .Preferences__description { font-size: 12px; line-height: 16px; letter-spacing: 0; } .Preferences__checkbox__description, .Preferences__description { color: #5e5e5e; } .dark-theme .Preferences__checkbox__description, .dark-theme .Preferences__description { color: #b9b9b9; } .Preferences__checkbox__description--error, .Preferences__description--error { color: #f44336 !important; } .Preferences__checkbox__description--medium, .Preferences__description--medium { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; } .Preferences__select { width: 100%; } .Preferences__select-title { display: block; margin-bottom: 8px; } .Preferences__right-button { display: flex; justify-content: flex-end; min-width: 120px; } .Preferences__back-icon { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .Preferences__back-icon { border: 1px solid WindowText; } } .Preferences__back-icon { display: inline-block; inset-inline-start: 12px; height: 20px; width: 20px; vertical-align: text-bottom; position: absolute; top: 50%; transform: translateY(-50%); } .Preferences__back-icon { -webkit-mask: url("../images/icons/v3/chevron/chevron-left.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #1b1b1b; } @media (forced-colors: active) { .Preferences__back-icon { background-color: WindowText; } } :dir(rtl) .Preferences__back-icon { -webkit-mask: url("../images/icons/v3/chevron/chevron-right.svg") no-repeat center; } .dark-theme .Preferences__back-icon { -webkit-mask: url("../images/icons/v3/chevron/chevron-left.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #f6f6f6; } @media (forced-colors: active) { .dark-theme .Preferences__back-icon { background-color: WindowText; } } :dir(rtl) .dark-theme .Preferences__back-icon { -webkit-mask: url("../images/icons/v3/chevron/chevron-right.svg") no-repeat center; } .Preferences__back-icon + .Preferences__title--header { margin-inline-end: 32px; } .Preferences__stories-off { min-width: 140px; } .Preferences__settings-radio__label { display: flex; flex-direction: row; gap: 16px; height: 40px; align-items: center; } .Preferences__settings-radio__label:last-child { margin-bottom: 8px; } .Preferences__settings-radio__label--readonly { opacity: 0.4; } .Preferences__LanguageIcon { -webkit-mask: url("../images/icons/v3/globe/globe.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .Preferences__LanguageIcon { background-color: WindowText; } } .dark-theme .Preferences__LanguageIcon { -webkit-mask: url("../images/icons/v3/globe/globe.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .Preferences__LanguageIcon { background-color: WindowText; } } .Preferences__LanguageButton { /* Japanese */ /* Farsi (Persian) */ /* Urdu */ } .Preferences__LanguageButton { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .Preferences__LanguageButton { border: 1px solid WindowText; } } .Preferences__LanguageButton:lang(ja) { font-family: Inter, "SF Pro", "SF Pro JP", "BIZ UDGothic", "Hiragino Kaku Gothic Pro", "ヒラギノ角ゴ Pro W3", メイリオ, Meiryo, "MS Pゴシック", "Helvetica Neue", Helvetica, Arial, sans-serif; } .Preferences__LanguageButton:lang(fa) { font-family: "Vazirmatn", -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Tahoma, "Noto Sans Arabic", Helvetica, Arial, sans-serif; } .Preferences__LanguageButton:lang(ur) { font-family: "Noto Nastaliq Urdu", Gulzar, "Jameel Noori Nastaleeq", "Faiz Lahori Nastaleeq", "Urdu Typesetting", Helvetica, Arial, sans-serif; } .Preferences__LanguageModal { height: 560px; } .Preferences__LanguageModal .module-Modal__body { flex-grow: 1; } .Preferences__LanguageModal__Title { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; margin-inline: 8px; } .Preferences__LanguageModal__NoResults { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; margin: 16px; text-align: center; } .Preferences__LanguageModal__Item { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .Preferences__LanguageModal__Item { border: 1px solid WindowText; } } .Preferences__LanguageModal__Item { width: 100%; padding-block: 2px; padding-inline: 8px; } .Preferences__LanguageModal__Item:hover .Preferences__LanguageModal__Item__Inner { background-color: rgba(0, 0, 0, 0.06); } .dark-theme .Preferences__LanguageModal__Item:hover .Preferences__LanguageModal__Item__Inner { background-color: rgba(255, 255, 255, 0.06); } .Preferences__LanguageModal__Item:focus { outline: none; } .keyboard-mode .Preferences__LanguageModal__Item:focus .Preferences__LanguageModal__Item__Inner { background-color: rgba(0, 0, 0, 0.06); box-shadow: 0 0 0 2px #2c6bed; } .dark-theme.keyboard-mode .Preferences__LanguageModal__Item:focus .Preferences__LanguageModal__Item__Inner { background-color: rgba(255, 255, 255, 0.06); } .Preferences__LanguageModal__Item__Inner { display: flex; gap: 8px; align-items: center; justify-content: center; padding-block: 5px; padding-inline: 16px; border-radius: 8px; } .Preferences__LanguageModal__Item__Label { flex-grow: 1; } .Preferences__LanguageModal__Item__Current { display: block; font-size: 14px; line-height: 20px; letter-spacing: -0.08px; } .Preferences__LanguageModal__Item__Check { display: flex; height: 20px; width: 20px; align-items: center; justify-content: center; background: #2c6bed; border-radius: 9999px; } .Preferences__LanguageModal__Item__Check::after { -webkit-mask: url("../images/icons/v3/check/check.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .Preferences__LanguageModal__Item__Check::after { background-color: WindowText; } } .Preferences__LanguageModal__Item__Check::after { content: ""; height: 14px; width: 14px; } .Preferences__LanguageModal__Item__Matching { display: block; /* Japanese */ /* Farsi (Persian) */ /* Urdu */ font-size: 13px; line-height: 18px; letter-spacing: -0.03px; } .Preferences__LanguageModal__Item__Matching:lang(ja) { font-family: Inter, "SF Pro", "SF Pro JP", "BIZ UDGothic", "Hiragino Kaku Gothic Pro", "ヒラギノ角ゴ Pro W3", メイリオ, Meiryo, "MS Pゴシック", "Helvetica Neue", Helvetica, Arial, sans-serif; } .Preferences__LanguageModal__Item__Matching:lang(fa) { font-family: "Vazirmatn", -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Tahoma, "Noto Sans Arabic", Helvetica, Arial, sans-serif; } .Preferences__LanguageModal__Item__Matching:lang(ur) { font-family: "Noto Nastaliq Urdu", Gulzar, "Jameel Noori Nastaleeq", "Faiz Lahori Nastaleeq", "Urdu Typesetting", Helvetica, Arial, sans-serif; } .Preferences__LanguageModal__Item__Matching { color: #5e5e5e; } .dark-theme .Preferences__LanguageModal__Item__Matching { color: #b9b9b9; } .Preferences--backups-summary__container { background-color: light-dark(#f6f6f6, #2e2e2e); border-radius: 12px; padding-block: 20px; padding-inline: 16px; margin-inline: 24px; } .Preferences--backups-summary__status-container { display: flex; justify-content: space-between; } .Preferences--backups-summary__type { font-size: 12px; line-height: 16px; letter-spacing: 0; color: light-dark(#5e5e5e, #b9b9b9); margin-block-end: 8px; } .Preferences--backups-summary__note { font-size: 12px; line-height: 16px; letter-spacing: 0; color: light-dark(#5e5e5e, #b9b9b9); margin-block-start: 12px; } .Preferences--backups-summary__canceled { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; color: #f44336; } .dark-theme .Preferences--backups-summary__icon--active::after { background-image: url("../images/icons/v3/backup/backups-subscribed-dark.svg"); } .Preferences--backups-summary__icon--active::after { background-image: url("../images/icons/v3/backup/backups-subscribed-light.svg"); } .dark-theme .Preferences--backups-summary__icon--inactive::after { background-image: url("../images/icons/v3/backup/backups-logo-dark.svg"); } .Preferences--backups-summary__icon--inactive::after { background-image: url("../images/icons/v3/backup/backups-logo-light.svg"); } .Preferences--backups-summary__icon::after { content: ""; margin-inline-start: 8px; display: block; height: 48px; width: 48px; } .Preferences--BackupsRow { padding-block: 8px; margin-block-start: 8px; } .Preferences--BackupsRow a { text-decoration: none; } .Preferences--BackupsRow:not(:last-child) { padding-block-end: 24px; } .Preferences--BackupsRow .Preferences__control { padding-block: 10px; align-items: initial; } .Preferences--backup-details { margin-block-start: 30px; } .Preferences--backup-details legend { margin-block-end: 10px; } .Preferences--backup-details__row { padding-block: 10px; padding-inline: 24px; } .Preferences--backup-details__value { margin-block-start: 2px; font-size: 12px; line-height: 16px; letter-spacing: 0; color: light-dark(#5e5e5e, #b9b9b9); } .Preferences--backup-details__value-divider::before { content: "•"; margin-inline: 4px; } .Preferences--backup-details pre { max-height: 128px; } .Preferences__BackupsIcon { -webkit-mask: url("../images/icons/v3/signal_backups/signal_backups.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .Preferences__BackupsIcon { background-color: WindowText; } } .dark-theme .Preferences__BackupsIcon { -webkit-mask: url("../images/icons/v3/signal_backups/signal_backups.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .Preferences__BackupsIcon { background-color: WindowText; } } .Preferences__LocalBackupsIcon { -webkit-mask: url("../images/icons/v3/device/device-laptop.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .Preferences__LocalBackupsIcon { background-color: WindowText; } } .dark-theme .Preferences__LocalBackupsIcon { -webkit-mask: url("../images/icons/v3/device/device-laptop.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .Preferences__LocalBackupsIcon { background-color: WindowText; } } .Preferences--LocalBackupsSetupScreen { display: flex; flex-direction: column; text-align: center; } .Preferences--LocalBackupsSetupScreenHeader { font-weight: 600; font-size: 20px; line-height: 26px; letter-spacing: -0.34px; margin-block: 8px; } .Preferences--LocalBackupsSetupScreenPane { display: flex; flex-direction: column; flex-grow: 1; } .Preferences--LocalBackupsSetupScreenPane-top { flex-grow: 0; min-height: 154px; } .Preferences--LocalBackupsSetupScreenPaneContent { display: block; width: 100%; } .Preferences--LocalBackupsSetupScreenPane-footer { flex-direction: row; flex-grow: 0; flex-shrink: 1; padding-block: 24px; } .Preferences--LocalBackupsSetupScreenFooterSection { display: flex; flex-grow: 1; } .Preferences--LocalBackupsSetupScreenFooterSection-right { justify-content: right; } .Preferences--LocalBackupsSetupScreenBody { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; margin-block: 8px; color: light-dark(#5e5e5e, #b9b9b9); } .Preferences--LocalBackupsSetupScreenBody a { text-decoration: none; } .Preferences--LocalBackupsSetupScreenBody--folder { margin-block-end: 57px; } .Preferences--LocalBackupsBackupKey { width: 274px; height: 201px; padding-block: 28px; padding-inline: 36px; margin-block: 28px 20px; background: #f6f6f6; border-radius: 12px; border-width: 0; outline: none; color: #1b1b1b; font-family: "SF Mono", SFMono-Regular, ui-monospace, "DejaVu Sans Mono", Menlo, Consolas, monospace; font-size: 16px; font-weight: 400; line-height: 36.128px; letter-spacing: 0.624px; overflow: hidden; resize: none; word-break: break-all; text-transform: uppercase; } .Preferences--LocalBackupsBackupKey::placeholder { color: #848484; text-transform: none; } .Preferences--LocalBackupsSetupIcon { display: inline-flex; width: 64px; height: 64px; border-radius: 64px; background: #d2dffb; align-items: center; justify-content: center; } .Preferences--LocalBackupsSetupIcon::before { height: 38px; width: 38px; content: ""; } .Preferences--LocalBackupsSetupIcon-folder { margin-block-start: 60px; margin-block-end: 12px; } .Preferences--LocalBackupsSetupIcon-folder::before { -webkit-mask: url("../images/icons/v3/folder/folder.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b45fd; } @media (forced-colors: active) { .Preferences--LocalBackupsSetupIcon-folder::before { background-color: WindowText; } } .Preferences--LocalBackupsSetupIcon-key::before { -webkit-mask: url("../images/icons/v3/key/key.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b45fd; } @media (forced-colors: active) { .Preferences--LocalBackupsSetupIcon-key::before { background-color: WindowText; } } .Preferences--LocalBackupsSetupIcon-lock::before { -webkit-mask: url("../images/icons/v3/lock/lock.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b45fd; } @media (forced-colors: active) { .Preferences--LocalBackupsSetupIcon-lock::before { background-color: WindowText; } } .Preferences--LocalBackupsConfirmKeyModal { padding-block: 36px 20px; padding-inline: 32px; text-align: center; } .Preferences--LocalBackupsConfirmKeyModal__body { padding: 0; } .Preferences--LocalBackupsConfirmKeyModalTitle { font-weight: 600; font-size: 18px; line-height: 25px; letter-spacing: -0.25px; margin-block: 12px; } .Preferences--LocalBackupsConfirmKeyModalBody { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; margin-block: 8px 32px; color: light-dark(#5e5e5e, #b9b9b9); } .Preferences--LocalBackupsConfirmKeyModal .module-Modal__button-footer { justify-content: center; } .Preferences--internal--result { padding-inline: 48px 24px; max-width: 100%; } .Preferences--internal--result table { width: 100%; } .Preferences--internal--result th, .Preferences--internal--result td { padding-inline: 16px; padding-block: 4px; text-align: start; max-width: 600px; } .Preferences--internal--result .Preferences--internal--subresult { background-color: rgba(255, 255, 255, 0.06); font-size: 0.8em; } .Preferences--internal--error { padding-inline: 48px 24px; color: #f44336; } .Preferences--internal pre, .Preferences--internal pre { max-height: 400px; max-width: 100%; white-space: pre-wrap; user-select: text; overflow-x: scroll; } .Preferences__ChatFolders__ChatSelection__List { list-style: none; padding: 0; margin: 0; } .Preferences__ChatFolders__ChatSelection__Item[data-dragging=true] { opacity: 0%; transition: opacity 0ms linear; transition-delay: 1ms; } .Preferences__ChatFolders__ChatSelection__Item--Button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .Preferences__ChatFolders__ChatSelection__Item--Button { border: 1px solid WindowText; } } .Preferences__ChatFolders__ChatSelection__Item--Button { width: 100%; } .Preferences__ChatFolders__ChatSelection__Item--Button, .Preferences__ChatFolders__ChatSelection__Item--ListItem { outline: 0; } .Preferences__ChatFolders__ChatSelection__Item--Button, .Preferences__ChatFolders__ChatSelection__Item--Clickable { cursor: pointer; } .Preferences__ChatFolders__ChatSelection__Item--Button:hover .Preferences__ChatFolders__ChatSelection__ItemContent, .Preferences__ChatFolders__ChatSelection__Item--Button .Preferences__ChatFolders__ChatSelection__ItemContent[data-axo-contextmenu-state=open], .Preferences__ChatFolders__ChatSelection__Item--Clickable:hover .Preferences__ChatFolders__ChatSelection__ItemContent, .Preferences__ChatFolders__ChatSelection__Item--Clickable .Preferences__ChatFolders__ChatSelection__ItemContent[data-axo-contextmenu-state=open] { background: light-dark(#f6f6f6, #2e2e2e); } .Preferences__ChatFolders__ChatSelection__ItemContent { display: flex; align-items: center; gap: 12px; padding-block: 8px; padding-inline: 24px; border-radius: 8px; } .Preferences__ChatFolders__ChatSelection__Item:focus .keyboard-mode .Preferences__ChatFolders__ChatSelection__ItemContent { outline: 2px solid #2c6bed; } .Preferences__ChatFolders__ChatSelection__ItemAvatar { display: flex; align-items: center; justify-content: center; width: 36px; height: 36px; border-radius: 9999px; background: light-dark(#e9e9e9, #1b1b1b); } .Preferences__ChatFolders__ChatSelection__ItemAvatar::before { content: ""; display: block; width: 20px; height: 20px; } .Preferences__ChatFolders__ChatSelection__ItemAvatar--Add::before { -webkit-mask: url("../images/icons/v3/plus/plus.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#3b3b3b, #dedede); } @media (forced-colors: active) { .Preferences__ChatFolders__ChatSelection__ItemAvatar--Add::before { background-color: WindowText; } } .Preferences__ChatFolders__ChatSelection__ItemAvatar--Folder::before { -webkit-mask: url("../images/icons/v3/folder/folder.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#3b3b3b, #dedede); } @media (forced-colors: active) { .Preferences__ChatFolders__ChatSelection__ItemAvatar--Folder::before { background-color: WindowText; } } .Preferences__ChatFolders__ChatSelection__ItemAvatar--UnreadChats::before { -webkit-mask: url("../images/icons/v3/chat/chat-badge.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#3b3b3b, #dedede); } @media (forced-colors: active) { .Preferences__ChatFolders__ChatSelection__ItemAvatar--UnreadChats::before { background-color: WindowText; } } .Preferences__ChatFolders__ChatSelection__ItemAvatar--DirectChats::before { -webkit-mask: url("../images/icons/v3/person/person.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#3b3b3b, #dedede); } @media (forced-colors: active) { .Preferences__ChatFolders__ChatSelection__ItemAvatar--DirectChats::before { background-color: WindowText; } } .Preferences__ChatFolders__ChatSelection__ItemAvatar--GroupChats::before { -webkit-mask: url("../images/icons/v3/group/group.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#3b3b3b, #dedede); } @media (forced-colors: active) { .Preferences__ChatFolders__ChatSelection__ItemAvatar--GroupChats::before { background-color: WindowText; } } .Preferences__ChatFolders__ChatSelection__ItemBody { display: flex; flex: 1; flex-direction: column; } .Preferences__ChatFolders__ChatSelection__ItemTitle { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; color: light-dark(#1b1b1b, #e9e9e9); } .Preferences__ChatFolders__ChatSelection__ItemDescription { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; color: light-dark(#5e5e5e, #b9b9b9); } .Preferences__ChatFolders__ChatList__DeleteButton { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .Preferences__ChatFolders__ChatList__DeleteButton { border: 1px solid WindowText; } } .Preferences__ChatFolders__ChatList__DeleteButton { color: #f44336; border-radius: 1px; } .keyboard-mode .Preferences__ChatFolders__ChatList__DeleteButton:focus { outline: 2px solid #2c6bed; } .Preferences__EditChatFolderPage__SelectChatsDialog__width-container.module-modal-host__width-container { max-width: 360px; } .Preferences__EditChatFolderPage__SelectChatsDialog { height: 60vw; } .Preferences__EditChatFolderPage__SelectChatsDialog__body { flex-grow: 1; display: flex; flex-direction: column; overflow: hidden; } .Preferences__EditChatFolderPage__SelectChatsDialog__body_inner { display: flex; flex-direction: column; height: 100%; } .Preferences__ReadonlySqlPlayground__Textarea__input { font-family: "SF Mono", SFMono-Regular, ui-monospace, "DejaVu Sans Mono", Menlo, Consolas, monospace; } .TimePickerPopup { scrollbar-width: 0; } .PreferencesDonations { display: flex; flex-direction: column; align-items: center; min-height: 590px; padding-block: 0; padding-inline: 0; margin-inline-start: 24px; margin-inline-end: 24px; } .PreferencesDonations__title { font-weight: 600; font-size: 18px; line-height: 25px; letter-spacing: -0.25px; margin-bottom: 8px; } .PreferencesDonations__description { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; text-align: center; max-width: 320px; margin-block-end: 12px; color: light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.5)); } .PreferencesDonations__description__read-more { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .PreferencesDonations__description__read-more { border: 1px solid WindowText; } } .PreferencesDonations__description__read-more { color: #2c6bed; } .PreferencesDonations__description__read-more:hover { text-decoration: underline; } .PreferencesDonations__separator { width: 100%; height: 0.5px; border: none; margin: 0; margin-bottom: 12px; background-color: light-dark(rgba(0, 0, 0, 0.12), rgba(255, 255, 255, 0.12)); } .PreferencesDonations__separator--card-form { margin-block: 20px 12px; } .PreferencesDonations__section-header { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; font-weight: 600; width: 100%; margin-block: 12px; padding-inline: 8px; color: light-dark(rgba(0, 0, 0, 0.85), rgba(255, 255, 255, 0.85)); } .PreferencesDonations__section-header--my-support { margin-block-start: 6px; } .PreferencesDonations__section-header--donate-flow { margin-block-start: 22px; } .PreferencesDonations__list { width: 100%; } .PreferencesDonations__list-item { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .PreferencesDonations__list-item { border: 1px solid WindowText; } } .PreferencesDonations__list-item { display: flex; width: 100%; align-items: center; gap: 12px; padding-block: 12px; padding-inline: 8px; border-radius: 5px; } .PreferencesDonations__list-item:hover { background: light-dark(#f6f6f6, #2e2e2e); } .keyboard-mode .PreferencesDonations__list-item:focus { outline: 2px solid #2c6bed; } .PreferencesDonations__list-item__icon { width: 20px; height: 20px; } .PreferencesDonations__list-item__icon--receipts::before { content: ""; display: block; width: 20px; height: 20px; } .PreferencesDonations__list-item__icon--receipts::before { -webkit-mask: url("../images/icons/v3/receipt/receipt.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#3b3b3b, #dedede); } @media (forced-colors: active) { .PreferencesDonations__list-item__icon--receipts::before { background-color: WindowText; } } .PreferencesDonations__list-item__icon--faqs::before { content: ""; display: block; width: 20px; height: 20px; } .PreferencesDonations__list-item__icon--faqs::before { -webkit-mask: url("../images/icons/v3/help/help-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#3b3b3b, #dedede); } @media (forced-colors: active) { .PreferencesDonations__list-item__icon--faqs::before { background-color: WindowText; } } .PreferencesDonations__list-item__text { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; flex: 1; color: light-dark(#1b1b1b, #e9e9e9); } .PreferencesDonations__list-item__chevron::before { content: ""; display: block; width: 20px; height: 20px; } .PreferencesDonations__list-item__chevron::before { -webkit-mask: url("../images/icons/v3/chevron/chevron-right.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#848484, #b9b9b9); } @media (forced-colors: active) { .PreferencesDonations__list-item__chevron::before { background-color: WindowText; } } :dir(rtl) .PreferencesDonations__list-item__chevron::before { -webkit-mask: url("../images/icons/v3/chevron/chevron-left.svg") no-repeat center; } .PreferencesDonations__list-item__open::before { content: ""; display: block; width: 20px; height: 20px; } .PreferencesDonations__list-item__open::before { -webkit-mask: url("../images/icons/v3/open/open.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#848484, #b9b9b9); } @media (forced-colors: active) { .PreferencesDonations__list-item__open::before { background-color: WindowText; } } .PreferencesDonations__mobile-info { font-size: 12px; line-height: 16px; letter-spacing: 0; padding-inline: 8px; margin-block-start: 10px; align-self: flex-start; color: light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.5)); } .PreferencesDonations__avatar { margin-block-end: 12px; } .PreferencesDonations--receiptList__info { margin-inline: 24px; margin-bottom: 24px; } .PreferencesDonations--receiptList__info__text { font-size: 12px; line-height: 16px; letter-spacing: 0; color: light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.5)); } .PreferencesDonations--receiptList-yearContainer { width: 100%; } .PreferencesDonations--receiptList__year-header { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; font-weight: 600; color: light-dark(rgba(0, 0, 0, 0.85), rgba(255, 255, 255, 0.85)); padding-block: 8px; padding-inline: 24px; background-color: light-dark(#ffffff, #121212); } .PreferencesDonations--receiptList__list { width: 100%; } .PreferencesDonations--receiptList__receipt-item { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .PreferencesDonations--receiptList__receipt-item { border: 1px solid WindowText; } } .PreferencesDonations--receiptList__receipt-item { display: flex; align-items: center; gap: 12px; padding-block: 8px; padding-inline: 24px; border-radius: 5px; width: 100%; } .PreferencesDonations--receiptList__receipt-item:hover { background-color: light-dark(#f6f6f6, #2e2e2e); } .keyboard-mode .PreferencesDonations--receiptList__receipt-item:focus { background-color: light-dark(#f6f6f6, #2e2e2e); } .PreferencesDonations--receiptList__receipt-item__icon { background: url("../images/rocket-36-light.svg"); } .dark-theme .PreferencesDonations--receiptList__receipt-item__icon { background: url("../images/rocket-36-dark.svg"); } .PreferencesDonations--receiptList__receipt-item__icon { width: 36px; height: 36px; background-size: 100%; border-radius: 18px; flex-shrink: 0; } .PreferencesDonations--receiptList__receipt-item__details { flex: 1; display: flex; flex-direction: column; gap: 2px; } .PreferencesDonations--receiptList__receipt-item__date { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; color: light-dark(rgba(0, 0, 0, 0.85), rgba(255, 255, 255, 0.85)); } .PreferencesDonations--receiptList__receipt-item__type { font-size: 12px; line-height: 16px; letter-spacing: 0; color: light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.5)); } .PreferencesDonations--receiptList__receipt-item__amount { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; color: light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.5)); } .PreferencesDonations--receiptList__empty-state { display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; gap: 8px; margin: auto; } .PreferencesDonations--receiptList__empty-state__title { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; color: light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.5)); } .PreferencesDonations--receiptList__empty-state__description { font-size: 11px; line-height: 14px; letter-spacing: 0.06px; color: light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.5)); max-width: 300px; } .PreferencesDonations__ReceiptModal__width-container { max-width: 420px; } .PreferencesDonations__ReceiptModal__headerTitle, .PreferencesDonations__ReceiptModal__body, .PreferencesDonations__ReceiptModal .module-Modal__button-footer { padding-inline: 24px; } .PreferencesDonations__ReceiptModal__headerTitle { padding-block-start: 24px; } .PreferencesDonations__ReceiptModal__title { font-weight: 600; font-size: 18px; line-height: 25px; letter-spacing: -0.25px; } .PreferencesDonations__ReceiptModal__body { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; padding-block-end: 16px; } .PreferencesDonations__ReceiptModal .module-Modal__button-footer { padding-block: 0 24px; } .PreferencesDonations__ReceiptModal .module-Modal__button-footer button { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; padding-block: 5px; padding-inline: 12px; border-radius: 6px; } .PreferencesDonations__ReceiptModal p:not(:last-child) { margin-block: 0 18px; } .PreferencesDonations__ReceiptModal__content { display: flex; flex-direction: column; align-items: center; text-align: center; } .PreferencesDonations__ReceiptModal__logo-container { margin-block-end: 20px; } .PreferencesDonations__ReceiptModal__logo { width: 100px; height: 28.571px; background-image: url("../images/signal-logo-and-wordmark.svg"); background-size: contain; background-repeat: no-repeat; background-position: center; } .PreferencesDonations__ReceiptModal__amount { font-size: 40px; line-height: normal; letter-spacing: 0.07px; color: light-dark(#1b1b1b, #e9e9e9); margin-block-end: 20px; } .PreferencesDonations__ReceiptModal__separator { width: 100%; height: 0.5px; border: none; margin-block: 12px; background-color: light-dark(rgba(0, 0, 0, 0.12), rgba(255, 255, 255, 0.12)); } .PreferencesDonations__ReceiptModal__details { width: 100%; text-align: start; } .PreferencesDonations__ReceiptModal__detail-item { padding-block: 10px; padding-inline: 0; } .PreferencesDonations__ReceiptModal__detail-label { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; color: light-dark(rgba(0, 0, 0, 0.85), rgba(255, 255, 255, 0.85)); margin-block-end: 2px; } .PreferencesDonations__ReceiptModal__detail-value { font-size: 12px; line-height: 16px; letter-spacing: 0; color: light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.5)); } .PreferencesDonations__badge-list { width: 100%; margin-block: 4px 8px; } .PreferencesDonations__badge { display: flex; gap: 12px; width: 100%; height: 58px; padding-block: 8px; padding-inline: 12px 8px; background: light-dark(#f6f6f6, #262626); border: 0.5px solid; border-color: light-dark(rgba(0, 0, 0, 0.12), rgba(255, 255, 255, 0.12)); border-radius: 6px; cursor: pointer; } .PreferencesDonations__badge:hover { background: light-dark(#f0f0f0, #2e2e2e); } .keyboard-mode .PreferencesDonations__badge:focus { outline: 2px solid #2c6bed; } .PreferencesDonations__badge-icon { display: flex; width: 40px; height: 40px; background-size: 100%; background-image: url("../images/rocket-160.svg"); } .PreferencesDonations__badge-info { display: flex; flex-direction: column; align-self: center; align-items: start; } .PreferencesDonations__badge-label { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; color: light-dark(rgba(0, 0, 0, 0.85), rgba(255, 255, 255, 0.85)); } .PreferencesDonations__badge-processing-info { font-size: 12px; line-height: 16px; letter-spacing: 0px; color: light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.55)); } .PreferencesDonations__payment-icon { display: flex; width: 20px; height: 20px; } .PreferencesDonations__payment-icon { -webkit-mask: url("../images/icons/v3/payment/payment.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .PreferencesDonations__payment-icon { background-color: WindowText; } } .PreferencesDonations__paypal-button { display: flex; width: 280px; height: 36px; background: #f6c757; border-radius: 6px; justify-content: center; } .PreferencesDonations__paypal-icon { display: flex; background-image: url("../images/paypal.svg"); } .ProfileEditor { margin-inline-start: 24px; margin-inline-end: 24px; } .ProfileEditor__icon--container { align-items: center; display: flex; font-size: 24px; justify-content: center; width: 20px; height: 20px; } .ProfileEditor__icon::after { -webkit-mask-size: 100%; content: ""; display: block; height: 20px; width: 20px; } .ProfileEditor__icon::after { background-color: #3b3b3b; } .dark-theme .ProfileEditor__icon::after { background-color: #dedede; } .ProfileEditor__icon--name::after { -webkit-mask: url("../images/icons/v3/person/person.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .ProfileEditor__icon--name::after { background-color: WindowText; } } .dark-theme .ProfileEditor__icon--name::after { -webkit-mask: url("../images/icons/v3/person/person.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .ProfileEditor__icon--name::after { background-color: WindowText; } } .ProfileEditor__icon--username::after { -webkit-mask: url("../images/icons/v3/at/at.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .ProfileEditor__icon--username::after { background-color: WindowText; } } .dark-theme .ProfileEditor__icon--username::after { -webkit-mask: url("../images/icons/v3/at/at.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .ProfileEditor__icon--username::after { background-color: WindowText; } } .ProfileEditor__icon--username-link::after { -webkit-mask: url("../images/icons/v3/qr_code/qr_code.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .ProfileEditor__icon--username-link::after { background-color: WindowText; } } .dark-theme .ProfileEditor__icon--username-link::after { -webkit-mask: url("../images/icons/v3/qr_code/qr_code.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .ProfileEditor__icon--username-link::after { background-color: WindowText; } } .ProfileEditor__icon--bio::after { -webkit-mask: url("../images/icons/v3/edit/edit.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .ProfileEditor__icon--bio::after { background-color: WindowText; } } .dark-theme .ProfileEditor__icon--bio::after { -webkit-mask: url("../images/icons/v3/edit/edit.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .ProfileEditor__icon--bio::after { background-color: WindowText; } } .ProfileEditor__row { padding-inline: 8px; padding-block: 12px; } .ProfileEditor__divider { border-style: solid; border-bottom: none; } .ProfileEditor__divider { border-color: #dedede; } .dark-theme .ProfileEditor__divider { border-color: #3b3b3b; } .ProfileEditor hr { margin-block: 24px 12px; } .ProfileEditor__info { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; margin-block: 12px; margin-inline: 8px; } .ProfileEditor__info { color: #5e5e5e; } .dark-theme .ProfileEditor__info { color: #b9b9b9; } .ProfileEditor__info a { font-weight: 600; text-decoration: none; } .ProfileEditor__username-menu__button { width: 20px; height: 20px; } .dark-theme .ProfileEditor__username-menu__button { -webkit-mask: url("../images/icons/v3/chevron/chevron-down.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .dark-theme .ProfileEditor__username-menu__button { background-color: WindowText; } } .ProfileEditor__username-menu__button { -webkit-mask: url("../images/icons/v3/chevron/chevron-down.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .ProfileEditor__username-menu__button { background-color: WindowText; } } .dark-theme .ProfileEditor__username-menu__copy-icon { -webkit-mask: url("../images/icons/v3/copy/copy.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .dark-theme .ProfileEditor__username-menu__copy-icon { background-color: WindowText; } } .ProfileEditor__username-menu__copy-icon { -webkit-mask: url("../images/icons/v3/copy/copy.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .ProfileEditor__username-menu__copy-icon { background-color: WindowText; } } .dark-theme .ProfileEditor__username-menu__copy-link-icon { -webkit-mask: url("../images/icons/v3/link/link.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .dark-theme .ProfileEditor__username-menu__copy-link-icon { background-color: WindowText; } } .ProfileEditor__username-menu__copy-link-icon { -webkit-mask: url("../images/icons/v3/link/link.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .ProfileEditor__username-menu__copy-link-icon { background-color: WindowText; } } .dark-theme .ProfileEditor__username-menu__trash-icon { -webkit-mask: url("../images/icons/v3/trash/trash.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .dark-theme .ProfileEditor__username-menu__trash-icon { background-color: WindowText; } } .ProfileEditor__username-menu__trash-icon { -webkit-mask: url("../images/icons/v3/trash/trash.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .ProfileEditor__username-menu__trash-icon { background-color: WindowText; } } .ProfileEditor__error-icon { -webkit-mask-size: 100%; display: block; height: 20px; width: 20px; } .ProfileEditor__error-icon { -webkit-mask: url("../images/icons/v3/error/error-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #f44336; } @media (forced-colors: active) { .ProfileEditor__error-icon { background-color: WindowText; } } .dark-theme .ProfileEditor__error-icon { -webkit-mask: url("../images/icons/v3/error/error-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #f44336; } @media (forced-colors: active) { .dark-theme .ProfileEditor__error-icon { background-color: WindowText; } } .ProfileEditor__username-link__tooltip { padding: 0; background-color: unset; --container-padding: 12px; } .ProfileEditor__username-link__tooltip__container { display: flex; flex-direction: row; padding: var(--container-padding); box-shadow: 0 6px 12px rgba(0, 0, 0, 0.12); border: 1px solid #c6c6c6; border-radius: inherit; background-color: #f6f6f6; transform-origin: 0 0; } .dark-theme .ProfileEditor__username-link__tooltip__container { background-color: #3b3b3b; border-color: #5e5e5e; } .ProfileEditor__username-link__tooltip { --direction-multiplier: 1; } .ProfileEditor__username-link__tooltip:dir(rtl) { --direction-multiplier: -1; } .ProfileEditor__username-link__tooltip__arrow { position: absolute; transform: translateY(calc(-50% - var(--container-padding))) translateX(calc(var(--direction-multiplier) * (20px - var(--container-padding)))) rotate(45deg); width: 14px; height: 14px; clip-path: polygon(0 100%, 0 0, 100% 0); border: inherit; background: inherit; } .ProfileEditor__username-link__tooltip__icon { width: 20px; height: 20px; margin-block-start: 4px; margin-inline: 4px 12px; } .dark-theme .ProfileEditor__username-link__tooltip__icon { -webkit-mask: url("../images/icons/v3/share/share.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .dark-theme .ProfileEditor__username-link__tooltip__icon { background-color: WindowText; } } .ProfileEditor__username-link__tooltip__icon { -webkit-mask: url("../images/icons/v3/share/share.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .ProfileEditor__username-link__tooltip__icon { background-color: WindowText; } } .ProfileEditor__username-link__tooltip__content { text-align: start; } .ProfileEditor__username-link__tooltip__content h3 { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; font-weight: 600; margin: 0; } .ProfileEditor__username-link__tooltip__content p { font-size: 12px; line-height: 16px; letter-spacing: 0; max-width: 240px; margin: 0; } .ProfileEditor__username-link__tooltip__close { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .ProfileEditor__username-link__tooltip__close { border: 1px solid WindowText; } } .keyboard-mode .ProfileEditor__username-link__tooltip__close:focus { box-shadow: 0px 0px 0px 3px #2c6bed; } .dark-theme.keyboard-mode .ProfileEditor__username-link__tooltip__close:focus { box-shadow: 0px 0px 0px 3px #6191f3; } .ProfileEditor__username-link__tooltip__close { width: 20px; height: 20px; padding: 0; margin: 0; } .ProfileEditor__username-link__tooltip__close { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #848484; } @media (forced-colors: active) { .ProfileEditor__username-link__tooltip__close { background-color: WindowText; } } .dark-theme .ProfileEditor__username-link__tooltip__close { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .dark-theme .ProfileEditor__username-link__tooltip__close { background-color: WindowText; } } .ProfileEditor__button-footer { display: flex; flex-wrap: wrap; justify-content: flex-end; align-items: center; padding-block: 1em 16px; gap: 8px; } .ProfileEditor__button-footer .module-Button:not(:first-child) { margin-inline-start: 4px; } .ProfileEditor__Title { font-weight: 600; font-size: 26px; line-height: 32px; letter-spacing: -0.56px; text-align: center; overflow-x: hidden; text-overflow: ellipsis; white-space: nowrap; margin-block: 0 4px; margin-inline: 0; } .ProfileEditor__Title { color: #1b1b1b; } .dark-theme .ProfileEditor__Title { color: #e9e9e9; } .ProfileEditor__PhoneNumber { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; text-align: center; overflow-x: hidden; text-overflow: ellipsis; white-space: nowrap; margin-block: 0 14px; margin-inline: 0; } .ProfileEditor__PhoneNumber { color: #000000; } .dark-theme .ProfileEditor__PhoneNumber { color: #ffffff; } .ProfileEditor__EditPhotoContainer { display: flex; justify-content: center; margin-block-end: 16px; } .ProfileMovedModal { width: 300px; text-align: center; } .ProfileMovedModal__image { margin-top: 8px; margin-bottom: 16px; } .ProfileMovedModal__title { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; margin-bottom: 4px; } .ProfileMovedModal__description { margin-bottom: 20px; margin-inline-start: 16px; margin-inline-end: 16px; } .ProfileMovedModal__description { color: rgba(0, 0, 0, 0.5); } .dark-theme .ProfileMovedModal__description { color: rgba(255, 255, 255, 0.5); } .ProfileMovedModal__button { min-width: 236px; } .ProfileNameWarningModal .ProfileNameWarningModal__body_inner { display: flex; flex-direction: column; } .ProfileNameWarningModal .ProfileNameWarningModal__header-icon { display: block; align-self: center; height: 48px; width: 48px; margin-bottom: 24px; } .ProfileNameWarningModal .ProfileNameWarningModal__header-icon { -webkit-mask: url("../images/icons/v3/person/person-questionmark-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#000000, #e9e9e9); } @media (forced-colors: active) { .ProfileNameWarningModal .ProfileNameWarningModal__header-icon { background-color: WindowText; } } .ProfileNameWarningModal .ProfileNameWarningModal__description { margin-bottom: 24px; } .ProfileNameWarningModal .ProfileNameWarningModal__list { padding-inline-start: 24px; margin-top: 0px; } .ProfileNameWarningModal .ProfileNameWarningModal__list-item { position: relative; padding-inline-start: 17px; margin-bottom: 25px; list-style-type: none; } .ProfileNameWarningModal .ProfileNameWarningModal__list-item::before { content: ""; position: absolute; inset-inline-start: 0; top: 0; width: 4px; height: 100%; background-color: #c6c6c6; border-radius: 6px; } .ProgressBar { position: relative; overflow: hidden; background: rgba(44, 107, 237, 0.2); height: 5px; border-radius: 2px; } .ProgressBar__fill { position: absolute; background-color: #2c6bed; border-radius: 2px; display: block; height: 100%; width: 100%; transition: transform 0.2s; left: 0; --spinning-bar-width-fraction: 0.36; } @keyframes progress-bar-spinning-rtl { from { transform: translateX(calc(100% * 1 / var(--spinning-bar-width-fraction))); } to { transform: translateX(-100%); } } @keyframes progress-bar-spinning { from { transform: translateX(-100%); } to { transform: translateX(calc(100% * 1 / var(--spinning-bar-width-fraction))); } } .ProgressBar__fill--spinning { width: calc(var(--spinning-bar-width-fraction) * 100%); } .ProgressBar__fill--spinning:dir(rtl) { animation: progress-bar-spinning-rtl 2s ease-in-out infinite; } .ProgressBar__fill--spinning:dir(ltr) { animation: progress-bar-spinning 2s ease-in-out infinite; } .module-message .module-quote__container { margin-inline: -4px; margin-top: 0px; margin-bottom: 8px; } .module-quote { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-quote { border: 1px solid WindowText; } } .module-quote { width: 100%; position: relative; border-radius: 8px 8px 4px 4px; display: flex; flex-direction: row; align-items: stretch; overflow: hidden; } .keyboard-mode .module-quote:focus { box-shadow: 0px 0px 0px 2px #2c6bed; } .module-quote__reaction-emoji { bottom: 5px; position: absolute; inset-inline-end: 25px; z-index: 1; } .module-quote__reaction-emoji img.emoji { height: 24px; width: 24px; } .module-quote__reaction-emoji--story-unavailable { align-items: flex-end; display: flex; margin-inline-start: 32px; padding-bottom: 7px; } .module-quote--no-click { cursor: auto; } .module-quote--with-reference-warning { border-bottom-left-radius: 0px; border-bottom-right-radius: 0px; } .module-quote--outgoing { background-color: #71717f; } .module-quote--outgoing .module-quote__primary { border-inline-start-color: #71717f; } .keyboard-mode .module-quote--outgoing:focus { box-shadow: 0px 0px 0px 2px #ffffff; } .module-quote--incoming-blue { background-color: rgb(164.8168224299, 195.8, 226.7831775701); } .module-quote--incoming-blue .module-quote__primary { border-inline-start-color: #336ba3; } .dark-theme .module-quote--incoming-blue { background-color: rgb(30.6, 64.2, 97.8); } .module-quote--outgoing-blue { background-color: rgb(164.8168224299, 195.8, 226.7831775701); } .module-quote--outgoing-blue .module-quote__primary { border-inline-start-color: #ffffff; } .dark-theme .module-quote--outgoing-blue { background-color: rgb(30.6, 64.2, 97.8); border-inline-start-color: #ffffff; } .module-quote--compose-blue { background-color: rgb(164.8168224299, 195.8, 226.7831775701); } .module-quote--compose-blue .module-quote__primary { border-inline-start-color: #336ba3; } .dark-theme .module-quote--compose-blue { background-color: rgb(30.6, 64.2, 97.8); } .dark-theme .module-quote--compose-blue .module-quote__primary { border-inline-start-color: #ffffff; } .module-quote--incoming-burlap { background-color: rgb(199.9889447236, 196.8633165829, 185.6110552764); } .module-quote--incoming-burlap .module-quote__primary { border-inline-start-color: #6f6a58; } .dark-theme .module-quote--incoming-burlap { background-color: rgb(66.6, 63.6, 52.8); } .module-quote--outgoing-burlap { background-color: rgb(199.9889447236, 196.8633165829, 185.6110552764); } .module-quote--outgoing-burlap .module-quote__primary { border-inline-start-color: #ffffff; } .dark-theme .module-quote--outgoing-burlap { background-color: rgb(66.6, 63.6, 52.8); border-inline-start-color: #ffffff; } .module-quote--compose-burlap { background-color: rgb(199.9889447236, 196.8633165829, 185.6110552764); } .module-quote--compose-burlap .module-quote__primary { border-inline-start-color: #6f6a58; } .dark-theme .module-quote--compose-burlap { background-color: rgb(66.6, 63.6, 52.8); } .dark-theme .module-quote--compose-burlap .module-quote__primary { border-inline-start-color: #ffffff; } .module-quote--incoming-crimson { background-color: rgb(244.2017467249, 153.3982532751, 173.031441048); } .module-quote--incoming-crimson .module-quote__primary { border-inline-start-color: #cf163e; } .dark-theme .module-quote--incoming-crimson { background-color: rgb(124.2, 13.2, 37.2); } .module-quote--outgoing-crimson { background-color: rgb(244.2017467249, 153.3982532751, 173.031441048); } .module-quote--outgoing-crimson .module-quote__primary { border-inline-start-color: #ffffff; } .dark-theme .module-quote--outgoing-crimson { background-color: rgb(124.2, 13.2, 37.2); border-inline-start-color: #ffffff; } .module-quote--compose-crimson { background-color: rgb(244.2017467249, 153.3982532751, 173.031441048); } .module-quote--compose-crimson .module-quote__primary { border-inline-start-color: #cf163e; } .dark-theme .module-quote--compose-crimson { background-color: rgb(124.2, 13.2, 37.2); } .dark-theme .module-quote--compose-crimson .module-quote__primary { border-inline-start-color: #ffffff; } .module-quote--incoming-forest { background-color: rgb(166.2402234637, 211.3597765363, 173.6368715084); } .module-quote--incoming-forest .module-quote__primary { border-inline-start-color: #3b7845; } .dark-theme .module-quote--incoming-forest { background-color: rgb(35.4, 72, 41.4); } .module-quote--outgoing-forest { background-color: rgb(166.2402234637, 211.3597765363, 173.6368715084); } .module-quote--outgoing-forest .module-quote__primary { border-inline-start-color: #ffffff; } .dark-theme .module-quote--outgoing-forest { background-color: rgb(35.4, 72, 41.4); border-inline-start-color: #ffffff; } .module-quote--compose-forest { background-color: rgb(166.2402234637, 211.3597765363, 173.6368715084); } .module-quote--compose-forest .module-quote__primary { border-inline-start-color: #3b7845; } .dark-theme .module-quote--compose-forest { background-color: rgb(35.4, 72, 41.4); } .dark-theme .module-quote--compose-forest .module-quote__primary { border-inline-start-color: #ffffff; } .module-quote--incoming-indigo { background-color: rgb(191.4, 188.2, 233.8); } .module-quote--incoming-indigo .module-quote__primary { border-inline-start-color: #6058ca; } .dark-theme .module-quote--incoming-indigo { background-color: rgb(48.2454545455, 41.9181818182, 132.0818181818); } .module-quote--outgoing-indigo { background-color: rgb(191.4, 188.2, 233.8); } .module-quote--outgoing-indigo .module-quote__primary { border-inline-start-color: #ffffff; } .dark-theme .module-quote--outgoing-indigo { background-color: rgb(48.2454545455, 41.9181818182, 132.0818181818); border-inline-start-color: #ffffff; } .module-quote--compose-indigo { background-color: rgb(191.4, 188.2, 233.8); } .module-quote--compose-indigo .module-quote__primary { border-inline-start-color: #6058ca; } .dark-theme .module-quote--compose-indigo { background-color: rgb(48.2454545455, 41.9181818182, 132.0818181818); } .dark-theme .module-quote--compose-indigo .module-quote__primary { border-inline-start-color: #ffffff; } .module-quote--incoming-plum { background-color: rgb(227.1333333333, 168.8666666667, 202.8133333333); } .module-quote--incoming-plum .module-quote__primary { border-inline-start-color: #aa377a; } .dark-theme .module-quote--incoming-plum { background-color: rgb(102, 33, 73.2); } .module-quote--outgoing-plum { background-color: rgb(227.1333333333, 168.8666666667, 202.8133333333); } .module-quote--outgoing-plum .module-quote__primary { border-inline-start-color: #ffffff; } .dark-theme .module-quote--outgoing-plum { background-color: rgb(102, 33, 73.2); border-inline-start-color: #ffffff; } .module-quote--compose-plum { background-color: rgb(227.1333333333, 168.8666666667, 202.8133333333); } .module-quote--compose-plum .module-quote__primary { border-inline-start-color: #aa377a; } .dark-theme .module-quote--compose-plum { background-color: rgb(102, 33, 73.2); } .dark-theme .module-quote--compose-plum .module-quote__primary { border-inline-start-color: #ffffff; } .module-quote--incoming-steel { background-color: rgb(197.85, 197.85, 204.15); } .module-quote--incoming-steel .module-quote__primary { border-inline-start-color: #71717f; } .dark-theme .module-quote--incoming-steel { background-color: rgb(67.8, 67.8, 76.2); } .module-quote--outgoing-steel { background-color: rgb(197.85, 197.85, 204.15); } .module-quote--outgoing-steel .module-quote__primary { border-inline-start-color: #ffffff; } .dark-theme .module-quote--outgoing-steel { background-color: rgb(67.8, 67.8, 76.2); border-inline-start-color: #ffffff; } .module-quote--compose-steel { background-color: rgb(197.85, 197.85, 204.15); } .module-quote--compose-steel .module-quote__primary { border-inline-start-color: #71717f; } .dark-theme .module-quote--compose-steel { background-color: rgb(67.8, 67.8, 76.2); } .dark-theme .module-quote--compose-steel .module-quote__primary { border-inline-start-color: #ffffff; } .module-quote--incoming-taupe { background-color: rgb(211.35, 190.65, 194.7); } .module-quote--incoming-taupe .module-quote__primary { border-inline-start-color: #8f616a; } .dark-theme .module-quote--incoming-taupe { background-color: rgb(85.8, 58.2, 63.6); } .module-quote--outgoing-taupe { background-color: rgb(211.35, 190.65, 194.7); } .module-quote--outgoing-taupe .module-quote__primary { border-inline-start-color: #ffffff; } .dark-theme .module-quote--outgoing-taupe { background-color: rgb(85.8, 58.2, 63.6); border-inline-start-color: #ffffff; } .module-quote--compose-taupe { background-color: rgb(211.35, 190.65, 194.7); } .module-quote--compose-taupe .module-quote__primary { border-inline-start-color: #8f616a; } .dark-theme .module-quote--compose-taupe { background-color: rgb(85.8, 58.2, 63.6); } .dark-theme .module-quote--compose-taupe .module-quote__primary { border-inline-start-color: #ffffff; } .module-quote--incoming-teal { background-color: rgb(118.7333333333, 228.8666666667, 248.4666666667); } .module-quote--incoming-teal .module-quote__primary { border-inline-start-color: #077d92; } .dark-theme .module-quote--incoming-teal { background-color: rgb(4.2, 75, 87.6); } .module-quote--outgoing-teal { background-color: rgb(118.7333333333, 228.8666666667, 248.4666666667); } .module-quote--outgoing-teal .module-quote__primary { border-inline-start-color: #ffffff; } .dark-theme .module-quote--outgoing-teal { background-color: rgb(4.2, 75, 87.6); border-inline-start-color: #ffffff; } .module-quote--compose-teal { background-color: rgb(118.7333333333, 228.8666666667, 248.4666666667); } .module-quote--compose-teal .module-quote__primary { border-inline-start-color: #077d92; } .dark-theme .module-quote--compose-teal { background-color: rgb(4.2, 75, 87.6); } .dark-theme .module-quote--compose-teal .module-quote__primary { border-inline-start-color: #ffffff; } .module-quote--incoming-vermilion { background-color: rgb(249.2392344498, 170.8928229665, 140.3607655502); } .module-quote--incoming-vermilion .module-quote__primary { border-inline-start-color: #c73f0a; } .dark-theme .module-quote--incoming-vermilion { background-color: rgb(119.4, 37.8, 6); } .module-quote--outgoing-vermilion { background-color: rgb(249.2392344498, 170.8928229665, 140.3607655502); } .module-quote--outgoing-vermilion .module-quote__primary { border-inline-start-color: #ffffff; } .dark-theme .module-quote--outgoing-vermilion { background-color: rgb(119.4, 37.8, 6); border-inline-start-color: #ffffff; } .module-quote--compose-vermilion { background-color: rgb(249.2392344498, 170.8928229665, 140.3607655502); } .module-quote--compose-vermilion .module-quote__primary { border-inline-start-color: #c73f0a; } .dark-theme .module-quote--compose-vermilion { background-color: rgb(119.4, 37.8, 6); } .dark-theme .module-quote--compose-vermilion .module-quote__primary { border-inline-start-color: #ffffff; } .module-quote--incoming-violet { background-color: rgb(214.648, 171.8, 234.2); } .module-quote--incoming-violet .module-quote__primary { border-inline-start-color: #9932c8; } .dark-theme .module-quote--incoming-violet { background-color: rgb(91.8, 30, 120); } .module-quote--outgoing-violet { background-color: rgb(214.648, 171.8, 234.2); } .module-quote--outgoing-violet .module-quote__primary { border-inline-start-color: #ffffff; } .dark-theme .module-quote--outgoing-violet { background-color: rgb(91.8, 30, 120); border-inline-start-color: #ffffff; } .module-quote--compose-violet { background-color: rgb(214.648, 171.8, 234.2); } .module-quote--compose-violet .module-quote__primary { border-inline-start-color: #9932c8; } .dark-theme .module-quote--compose-violet { background-color: rgb(91.8, 30, 120); } .dark-theme .module-quote--compose-violet .module-quote__primary { border-inline-start-color: #ffffff; } .module-quote--incoming-wintergreen { background-color: rgb(140.8944785276, 230.3055214724, 200.5018404908); } .module-quote--incoming-wintergreen .module-quote__primary { border-inline-start-color: #1d8663; } .dark-theme .module-quote--incoming-wintergreen { background-color: rgb(17.4, 80.4, 59.4); } .module-quote--outgoing-wintergreen { background-color: rgb(140.8944785276, 230.3055214724, 200.5018404908); } .module-quote--outgoing-wintergreen .module-quote__primary { border-inline-start-color: #ffffff; } .dark-theme .module-quote--outgoing-wintergreen { background-color: rgb(17.4, 80.4, 59.4); border-inline-start-color: #ffffff; } .module-quote--compose-wintergreen { background-color: rgb(140.8944785276, 230.3055214724, 200.5018404908); } .module-quote--compose-wintergreen .module-quote__primary { border-inline-start-color: #1d8663; } .dark-theme .module-quote--compose-wintergreen { background-color: rgb(17.4, 80.4, 59.4); } .dark-theme .module-quote--compose-wintergreen .module-quote__primary { border-inline-start-color: #ffffff; } .module-quote--compose-custom, .module-quote--incoming-custom, .module-quote--outgoing-custom { background-attachment: fixed; } .module-quote--compose-ultramarine .module-quote__primary, .module-quote--compose-ultramarine.module-quote__reference-warning, .module-quote--incoming-ultramarine .module-quote__primary, .module-quote--incoming-ultramarine.module-quote__reference-warning { border-inline-start-color: #0552f0; } .module-quote--compose-ultramarine, .module-quote--incoming-ultramarine, .module-quote--outgoing-ultramarine { background-attachment: fixed; } .module-quote--compose-ultramarine, .module-quote--incoming-ultramarine, .module-quote--outgoing-ultramarine { background-image: linear-gradient(180deg, rgb(151.1632653061, 184.4775510204, 252.8367346939), rgb(170.6, 195.8, 247.8)), linear-gradient(red, blue); } .dark-theme .module-quote--compose-ultramarine, .dark-theme .module-quote--incoming-ultramarine, .dark-theme .module-quote--outgoing-ultramarine { background-image: linear-gradient(180deg, rgb(3, 49.2, 144), rgb(13.2524017467, 59.6358078603, 155.3475982533)); } .module-quote--outgoing-ultramarine .module-quote__primary, .module-quote--outgoing-ultramarine.module-quote__reference-warning { border-inline-start-color: #ffffff; } .module-quote--compose-basil .module-quote__primary, .module-quote--compose-basil.module-quote__reference-warning, .module-quote--incoming-basil .module-quote__primary, .module-quote--incoming-basil.module-quote__reference-warning { border-inline-start-color: #2f9373; } .module-quote--compose-basil, .module-quote--incoming-basil, .module-quote--outgoing-basil { background-attachment: fixed; } .module-quote--compose-basil, .module-quote--incoming-basil, .module-quote--outgoing-basil { background-image: linear-gradient(180deg, rgb(159.2226804124, 224.3773195876, 203.5278350515), rgb(108.7049180328, 246.0950819672, 185.0327868852)), linear-gradient(red, blue); } .dark-theme .module-quote--compose-basil, .dark-theme .module-quote--incoming-basil, .dark-theme .module-quote--outgoing-basil { background-image: linear-gradient(180deg, rgb(28.2, 88.2, 69), rgb(4.2, 69, 40.2)); } .module-quote--outgoing-basil .module-quote__primary, .module-quote--outgoing-basil.module-quote__reference-warning { border-inline-start-color: #ffffff; } .module-quote--compose-ember .module-quote__primary, .module-quote--compose-ember.module-quote__reference-warning, .module-quote--incoming-ember .module-quote__primary, .module-quote--incoming-ember.module-quote__reference-warning { border-inline-start-color: #e57c00; } .module-quote--compose-ember, .module-quote--incoming-ember, .module-quote--outgoing-ember { background-attachment: fixed; } .module-quote--compose-ember, .module-quote--incoming-ember, .module-quote--outgoing-ember { background-image: linear-gradient(168deg, rgb(255, 203.4628820961, 142.6), rgb(255, 88.6, 88.6)), linear-gradient(red, blue); } .dark-theme .module-quote--compose-ember, .dark-theme .module-quote--incoming-ember, .dark-theme .module-quote--outgoing-ember { background-image: linear-gradient(168deg, rgb(137.4, 74.4, 0), rgb(56.4, 0, 0)); } .module-quote--outgoing-ember .module-quote__primary, .module-quote--outgoing-ember.module-quote__reference-warning { border-inline-start-color: #ffffff; } .module-quote--compose-fluorescent .module-quote__primary, .module-quote--compose-fluorescent.module-quote__reference-warning, .module-quote--incoming-fluorescent .module-quote__primary, .module-quote--incoming-fluorescent.module-quote__reference-warning { border-inline-start-color: #ec13dd; } .module-quote--compose-fluorescent, .module-quote--incoming-fluorescent, .module-quote--outgoing-fluorescent { background-attachment: fixed; } .module-quote--compose-fluorescent, .module-quote--incoming-fluorescent, .module-quote--outgoing-fluorescent { background-image: linear-gradient(192deg, rgb(247.4, 160.6, 241.4), rgb(154.68, 168.36, 241.32)), linear-gradient(red, blue); } .dark-theme .module-quote--compose-fluorescent, .dark-theme .module-quote--incoming-fluorescent, .dark-theme .module-quote--outgoing-fluorescent { background-image: linear-gradient(192deg, rgb(141.6, 11.4, 132.6), rgb(16.2, 32.4, 118.8)); } .module-quote--outgoing-fluorescent .module-quote__primary, .module-quote--outgoing-fluorescent.module-quote__reference-warning { border-inline-start-color: #ffffff; } .module-quote--compose-infrared .module-quote__primary, .module-quote--compose-infrared.module-quote__reference-warning, .module-quote--incoming-infrared .module-quote__primary, .module-quote--incoming-infrared.module-quote__reference-warning { border-inline-start-color: #f65560; } .module-quote--compose-infrared, .module-quote--incoming-infrared, .module-quote--outgoing-infrared { background-attachment: fixed; } .module-quote--compose-infrared, .module-quote--incoming-infrared, .module-quote--outgoing-infrared { background-image: linear-gradient(192deg, rgb(251.4, 187, 191.4), rgb(180.2, 170.6, 247.8)), linear-gradient(red, blue); } .dark-theme .module-quote--compose-infrared, .dark-theme .module-quote--incoming-infrared, .dark-theme .module-quote--outgoing-infrared { background-image: linear-gradient(192deg, rgb(188.6145251397, 9.9854748603, 22.1899441341), rgb(30.9222707424, 13.2524017467, 155.3475982533)); } .module-quote--outgoing-infrared .module-quote__primary, .module-quote--outgoing-infrared.module-quote__reference-warning { border-inline-start-color: #ffffff; } .module-quote--compose-lagoon .module-quote__primary, .module-quote--compose-lagoon.module-quote__reference-warning, .module-quote--incoming-lagoon .module-quote__primary, .module-quote--incoming-lagoon.module-quote__reference-warning { border-inline-start-color: #004066; } .module-quote--compose-lagoon, .module-quote--incoming-lagoon, .module-quote--outgoing-lagoon { background-attachment: fixed; } .module-quote--compose-lagoon, .module-quote--incoming-lagoon, .module-quote--outgoing-lagoon { background-image: linear-gradient(180deg, rgb(91.8, 194.2, 255), rgb(160.0347826087, 219.5652173913, 213.1869565217)), linear-gradient(red, blue); } .dark-theme .module-quote--compose-lagoon, .dark-theme .module-quote--incoming-lagoon, .dark-theme .module-quote--outgoing-lagoon { background-image: linear-gradient(180deg, rgb(0, 38.4, 61.2), rgb(30, 80.4, 75)); } .module-quote--outgoing-lagoon .module-quote__primary, .module-quote--outgoing-lagoon.module-quote__reference-warning { border-inline-start-color: #ffffff; } .module-quote--compose-midnight .module-quote__primary, .module-quote--compose-midnight.module-quote__reference-warning, .module-quote--incoming-midnight .module-quote__primary, .module-quote--incoming-midnight.module-quote__reference-warning { border-inline-start-color: #2c2c3a; } .module-quote--compose-midnight, .module-quote--incoming-midnight, .module-quote--outgoing-midnight { background-attachment: fixed; } .module-quote--compose-midnight, .module-quote--incoming-midnight, .module-quote--outgoing-midnight { background-image: linear-gradient(180deg, rgb(162.2, 162.2, 184.6), #c9c9d3), linear-gradient(red, blue); } .dark-theme .module-quote--compose-midnight, .dark-theme .module-quote--incoming-midnight, .dark-theme .module-quote--outgoing-midnight { background-image: linear-gradient(180deg, rgb(26.4, 26.4, 34.8), rgb(71.387755102, 71.387755102, 87.612244898)); } .module-quote--outgoing-midnight .module-quote__primary, .module-quote--outgoing-midnight.module-quote__reference-warning { border-inline-start-color: #ffffff; } .module-quote--compose-sea .module-quote__primary, .module-quote--compose-sea.module-quote__reference-warning, .module-quote--incoming-sea .module-quote__primary, .module-quote--incoming-sea.module-quote__reference-warning { border-inline-start-color: #498fd4; } .module-quote--compose-sea, .module-quote--incoming-sea, .module-quote--outgoing-sea { background-attachment: fixed; } .module-quote--compose-sea, .module-quote--incoming-sea, .module-quote--outgoing-sea { background-image: linear-gradient(180deg, rgb(182.2, 210.2, 237.8), rgb(159, 193.8, 228.6)), linear-gradient(red, blue); } .dark-theme .module-quote--compose-sea, .dark-theme .module-quote--incoming-sea, .dark-theme .module-quote--outgoing-sea { background-image: linear-gradient(180deg, rgb(32.68, 85.88, 138.32), rgb(26.4, 61.2, 96)); } .module-quote--outgoing-sea .module-quote__primary, .module-quote--outgoing-sea.module-quote__reference-warning { border-inline-start-color: #ffffff; } .module-quote--compose-sublime .module-quote__primary, .module-quote--compose-sublime.module-quote__reference-warning, .module-quote--incoming-sublime .module-quote__primary, .module-quote--incoming-sublime.module-quote__reference-warning { border-inline-start-color: #6281d5; } .module-quote--compose-sublime, .module-quote--incoming-sublime, .module-quote--outgoing-sublime { background-attachment: fixed; } .module-quote--compose-sublime, .module-quote--incoming-sublime, .module-quote--outgoing-sublime { background-image: linear-gradient(180deg, rgb(192.2, 204.6, 238.2), rgb(218.8575342466, 174.7424657534, 189.6246575342)), linear-gradient(red, blue); } .dark-theme .module-quote--compose-sublime, .dark-theme .module-quote--incoming-sublime, .dark-theme .module-quote--outgoing-sublime { background-image: linear-gradient(180deg, rgb(39.3829145729, 68.4512562814, 147.2170854271), rgb(90.6, 40.8, 57.6)); } .module-quote--outgoing-sublime .module-quote__primary, .module-quote--outgoing-sublime.module-quote__reference-warning { border-inline-start-color: #ffffff; } .module-quote--compose-tangerine .module-quote__primary, .module-quote--compose-tangerine.module-quote__reference-warning, .module-quote--incoming-tangerine .module-quote__primary, .module-quote--incoming-tangerine.module-quote__reference-warning { border-inline-start-color: #db7133; } .module-quote--compose-tangerine, .module-quote--incoming-tangerine, .module-quote--outgoing-tangerine { background-attachment: fixed; } .module-quote--compose-tangerine, .module-quote--incoming-tangerine, .module-quote--outgoing-tangerine { background-image: linear-gradient(192deg, rgb(240.6, 198.2, 173.4), rgb(239.672392638, 131.527607362, 157.9251533742)), linear-gradient(red, blue); } .dark-theme .module-quote--compose-tangerine, .dark-theme .module-quote--incoming-tangerine, .dark-theme .module-quote--outgoing-tangerine { background-image: linear-gradient(192deg, rgb(137.7, 66.15, 24.3), rgb(87, 10.8, 29.4)); } .module-quote--outgoing-tangerine .module-quote__primary, .module-quote--outgoing-tangerine.module-quote__reference-warning { border-inline-start-color: #ffffff; } .module-quote--outgoing-custom .module-quote__primary, .module-quote--outgoing-custom.module-quote__reference-warning { border-inline-start-color: #ffffff; } .module-quote__primary { flex-grow: 1; padding-inline: 8px; padding-top: 7px; padding-bottom: 7px; min-height: 54px; border-style: solid; border-width: 0 0 0 4px; max-width: 100%; } .module-quote__primary__author { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; font-weight: 600; display: inline-flex; align-items: center; gap: 4px; max-width: 100%; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } .module-quote__primary__author { color: #1b1b1b; } .dark-theme .module-quote__primary__author { color: #e9e9e9; } .dark-theme .module-quote__primary__author--incoming { color: #e9e9e9; } .module-quote__primary__text { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; text-align: start; } .module-quote__primary__text { color: #1b1b1b; } .module-quote__primary__text a { color: #1b1b1b; } .dark-theme .module-quote__primary__text { color: #e9e9e9; } .dark-theme .module-quote__primary__text a { color: #e9e9e9; } .module-quote__primary__text { overflow-wrap: break-word; word-wrap: break-word; word-break: break-word; white-space: pre-wrap; overflow: hidden; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; } .dark-theme .module-quote__primary__text--incoming { color: #e9e9e9; } .dark-theme .module-quote__primary__text--incoming a { color: #e9e9e9; } .module-quote__primary__type-label { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; font-style: italic; } .module-quote__primary__type-label { color: #1b1b1b; } .dark-theme .module-quote__primary__type-label { color: #e9e9e9; } .dark-theme .module-quote__primary__type-label--incoming { color: #e9e9e9; } .module-quote__primary__filename-label { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; } .module-quote__close-container { position: absolute; top: 4px; inset-inline-end: 4px; height: 16px; width: 16px; border-radius: 50%; background-color: rgba(0, 0, 0, 0.4); } .keyboard-mode .module-quote__close-container:focus-within { background-color: #2c6bed; } .module-quote__close-button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-quote__close-button { border: 1px solid WindowText; } } .module-quote__close-button { width: 14px; height: 14px; position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); } .module-quote__close-button { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .module-quote__close-button { background-color: WindowText; } } .module-quote__icon-container { background-position: center center; background-repeat: no-repeat; background-size: cover; flex: 0 0 54px; position: relative; width: 54px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; } .module-quote__icon-container__outgoing-gift-badge { border: 1px solid #ffffff; } .dark-theme .module-quote__icon-container__outgoing-gift-badge { border: 1px solid rgba(255, 255, 255, 0.8); } .module-quote__icon-container__inner { position: absolute; top: 0; inset-inline: 0; bottom: 0; text-align: center; display: flex; align-items: center; justify-content: center; } .module-quote__icon-container__circle-background { display: flex; align-items: center; justify-content: center; height: 32px; width: 32px; border-radius: 50%; background-color: #ffffff; } .module-quote__icon-container__icon { width: 20px; height: 20px; } .module-quote__icon-container__icon--file { -webkit-mask: url("../images/icons/v3/file/file.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #2c6bed; } @media (forced-colors: active) { .module-quote__icon-container__icon--file { background-color: WindowText; } } .module-quote__icon-container__icon--image { -webkit-mask: url("../images/icons/v3/photo/photo-square.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #2c6bed; } @media (forced-colors: active) { .module-quote__icon-container__icon--image { background-color: WindowText; } } .module-quote__icon-container__icon--microphone { -webkit-mask: url("../images/icons/v3/mic/mic.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #2c6bed; } @media (forced-colors: active) { .module-quote__icon-container__icon--microphone { background-color: WindowText; } } .module-quote__icon-container__icon--play { -webkit-mask: url("../images/icons/v3/play/play-fill.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #2c6bed; } @media (forced-colors: active) { .module-quote__icon-container__icon--play { background-color: WindowText; } } .module-quote__icon-container__icon--movie { -webkit-mask: url("../images/movie.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #2c6bed; } @media (forced-colors: active) { .module-quote__icon-container__icon--movie { background-color: WindowText; } } .module-quote__icon-container__icon--view-once { -webkit-mask: url("../images/icons/v3/view_once/view_once.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #2c6bed; } @media (forced-colors: active) { .module-quote__icon-container__icon--view-once { background-color: WindowText; } } .module-quote__generic-file { display: flex; flex-direction: row; align-items: center; } .module-quote__generic-file__icon { background: url("../images/generic-file.svg"); background-size: contain; margin-inline-end: 6px; background-repeat: no-repeat; height: 40px; width: 30px; } .module-quote__generic-file__text { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; max-width: calc(100% - 26px); overflow-x: hidden; white-space: nowrap; text-overflow: ellipsis; } .module-quote__generic-file__text { color: #1b1b1b; } .dark-theme .module-quote__generic-file__text { color: #e9e9e9; } .dark-theme .module-quote__generic-file__text--incoming { color: #e9e9e9; } .module-quote__reference-warning { color: #1b1b1b; height: 26px; display: flex; flex-direction: row; align-items: center; border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; border-inline-start-style: solid; border-left-width: 4px; padding-inline: 8px; } .module-quote__reference-warning__icon { height: 16px; width: 16px; } .module-quote__reference-warning__icon { -webkit-mask: url("../images/icons/v3/link/link-slash.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #1b1b1b; } @media (forced-colors: active) { .module-quote__reference-warning__icon { background-color: WindowText; } } .dark-theme .module-quote__reference-warning__icon { -webkit-mask: url("../images/icons/v3/link/link-slash.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #e9e9e9; } @media (forced-colors: active) { .dark-theme .module-quote__reference-warning__icon { background-color: WindowText; } } .module-quote__reference-warning__icon--incoming { -webkit-mask: url("../images/icons/v3/link/link-slash.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #1b1b1b; } @media (forced-colors: active) { .module-quote__reference-warning__icon--incoming { background-color: WindowText; } } .dark-theme .module-quote__reference-warning__icon--incoming { -webkit-mask: url("../images/icons/v3/link/link-slash.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #e9e9e9; } @media (forced-colors: active) { .dark-theme .module-quote__reference-warning__icon--incoming { background-color: WindowText; } } .module-quote__reference-warning__text { font-size: 11px; line-height: 14px; letter-spacing: 0.06px; margin-inline-start: 6px; } .module-quote__reference-warning__text { color: #1b1b1b; } .dark-theme .module-quote__reference-warning__text { color: #e9e9e9; } .dark-theme .module-quote__reference-warning__text--incoming { color: #e9e9e9; } .module-message .module-message__author + .module-quote__container { margin-top: 3px; } .module-message .module-message__author + .module-quote__container .module-quote { border-radius: 4px 4px 4px 4px; } .module-message--incoming.module-message--collapsed-above .module-quote { border-top-left-radius: 4px; } .module-message--outgoing.module-message--collapsed-above .module-quote { border-top-right-radius: 4px; } .module-ReactionPickerPicker { border-radius: 9999px; align-items: center; border-style: solid; border-width: 1px; box-shadow: 0 1px 4px rgba(0, 0, 0, 0.05), 0 10px 16px rgba(0, 0, 0, 0.2); display: inline-flex; flex-direction: row; padding-block: 3px; padding-inline: 7px; position: relative; user-select: none; } @media (prefers-reduced-motion: no-preference) { .module-ReactionPickerPicker { animation-name: module-ReactionPickerPicker__appear; animation-duration: 400ms; animation-timing-function: cubic-bezier(0.19, 1, 0.22, 1); animation-fill-mode: forwards; } } .module-ReactionPickerPicker { background: #ffffff; border-color: rgba(0, 0, 0, 0.05); } .dark-theme .module-ReactionPickerPicker { background: #3b3b3b; border-color: #2e2e2e; } .module-ReactionPickerPicker__button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-ReactionPickerPicker__button { border: 1px solid WindowText; } } .module-ReactionPickerPicker__button { align-items: center; border-radius: 100%; display: flex; justify-content: center; position: relative; } .module-ReactionPickerPicker__button--emoji { height: 40px; width: 40px; } @media (prefers-reduced-motion: no-preference) { .module-ReactionPickerPicker__button--emoji { transition: background 200ms cubic-bezier(0.19, 1, 0.22, 1); } } .module-ReactionPickerPicker__button--emoji .FunStaticEmoji { transform: scale(0.5833333333); } @media (prefers-reduced-motion: no-preference) { .module-ReactionPickerPicker__button--emoji .FunStaticEmoji { transition: transform 400ms cubic-bezier(0.19, 1, 0.22, 1); } } .module-ReactionPickerPicker__button--more { height: 28px; margin: 6px; width: 28px; } @media (prefers-reduced-motion: no-preference) { .module-ReactionPickerPicker__button--more { transition: background 200ms cubic-bezier(0.19, 1, 0.22, 1); } } .module-ReactionPickerPicker__button--more { background: #f6f6f6; } .module-ReactionPickerPicker__button--more:hover { background: #e9e9e9; } .keyboard-mode .module-ReactionPickerPicker__button--more:focus { background: #e9e9e9; } .dark-theme .module-ReactionPickerPicker__button--more { background: #5e5e5e; } .dark-theme .module-ReactionPickerPicker__button--more:hover { background: #848484; } .dark-theme.keyboard-mode .dark-theme .module-ReactionPickerPicker__button--more:focus { background: #848484; } .module-ReactionPickerPicker__button--more::before { width: 20px; height: 20px; display: block; content: ""; } .module-ReactionPickerPicker__button--more::before { -webkit-mask: url("../images/icons/v3/more/more.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #848484; } @media (forced-colors: active) { .module-ReactionPickerPicker__button--more::before { background-color: WindowText; } } .dark-theme .module-ReactionPickerPicker__button--more::before { -webkit-mask: url("../images/icons/v3/more/more.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .module-ReactionPickerPicker__button--more::before { background-color: WindowText; } } .module-ReactionPickerPicker--picker-style { z-index: 2; } @media (prefers-reduced-motion: no-preference) { .module-ReactionPickerPicker--picker-style .module-ReactionPickerPicker__button { opacity: 0; animation-name: module-ReactionPickerPicker__button-appear; animation-duration: 400ms; animation-timing-function: cubic-bezier(0.19, 1, 0.22, 1); animation-fill-mode: forwards; animation-delay: 70ms; } } .module-ReactionPickerPicker--picker-style .module-ReactionPickerPicker__button:nth-of-type(1) { animation-delay: 0ms; } .module-ReactionPickerPicker--picker-style .module-ReactionPickerPicker__button:nth-of-type(2) { animation-delay: 10ms; } .module-ReactionPickerPicker--picker-style .module-ReactionPickerPicker__button:nth-of-type(3) { animation-delay: 20ms; } .module-ReactionPickerPicker--picker-style .module-ReactionPickerPicker__button:nth-of-type(4) { animation-delay: 30ms; } .module-ReactionPickerPicker--picker-style .module-ReactionPickerPicker__button:nth-of-type(5) { animation-delay: 40ms; } .module-ReactionPickerPicker--picker-style .module-ReactionPickerPicker__button:nth-of-type(6) { animation-delay: 50ms; } .module-ReactionPickerPicker--picker-style .module-ReactionPickerPicker__button:nth-of-type(7) { animation-delay: 60ms; } .module-ReactionPickerPicker--picker-style .module-ReactionPickerPicker__button:nth-of-type(8) { animation-delay: 70ms; } .module-ReactionPickerPicker--picker-style .module-ReactionPickerPicker__button--emoji:hover .FunStaticEmoji { transform: scale(0.875) translateY(-16px); } .keyboard-mode .module-ReactionPickerPicker--picker-style .module-ReactionPickerPicker__button--emoji:focus .FunStaticEmoji { transform: scale(0.875) translateY(-16px); } .module-ReactionPickerPicker--picker-style .module-ReactionPickerPicker__button--selected { background: rgba(0, 0, 0, 0.2); } .dark-theme .module-ReactionPickerPicker--picker-style .module-ReactionPickerPicker__button--selected { background: rgba(255, 255, 255, 0.2); } .keyboard-mode .module-ReactionPickerPicker--menu-style .module-ReactionPickerPicker__button:focus { background: rgba(0, 0, 0, 0.2); } .dark-theme.keyboard-mode .module-ReactionPickerPicker--menu-style .module-ReactionPickerPicker__button:focus { background: rgba(255, 255, 255, 0.4); } .module-ReactionPickerPicker--menu-style .module-ReactionPickerPicker__button--selected { opacity: 1; } .module-ReactionPickerPicker--menu-style .module-ReactionPickerPicker__button--selected .FunStaticEmoji { transform: scale(0.875); } @media (prefers-reduced-motion: no-preference) { .module-ReactionPickerPicker--menu-style .module-ReactionPickerPicker__button--selected { animation: module-ReactionPickerPicker__button-selected 200ms ease-in-out infinite alternate; } } .module-ReactionPickerPicker--menu-style.module-ReactionPickerPicker--something-selected .module-ReactionPickerPicker__button:not(.module-ReactionPickerPicker__button--selected) { opacity: 0.4; transform: scale(0.9); } @keyframes module-ReactionPickerPicker__appear { from { opacity: 0; } to { opacity: 1; } } @keyframes module-ReactionPickerPicker__button-appear { from { /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate3d(0, 24px, 0); opacity: 0; } to { /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate3d(0, 0, 0); opacity: 1; } } @keyframes module-ReactionPickerPicker__button-selected { from { transform: rotate(-8deg); } to { transform: rotate(8deg); } } .RecordingComposer { display: flex; align-items: center; gap: 12px; padding-block: 10px; padding-inline: 18px; } .RecordingComposer__content { display: flex; align-items: center; gap: 8px; flex: 1; border-radius: 16px; height: 32px; padding-block: 6px; padding-inline: 12px; overflow: hidden; } .RecordingComposer__content { background: #e9e9e9; } .dark-theme .RecordingComposer__content { background: #3b3b3b; } .RecordingComposer__button { font-size: 13px; min-width: 76px; line-height: 18px; padding-block: 5px; padding-inline: 16px; } .RemoteMegaphoneTooltip { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; } .RemoteMegaphoneTooltip { background-color: #f0f0f0; color: #000000; outline: 1px solid #c6c6c6; } .dark-theme .RemoteMegaphoneTooltip { background-color: #2e2e2e; color: #dedede; outline: 1px solid #545454; } .RemoteMegaphoneTooltip { padding-block: 5px; padding-inline: 12px; border-radius: 6px; filter: drop-shadow(0px 4px 3px rgba(0, 0, 0, 0.16)); pointer-events: none; } .RemoteMegaphoneTooltip .module-tooltip-arrow::before { position: absolute; content: ""; border-style: solid; border-width: 7px; border-color: light-dark(#f0f0f0, #2e2e2e); } .RemoteMegaphoneTooltip[data-placement=bottom] .module-tooltip-arrow::before { border-color: transparent transparent #c6c6c6 transparent; } .dark-theme .RemoteMegaphoneTooltip[data-placement=bottom] .module-tooltip-arrow::before { border-color: transparent transparent #545454 transparent; } .RemoteMegaphoneTooltip[data-placement=bottom] .module-tooltip-arrow::before { margin-top: -14px; /* stylelint-disable-next-line liberty/use-logical-spec */ margin-left: -7px; } .RemoteMegaphoneTooltip[data-placement=top] .module-tooltip-arrow::before { border-color: #c6c6c6 transparent transparent transparent; } .dark-theme .RemoteMegaphoneTooltip[data-placement=top] .module-tooltip-arrow::before { border-color: #545454 transparent transparent transparent; } .RemoteMegaphoneTooltip[data-placement=top] .module-tooltip-arrow::before { margin-top: 0; /* stylelint-disable-next-line liberty/use-logical-spec */ margin-left: -7px; } .RemoteMegaphoneTooltip[data-placement=left] .module-tooltip-arrow::before { border-color: transparent transparent transparent #c6c6c6; } .dark-theme .RemoteMegaphoneTooltip[data-placement=left] .module-tooltip-arrow::before { border-color: transparent transparent transparent #545454; } .RemoteMegaphoneTooltip[data-placement=left] .module-tooltip-arrow::before { margin-top: -7px; /* stylelint-disable-next-line liberty/use-logical-spec */ margin-left: 0px; } .RemoteMegaphoneTooltip[data-placement=right] .module-tooltip-arrow::before { border-color: transparent #c6c6c6 transparent transparent; } .dark-theme .RemoteMegaphoneTooltip[data-placement=right] .module-tooltip-arrow::before { border-color: transparent #545454 transparent transparent; } .RemoteMegaphoneTooltip[data-placement=right] .module-tooltip-arrow::before { margin-top: -7px; /* stylelint-disable-next-line liberty/use-logical-spec */ margin-left: -14px; } .module-SafetyNumberChangeDialog__confirm-dialog__header { padding-bottom: 0px; margin-bottom: -5px; } .module-SafetyNumberChangeDialog__rtl-span { display: inline-block; } .module-SafetyNumberChangeDialog__shield-icon { margin-inline: auto; height: 24px; width: 24px; } .module-SafetyNumberChangeDialog__shield-icon { -webkit-mask: url("../images/icons/v3/safety_number/safety_number.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #1b1b1b; } @media (forced-colors: active) { .module-SafetyNumberChangeDialog__shield-icon { background-color: WindowText; } } .dark-theme .module-SafetyNumberChangeDialog__shield-icon { -webkit-mask: url("../images/icons/v3/safety_number/safety_number.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .dark-theme .module-SafetyNumberChangeDialog__shield-icon { background-color: WindowText; } } .module-SafetyNumberChangeDialog__title { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; text-align: center; margin-top: 8px; } .module-SafetyNumberChangeDialog__title { color: #1b1b1b; } .dark-theme .module-SafetyNumberChangeDialog__title { color: #ffffff; } .module-SafetyNumberChangeDialog__message { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; text-align: center; margin-top: 8px; margin-bottom: 24px; padding-inline: 4px; } .module-SafetyNumberChangeDialog__message { color: #5e5e5e; } .dark-theme .module-SafetyNumberChangeDialog__message { color: #b9b9b9; } .module-SafetyNumberChangeDialog__message--narrow { padding-inline: 38px; } .module-SafetyNumberChangeDialog__contacts { list-style-type: none; padding: 0px; margin-block-end: 0px; } .module-SafetyNumberChangeDialog__row { align-items: center; display: flex; flex-direction: row; margin-bottom: 16px; } .module-SafetyNumberChangeDialog__row__story-name { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; flex-grow: 1; margin-inline-end: auto; } .module-SafetyNumberChangeDialog__row--wrapper { flex-grow: 1; margin-inline-start: 12px; } .module-SafetyNumberChangeDialog__row--name { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; } .dark-theme .module-SafetyNumberChangeDialog__row--name { color: #ffffff; } .module-SafetyNumberChangeDialog__row--subtitle { font-size: 12px; line-height: 16px; letter-spacing: 0; } .module-SafetyNumberChangeDialog__row--subtitle { color: #5e5e5e; } .dark-theme .module-SafetyNumberChangeDialog__row--subtitle { color: #b9b9b9; } .module-SafetyNumberChangeDialog__row__view { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-SafetyNumberChangeDialog__row__view { border: 1px solid WindowText; } } .module-SafetyNumberChangeDialog__row__view { color: #1b1b1b; background-color: #e9e9e9; } .dark-theme .module-SafetyNumberChangeDialog__row__view { color: #e9e9e9; background-color: #4a4a4a; } .mouse-mode .module-SafetyNumberChangeDialog__row__view:hover { background-color: rgb(198.05, 198.05, 198.05); } .dark-theme.mouse-mode .module-SafetyNumberChangeDialog__row__view:hover { background-color: rgb(101.15, 101.15, 101.15); } .mouse-mode .module-SafetyNumberChangeDialog__row__view:active { background-color: rgb(174.75, 174.75, 174.75); } .dark-theme.mouse-mode .module-SafetyNumberChangeDialog__row__view:active { background-color: rgb(119.25, 119.25, 119.25); } .keyboard-mode .module-SafetyNumberChangeDialog__row__view:active { background-color: rgb(174.75, 174.75, 174.75); } .dark-theme.keyboard-mode .module-SafetyNumberChangeDialog__row__view:active { background-color: rgb(119.25, 119.25, 119.25); } .keyboard-mode .module-SafetyNumberChangeDialog__row__view:focus { box-shadow: 0px 0px 0px 3px #2c6bed; } .dark-theme.keyboard-mode .module-SafetyNumberChangeDialog__row__view:focus { box-shadow: 0px 0px 0px 3px #6191f3; } .module-SafetyNumberChangeDialog__row__view { color: #2c6bed; } .dark-theme .module-SafetyNumberChangeDialog__row__view { color: #6191f3; } .module-SafetyNumberChangeDialog__row__view { opacity: 0; transition: opacity 150ms cubic-bezier(0.17, 0.17, 0, 1); } .mouse-mode .module-SafetyNumberChangeDialog__row:hover .module-SafetyNumberChangeDialog__row__view { opacity: 1; } .keyboard-mode .module-SafetyNumberChangeDialog__row:focus-within .module-SafetyNumberChangeDialog__row__view { opacity: 1; } .module-SafetyNumberChangeDialog__row__view { border-radius: 4px; padding-block: 8px; padding-inline: 14px; } .module-SafetyNumberChangeDialog__row__chevron__option { padding-block: 10px; padding-inline: 15px; } .ContextMenu__popper--single-item .module-SafetyNumberChangeDialog__row__chevron__option { padding-block: 10px; padding-inline: 15px; } .module-SafetyNumberChangeDialog__row__chevron__option--container { align-items: center; } .module-SafetyNumberChangeDialog__row__chevron__button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-SafetyNumberChangeDialog__row__chevron__button { border: 1px solid WindowText; } } .module-SafetyNumberChangeDialog__row__chevron__button { display: flex; align-items: center; flex-grow: 0; flex-shrink: 0; padding: 10px; height: 16px; width: 16px; justify-content: center; border-radius: 4px; border: 2px solid transparent; opacity: 0; transition: opacity 150ms cubic-bezier(0.17, 0.17, 0, 1); } .mouse-mode .module-SafetyNumberChangeDialog__row:hover .module-SafetyNumberChangeDialog__row__chevron__button { opacity: 1; } .keyboard-mode .module-SafetyNumberChangeDialog__row:focus-within .module-SafetyNumberChangeDialog__row__chevron__button { opacity: 1; } .keyboard-mode .module-SafetyNumberChangeDialog__row__chevron__button:focus { border-color: #2c6bed; } .dark-theme.keyboard-mode .module-SafetyNumberChangeDialog__row__chevron__button:focus { border-color: #6191f3; } .module-SafetyNumberChangeDialog__row__chevron__button::before { content: ""; display: block; height: 16px; width: 16px; flex-shrink: 0; } .module-SafetyNumberChangeDialog__row__chevron__button::before { -webkit-mask: url("../images/icons/v3/chevron/chevron-down.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .module-SafetyNumberChangeDialog__row__chevron__button::before { background-color: WindowText; } } .dark-theme .module-SafetyNumberChangeDialog__row__chevron__button::before { -webkit-mask: url("../images/icons/v3/chevron/chevron-down.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .dark-theme .module-SafetyNumberChangeDialog__row__chevron__button::before { background-color: WindowText; } } .module-SafetyNumberChangeDialog__menu-icon--delete { -webkit-mask: url("../images/icons/v3/x/x-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #1b1b1b; } @media (forced-colors: active) { .module-SafetyNumberChangeDialog__menu-icon--delete { background-color: WindowText; } } .dark-theme .module-SafetyNumberChangeDialog__menu-icon--delete { -webkit-mask: url("../images/icons/v3/x/x-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #e9e9e9; } @media (forced-colors: active) { .dark-theme .module-SafetyNumberChangeDialog__menu-icon--delete { background-color: WindowText; } } .module-SafetyNumberChangeDialog__menu-icon--verify { -webkit-mask: url("../images/icons/v3/safety_number/safety_number.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #1b1b1b; } @media (forced-colors: active) { .module-SafetyNumberChangeDialog__menu-icon--verify { background-color: WindowText; } } .dark-theme .module-SafetyNumberChangeDialog__menu-icon--verify { -webkit-mask: url("../images/icons/v3/safety_number/safety_number.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #e9e9e9; } @media (forced-colors: active) { .dark-theme .module-SafetyNumberChangeDialog__menu-icon--verify { background-color: WindowText; } } .module-SafetyNumberOnboarding { display: flex; flex-direction: column; align-items: center; text-align: center; } .module-SafetyNumberOnboarding h2 { margin-block: 0 12px; } .module-SafetyNumberOnboarding p { margin-block: 0 25px; text-align: start; font-size: 13px; line-height: 18px; letter-spacing: -0.03px; } .module-SafetyNumberOnboarding p { color: #5e5e5e; } .dark-theme .module-SafetyNumberOnboarding p { color: #b9b9b9; } .module-SafetyNumberOnboarding svg { margin-block: 0 21px; border-radius: 12px; } .module-SafetyNumberOnboarding svg { border: 1.5px solid rgba(0, 0, 0, 0.12); } .dark-theme .module-SafetyNumberOnboarding svg { border: 1.5px solid #5e5e5e; } .module-SafetyNumberOnboarding svg { background: #ffffff; } .module-SafetyNumberOnboarding__help { margin-block: 0 24px; } .module-SafetyNumberOnboarding__help a { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; text-decoration: none; } .module-SafetyNumberOnboarding__close { width: 296px; margin-bottom: 16px; } .SafetyTipsModal .module-Modal__headerTitle { align-items: start; } .SafetyTipsModal .module-Modal__title { padding-top: 20px; font-weight: 600; font-size: 26px; line-height: 32px; letter-spacing: -0.56px; text-align: center; } .SafetyTipsModal .module-Modal__body { padding-inline: 0; } .SafetyTipsModal .module-Modal__button-footer { padding-block: 24px; padding-inline: 32px; } .SafetyTipsModal__width-container { max-width: 420px; width: 95%; } .SafetyTipsModal__Description { margin: 0; padding-inline: 32px; padding-bottom: 24px; text-align: center; font-size: 14px; line-height: 20px; letter-spacing: -0.08px; } .SafetyTipsModal__Description { color: #5e5e5e; } .dark-theme .SafetyTipsModal__Description { color: #b9b9b9; } .SafetyTipsModal__Footer { display: flex; gap: 16px; } .SafetyTipsModal__Button { flex: 1; } .SafetyTipsModal__Button--Previous, .dark-theme .SafetyTipsModal__Button--Previous, .SafetyTipsModal__Button--Previous:is(:disabled, [aria-disabled=true]), .dark-theme .SafetyTipsModal__Button--Previous:is(:disabled, [aria-disabled=true]) { background: transparent; } .SafetyTipsModal__Button--Previous, .SafetyTipsModal__Button--Previous:is(:disabled, [aria-disabled=true]) { color: #2c6bed; } .dark-theme .SafetyTipsModal__Button--Previous, .dark-theme .SafetyTipsModal__Button--Previous:is(:disabled, [aria-disabled=true]) { color: #ffffff; } .SafetyTipsModal__Button--Previous:is(:disabled, [aria-disabled=true]) { opacity: 0.5; } .SafetyTipsModal__Button--Previous:not(:disabled):not([aria-disabled=true]):hover, .SafetyTipsModal__Button--Previous:not(:disabled):not([aria-disabled=true]):focus { background: #dedede; } .dark-theme .SafetyTipsModal__Button--Previous:not(:disabled):not([aria-disabled=true]):hover, .dark-theme .SafetyTipsModal__Button--Previous:not(:disabled):not([aria-disabled=true]):focus { background: #4a4a4a; } .SafetyTipsModal__Button--Previous:not(:disabled):not([aria-disabled=true]):active { background: #c6c6c6; } .dark-theme .SafetyTipsModal__Button--Previous:not(:disabled):not([aria-disabled=true]):active { background: #5e5e5e; } .SafetyTipsModal__CardWrapper { display: flex; flex-direction: row; gap: 32px; overflow: hidden; scroll-snap-type: x mandatory; padding-inline: 32px; } .SafetyTipsModal__Card { width: 100%; flex-shrink: 0; scroll-snap-align: center; padding-block: 14px 32px; padding-inline: 12px; border-radius: 18px; text-align: center; } .SafetyTipsModal__Card { background: #f6f6f6; } .dark-theme .SafetyTipsModal__Card { background: #3b3b3b; } .SafetyTipsModal__CardImage { width: 100%; height: auto; vertical-align: top; border-radius: 12px; } .SafetyTipsModal__CardImage { background: white; } .dark-theme .SafetyTipsModal__CardImage { background: #4a4a4a; } .SafetyTipsModal__CardTitle { margin-block: 14px 0; font-weight: 600; font-size: 20px; line-height: 26px; letter-spacing: -0.34px; } .SafetyTipsModal__CardTitle { color: #1b1b1b; } .dark-theme .SafetyTipsModal__CardTitle { color: #e9e9e9; } .SafetyTipsModal__CardDescription { margin-block: 8px 0; font-size: 14px; line-height: 20px; letter-spacing: -0.08px; } .SafetyTipsModal__CardDescription { color: #545454; } .dark-theme .SafetyTipsModal__CardDescription { color: #c6c6c6; } .SafetyTipsModal__Dots { display: flex; justify-content: center; padding-block: 24px 20px; } .SafetyTipsModal__DotsButton { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .SafetyTipsModal__DotsButton { border: 1px solid WindowText; } } .SafetyTipsModal__DotsButton { padding: 4px; } .SafetyTipsModal__DotsButton::before { content: ""; display: block; width: 8px; height: 8px; border-radius: 9999px; transition: background 100ms ease; } .SafetyTipsModal__DotsButton::before { background: rgba(0, 0, 0, 0.3); } .dark-theme .SafetyTipsModal__DotsButton::before { background: rgba(255, 255, 255, 0.3); } .SafetyTipsModal__DotsButton:not([aria-current]):hover::before, .SafetyTipsModal__DotsButton:not([aria-current]):focus::before { background: rgba(0, 0, 0, 0.45); } .dark-theme .SafetyTipsModal__DotsButton:not([aria-current]):hover::before, .dark-theme .SafetyTipsModal__DotsButton:not([aria-current]):focus::before { background: rgba(255, 255, 255, 0.45); } .SafetyTipsModal__DotsButton[aria-current]::before { background: #000000; } .dark-theme .SafetyTipsModal__DotsButton[aria-current]::before { background: #ffffff; } .keyboard-mode .SafetyTipsModal__DotsButton:focus::before { box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px #2c6bed; } .dark-theme.keyboard-mode .SafetyTipsModal__DotsButton:focus::before { box-shadow: 0 0 0 2px #2e2e2e, 0 0 0 4px #2c6bed; } .SafetyTipsModal__DotsButtonLabel { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border-width: 0; } .ScrollDownButton { position: relative; height: 36px; width: 36px; display: flex; border-radius: 18px; border: none; outline: none; align-items: center; justify-content: center; box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2), 0px 2px 6px rgba(0, 0, 0, 0.12); } .ScrollDownButton { background-color: #ffffff; } .dark-theme .ScrollDownButton { background-color: #3b3b3b; } .ScrollDownButton__icon--unread-mentions { height: 17px; width: 17px; } .ScrollDownButton__icon--unread-mentions { -webkit-mask: url("../images/icons/v3/at/at.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .ScrollDownButton__icon--unread-mentions { background-color: WindowText; } } .dark-theme .ScrollDownButton__icon--unread-mentions { -webkit-mask: url("../images/icons/v3/at/at.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .ScrollDownButton__icon--unread-mentions { background-color: WindowText; } } .ScrollDownButton__icon--unread-messages { height: 20px; width: 20px; } .ScrollDownButton__icon--unread-messages { -webkit-mask: url("../images/icons/v3/chevron/chevron-down.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .ScrollDownButton__icon--unread-messages { background-color: WindowText; } } .dark-theme .ScrollDownButton__icon--unread-messages { -webkit-mask: url("../images/icons/v3/chevron/chevron-down.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .ScrollDownButton__icon--unread-messages { background-color: WindowText; } } .ScrollDownButton__badge { position: absolute; top: -8px; height: 16px; min-width: 16px; border-radius: 8px; padding-block: 1px; padding-inline: 4px; background-color: #2c6bed; color: #ffffff; font-size: 10px; line-height: 14px; box-shadow: 0px 1px 4px rgba(0, 0, 0, 0.24); } .module-SearchInput__container { position: relative; margin-inline: 16px; margin-bottom: 8px; } .module-SearchInput__icon { height: 16px; inset-inline-start: 8px; pointer-events: none; position: absolute; top: 6px; width: 16px; } .module-SearchInput__icon { -webkit-mask: url("../images/icons/v3/search/search-compact-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #848484; } @media (forced-colors: active) { .module-SearchInput__icon { background-color: WindowText; } } .dark-theme .module-SearchInput__icon { -webkit-mask: url("../images/icons/v3/search/search-compact-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .dark-theme .module-SearchInput__icon { background-color: WindowText; } } .module-SearchInput__input { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; border: solid 1px transparent; border-radius: 8px; height: 28px; padding-inline: 30px 5px; width: 100%; } .module-SearchInput__input { background-color: rgba(0, 0, 0, 0.06); color: #1b1b1b; } .module-SearchInput__input:placeholder { color: #848484; } .dark-theme .module-SearchInput__input { background-color: rgba(255, 255, 255, 0.12); color: #e9e9e9; } .dark-theme .module-SearchInput__input:placeholder { color: #b9b9b9; } .module-SearchInput__input:focus { outline: none; } .keyboard-mode .module-SearchInput__input:focus { border: solid 1px #2c6bed; } .module-SearchInput__input--with-text { padding-inline-end: 30px; } .module-SearchInput__cancel { height: 16px; position: absolute; inset-inline-end: 8px; top: 6px; width: 16px; } .module-SearchInput__cancel { -webkit-mask: url("../images/icons/v3/x/x-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .module-SearchInput__cancel { background-color: WindowText; } } .dark-theme .module-SearchInput__cancel { -webkit-mask: url("../images/icons/v3/x/x-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .dark-theme .module-SearchInput__cancel { background-color: WindowText; } } .module-SearchInput__description { margin-block-start: 12px; font-size: 12px; line-height: 16px; letter-spacing: 0; } .module-SearchInput__description { color: #5e5e5e; } .dark-theme .module-SearchInput__description { color: #e9e9e9; } .module-SearchResultsLoadingFakeHeader { display: flex; flex-direction: column; justify-content: center; padding: 14px; } .module-SearchResultsLoadingFakeHeader::before { content: ""; display: block; width: 25%; height: 12px; border-radius: 4px; animation: search-results-loading-pulsating-background-animation 2s infinite; } @media (prefers-reduced-motion) { .module-SearchResultsLoadingFakeHeader::before { animation: none; } } .module-SearchResultsLoadingFakeHeader::before { background: #e9e9e9; } .dark-theme .module-SearchResultsLoadingFakeHeader::before { background: #4a4a4a; } .module-SearchResultsLoadingFakeRow { display: flex; align-items: center; justify-content: center; padding-block: 10px; padding-inline: 14px; margin-block: 2px; margin-inline: 0; } .module-SearchResultsLoadingFakeRow__avatar { width: 48px; height: 48px; border-radius: 100%; animation: search-results-loading-pulsating-background-animation 2s infinite; } @media (prefers-reduced-motion) { .module-SearchResultsLoadingFakeRow__avatar { animation: none; } } .module-SearchResultsLoadingFakeRow__avatar { background: #e9e9e9; } .dark-theme .module-SearchResultsLoadingFakeRow__avatar { background: #4a4a4a; } .module-SearchResultsLoadingFakeRow__content { display: flex; flex-direction: column; flex-grow: 1; justify-content: center; margin-inline-start: 12px; } .module-SearchResultsLoadingFakeRow__content__line:nth-child(1) { width: 30%; height: 12px; border-radius: 4px; animation: search-results-loading-pulsating-background-animation 2s infinite; } @media (prefers-reduced-motion) { .module-SearchResultsLoadingFakeRow__content__line:nth-child(1) { animation: none; } } .module-SearchResultsLoadingFakeRow__content__line:nth-child(1) { background: #e9e9e9; } .dark-theme .module-SearchResultsLoadingFakeRow__content__line:nth-child(1) { background: #4a4a4a; } .module-SearchResultsLoadingFakeRow__content__line:nth-child(1) { margin-bottom: 8px; } .module-SearchResultsLoadingFakeRow__content__line:nth-child(2) { width: 90%; height: 12px; border-radius: 4px; animation: search-results-loading-pulsating-background-animation 2s infinite; } @media (prefers-reduced-motion) { .module-SearchResultsLoadingFakeRow__content__line:nth-child(2) { animation: none; } } .module-SearchResultsLoadingFakeRow__content__line:nth-child(2) { background: #e9e9e9; } .dark-theme .module-SearchResultsLoadingFakeRow__content__line:nth-child(2) { background: #4a4a4a; } .module-SearchResultsLoadingFakeRow__content__line:nth-child(2) { margin-bottom: 8px; } .module-SearchResultsLoadingFakeRow__content__line:nth-child(3) { width: 60%; height: 12px; border-radius: 4px; animation: search-results-loading-pulsating-background-animation 2s infinite; } @media (prefers-reduced-motion) { .module-SearchResultsLoadingFakeRow__content__line:nth-child(3) { animation: none; } } .module-SearchResultsLoadingFakeRow__content__line:nth-child(3) { background: #e9e9e9; } .dark-theme .module-SearchResultsLoadingFakeRow__content__line:nth-child(3) { background: #4a4a4a; } .module-select { position: relative; } .module-select select { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; -webkit-appearance: none; border-radius: 4px; border: 1px solid #b9b9b9; cursor: pointer; height: 40px; min-width: 124px; outline: 0; padding: 10px; padding-inline: 12px 32px; text-overflow: ellipsis; width: 100%; color: #000000; } .dark-theme .module-select select { background-color: #1b1b1b; border-color: #5e5e5e; color: #e9e9e9; } .keyboard-mode .module-select select:focus { border: 3px solid #2c6bed; line-height: 14px; padding-inline-start: 10px; } .module-select::after { content: " "; display: block; height: 16px; pointer-events: none; position: absolute; inset-inline-end: 8px; top: 11px; width: 16px; } .module-select::after { -webkit-mask: url("../images/icons/v3/dropdown/dropdown-compact-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .module-select::after { background-color: WindowText; } } .dark-theme .module-select::after { -webkit-mask: url("../images/icons/v3/dropdown/dropdown-compact-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .module-select::after { background-color: WindowText; } } .SelectModeActions { display: flex; align-items: center; width: 100%; padding-inline: 4px; } .SelectModeActions__selectedMessages { flex: 1; padding-block: 17px; padding-inline: 10px; font-size: 14px; line-height: 20px; letter-spacing: -0.08px; } .SelectModeActions__selectedMessages { color: #5e5e5e; } .dark-theme .SelectModeActions__selectedMessages { color: #b9b9b9; } .SelectModeActions__button { appearance: none; padding: 12px; border: none; background: transparent; } .SelectModeActions__icon { display: block; width: 20px; height: 20px; } .SelectModeActions__icon { color: #3b3b3b; } .dark-theme .SelectModeActions__icon { color: #dedede; } .SelectModeActions__button--disabled .SelectModeActions__icon { color: #b9b9b9; } .dark-theme .SelectModeActions__button--disabled .SelectModeActions__icon { color: #5e5e5e; } .SelectModeActions__icon--exitSelectMode { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .SelectModeActions__icon--exitSelectMode { background-color: WindowText; } } .SelectModeActions__icon--forwardSelectedMessages { -webkit-mask: url("../images/icons/v3/forward/forward.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .SelectModeActions__icon--forwardSelectedMessages { background-color: WindowText; } } .SelectModeActions__icon--deleteSelectedMessages { -webkit-mask: url("../images/icons/v3/trash/trash.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .SelectModeActions__icon--deleteSelectedMessages { background-color: WindowText; } } .module-Modal .SendStoryModal__body { padding-bottom: 0; } .SendStoryModal__rtl-span { display: inline-block; } .SendStoryModal .module-Modal__button-footer--one-button-per-line { flex-direction: row; align-items: center; } .SendStoryModal .module-SearchInput__container { margin-inline: 0; } .SendStoryModal__story-preview { height: 140px; width: 80px; border-radius: 12px; margin-block: 0 16px; margin-inline: auto; background-size: cover; } .SendStoryModal__item--contact-or-conversation { height: 52px; padding-block: 0; padding-inline: 6px; } .SendStoryModal__top-bar { align-items: center; display: flex; min-height: 40px; justify-content: space-between; user-select: none; } .SendStoryModal__top-bar-title { flex: 1; } .SendStoryModal__new-story__button { font-weight: 500; padding-block: 5px; padding-inline: 10px; } .SendStoryModal__new-story__button::before { -webkit-mask: url("../images/icons/v3/plus/plus.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .SendStoryModal__new-story__button::before { background-color: WindowText; } } .SendStoryModal__new-story__button::before { content: ""; height: 16px; width: 16px; margin-inline-end: 8px; display: inline-block; vertical-align: text-bottom; } .SendStoryModal__new-story__option { padding: 10px; } .SendStoryModal__new-story__option--icon { margin-inline-end: 15px; } .SendStoryModal__new-story__option--container { align-items: center; } .SendStoryModal__new-story__option--description { color: #b9b9b9; } .SendStoryModal__icon--delete { -webkit-mask: url("../images/icons/v3/trash/trash.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .SendStoryModal__icon--delete { background-color: WindowText; } } .SendStoryModal__icon--delete { height: 14px; width: 14px; } .SendStoryModal__icon--custom { -webkit-mask: url("../images/icons/v3/stories/stories.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .SendStoryModal__icon--custom { background-color: WindowText; } } .SendStoryModal__icon--custom { height: 16px; width: 16px; } .SendStoryModal__icon--group { -webkit-mask: url("../images/icons/v3/group/group.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .SendStoryModal__icon--group { background-color: WindowText; } } .SendStoryModal__icon--group { height: 16px; width: 16px; } .SendStoryModal__icon--settings { -webkit-mask: url("../images/icons/v3/settings/settings.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .SendStoryModal__icon--settings { background-color: WindowText; } } .SendStoryModal__icon--settings { height: 14px; width: 14px; } .SendStoryModal__distribution-list-context__container { width: 100%; } .SendStoryModal__distribution-list-context__button { align-items: center; display: flex; width: 100%; } .SendStoryModal__distribution-list { height: 52px; } .SendStoryModal__distribution-list__container { justify-content: space-between; padding-block: 8px; padding-inline: 0; user-select: none; } .SendStoryModal__distribution-list__info { margin-inline-start: 8px; } .SendStoryModal__distribution-list__label { align-items: center; display: flex; justify-content: flex-start; flex: 1; } .SendStoryModal__distribution-list__name { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; font-weight: 400; } .SendStoryModal__distribution-list__description { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; font-size: 12px; color: #b9b9b9; } .SendStoryModal__distribution-list__checkbox { margin-inline-end: 0; position: relative; } .SendStoryModal__distribution-list__checkbox input[type=checkbox] { cursor: pointer; height: 0; position: absolute; width: 0; } .keyboard-mode .SendStoryModal__distribution-list__checkbox input[type=checkbox]:focus { outline: none; } .keyboard-mode .SendStoryModal__distribution-list__checkbox input[type=checkbox]:focus::before { border-color: #2c6bed; } .SendStoryModal__distribution-list__checkbox input[type=checkbox]::before { border-radius: 9999px; background: inherit; border: 1.5px solid #5e5e5e; content: ""; display: block; height: 20px; position: absolute; width: 20px; } .SendStoryModal__distribution-list__checkbox input[type=checkbox]:checked::before { background: #2c6bed; border: 1.5px solid #2c6bed; } .SendStoryModal__distribution-list__checkbox input[type=checkbox]:checked::after { border: solid #ffffff; border-width: 0 2px 2px 0; content: ""; display: block; height: 11px; inset-inline-start: 7px; position: absolute; top: 3px; transform: rotate(45deg); width: 6px; } .SendStoryModal__selected-lists { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; color: #dedede; padding-inline-end: 16px; user-select: none; flex: 1; display: flex; align-items: center; min-height: 32px; } .SendStoryModal__ok { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .SendStoryModal__ok { border: 1px solid WindowText; } } .SendStoryModal__ok { border-radius: 9999px; align-items: center; background: #2c6bed; display: flex; height: 32px; justify-content: center; width: 32px; } .SendStoryModal__ok::disabled { background: #5e5e5e; } .SendStoryModal__ok::after { -webkit-mask: url("../images/icons/v3/check/check.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .SendStoryModal__ok::after { background-color: WindowText; } } .SendStoryModal__ok::after { content: ""; height: 18px; width: 18px; } .SendStoryModal__send { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .SendStoryModal__send { border: 1px solid WindowText; } } .SendStoryModal__send { border-radius: 9999px; align-items: center; background: #2c6bed; display: flex; height: 32px; justify-content: center; width: 32px; } .SendStoryModal__send::disabled { background: #5e5e5e; } .SendStoryModal__send::after { -webkit-mask: url("../images/icons/v3/send/send-fill.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .SendStoryModal__send::after { background-color: WindowText; } } .SendStoryModal__send::after { content: ""; height: 18px; width: 18px; } .SendStoryModal .SendStoryModal__story { border-radius: 12px; backdrop-filter: blur(45px); } .SendStoryModal .SendStoryModal__story__image { object-fit: contain; } .module-shortcut-guide { border-radius: 4px; padding: 16px; max-height: calc(100vh - 40px); max-width: 600px; margin-inline: auto; display: flex; flex-direction: column; } .module-shortcut-guide { box-shadow: 0px 8px 20px rgba(0, 0, 0, 0.3), 0px 0px 8px rgba(0, 0, 0, 0.05); } @media (forced-colors: active) { .module-shortcut-guide { border: 1px solid WindowText; } } .module-shortcut-guide { color: #1b1b1b; background-color: #ffffff; } .dark-theme .module-shortcut-guide { color: #e9e9e9; background-color: #3b3b3b; } .module-shortcut-guide__header { display: flex; flex-direction: row; align-items: center; margin-bottom: 20px; } .module-shortcut-guide__header-text { font-weight: 600; font-size: 20px; line-height: 26px; letter-spacing: -0.34px; flex-grow: 1; } .module-shortcut-guide__header-close { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-shortcut-guide__header-close { border: 1px solid WindowText; } } .module-shortcut-guide__header-close { height: 24px; width: 24px; } .module-shortcut-guide__header-close { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .module-shortcut-guide__header-close { background-color: WindowText; } } .dark-theme .module-shortcut-guide__header-close { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #e9e9e9; } @media (forced-colors: active) { .dark-theme .module-shortcut-guide__header-close { background-color: WindowText; } } .keyboard-mode .module-shortcut-guide__header-close:focus { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #2c6bed; } @media (forced-colors: active) { .keyboard-mode .module-shortcut-guide__header-close:focus { background-color: WindowText; } } .dark-theme.keyboard-mode .module-shortcut-guide__header-close:focus { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #6191f3; } @media (forced-colors: active) { .dark-theme.keyboard-mode .module-shortcut-guide__header-close:focus { background-color: WindowText; } } .module-shortcut-guide__section-header { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; margin-bottom: 8px; } .module-shortcut-guide__scroll-container { outline: none; overflow-y: scroll; } .module-shortcut-guide__section:not(:last-child) { margin-bottom: 25px; } .module-shortcut-guide__shortcut { display: flex; flex-direction: row; align-items: center; break-inside: avoid; padding-inline-start: 4px; min-height: 40px; outline: none; } .keyboard-mode .module-shortcut-guide__shortcut:focus { background-color: #e9e9e9; } .dark-theme.keyboard-mode .module-shortcut-guide__shortcut:focus { background-color: #1b1b1b; } .module-shortcut-guide__shortcut { border-bottom: 1px solid #e9e9e9; } .dark-theme .module-shortcut-guide__shortcut { border-bottom: 1px solid #1b1b1b; } .module-shortcut-guide__shortcut__description { flex-grow: 1; margin-top: 4px; margin-bottom: 4px; } .module-shortcut-guide__shortcut__key-container { margin-bottom: 4px; } .module-shortcut-guide__shortcut__key-inner-container { text-align: end; margin-top: 4px; margin-inline-end: 4px; white-space: nowrap; } .module-shortcut-guide__shortcut__key { display: inline-block; border-radius: 2px; padding: 3px; padding-inline: 8px; margin-inline-start: 4px; height: 30px; text-align: center; } .module-shortcut-guide__shortcut__key { border: 1px solid #dedede; } .dark-theme .module-shortcut-guide__shortcut__key { border: 1px solid #1b1b1b; } .module-shortcut-guide__shortcut__key--square { width: 30px; padding-inline: 0px; } .module-shortcut-guide-modal { position: absolute; top: 0; inset-inline: 0; bottom: 0; padding: 20px; display: flex; flex-direction: row; align-items: center; background-color: rgba(0, 0, 0, 0.4); z-index: 126; } .module-shortcut-guide-container { flex-grow: 1; overflow: hidden; } .SignalConnectionsModal { padding-inline: 8px; padding-block-end: 20px; } .dark-theme .SignalConnectionsModal { color: #e9e9e9; } .SignalConnectionsModal__icon { -webkit-mask: url("../images/icons/v3/connections/connections-display.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #1b1b1b; } @media (forced-colors: active) { .SignalConnectionsModal__icon { background-color: WindowText; } } .dark-theme .SignalConnectionsModal__icon { -webkit-mask: url("../images/icons/v3/connections/connections-display.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .dark-theme .SignalConnectionsModal__icon { background-color: WindowText; } } .SignalConnectionsModal__icon { display: block; height: 48px; margin-block: 0; margin-inline: auto; margin-bottom: 24px; width: 48px; } .SignalConnectionsModal__list { margin-block: 20px; margin-inline: 0; padding-inline-start: 12px; } .SignalConnectionsModal__list li { display: flex; gap: 12px; align-items: center; list-style: none; margin-block: 16px; margin-inline: 0; } .SignalConnectionsModal__list li::before { display: block; content: ""; width: 4px; height: 14px; border-radius: 6px; } .SignalConnectionsModal__list li::before { background-color: #c6c6c6; } .dark-theme .SignalConnectionsModal__list li::before { background-color: #b9b9b9; } .SignalConnectionsModal__button { display: flex; justify-content: center; margin-top: 24px; } .SignalConnectionsModal__button button { min-width: 150px; } .SignalConversationMuteToggle { height: 52px; display: flex; justify-content: center; align-items: center; font-size: 14px; color: #6191f3; } .SignalConversationMuteToggle { background-color: #ffffff; border-top: 0.5px solid rgba(0, 0, 0, 0.16); } .dark-theme .SignalConversationMuteToggle { background-color: #121212; border-top: 0.5px solid #4a4a4a; } .SignalConversationMuteToggle__text { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .SignalConversationMuteToggle__text { border: 1px solid WindowText; } } .Slider { background-color: #dedede; cursor: pointer; height: 8px; position: relative; width: 100%; } .Slider__handle { background-color: #1b1b1b; border-radius: 16px; border: 1px solid #ffffff; cursor: move; height: 16px; margin-inline-start: -4px; margin-top: -4px; position: absolute; width: 16px; } .module-staged-link-preview { position: relative; display: flex; flex-direction: row; align-items: stretch; min-height: 65px; } .module-staged-link-preview__no-image { align-items: center; background-color: #ffffff; border-radius: 14px; display: flex; flex-direction: row; height: 74px; justify-content: center; margin-inline-end: 32px; width: 74px; } .module-staged-link-preview__no-image::after { -webkit-mask: url("../images/icons/v3/link/link.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .module-staged-link-preview__no-image::after { background-color: WindowText; } } .module-staged-link-preview__no-image::after { content: ""; height: 44px; width: 44px; } .module-staged-link-preview--is-loading { align-items: center; } .module-staged-link-preview__loading { text-align: center; flex-grow: 1; flex-shrink: 1; } .module-staged-link-preview__loading { color: #5e5e5e; } .dark-theme .module-staged-link-preview__loading { color: #b9b9b9; } .module-staged-link-preview__icon-container { margin-inline-end: 8px; } .module-staged-link-preview__icon-container-call-link { margin-inline-end: 8px; margin: 4px; } .module-staged-link-preview__content { display: flex; flex-direction: column; margin-inline-end: 20px; } .module-staged-link-preview__content--only-url { justify-content: center; } .module-staged-link-preview__title { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; } .module-staged-link-preview__title { color: #1b1b1b; } .dark-theme .module-staged-link-preview__title { color: #e9e9e9; } .module-staged-link-preview__title { overflow: hidden; display: -webkit-box; -webkit-line-clamp: 1; -webkit-box-orient: vertical; } .module-staged-link-preview__description { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; overflow: hidden; display: -webkit-box; -webkit-line-clamp: 1; -webkit-box-orient: vertical; } .module-staged-link-preview__footer { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; display: flex; flex-flow: row wrap; align-items: center; } .module-staged-link-preview__footer { color: #5e5e5e; } .dark-theme .module-staged-link-preview__footer { color: #b9b9b9; } .module-staged-link-preview__footer > *:not(:first-child) { display: flex; } .module-staged-link-preview__footer > *:not(:first-child):before { content: "•"; font-size: 50%; margin-inline: 0.2rem; } .module-staged-link-preview__location { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; text-transform: lowercase; } .module-staged-link-preview__location { color: #5e5e5e; } .dark-theme .module-staged-link-preview__location { color: #b9b9b9; } .module-staged-link-preview__close-button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-staged-link-preview__close-button { border: 1px solid WindowText; } } .module-staged-link-preview__close-button { position: absolute; top: 0px; inset-inline-end: 0px; height: 16px; width: 16px; } .module-staged-link-preview__close-button { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .module-staged-link-preview__close-button { background-color: WindowText; } } .keyboard-mode .module-staged-link-preview__close-button:focus { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #2c6bed; } @media (forced-colors: active) { .keyboard-mode .module-staged-link-preview__close-button:focus { background-color: WindowText; } } .dark-theme .module-staged-link-preview__close-button { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .dark-theme .module-staged-link-preview__close-button { background-color: WindowText; } } .dark-theme.keyboard-mode .module-staged-link-preview__close-button:focus { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #6191f3; } @media (forced-colors: active) { .dark-theme.keyboard-mode .module-staged-link-preview__close-button:focus { background-color: WindowText; } } .module-sticker-manager { padding-block: 0; padding-inline: 16px; outline: none; } .module-sticker-manager__text { height: 18px; letter-spacing: 0px; line-height: 18px; padding-inline-start: 8px; } .module-sticker-manager__text { color: #5e5e5e; } .dark-theme .module-sticker-manager__text { color: #b9b9b9; } .module-sticker-manager__text--heading { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; } .module-sticker-manager__text--heading { color: #1b1b1b; } .dark-theme .module-sticker-manager__text--heading { color: #e9e9e9; } .module-sticker-manager__empty { display: flex; justify-content: center; align-items: center; height: 64px; border-radius: 8px; } .module-sticker-manager__empty { background: #f6f6f6; color: #5e5e5e; } .dark-theme .module-sticker-manager__empty { background: #1b1b1b; color: #b9b9b9; } .module-sticker-manager__preview-modal__footer--blessed-icon, .module-sticker-manager__pack-row__meta__blessed-icon { height: 14px; width: 14px; border-radius: 8px; background-color: #ffffff; display: inline-block; vertical-align: middle; margin-inline-start: 5px; margin-bottom: 2px; position: relative; } .module-sticker-manager__preview-modal__footer--blessed-icon::before, .module-sticker-manager__pack-row__meta__blessed-icon::before { content: ""; display: block; width: 16px; height: 16px; position: absolute; top: -1px; inset-inline-start: -1px; } .module-sticker-manager__preview-modal__footer--blessed-icon::before, .module-sticker-manager__pack-row__meta__blessed-icon::before { -webkit-mask: url("../images/icons/v3/check/check-circle-fill.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #2c6bed; } @media (forced-colors: active) { .module-sticker-manager__preview-modal__footer--blessed-icon::before, .module-sticker-manager__pack-row__meta__blessed-icon::before { background-color: WindowText; } } .dark-theme .module-sticker-manager__preview-modal__footer--blessed-icon::before, .dark-theme .module-sticker-manager__pack-row__meta__blessed-icon::before { -webkit-mask: url("../images/icons/v3/check/check-circle-fill.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #2c6bed; } @media (forced-colors: active) { .dark-theme .module-sticker-manager__preview-modal__footer--blessed-icon::before, .dark-theme .module-sticker-manager__pack-row__meta__blessed-icon::before { background-color: WindowText; } } .module-sticker-manager__pack-row { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-sticker-manager__pack-row { border: 1px solid WindowText; } } .module-sticker-manager__pack-row { display: flex; flex-direction: row; padding: 16px; padding-inline-start: 8px; } .keyboard-mode .module-sticker-manager__pack-row:focus { box-shadow: 0px 0px 0px 2px #2c6bed; } .module-sticker-manager__pack-row__cover { width: 48px; height: 48px; object-fit: contain; } .module-sticker-manager__pack-row__cover-placeholder { width: 48px; height: 48px; background: #e9e9e9; } .module-sticker-manager__pack-row__meta { flex-grow: 1; display: flex; flex-direction: column; } .module-sticker-manager__pack-row__meta:not(:first-child) { padding-block: 0; padding-inline: 12px; } .module-sticker-manager__pack-row__meta__title { flex: 1; } .module-sticker-manager__pack-row__meta__author { flex: 1; } .module-sticker-manager__pack-row__meta__author { color: #848484; } .dark-theme .module-sticker-manager__pack-row__meta__author { color: #b9b9b9; } .module-sticker-manager__pack-row__controls { flex-shrink: 1; display: flex; justify-content: center; align-items: center; } .module-sticker-manager__pack-row__controls__button { background: none; border: 0; } .module-sticker-manager__pack-row__controls__button--menu::after { content: ""; display: block; min-width: 24px; min-height: 24px; } .module-sticker-manager__pack-row__controls__button--menu::after { -webkit-mask: url("../images/icons/v3/more/more.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .module-sticker-manager__pack-row__controls__button--menu::after { background-color: WindowText; } } .dark-theme .module-sticker-manager__pack-row__controls__button--menu::after { -webkit-mask: url("../images/icons/v3/more/more.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .dark-theme .module-sticker-manager__pack-row__controls__button--menu::after { background-color: WindowText; } } .module-sticker-manager__install-button { background: none; border: 0; color: #1b1b1b; font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; height: 24px; background: #e9e9e9; border-radius: 12px; display: flex; justify-content: center; align-items: center; padding-block: 0; padding-inline: 12px; } .dark-theme .module-sticker-manager__install-button { color: #e9e9e9; background: #3b3b3b; } .mouse-mode .module-sticker-manager__install-button { outline: none; } .module-sticker-manager__install-button--blue { background: #2c6bed; color: #ffffff; } .dark-theme .module-sticker-manager__install-button--blue { background: #6191f3; color: #ffffff; } .module-sticker-manager__preview-modal__modal.module-Modal { width: fit-content; } .module-sticker-manager__preview-modal__error { color: #f44336; display: flex; justify-content: center; align-items: center; text-align: center; width: 100%; height: 100%; padding-block: 0 30px; padding-inline: 80px; font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; } .module-sticker-manager__preview-modal__sticker-grid { width: 100%; display: grid; grid-gap: 8px; grid-template-columns: repeat(4, 1fr); } .module-sticker-manager__preview-modal__sticker-grid__cell { width: 96px; height: 96px; display: flex; justify-content: center; align-items: center; } .module-sticker-manager__preview-modal__sticker-grid__cell__image { width: 100%; height: 100%; object-fit: contain; } .module-sticker-manager__preview-modal__sticker-grid__cell--placeholder { border-radius: 4px; } .module-sticker-manager__preview-modal__sticker-grid__cell--placeholder { background: #e9e9e9; } .dark-theme .module-sticker-manager__preview-modal__sticker-grid__cell--placeholder { background: #5e5e5e; } .module-sticker-manager__preview-modal__footer { display: flex; justify-content: space-between; width: 100%; } .module-sticker-manager__preview-modal__footer--info { display: flex; flex-direction: column; flex-grow: 1; flex-shrink: 1; justify-content: center; overflow: hidden; } .module-sticker-manager__preview-modal__footer--title { margin: 0; overflow: hidden; text-overflow: ellipsis; font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; } .module-sticker-manager__preview-modal__footer--title { color: #1b1b1b; } .dark-theme .module-sticker-manager__preview-modal__footer--title { color: #e9e9e9; } .module-sticker-manager__preview-modal__footer--author { margin: 0; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } .module-sticker-manager__preview-modal__footer--author { color: #848484; } .dark-theme .module-sticker-manager__preview-modal__footer--author { color: #b9b9b9; } .module-sticker-manager__preview-modal__footer--install { flex-shrink: 0; overflow: hidden; } .Stories { display: flex; height: 100vh; inset-inline-start: 0; position: absolute; top: 0; user-select: none; width: 100%; z-index: 98; } .Stories { background: #ffffff; } .dark-theme .Stories { background: #121212; } .Stories__pane { display: flex; flex-direction: column; height: 100%; width: 380px; padding-top: calc(2px + var(--title-bar-drag-area-height)); } .Stories__pane { background: #f0f0f0; border-inline-end: 1px solid rgba(0, 0, 0, 0.16); } .dark-theme .Stories__pane { background: #2e2e2e; border-inline-end: 1px solid rgba(255, 255, 255, 0.16); } .Stories__pane__add-story__container { padding: 4px; border-radius: 4px; } .Stories__pane__add-story__container:hover, .Stories__pane__add-story__container:focus { background-color: rgba(0, 0, 0, 0.06); } .dark-theme .Stories__pane__add-story__container:hover, .dark-theme .Stories__pane__add-story__container:focus { background-color: rgba(255, 255, 255, 0.06); } .Stories__pane__add-story__button { height: 20px; width: 20px; } .Stories__pane__add-story__button { -webkit-mask: url("../images/icons/v3/plus/plus.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .Stories__pane__add-story__button { background-color: WindowText; } } .dark-theme .Stories__pane__add-story__button { -webkit-mask: url("../images/icons/v3/plus/plus.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .Stories__pane__add-story__button { background-color: WindowText; } } .keyboard-mode .Stories__pane__add-story__button:focus { background-color: #2c6bed; } .Stories__pane__header { align-items: center; display: flex; justify-content: space-between; padding-block: 0; padding-inline: 16px; position: relative; } .Stories__pane__header--centered { justify-content: flex-start; } .Stories__pane__header--title { font-weight: 600; font-size: 18px; line-height: 25px; letter-spacing: -0.25px; flex: 1; } .Stories__pane__header--title { color: #000000; } .dark-theme .Stories__pane__header--title { color: #e9e9e9; } .Stories__pane__header--centered .Stories__pane__header--title { text-align: center; width: 100%; } .Stories__pane__list { display: flex; flex-direction: column; flex: 1; overflow-y: auto; scrollbar-gutter: stable; padding-inline-start: 11px; padding-inline-end: calc(11px - var(--axo-scrollbar-gutter-thin-vertical)); } .Stories__pane__list:not(:hover, :focus-within) { scrollbar-color: transparent transparent; } .Stories__pane__list--empty { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; align-items: center; } .Stories__pane__list--empty { color: #5e5e5e; } .dark-theme .Stories__pane__list--empty { color: #848484; } .Stories__pane__list--empty { display: flex; flex: 1; flex-direction: column; justify-content: center; } .Stories__placeholder { align-items: center; display: flex; flex-direction: column; flex: 1; justify-content: center; opacity: 0.7; padding-block: 78px 28px; } .Stories__placeholder { color: #5e5e5e; } .dark-theme .Stories__placeholder { color: #b9b9b9; } .Stories__placeholder__icon { margin-bottom: 12px; width: 40px; height: 40px; } .Stories__placeholder__icon { -webkit-mask: url("../images/icons/v3/stories/stories-display-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .Stories__placeholder__icon { background-color: WindowText; } } .dark-theme .Stories__placeholder__icon { -webkit-mask: url("../images/icons/v3/stories/stories-display-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .dark-theme .Stories__placeholder__icon { background-color: WindowText; } } .Stories__placeholder__text { text-align: center; } .Stories__placeholder__text__action { vertical-align: text-top; display: inline-block; width: 16px; height: 16px; } .Stories__placeholder__text__action { -webkit-mask: url("../images/icons/v3/plus/plus.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .Stories__placeholder__text__action { background-color: WindowText; } } .dark-theme .Stories__placeholder__text__action { -webkit-mask: url("../images/icons/v3/plus/plus.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .dark-theme .Stories__placeholder__text__action { background-color: WindowText; } } .Stories__hidden-stories { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .Stories__hidden-stories { border: 1px solid WindowText; } } .Stories__hidden-stories { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; align-items: center; display: flex; justify-content: space-between; padding-block: 12px; padding-inline: 24px; position: relative; width: 100%; } .Stories__hidden-stories { color: #000000; } .dark-theme .Stories__hidden-stories { color: #e9e9e9; } .Stories__hidden-stories::after { content: ""; height: 16px; width: 16px; } .Stories__hidden-stories--collapsed::after { -webkit-mask: url("../images/icons/v3/chevron/chevron-right.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .Stories__hidden-stories--collapsed::after { background-color: WindowText; } } :dir(rtl) .Stories__hidden-stories--collapsed::after { -webkit-mask: url("../images/icons/v3/chevron/chevron-left.svg") no-repeat center; } .dark-theme .Stories__hidden-stories--collapsed::after { -webkit-mask: url("../images/icons/v3/chevron/chevron-right.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #e9e9e9; } @media (forced-colors: active) { .dark-theme .Stories__hidden-stories--collapsed::after { background-color: WindowText; } } :dir(rtl) .dark-theme .Stories__hidden-stories--collapsed::after { -webkit-mask: url("../images/icons/v3/chevron/chevron-left.svg") no-repeat center; } .Stories__hidden-stories--expanded::after { -webkit-mask: url("../images/icons/v3/chevron/chevron-down.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .Stories__hidden-stories--expanded::after { background-color: WindowText; } } .dark-theme .Stories__hidden-stories--expanded::after { -webkit-mask: url("../images/icons/v3/chevron/chevron-down.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #e9e9e9; } @media (forced-colors: active) { .dark-theme .Stories__hidden-stories--expanded::after { background-color: WindowText; } } .StoriesTab__MoreActionsIcon { display: block; width: 20px; height: 20px; } .StoriesTab__MoreActionsIcon { -webkit-mask: url("../images/icons/v3/more/more.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .StoriesTab__MoreActionsIcon { background-color: WindowText; } } .dark-theme .StoriesTab__MoreActionsIcon { -webkit-mask: url("../images/icons/v3/more/more.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .StoriesTab__MoreActionsIcon { background-color: WindowText; } } .StoriesSettingsModal__width-container { max-width: 420px; } .StoriesSettingsModal__modal { width: 420px; } .StoriesSettingsModal__conversation-list .module-conversation-list { padding-inline: 0; } .StoriesSettingsModal__conversation-list .module-conversation-list__item--contact-or-conversation__checkbox--container { height: 20px; margin-inline-end: 8px; position: relative; width: 20px; } .StoriesSettingsModal__conversation-list input[type=checkbox] { background: transparent; border: none; cursor: pointer; display: block; height: 0; margin: 0; min-width: 0; position: absolute; width: 0; } .keyboard-mode .StoriesSettingsModal__conversation-list input[type=checkbox]:focus { outline: none; } .keyboard-mode .StoriesSettingsModal__conversation-list input[type=checkbox]:focus::before { border-color: #2c6bed; } .StoriesSettingsModal__conversation-list input[type=checkbox]::before { border-radius: 9999px; background: inherit; border: 1.5px solid; } .StoriesSettingsModal__conversation-list input[type=checkbox]::before { border-color: #b9b9b9; } .dark-theme .StoriesSettingsModal__conversation-list input[type=checkbox]::before { border-color: #5e5e5e; } .StoriesSettingsModal__conversation-list input[type=checkbox]::before { content: ""; display: block; height: 20px; position: absolute; width: 20px; } .StoriesSettingsModal__conversation-list input[type=checkbox]:checked::before { -webkit-mask: none; background: #2c6bed; border: 1.5px solid #2c6bed; } .StoriesSettingsModal__list { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .StoriesSettingsModal__list { border: 1px solid WindowText; } } .StoriesSettingsModal__list { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; align-items: center; display: flex; justify-content: space-between; width: 100%; padding-block: 8px; padding-inline: 0; } .StoriesSettingsModal__list--no-pointer { cursor: inherit; } .StoriesSettingsModal__list__viewers { display: flex; font-size: 13px; line-height: 18px; letter-spacing: -0.03px; } .StoriesSettingsModal__list__viewers { color: #5e5e5e; } .dark-theme .StoriesSettingsModal__list__viewers { color: #b9b9b9; } .StoriesSettingsModal__list__left { display: flex; align-items: center; } .StoriesSettingsModal__list__avatar--new { border-radius: 9999px; display: inline-flex; justify-content: center; align-items: center; width: 32px; height: 32px; } .StoriesSettingsModal__list__avatar--new { background: #dedede; } .dark-theme .StoriesSettingsModal__list__avatar--new { background: #3b3b3b; } .StoriesSettingsModal__list__avatar--new::after { content: ""; height: 20px; width: 20px; } .StoriesSettingsModal__list__avatar--new::after { -webkit-mask: url("../images/icons/v3/plus/plus.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .StoriesSettingsModal__list__avatar--new::after { background-color: WindowText; } } .dark-theme .StoriesSettingsModal__list__avatar--new::after { -webkit-mask: url("../images/icons/v3/plus/plus.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .dark-theme .StoriesSettingsModal__list__avatar--new::after { background-color: WindowText; } } .StoriesSettingsModal__list__avatar--custom { border-radius: 9999px; display: inline-flex; justify-content: center; align-items: center; width: 32px; height: 32px; } .StoriesSettingsModal__list__avatar--custom { background: #dedede; } .dark-theme .StoriesSettingsModal__list__avatar--custom { background: #3b3b3b; } .StoriesSettingsModal__list__avatar--custom::after { content: ""; height: 20px; width: 20px; } .StoriesSettingsModal__list__avatar--custom::after { -webkit-mask: url("../images/icons/v3/stories/stories.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .StoriesSettingsModal__list__avatar--custom::after { background-color: WindowText; } } .dark-theme .StoriesSettingsModal__list__avatar--custom::after { -webkit-mask: url("../images/icons/v3/stories/stories.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .dark-theme .StoriesSettingsModal__list__avatar--custom::after { background-color: WindowText; } } .StoriesSettingsModal__list__avatar--custom::after { height: 20px; width: 20px; } .StoriesSettingsModal__list__title { margin-inline-start: 12px; } .StoriesSettingsModal__list__delete { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .StoriesSettingsModal__list__delete { border: 1px solid WindowText; } } .StoriesSettingsModal__list__delete { height: 20px; width: 20px; visibility: hidden; } .StoriesSettingsModal__list__delete { -webkit-mask: url("../images/icons/v3/trash/trash.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #848484; } @media (forced-colors: active) { .StoriesSettingsModal__list__delete { background-color: WindowText; } } .dark-theme .StoriesSettingsModal__list__delete { -webkit-mask: url("../images/icons/v3/trash/trash.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .dark-theme .StoriesSettingsModal__list__delete { background-color: WindowText; } } .StoriesSettingsModal__list:hover .StoriesSettingsModal__list__delete { visibility: visible; } .StoriesSettingsModal__divider { width: 100%; border: 0 solid; border-top-width: 1px; } .StoriesSettingsModal__divider { border-color: #dedede; } .dark-theme .StoriesSettingsModal__divider { border-color: #4a4a4a; } .StoriesSettingsModal__input__container { margin-top: 15px; margin-bottom: 0px; } .StoriesSettingsModal__visibility { font-size: 12px; line-height: 16px; letter-spacing: 0; margin-top: 10px; } .StoriesSettingsModal__visibility { color: #5e5e5e; } .dark-theme .StoriesSettingsModal__visibility { color: #b9b9b9; } .StoriesSettingsModal__title { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; margin-top: 32px; } .StoriesSettingsModal__description { font-size: 12px; line-height: 16px; letter-spacing: 0; margin-top: 0px; margin-bottom: 16px; } .StoriesSettingsModal__description { color: #5e5e5e; } .dark-theme .StoriesSettingsModal__description { color: #b9b9b9; } .StoriesSettingsModal__listHeader { display: flex; align-items: center; } .StoriesSettingsModal__listHeader__title { flex: 1; font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; margin-inline-end: 8px; } .StoriesSettingsModal__delete-list { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .StoriesSettingsModal__delete-list { border: 1px solid WindowText; } } .StoriesSettingsModal__delete-list { align-items: center; color: #f44336; display: flex; padding-block: 8px; padding-inline: 0; width: 100%; } .StoriesSettingsModal__delete-list::before { -webkit-mask: url("../images/icons/v3/trash/trash.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #f44336; } @media (forced-colors: active) { .StoriesSettingsModal__delete-list::before { background-color: WindowText; } } .StoriesSettingsModal__delete-list::before { content: ""; height: 20px; margin-inline-end: 20px; width: 20px; } .StoriesSettingsModal__checkbox { margin-block: 14px; margin-inline: 0; } .StoriesSettingsModal__checkbox-container { flex: 1; display: flex; align-items: center; } .StoriesSettingsModal__checkbox-label { flex: 1; margin-inline-end: 8px; } .StoriesSettingsModal__checkbox-description { color: #5e5e5e; } .dark-theme .StoriesSettingsModal__checkbox-description { color: #b9b9b9; } .StoriesSettingsModal__conversation-list { flex-grow: 1; min-height: 300px; overflow: hidden; } .StoriesSettingsModal__disclaimer { font-size: 12px; line-height: 16px; letter-spacing: 0; } .StoriesSettingsModal__disclaimer { color: #5e5e5e; } .dark-theme .StoriesSettingsModal__disclaimer { color: #b9b9b9; } .StoriesSettingsModal__disclaimer__learn-more { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .StoriesSettingsModal__disclaimer__learn-more { border: 1px solid WindowText; } } .StoriesSettingsModal__disclaimer__learn-more { color: #1b1b1b; } .dark-theme .StoriesSettingsModal__disclaimer__learn-more { color: #e9e9e9; } .StoriesSettingsModal__stories-off-container { display: flex; gap: 16px; align-items: center; } .StoriesSettingsModal__stories-off-text { flex: 1; font-size: 12px; line-height: 16px; letter-spacing: 0; } .StoriesSettingsModal__stories-off-text { color: #5e5e5e; } .dark-theme .StoriesSettingsModal__stories-off-text { color: #b9b9b9; } .GroupStorySettingsModal__header { display: flex; gap: 12px; align-items: center; padding-bottom: 12px; } .GroupStorySettingsModal__members_title { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; } .GroupStorySettingsModal__members_item { display: flex; gap: 12px; align-items: center; } .GroupStorySettingsModal__members_item__name { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; } .GroupStorySettingsModal__members_help { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; } .GroupStorySettingsModal__members_help { color: #5e5e5e; } .dark-theme .GroupStorySettingsModal__members_help { color: #b9b9b9; } .GroupStorySettingsModal__remove_group { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .GroupStorySettingsModal__remove_group { border: 1px solid WindowText; } } .GroupStorySettingsModal__remove_group { align-items: center; color: #f44336; display: flex; padding-block: 8px; padding-inline: 0; width: 100%; margin-top: 12px; } .GroupStorySettingsModal__remove_group::before { -webkit-mask: url("../images/icons/v3/minus/minus-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #f44336; } @media (forced-colors: active) { .GroupStorySettingsModal__remove_group::before { background-color: WindowText; } } .GroupStorySettingsModal__remove_group::before { content: ""; height: 20px; margin-inline-end: 20px; width: 20px; } .StoryCreator { background: #121212; display: flex; flex-direction: column; width: 100vw; height: 100vh; inset-inline-start: 0; position: absolute; top: 0; user-select: none; z-index: 99; } .StoryCreator__container { display: flex; flex: 1; justify-content: center; overflow: hidden; padding-bottom: 0; padding-block: 22px; padding-inline: 60px; position: relative; } .StoryCreator__input { background: transparent; border: none; color: transparent; position: absolute; text-align: center; top: 50%; user-select: none; } .StoryCreator__input:focus { outline: none; } .StoryCreator__controls { align-items: center; display: flex; flex-grow: 1; flex-wrap: wrap; justify-content: center; max-width: 596px; } .StoryCreator__control { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .StoryCreator__control { border: 1px solid WindowText; } } .StoryCreator__control { align-items: center; border-radius: 32px; display: inline-flex; height: 32px; justify-content: center; margin-block: 0; margin-inline: 15px; opacity: 1; width: 32px; } .StoryCreator__control::after { content: " "; height: 24px; width: 24px; } .StoryCreator__control--link::after { -webkit-mask: url("../images/icons/v3/link/link.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .StoryCreator__control--link::after { background-color: WindowText; } } .StoryCreator__control--text::after { -webkit-mask: url("../images/icons/v2/text-24.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .StoryCreator__control--text::after { background-color: WindowText; } } .StoryCreator__control--bg { border-radius: 9999px; border: 1.5px solid #ffffff; display: block; height: 24px; padding: 2.5px; width: 24px; } .StoryCreator__control--bg::after { display: none; } .StoryCreator__control--bg--selected { border-width: 4px; padding: 0; } .StoryCreator__control--selected { background-color: #ffffff; } .StoryCreator__control--selected::after { background-color: #000000; } .StoryCreator__control:hover { background-color: #2e2e2e; } .StoryCreator__control:hover::after { background-color: #ffffff; } .StoryCreator__toolbar { align-items: center; display: flex; flex-direction: column; justify-content: center; padding: 22px; width: 100%; } .StoryCreator__toolbar--buttons { align-items: center; display: flex; justify-content: center; width: 100%; } .StoryCreator__toolbar--space { height: 44px; margin-bottom: 22px; } .StoryCreator__tools { align-items: center; background-color: #1b1b1b; border-radius: 10px; color: #ffffff; display: flex; height: 44px; justify-content: center; margin-bottom: 22px; padding-block: 14px; padding-inline: 12px; } .StoryCreator__tools__tool, .StoryCreator__tools__tool__button { margin-inline-end: 14px; } .StoryCreator__tools__button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .StoryCreator__tools__button { border: 1px solid WindowText; } } .StoryCreator__tools__button { margin-block: 0; margin-inline: 8px; padding: 8px; } .StoryCreator__tools__button--bg { -webkit-mask: url("../images/icons/v2/text-effect-on-24.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .StoryCreator__tools__button--bg { background-color: WindowText; } } .StoryCreator__tools__button--bg { height: 20px; width: 20px; border-radius: 0; } .StoryCreator__tools__button--bg-inverse { -webkit-mask: url("../images/icons/v2/text-effect-on-24.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .StoryCreator__tools__button--bg-inverse { background-color: WindowText; } } .StoryCreator__tools__button--bg-inverse { height: 20px; width: 20px; border-radius: 0; } .StoryCreator__tools__button--bg-none { -webkit-mask: url("../images/icons/v2/text-effect-off-24.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .StoryCreator__tools__button--bg-none { background-color: WindowText; } } .StoryCreator__tools__button--bg-none { height: 20px; width: 20px; border-radius: 0; } .StoryCreator__tools__button--font-regular__button { -webkit-mask: url("../images/icons/v3/font/font-regular-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .StoryCreator__tools__button--font-regular__button { background-color: WindowText; } } .StoryCreator__tools__button--font-regular__button { height: 20px; width: 20px; border-radius: 0; } .StoryCreator__tools__button--font-bold__button { -webkit-mask: url("../images/icons/v3/font/font-bold-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .StoryCreator__tools__button--font-bold__button { background-color: WindowText; } } .StoryCreator__tools__button--font-bold__button { height: 20px; width: 20px; border-radius: 0; } .StoryCreator__tools__button--font-serif__button { -webkit-mask: url("../images/icons/v3/font/font-serif-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .StoryCreator__tools__button--font-serif__button { background-color: WindowText; } } .StoryCreator__tools__button--font-serif__button { height: 20px; width: 20px; border-radius: 0; } .StoryCreator__tools__button--font-script__button { -webkit-mask: url("../images/icons/v3/font/font-script-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .StoryCreator__tools__button--font-script__button { background-color: WindowText; } } .StoryCreator__tools__button--font-script__button { height: 20px; width: 20px; border-radius: 0; } .StoryCreator__tools__button--font-condensed__button { -webkit-mask: url("../images/icons/v3/font/font-condensed-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .StoryCreator__tools__button--font-condensed__button { background-color: WindowText; } } .StoryCreator__tools__button--font-condensed__button { height: 20px; width: 20px; border-radius: 0; } .StoryCreator__icon--font-regular { -webkit-mask: url("../images/icons/v3/font/font-regular-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .StoryCreator__icon--font-regular { background-color: WindowText; } } .StoryCreator__icon--font-bold { -webkit-mask: url("../images/icons/v3/font/font-bold-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .StoryCreator__icon--font-bold { background-color: WindowText; } } .StoryCreator__icon--font-serif { -webkit-mask: url("../images/icons/v3/font/font-serif-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .StoryCreator__icon--font-serif { background-color: WindowText; } } .StoryCreator__icon--font-script { -webkit-mask: url("../images/icons/v3/font/font-script-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .StoryCreator__icon--font-script { background-color: WindowText; } } .StoryCreator__icon--font-condensed { -webkit-mask: url("../images/icons/v3/font/font-condensed-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .StoryCreator__icon--font-condensed { background-color: WindowText; } } .StoryCreator__bg { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .StoryCreator__bg { border: 1px solid WindowText; } } .StoryCreator__bg { border-radius: 9999px; border: 2px solid transparent; height: 24px; margin: 4px; width: 24px; } .StoryCreator__bg--selected { border: 2px solid #ffffff; } .StoryCreator__popper { background: #2e2e2e; border-radius: 10px; margin-bottom: 18px; padding: 8px; width: 144px; } .StoryCreator__popper__arrow { border-inline-start: 14px solid transparent; border-inline-end: 14px solid transparent; border-top: 14px solid #2e2e2e; position: absolute; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translateX(-50%); bottom: -14px; height: 0; width: 0; } .StoryCreator__link-preview-input-popper { display: flex; flex-direction: column; min-height: 256px; padding: 16px; width: 360px; } .StoryCreator__link-preview-input__container { margin-top: 0; } .StoryCreator__link-preview-container { align-items: center; display: flex; flex-direction: column; flex: 1; justify-content: center; } .StoryCreator__link-preview-wrapper { transform: scale(0.5); } .StoryCreator__link-preview-button { margin-top: 18px; margin-bottom: 8px; } .StoryCreator__link-preview { background: rgba(0, 0, 0, 0.4); border-radius: 16px; display: flex; padding: 14px; width: 100%; } .StoryCreator__link-preview__image { border-radius: 8px; height: 76px; width: 76px; } .StoryCreator__link-preview__meta { display: flex; flex-direction: column; justify-content: center; margin-inline-start: 14px; } .StoryCreator__link-preview__title { -webkit-box-orient: vertical; -webkit-line-clamp: 2; font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; color: #ffffff; display: -webkit-box; overflow: hidden; user-select: none; } .StoryCreator__link-preview__location { font-size: 12px; line-height: 16px; letter-spacing: 0; color: rgba(255, 255, 255, 0.6); } .StoryCreator__link-preview-empty { align-items: center; color: #848484; display: flex; flex-direction: column; } .StoryCreator__link-preview-empty__icon { -webkit-mask: url("../images/icons/v3/link/link.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #848484; } @media (forced-colors: active) { .StoryCreator__link-preview-empty__icon { background-color: WindowText; } } .StoryCreator__link-preview-empty__icon { height: 20px; width: 20px; } .StoryCreator__emoji-button, .StoryCreator__emoji-button::after { height: 20px; width: 20px; } .StoryDetailsModal { min-width: 320px; overflow: hidden; } .StoryDetailsModal__overlay-container { align-items: flex-end; justify-content: flex-end; } .StoryDetailsModal__debugger__container { justify-content: flex-start; } .StoryDetailsModal__debugger__button { color: #b9b9b9; display: block; font-weight: 600; height: auto; width: auto; } .StoryDetailsModal__debugger__button__text { font-weight: normal; } .dark-theme .StoryDetailsModal__copy-icon { -webkit-mask: url("../images/icons/v3/copy/copy.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .dark-theme .StoryDetailsModal__copy-icon { background-color: WindowText; } } .StoryDetailsModal__copy-icon { -webkit-mask: url("../images/icons/v3/copy/copy.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .StoryDetailsModal__copy-icon { background-color: WindowText; } } .dark-theme .StoryDetailsModal__download-icon { -webkit-mask: url("../images/icons/v3/save/save.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .dark-theme .StoryDetailsModal__download-icon { background-color: WindowText; } } .StoryDetailsModal__download-icon { -webkit-mask: url("../images/icons/v3/save/save.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .StoryDetailsModal__download-icon { background-color: WindowText; } } .StoryDetailsModal__contact-container { border-top: 1px solid #3b3b3b; } .StoryDetailsModal__contact-group__header { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; align-items: center; display: flex; justify-content: space-between; margin-top: 24px; padding-block: 10px; padding-inline: 0; user-select: none; } .StoryDetailsModal__contact-group__header:first-child { margin-top: 0; } .StoryDetailsModal__contact { margin-bottom: 8px; padding-block: 8px; padding-inline: 0; display: flex; flex-direction: row; align-items: center; } .StoryDetailsModal__contact__text { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; flex-grow: 1; margin-inline-start: 10px; } .StoryDetailsModal__contact:last-child { margin-bottom: 0; } .StoryDetailsModal__status-timestamp { margin-inline-start: 6px; } .StoryImage { align-items: center; display: flex; height: 100%; justify-content: center; overflow: hidden; position: relative; width: 100%; z-index: 1; } .StoryImage--thumbnail { height: 72px; width: 46px; } .StoryImage__image { height: 100%; object-fit: cover; width: 100%; } .StoryImage__overlay-container { align-items: center; display: flex; height: 100%; justify-content: center; inset-inline-start: 0; position: absolute; top: 0; width: 100%; } .StoryImage__error { -webkit-mask: url("../images/full-screen-flow/alert-outline.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .StoryImage__error { background-color: WindowText; } } .StoryImage__error { align-items: center; display: flex; height: 32px; justify-content: center; width: 32px; } .StoryImage__spinner-bubble { align-items: center; background-color: #3b3b3b; border-radius: 32px; display: flex; height: 32px; justify-content: center; width: 32px; } .dark-theme .StoryImage__spinner__circle { background-color: #ffffff; } .dark-theme .StoryImage__spinner__arc { background-color: #3b3b3b; } .StoryLinkPreview { align-items: center; background-color: #ffffff; border-radius: 36px; color: #1b1b1b; display: inline-flex; max-width: 560px; min-width: 560px; max-height: 840px; overflow: hidden; } .StoryLinkPreview__content { margin-inline: 24px; padding-block: 16px; padding-inline: 0; } .StoryLinkPreview__title { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; -webkit-box-orient: vertical; -webkit-line-clamp: 1; display: -webkit-box; overflow: hidden; font-size: 28px; line-height: 40px; letter-spacing: -0.16px; } .StoryLinkPreview__description { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; -webkit-box-orient: vertical; -webkit-line-clamp: 2; display: -webkit-box; overflow: hidden; font-size: 26px; line-height: 36px; letter-spacing: -0.06px; } .StoryLinkPreview__location { font-size: 11px; line-height: 14px; letter-spacing: 0.06px; color: #848484; font-size: 22px; line-height: 28px; letter-spacing: 0.12px; } .StoryLinkPreview__no-image { align-items: center; display: flex; height: 176px; justify-content: center; margin-inline: 52px; } .StoryLinkPreview__no-image::before { -webkit-mask: url("../images/icons/v3/link/link.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #1b1b1b; } @media (forced-colors: active) { .StoryLinkPreview__no-image::before { background-color: WindowText; } } .StoryLinkPreview__no-image::before { content: ""; display: block; height: 48px; width: 48px; } .StoryLinkPreview__icon-container { overflow: hidden; } .StoryLinkPreview--tall { flex-direction: column; } .StoryLinkPreview--tiny { min-width: inherit; } .StoryLinkPreview--tiny .StoryLinkPreview__no-image { height: 100px; margin-inline: 24px 0; width: auto; } .StoryListItem__button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .StoryListItem__button { border: 1px solid WindowText; } } .StoryListItem__button { align-items: center; border-radius: 10px; display: flex; height: 96px; min-height: 96px; padding-block: 0; padding-inline: 10px; width: 100%; } .keyboard-mode .StoryListItem__button:focus { background: #dedede; } .dark-theme.keyboard-mode .StoryListItem__button:focus { background: #4a4a4a; } .StoryListItem__button:hover, .StoryListItem__button--active { background: #dedede; } .dark-theme .StoryListItem__button:hover, .dark-theme .StoryListItem__button--active { background: #4a4a4a; } .StoryListItem--active-opacity:active, .StoryListItem--active-opacity__button:active { opacity: 0.3; } .StoryListItem__click-container { align-items: center; display: flex; height: 100%; width: 100%; } .StoryListItem__click-container:focus { outline: none; } .keyboard-mode .StoryListItem__click-container:focus { outline: 1px solid #2c6bed; } .StoryListItem__info { display: flex; flex-direction: column; flex: 1; justify-content: center; margin-inline: 12px; } .StoryListItem__info--title { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; display: flex; align-items: center; } .StoryListItem__info--title { color: #000000; } .dark-theme .StoryListItem__info--title { color: #e9e9e9; } .StoryListItem__info--timestamp, .StoryListItem__info--sending, .StoryListItem__info--send_failed { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; } .StoryListItem__info--timestamp, .StoryListItem__info--sending, .StoryListItem__info--send_failed { color: #5e5e5e; } .dark-theme .StoryListItem__info--timestamp, .dark-theme .StoryListItem__info--sending, .dark-theme .StoryListItem__info--send_failed { color: #b9b9b9; } .StoryListItem__info--send_failed { display: flex; align-items: center; } .StoryListItem__info--send_failed::before { content: ""; display: flex; flex-shrink: 0; height: 12px; width: 12px; margin-inline-end: 8px; } .StoryListItem__info--send_failed::before { -webkit-mask: url("../images/icons/v3/error/error-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #f44336; } @media (forced-colors: active) { .StoryListItem__info--send_failed::before { background-color: WindowText; } } .StoryListItem__info--replies--others { -webkit-mask: url("../images/icons/v3/thread/thread-fill-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .StoryListItem__info--replies--others { background-color: WindowText; } } .StoryListItem__info--replies--others { height: 16px; width: 16px; } .StoryListItem__info--replies--self { -webkit-mask: url("../images/icons/v3/reply/reply-fill-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .StoryListItem__info--replies--self { background-color: WindowText; } } .StoryListItem__info--replies--self { height: 16px; width: 16px; } .StoryListItem__previews { height: 72px; position: relative; width: 46px; } .StoryListItem__previews--image { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .StoryListItem__previews--image { border: 1px solid WindowText; } } .StoryListItem__previews--image { align-items: center; background-color: #5e5e5e; background-size: cover; border-radius: 8px; display: flex; height: 72px; justify-content: center; inset-inline-start: 0; overflow: hidden; position: absolute; top: 0; width: 46px; z-index: 1; } .StoryListItem__previews--multiple .StoryListItem__previews--image { border: 1px solid #2e2e2e; } .StoryListItem__previews--more { background: #99a8a0; border-radius: 6px; height: 62px; position: absolute; transform: rotate(-12deg); width: 40px; } .StoryListItem__icon--chat { -webkit-mask: url("../images/icons/v3/open/open-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .StoryListItem__icon--chat { background-color: WindowText; } } .dark-theme .StoryListItem__icon--chat { -webkit-mask: url("../images/icons/v3/open/open-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .dark-theme .StoryListItem__icon--chat { background-color: WindowText; } } .StoryListItem__icon--delete { -webkit-mask: url("../images/icons/v3/trash/trash-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .StoryListItem__icon--delete { background-color: WindowText; } } .dark-theme .StoryListItem__icon--delete { -webkit-mask: url("../images/icons/v3/trash/trash-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .dark-theme .StoryListItem__icon--delete { background-color: WindowText; } } .StoryListItem__icon--hide { -webkit-mask: url("../images/icons/v3/x/x-circle-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .StoryListItem__icon--hide { background-color: WindowText; } } .dark-theme .StoryListItem__icon--hide { -webkit-mask: url("../images/icons/v3/x/x-circle-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .dark-theme .StoryListItem__icon--hide { background-color: WindowText; } } .StoryListItem__icon--unhide { -webkit-mask: url("../images/icons/v3/check/check-circle-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .StoryListItem__icon--unhide { background-color: WindowText; } } .dark-theme .StoryListItem__icon--unhide { -webkit-mask: url("../images/icons/v3/check/check-circle-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .dark-theme .StoryListItem__icon--unhide { background-color: WindowText; } } .StoryListItem__icon--info { -webkit-mask: url("../images/icons/v3/info/info-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .StoryListItem__icon--info { background-color: WindowText; } } .dark-theme .StoryListItem__icon--info { -webkit-mask: url("../images/icons/v3/info/info-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .dark-theme .StoryListItem__icon--info { background-color: WindowText; } } .StoryListItem__chevron::after { content: ""; display: inline-block; height: 16px; margin-inline-start: 2px; vertical-align: middle; width: 16px; } .StoryListItem__chevron::after { -webkit-mask: url("../images/icons/v3/chevron/chevron-right-compact-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .StoryListItem__chevron::after { background-color: WindowText; } } :dir(rtl) .StoryListItem__chevron::after { -webkit-mask: url("../images/icons/v3/chevron/chevron-left-compact-bold.svg") no-repeat center; } .dark-theme .StoryListItem__chevron::after { -webkit-mask: url("../images/icons/v3/chevron/chevron-right-compact-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .dark-theme .StoryListItem__chevron::after { background-color: WindowText; } } :dir(rtl) .dark-theme .StoryListItem__chevron::after { -webkit-mask: url("../images/icons/v3/chevron/chevron-left-compact-bold.svg") no-repeat center; } .StoryProgressSegment { background: rgba(255, 255, 255, 0.4); border-radius: 2px; height: 2px; margin-block: 12px 0; margin-inline: 1px; overflow: hidden; width: 100%; } .StoryProgressSegment__bar { background: #ffffff; border-radius: 2px; height: 100%; } .StoryProgressSegment__bar:dir(ltr) { transform: translateX(-100%); } .StoryProgressSegment__bar:dir(rtl) { transform: translateX(100%); } .StoryReplyQuote__primary { min-height: 52px; } .StoryReplyQuote__icon-container { flex: 0 0 40px; height: 64px; width: 40px; } .StoryViewer__overlay { background-size: contain; height: 100%; inset-inline-start: 0; position: absolute; top: 0; width: 100%; z-index: 99; } .StoryViewer__content { align-items: center; backdrop-filter: blur(90px); background: rgba(0, 0, 0, 0.2); display: flex; flex-direction: column; height: 100%; justify-content: center; inset-inline-start: 0; position: absolute; top: 0; width: 100%; z-index: 99; } .StoryViewer__close-button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .StoryViewer__close-button { border: 1px solid WindowText; } } .StoryViewer__close-button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .StoryViewer__close-button { border: 1px solid WindowText; } } .StoryViewer__close-button { position: absolute; inset-inline-end: 12px; top: 12px; height: 24px; width: 24px; } .StoryViewer__close-button { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .StoryViewer__close-button { background-color: WindowText; } } .dark-theme .StoryViewer__close-button { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .StoryViewer__close-button { background-color: WindowText; } } .keyboard-mode .StoryViewer__close-button:focus { background-color: #2c6bed; } .dark-theme.keyboard-mode .StoryViewer__close-button:focus { background-color: #6191f3; } .StoryViewer__close-button { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .StoryViewer__close-button { background-color: WindowText; } } .StoryViewer__close-button { width: 20px; height: 20px; top: var(--title-bar-drag-area-height); inset-inline-end: 28px; z-index: 3; } .StoryViewer__container { flex-grow: 1; overflow: hidden; outline: none; } .StoryViewer__story { max-height: 100%; outline: none; width: auto; } .StoryViewer__story__image { object-fit: contain; } .StoryViewer__meta { position: absolute; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translateX(-50%); bottom: 0; min-width: 284px; padding-block: 0; padding-inline: 16px; width: clamp(0vh, 56.25vh, 100vw); z-index: 3; } .StoryViewer__meta__list { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; align-items: center; display: flex; color: rgba(255, 255, 255, 0.8); } .StoryViewer__meta__list::before { -webkit-mask: url("../images/icons/v3/stories/stories-fill-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: rgba(255, 255, 255, 0.8); } @media (forced-colors: active) { .StoryViewer__meta__list::before { background-color: WindowText; } } .StoryViewer__meta__list::before { content: ""; display: block; height: 14px; margin-inline-end: 6px; width: 14px; } .StoryViewer__meta--group-avatar { margin-inline-start: -8px; } .StoryViewer__meta--title-container { padding-inline-start: 8px; } .StoryViewer__meta--title { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; color: #ffffff; display: inline; margin-inline-end: 8px; } .StoryViewer__meta--timestamp { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; color: rgba(255, 255, 255, 0.6); } .StoryViewer__meta__playback-bar { display: flex; justify-content: space-between; user-select: none; } .StoryViewer__meta__playback-bar__container { align-items: center; display: flex; } .StoryViewer__meta__playback-controls { align-items: center; display: flex; } .StoryViewer__caption { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; color: #ffffff; padding-block: 4px; padding-inline: 0; margin-bottom: 24px; text-shadow: 0px 0px 48px 0px rgba(0, 0, 0, 0.8); } .StoryViewer__caption__overlay { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .StoryViewer__caption__overlay { border: 1px solid WindowText; } } .StoryViewer__caption__overlay { background: rgba(0, 0, 0, 0.6); height: 100%; inset-inline-start: 0; position: absolute; top: 0; width: 100%; z-index: 1; } .StoryViewer__actions { display: flex; justify-content: center; min-height: 60px; } .StoryViewer__actions__failed { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .StoryViewer__actions__failed { border: 1px solid WindowText; } } .StoryViewer__actions__failed { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; align-items: center; color: #ffffff; display: flex; } .StoryViewer__actions__failed::before { content: ""; display: block; height: 18px; margin-inline-end: 12px; width: 18px; } .StoryViewer__actions__failed::before { -webkit-mask: url("../images/icons/v3/error/error-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #f44336; } @media (forced-colors: active) { .StoryViewer__actions__failed::before { background-color: WindowText; } } .StoryViewer__reply { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .StoryViewer__reply { border: 1px solid WindowText; } } .StoryViewer__reply { color: #e9e9e9; } .keyboard-mode .StoryViewer__reply:focus { color: #2c6bed; } .StoryViewer__reply__arrow { display: flex; align-items: center; } .StoryViewer__reply__arrow::before { content: ""; height: 20px; margin-inline-end: 12px; width: 20px; } .StoryViewer__reply__arrow::before { -webkit-mask: url("../images/icons/v3/reply/reply.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .StoryViewer__reply__arrow::before { background-color: WindowText; } } .StoryViewer__reply__chevron { display: flex; align-items: center; } .StoryViewer__reply__chevron::after { content: ""; display: inline-block; height: 16px; margin-inline-start: 4px; vertical-align: middle; width: 16px; } .StoryViewer__reply__chevron::after { -webkit-mask: url("../images/icons/v3/chevron/chevron-right.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .StoryViewer__reply__chevron::after { background-color: WindowText; } } :dir(rtl) .StoryViewer__reply__chevron::after { -webkit-mask: url("../images/icons/v3/chevron/chevron-left.svg") no-repeat center; } .StoryViewer__more__button { display: flex; justify-content: center; align-items: center; height: 24px; width: 24px; } .StoryViewer__more__button::after { -webkit-mask: url("../images/icons/v3/more/more.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .StoryViewer__more__button::after { background-color: WindowText; } } .StoryViewer__more__button::after { content: ""; height: 20px; width: 20px; } .keyboard-mode .StoryViewer__more__button::after:focus { background-color: #000000; } .StoryViewer__mute { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .StoryViewer__mute { border: 1px solid WindowText; } } .StoryViewer__mute { height: 20px; margin-block: 0; margin-inline: 24px; width: 20px; } .StoryViewer__mute { -webkit-mask: url("../images/icons/v3/speaker/speaker.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .StoryViewer__mute { background-color: WindowText; } } .keyboard-mode .StoryViewer__mute:focus { background-color: rgba(255, 255, 255, 0.8); } .StoryViewer__pause { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .StoryViewer__pause { border: 1px solid WindowText; } } .StoryViewer__pause { height: 20px; width: 20px; } .StoryViewer__pause { -webkit-mask: url("../images/icons/v3/pause/pause.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .StoryViewer__pause { background-color: WindowText; } } .keyboard-mode .StoryViewer__pause:focus { background-color: rgba(255, 255, 255, 0.8); } .StoryViewer__play { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .StoryViewer__play { border: 1px solid WindowText; } } .StoryViewer__play { height: 20px; width: 20px; } .StoryViewer__play { -webkit-mask: url("../images/icons/v3/play/play-fill.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .StoryViewer__play { background-color: WindowText; } } .keyboard-mode .StoryViewer__play:focus { background-color: rgba(255, 255, 255, 0.8); } .StoryViewer__unmute { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .StoryViewer__unmute { border: 1px solid WindowText; } } .StoryViewer__unmute { height: 20px; margin-block: 0; margin-inline: 24px; width: 20px; } .StoryViewer__unmute { -webkit-mask: url("../images/icons/v3/speaker/speaker-slash.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .StoryViewer__unmute { background-color: WindowText; } } .keyboard-mode .StoryViewer__unmute:focus { background-color: rgba(255, 255, 255, 0.8); } .StoryViewer__soundless { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .StoryViewer__soundless { border: 1px solid WindowText; } } .StoryViewer__soundless { height: 20px; margin-block: 0; margin-inline: 24px; width: 20px; } .StoryViewer__soundless { -webkit-mask: url("../images/icons/v3/speaker/speaker-x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .StoryViewer__soundless { background-color: WindowText; } } .keyboard-mode .StoryViewer__soundless:focus { background-color: rgba(255, 255, 255, 0.8); } .StoryViewer__progress { display: flex; } .StoryViewer__animated-emojis { height: 100%; position: absolute; width: 100%; z-index: 2; } .StoryViewer__arrow { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .StoryViewer__arrow { border: 1px solid WindowText; } } .StoryViewer__arrow { align-items: center; display: flex; position: absolute; top: var(--title-bar-drag-area-height); bottom: 0; padding-block-end: var(--title-bar-drag-area-height); width: 25%; z-index: 3; } .StoryViewer__arrow::before { content: ""; height: 28px; opacity: 0; width: 28px; transition: opacity 200ms ease-in-out; } .StoryViewer__arrow--left { justify-content: flex-start; inset-inline-start: 0; } .StoryViewer__arrow--left::before { margin-inline-start: 16px; } .StoryViewer__arrow--left::before { -webkit-mask: url("../images/icons/v3/chevron/chevron-left.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .StoryViewer__arrow--left::before { background-color: WindowText; } } :dir(rtl) .StoryViewer__arrow--left::before { -webkit-mask: url("../images/icons/v3/chevron/chevron-right.svg") no-repeat center; } .StoryViewer__arrow--right { justify-content: flex-end; inset-inline-end: 0; } .StoryViewer__arrow--right::before { margin-inline-end: 16px; } .StoryViewer__arrow--right::before { -webkit-mask: url("../images/icons/v3/chevron/chevron-right.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .StoryViewer__arrow--right::before { background-color: WindowText; } } :dir(rtl) .StoryViewer__arrow--right::before { -webkit-mask: url("../images/icons/v3/chevron/chevron-left.svg") no-repeat center; } .StoryViewer__arrow--visible::before { opacity: 1; } .StoryViewer__protection { position: absolute; width: 100%; z-index: 1; } .StoryViewer__protection--top { background: linear-gradient(rgba(0, 0, 0, 0.16), rgba(0, 0, 0, 0)); top: 0; height: 80px; } .StoryViewer__protection--bottom { background: linear-gradient(rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.6)); bottom: 0; height: 140px; } .StoryViewer__protection--bottom.StoryViewer__protection--has-caption { background: linear-gradient(rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.8)); height: 280px; } .StoryViewer__protection--whole { top: 0; bottom: 0; background: linear-gradient(rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.4)); } .StoryViewer__sending { align-items: center; display: flex; } .StoryViewer__sending__spinner__container { margin-inline: 0 12px; } .StoryViewsNRepliesModal { min-width: 320px; max-height: 80vh; } .StoryViewsNRepliesModal--group { min-height: min(400px, 80vh); } .StoryViewsNRepliesModal--group .StoryViewsNRepliesModal__content { display: flex; flex-direction: column; flex: 1; } .StoryViewsNRepliesModal__body { flex: 1; display: flex; flex-direction: column; } .StoryViewsNRepliesModal__body_inner { display: flex; flex-direction: column; flex: 1; } .StoryViewsNRepliesModal__content { padding-block-end: 16px; padding-inline: 16px; } .StoryViewsNRepliesModal__content:not(:has(.Tabs)) { padding-block-start: 16px; } .StoryViewsNRepliesModal__content:has(.module-emoji-picker)::before { content: ""; display: block; height: 52px; } .StoryViewsNRepliesModal__replies { flex: 1; margin-block: 0; margin-inline: -16px; } .StoryViewsNRepliesModal__replies--none { align-items: center; color: #848484; display: flex; flex: 1; justify-content: center; padding-block: 80px; padding-inline: 0; user-select: none; } .StoryViewsNRepliesModal__overlay-container { align-items: flex-end; justify-content: flex-end; } .StoryViewsNRepliesModal__compose-container { display: flex; align-items: center; } .StoryViewsNRepliesModal__composer { flex: 1; margin-top: 6px; } .StoryViewsNRepliesModal__emoji-button { height: 24px; margin-inline-start: 10px; width: 24px; } .dark-theme .StoryViewsNRepliesModal__emoji-button::after { -webkit-mask: url("../images/icons/v3/emoji/emoji.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .dark-theme .StoryViewsNRepliesModal__emoji-button::after { background-color: WindowText; } } .StoryViewsNRepliesModal__not-a-member { margin-block: 24px 8px; margin-inline: 4px; font-size: 12px; text-align: center; color: #b9b9b9; } .StoryViewsNRepliesModal__input__input { display: flex; align-items: center; min-height: 36px; } .dark-theme .StoryViewsNRepliesModal__input__input { background: #3b3b3b; border: 1px solid #3b3b3b; color: #ffffff; } .StoryViewsNRepliesModal__input__input .ql-editor.ql-blank::before { color: #b9b9b9; } .StoryViewsNRepliesModal__input__input--with-children { flex: 1; } .StoryViewsNRepliesModal__input__input .quill { flex: 1; } .StoryViewsNRepliesModal__view { align-items: center; display: flex; justify-content: space-between; margin-block: 8px; margin-inline: 0; } .StoryViewsNRepliesModal__view--name { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; margin-inline-start: 12px; } .StoryViewsNRepliesModal__view--timestamp { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; color: #848484; } .StoryViewsNRepliesModal__reply { align-items: flex-end; display: flex; padding-bottom: 12px; } .StoryViewsNRepliesModal__reply--title { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; } .StoryViewsNRepliesModal__reply--timestamp { font-size: 12px; line-height: 16px; letter-spacing: 0; color: #b9b9b9; margin-inline-start: 6px; } .StoryViewsNRepliesModal__reaction { align-items: center; display: flex; justify-content: space-between; padding-block: 12px; padding-inline: 16px; } .StoryViewsNRepliesModal__reaction--container { display: flex; } .StoryViewsNRepliesModal__reaction--body { margin-inline-start: 20px; } .StoryViewsNRepliesModal__message-bubble { background: #3b3b3b; border-radius: 18px; margin-inline-start: 8px; padding-block: 7px; padding-inline: 12px; } .StoryViewsNRepliesModal__message-bubble--doe { background: none; border: 1px solid #3b3b3b; } .StoryViewsNRepliesModal__quote__container { margin-block: 8px; margin-inline: 0; margin-inline-end: 38px; } .dark-theme .StoryViewsNRepliesModal__quote--outgoing-ultramarine { background-color: #5e5e5e; background-image: none; } .StoryViewsNRepliesModal__quote__primary { min-height: 64px; color: #e9e9e9; font-size: 12px; font-weight: 400; } .StoryViewsNRepliesModal__quote__icon-container { flex: 0 0 40px; height: 64px; width: 40px; } .StoryViewsNRepliesModal__debugger__button { color: #b9b9b9; display: block; font-weight: 600; height: auto; opacity: 1; width: auto; } .dark-theme .StoryViewsNRepliesModal__debugger__button--active { background: inherit; } .StoryViewsNRepliesModal__debugger__button::after { display: none; } .StoryViewsNRepliesModal__debugger__button__text { font-weight: normal; } .StoryViewsNRepliesModal__copy-icon { -webkit-mask: url("../images/icons/v3/copy/copy.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .StoryViewsNRepliesModal__copy-icon { background-color: WindowText; } } .StoryViewsNRepliesModal__read-receipts-off { color: #b9b9b9; margin-block: 160px; margin-inline: 16px; } .StoryViewsNRepliesModal .module-ReactionPickerPicker { background: inherit; border: none; box-shadow: none; justify-content: space-between; width: 100%; } .StoryViewsNRepliesModal .module-emoji-picker { position: absolute; bottom: 55px; max-height: calc(100vh - 100px); } .Tabs.StoryViewsNRepliesModal__tabs { position: sticky; top: 0; z-index: 1; padding-block: 16px; background: #2e2e2e; border-bottom: none; justify-content: center; } .Tabs__tab.StoryViewsNRepliesModal__tabs__tab { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; padding-block: 4px; padding-inline: 12px; margin-block: 0; margin-inline: 12px; } .Tabs__tab--selected.StoryViewsNRepliesModal__tabs__tab--selected { background: #4a4a4a; border-radius: 24px; border-bottom: none; } .SystemMessage { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; align-items: center; display: flex; flex-direction: column; justify-content: center; line-height: 16px; padding-bottom: 16px; padding-top: 16px; } .SystemMessage { color: #5e5e5e; } .dark-theme .SystemMessage { color: #b9b9b9; } .SystemMessage__contents { max-width: 400px; text-align: center; user-select: none; } .SystemMessage__contents p { display: block; margin-block-start: 0; margin-block-end: 4px; margin-inline-start: 0; margin-inline-end: 0; } .SystemMessage__contents p:first-child { display: inline-block; } .SystemMessage__contents p:last-child { margin-block-end: 0; } .SystemMessage__contents--has-icon::before { content: ""; display: inline-block; height: 16px; margin-inline-end: 8px; width: 16px; vertical-align: text-top; } .SystemMessage__contents--has-icon::before { background-color: #5e5e5e; } .dark-theme .SystemMessage__contents--has-icon::before { background-color: #b9b9b9; } .SystemMessage__contents--icon-audio-incoming::before { -webkit-mask: url("../images/icons/v3/phone/phone-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .dark-theme .SystemMessage__contents--icon-audio-incoming::before { -webkit-mask: url("../images/icons/v3/phone/phone-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .SystemMessage__contents--icon-audio-missed::before { -webkit-mask: url("../images/icons/v3/phone/phone-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .dark-theme .SystemMessage__contents--icon-audio-missed::before { -webkit-mask: url("../images/icons/v3/phone/phone-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .SystemMessage__contents--icon-audio-outgoing::before { -webkit-mask: url("../images/icons/v3/phone/phone-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .dark-theme .SystemMessage__contents--icon-audio-outgoing::before { -webkit-mask: url("../images/icons/v3/phone/phone-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .SystemMessage__contents--icon-group::before { -webkit-mask: url("../images/icons/v3/group/group-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .dark-theme .SystemMessage__contents--icon-group::before { -webkit-mask: url("../images/icons/v3/group/group-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .SystemMessage__contents--icon-group-access::before { -webkit-mask: url("../images/icons/v3/megaphone/megaphone-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .dark-theme .SystemMessage__contents--icon-group-access::before { -webkit-mask: url("../images/icons/v3/megaphone/megaphone-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .SystemMessage__contents--icon-group-add::before { -webkit-mask: url("../images/icons/v3/person/person-plus-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .dark-theme .SystemMessage__contents--icon-group-add::before { -webkit-mask: url("../images/icons/v3/person/person-plus-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .SystemMessage__contents--icon-group-approved::before { -webkit-mask: url("../images/icons/v3/person/person-check-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .dark-theme .SystemMessage__contents--icon-group-approved::before { -webkit-mask: url("../images/icons/v3/person/person-check-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .SystemMessage__contents--icon-group-avatar::before { -webkit-mask: url("../images/icons/v3/photo/photo-square-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .dark-theme .SystemMessage__contents--icon-group-avatar::before { -webkit-mask: url("../images/icons/v3/photo/photo-square-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .SystemMessage__contents--icon-group-decline::before { -webkit-mask: url("../images/icons/v3/person/person-x-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .dark-theme .SystemMessage__contents--icon-group-decline::before { -webkit-mask: url("../images/icons/v3/person/person-x-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .SystemMessage__contents--icon-group-edit::before { -webkit-mask: url("../images/icons/v3/edit/edit-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .dark-theme .SystemMessage__contents--icon-group-edit::before { -webkit-mask: url("../images/icons/v3/edit/edit-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .SystemMessage__contents--icon-group-leave::before { -webkit-mask: url("../images/icons/v3/leave/leave-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .dark-theme .SystemMessage__contents--icon-group-leave::before { -webkit-mask: url("../images/icons/v3/leave/leave-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .SystemMessage__contents--icon-group-remove::before { -webkit-mask: url("../images/icons/v3/person/person-minus-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .dark-theme .SystemMessage__contents--icon-group-remove::before { -webkit-mask: url("../images/icons/v3/person/person-minus-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .SystemMessage__contents--icon-group-summary::before { -webkit-mask: url("../images/icons/v3/info/info-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .dark-theme .SystemMessage__contents--icon-group-summary::before { -webkit-mask: url("../images/icons/v3/info/info-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .SystemMessage__contents--icon-info::before { -webkit-mask: url("../images/icons/v3/info/info-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .dark-theme .SystemMessage__contents--icon-info::before { -webkit-mask: url("../images/icons/v3/info/info-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .SystemMessage__contents--icon-phone::before { -webkit-mask: url("../images/icons/v3/phone/phone-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .dark-theme .SystemMessage__contents--icon-phone::before { -webkit-mask: url("../images/icons/v3/phone/phone-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .SystemMessage__contents--icon-profile::before { -webkit-mask: url("../images/icons/v3/person/person-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .dark-theme .SystemMessage__contents--icon-profile::before { -webkit-mask: url("../images/icons/v3/person/person-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .SystemMessage__contents--icon-safety-number::before { -webkit-mask: url("../images/icons/v3/safety_number/safety_number-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .dark-theme .SystemMessage__contents--icon-safety-number::before { -webkit-mask: url("../images/icons/v3/safety_number/safety_number-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .SystemMessage__contents--icon-session-refresh::before { -webkit-mask: url("../images/icons/v3/refresh/refresh.svg") no-repeat center; -webkit-mask-size: 100%; } .dark-theme .SystemMessage__contents--icon-session-refresh::before { -webkit-mask: url("../images/icons/v3/refresh/refresh.svg") no-repeat center; -webkit-mask-size: 100%; } .SystemMessage__contents--icon-thread::before { -webkit-mask: url("../images/icons/v3/thread/thread-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .dark-theme .SystemMessage__contents--icon-thread::before { -webkit-mask: url("../images/icons/v3/thread/thread-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .SystemMessage__contents--icon-timer::before { -webkit-mask: url("../images/icons/v3/timer/timer-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .dark-theme .SystemMessage__contents--icon-timer::before { -webkit-mask: url("../images/icons/v3/timer/timer-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .SystemMessage__contents--icon-timer-disabled::before { -webkit-mask: url("../images/icons/v3/timer/timer-slash-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .dark-theme .SystemMessage__contents--icon-timer-disabled::before { -webkit-mask: url("../images/icons/v3/timer/timer-slash-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .SystemMessage__contents--icon-unsupported::before { -webkit-mask: url("../images/icons/v3/error/error-circle-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .dark-theme .SystemMessage__contents--icon-unsupported::before { -webkit-mask: url("../images/icons/v3/error/error-circle-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .SystemMessage__contents--icon-unsupported--can-process::before { -webkit-mask: url("../images/icons/v3/check/check-circle-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .dark-theme .SystemMessage__contents--icon-unsupported--can-process::before { -webkit-mask: url("../images/icons/v3/check/check-circle-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .SystemMessage__contents--icon-verified::before { -webkit-mask: url("../images/icons/v3/safety_number/safety_number-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .dark-theme .SystemMessage__contents--icon-verified::before { -webkit-mask: url("../images/icons/v3/safety_number/safety_number-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .SystemMessage__contents--icon-verified-not::before { -webkit-mask: url("../images/icons/v3/safety_number/safety_number-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .dark-theme .SystemMessage__contents--icon-verified-not::before { -webkit-mask: url("../images/icons/v3/safety_number/safety_number-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .SystemMessage__contents--icon-video::before { -webkit-mask: url("../images/icons/v3/video/video-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .dark-theme .SystemMessage__contents--icon-video::before { -webkit-mask: url("../images/icons/v3/video/video-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .SystemMessage__contents--icon-video-incoming::before { -webkit-mask: url("../images/icons/v3/video/video-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .dark-theme .SystemMessage__contents--icon-video-incoming::before { -webkit-mask: url("../images/icons/v3/video/video-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .SystemMessage__contents--icon-video-missed::before { -webkit-mask: url("../images/icons/v3/video/video-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .dark-theme .SystemMessage__contents--icon-video-missed::before { -webkit-mask: url("../images/icons/v3/video/video-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .SystemMessage__contents--icon-video-outgoing::before { -webkit-mask: url("../images/icons/v3/video/video-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .dark-theme .SystemMessage__contents--icon-video-outgoing::before { -webkit-mask: url("../images/icons/v3/video/video-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .SystemMessage__contents--icon-warning::before { -webkit-mask: url("../images/icons/v3/error/error-circle-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .dark-theme .SystemMessage__contents--icon-warning::before { -webkit-mask: url("../images/icons/v3/error/error-circle-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .SystemMessage__contents--icon-payment-event::before { -webkit-mask: url("../images/icons/v3/payment/payment.svg") no-repeat center; -webkit-mask-size: 100%; } .dark-theme .SystemMessage__contents--icon-payment-event::before { -webkit-mask: url("../images/icons/v3/payment/payment.svg") no-repeat center; -webkit-mask-size: 100%; } .SystemMessage__contents--icon-merge::before { -webkit-mask: url("../images/icons/v3/merge/merge-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .dark-theme .SystemMessage__contents--icon-merge::before { -webkit-mask: url("../images/icons/v3/merge/merge-compact.svg") no-repeat center; -webkit-mask-size: 100%; } .SystemMessage__contents--icon-thread::before { -webkit-mask: url("../images/icons/v3/thread/thread.svg") no-repeat center; -webkit-mask-size: 100%; } .dark-theme .SystemMessage__contents--icon-thread::before { -webkit-mask: url("../images/icons/v3/thread/thread.svg") no-repeat center; -webkit-mask-size: 100%; } .SystemMessage__contents--icon-spam::before { -webkit-mask: url("../images/icons/v3/spam/spam.svg") no-repeat center; -webkit-mask-size: 100%; } .dark-theme .SystemMessage__contents--icon-spam::before { -webkit-mask: url("../images/icons/v3/spam/spam.svg") no-repeat center; -webkit-mask-size: 100%; } .SystemMessage__contents--icon-block::before { -webkit-mask: url("../images/icons/v3/block/block.svg") no-repeat center; -webkit-mask-size: 100%; } .dark-theme .SystemMessage__contents--icon-block::before { -webkit-mask: url("../images/icons/v3/block/block.svg") no-repeat center; -webkit-mask-size: 100%; } .SystemMessage--error .SystemMessage__contents::before { background-color: #f44336; } .dark-theme .SystemMessage--error .SystemMessage__contents::before { background-color: #f44336; } .SystemMessage--danger { color: #f44336; } .dark-theme .SystemMessage--danger { color: #f44336; } .SystemMessage--danger .SystemMessage__contents::before { background-color: #f44336; } .dark-theme .SystemMessage--danger .SystemMessage__contents::before { background-color: #f44336; } .SystemMessage__button-container { margin-top: 12px; } .Tabs { border-bottom: 1px solid #dedede; display: flex; justify-content: space-around; user-select: none; } .Tabs__tab { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; cursor: pointer; padding: 10px; padding-bottom: 6px; border-bottom: 4px solid transparent; } .Tabs__tab:focus { outline: none; } .keyboard-mode .Tabs__tab:focus { border-bottom-color: #2c6bed; } .Tabs__tab--selected { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; border-bottom: 2px solid; } .Tabs__tab--selected { border-bottom-color: #000000; } .dark-theme .Tabs__tab--selected { border-bottom-color: #ffffff; } .TapToViewNotAvailableModal__width-container { max-width: 440px; } .TapToViewNotAvailableModal__body { padding-block: 16px 0; padding-inline: 16px; } .TapToViewNotAvailableModal .module-Button { padding-inline: 24px; } .TextAttachment { max-height: 100%; max-width: 100%; display: flex; justify-content: center; align-items: center; } .TextAttachment__story { align-items: center; display: flex; flex-direction: column; justify-content: center; overflow: hidden; user-select: none; height: 1280px; max-height: 1280px; max-width: 720px; min-height: 1280px; min-width: 720px; width: 720px; } .TextAttachment__text { border-radius: 36px; padding: 28px; margin-inline: 56px; } .TextAttachment__text--with-bg { margin-inline: 36px; } .TextAttachment__text__container { overflow: hidden; user-select: none; } .TextAttachment__text__textarea { background: inherit; border: none; padding: 0; resize: none; text-align: center; width: 100%; field-sizing: content; } .TextAttachment__text__textarea:disabled { color: inherit; cursor: inherit; pointer-events: none; } .TextAttachment__text__textarea:focus { border: none; outline: none; } .TextAttachment__preview-container { margin-inline: 56px; margin-top: 36px; position: relative; } .TextAttachment__preview { align-items: center; background: rgba(0, 0, 0, 0.4); border-radius: 28px; display: flex; flex-direction: row; height: 112px; justify-content: center; padding: 16px; } .TextAttachment__preview__no-image { margin-inline-end: 16px; } .TextAttachment__preview__location { color: #ffffff; font: bold 22px Inter; max-width: 422px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .dark-theme .TextAttachment__preview__location { color: #ffffff; } .TextAttachment__preview-container--large .TextAttachment__preview__location { color: rgba(255, 255, 255, 0.6); font: 18px Inter; max-width: 352px; } .TextAttachment__preview__remove { align-items: center; backdrop-filter: blur(26px); background: rgba(0, 0, 0, 0.4); border-radius: 100%; display: flex; height: 48px; justify-content: center; position: absolute; inset-inline-end: -16px; top: -16px; width: 48px; z-index: 1; } .TextAttachment__preview__remove button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .TextAttachment__preview__remove button { border: 1px solid WindowText; } } .TextAttachment__preview__remove button { height: 24px; width: 24px; } .TextAttachment__preview__remove button { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .TextAttachment__preview__remove button { background-color: WindowText; } } .TextAttachment__preview-container--large .TextAttachment__preview { height: 140px; } .TextAttachment__preview-container--large .TextAttachment__preview__no-image { height: 105px; width: 105px; } .TextAttachment__preview__content { align-items: flex-start; display: flex; flex-direction: column; justify-content: flex-start; margin: 0; max-width: 422px; } .TextAttachment__preview-container--large .TextAttachment__preview__content { max-width: 352px; } .TextAttachment__preview__title { -webkit-box-orient: vertical; -webkit-line-clamp: 3; color: #ffffff; display: -webkit-box; font: bold 22px Inter; overflow: hidden; } .dark-theme .TextAttachment__preview__title { color: #ffffff; } .TextAttachment__preview__tooltip { align-items: center; background: rgba(0, 0, 0, 0.9); border-radius: 12px; color: #ffffff; display: flex; font-size: 13px; font-weight: 400; justify-content: center; line-height: 18px; max-width: 656px; padding: 12px; position: absolute; text-decoration: none; z-index: 2; } .TextAttachment__preview__tooltip::after { border-color: black transparent transparent transparent; border-style: solid; border-width: 14px; content: ""; inset-inline-start: 50%; margin-inline-start: -14px; position: absolute; top: 100%; } .TextAttachment__preview__tooltip__title { font-size: 14px; font-weight: 600; } .TextAttachment__preview__tooltip__url { margin-top: 4px; max-width: 566px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .TextAttachment__preview__tooltip__arrow { -webkit-mask: url("../images/icons/v3/chevron/chevron-right.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .TextAttachment__preview__tooltip__arrow { background-color: WindowText; } } :dir(rtl) .TextAttachment__preview__tooltip__arrow { -webkit-mask: url("../images/icons/v3/chevron/chevron-left.svg") no-repeat center; } .TextAttachment__preview__tooltip__arrow { height: 24px; width: 24px; } .TimelineDateHeader { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; display: block; text-align: center; user-select: none; } .TimelineDateHeader { color: #5e5e5e; } .dark-theme .TimelineDateHeader { color: #e9e9e9; } .TimelineDateHeader--inline { padding: 20px; } .TimelineDateHeader--floating { border-radius: 9999px; box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); } .TimelineDateHeader--floating { background: #ffffff; } .dark-theme .TimelineDateHeader--floating { background: #2e2e2e; } .TimelineDateHeader--floating { padding-block: 5px; padding-inline: 10px; } .TimelineFloatingHeader { align-items: center; display: flex; flex-direction: column; inset-inline-start: 0; pointer-events: none; position: absolute; top: 10px; transition: opacity 0.25s ease-out; width: 100%; z-index: 3; } .TimelineFloatingHeader--visible { opacity: 1; } .TimelineFloatingHeader--hidden { opacity: 0; } .TimelineFloatingHeader__spinner-container { border-radius: 9999px; box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); } .TimelineFloatingHeader__spinner-container { background: #ffffff; } .dark-theme .TimelineFloatingHeader__spinner-container { background: #2e2e2e; } .TimelineFloatingHeader__spinner-container { margin-top: 12px; padding: 6px; } .module-TimelineWarning { align-items: center; display: flex; padding-block: 10px; padding-inline: 16px; min-height: 56px; user-select: none; border-top-width: 1px; border-top-style: solid; } .module-TimelineWarning { color: #4a4a4a; background: #f6f6f6; border-color: #dedede; } .dark-theme .module-TimelineWarning { color: #dedede; background: #2e2e2e; border-color: #4a4a4a; } .module-TimelineWarning__generic-icon { -webkit-mask: url("../images/icons/v3/info/info.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .module-TimelineWarning__generic-icon { background-color: WindowText; } } .dark-theme .module-TimelineWarning__generic-icon { -webkit-mask: url("../images/icons/v3/info/info.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #c6c6c6; } @media (forced-colors: active) { .dark-theme .module-TimelineWarning__generic-icon { background-color: WindowText; } } .module-TimelineWarning__generic-icon { width: 20px; height: 20px; } .module-TimelineWarning__text { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; flex-grow: 1; margin-inline: 12px; } .module-TimelineWarning__text__link { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-TimelineWarning__text__link { border: 1px solid WindowText; } } .module-TimelineWarning__text__link { display: inline; font-weight: bold; text-decoration: none; } .module-TimelineWarning__text__link { color: #2c6bed; } .dark-theme .module-TimelineWarning__text__link { color: #b0c8f9; } .module-TimelineWarning__close-button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-TimelineWarning__close-button { border: 1px solid WindowText; } } .module-TimelineWarning__close-button::after { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .module-TimelineWarning__close-button::after { background-color: WindowText; } } .dark-theme .module-TimelineWarning__close-button::after { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #c6c6c6; } @media (forced-colors: active) { .dark-theme .module-TimelineWarning__close-button::after { background-color: WindowText; } } .module-TimelineWarning__close-button::after { content: ""; display: block; height: 20px; width: 20px; } .module-TimelineWarning__custom-info { flex-shrink: 0; } .Toast { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; align-items: stretch; border-radius: 8px; box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.05), 0px 4px 12px rgba(0, 0, 0, 0.3); display: flex; justify-content: space-between; user-select: none; overflow: hidden; width: fit-content; max-width: 280px; background-color: #3b3b3b; color: #e9e9e9; z-index: 200; inset-inline-start: 20px; text-align: start; } .Toast:focus { outline: none; } .keyboard-mode .Toast:focus { box-shadow: inset 0px 0px 0px 2px #2c6bed; } .ToastManager--narrow-sidebar .Toast { width: max-content; } .ToastManager--narrow-sidebar.ToastManager--composition-area-visible .Toast { min-width: initial; text-align: center; } .Toast__content { padding-block: 13px; padding-inline: 16px; } .Toast__button { display: flex; align-items: center; justify-content: center; font-size: 13px; line-height: 18px; letter-spacing: -0.03px; font-weight: 600; cursor: pointer; padding-block: 13px; padding-inline: 16px; white-space: nowrap; color: #b0c8f9; } .Toast__button:focus { outline: none; } .keyboard-mode .Toast__button:focus { box-shadow: inset 0px 0px 0px 2px #2c6bed; } .ToastManager { display: flex; flex-direction: column; pointer-events: none; gap: 16px; position: fixed; width: inherit; bottom: 0; z-index: 200; padding: 16px; } .ToastManager * { pointer-events: auto; } .ToastManager__root { display: flex; flex-direction: column; position: fixed; bottom: 16px; z-index: 200; inset-inline-start: 0; width: 100%; align-items: center; pointer-events: none; } .ToastManager__root * { pointer-events: auto; } .ToastManager--narrow-sidebar.ToastManager--composition-area-visible { inset-inline-start: 0; width: 100%; align-items: center; bottom: 40px; } .ToastManager--full-screen-call { bottom: 112px; } .ToastManager--megaphones { padding: 12px; } .ToastManager--megaphones.ToastManager--narrow-sidebar { padding: 10px; } .Waveform { /** * Progress indicators for audio or video content should always be left-to-right. * This overrides the default direction of the page. */ /* stylelint-disable-next-line declaration-property-value-disallowed-list */ direction: ltr; flex-shrink: 0; display: flex; align-items: center; cursor: pointer; outline: 0; } .Waveform__bar { display: inline-block; width: 2px; border-radius: 2px; transition: height 250ms, background 250ms; } .Waveform__bar:not(:first-of-type) { margin-inline-start: 2px; } .Waveform__bar { background: rgba(0, 0, 0, 0.4); } .Waveform__bar--active { background: rgba(0, 0, 0, 0.8); } .dark-theme .Waveform__bar { background: rgba(255, 255, 255, 0.4); } .dark-theme .Waveform__bar--active { background: rgba(255, 255, 255, 0.8); } .module-message__audio-attachment--incoming .Waveform__bar--active { background: rgba(0, 0, 0, 0.8); } .dark-theme .module-message__audio-attachment--incoming .Waveform__bar--active { background: rgba(255, 255, 255, 0.7); } .module-message__audio-attachment--outgoing .Waveform__bar { background: rgba(255, 255, 255, 0.4); } .module-message__audio-attachment--outgoing .Waveform__bar--active { background: rgba(255, 255, 255, 0.8); } .WaveformScrubber { display: flex; flex-basis: 0; } .UsernameEditor__header { display: flex; flex-direction: column; align-items: center; } .UsernameEditor__header__large-at { display: flex; align-items: center; justify-content: center; width: 64px; height: 64px; border-radius: 32px; margin-top: 21px; margin-bottom: 16px; } .UsernameEditor__header__large-at { background-color: #f0f0f0; } .dark-theme .UsernameEditor__header__large-at { background-color: #4a4a4a; } .UsernameEditor__header__large-at::after { display: block; width: 36px; height: 36px; content: ""; } .UsernameEditor__header__large-at::after { -webkit-mask: url("../images/icons/v3/at/at.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .UsernameEditor__header__large-at::after { background-color: WindowText; } } .dark-theme .UsernameEditor__header__large-at::after { -webkit-mask: url("../images/icons/v3/at/at.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .UsernameEditor__header__large-at::after { background-color: WindowText; } } .UsernameEditor__header__preview { margin-bottom: 2px; } .UsernameEditor__divider { width: 2px; height: 20px; margin-block: 0; margin-inline: 12px; } .UsernameEditor__divider { background-color: #c6c6c6; } .dark-theme .UsernameEditor__divider { background-color: #848484; } .UsernameEditor__discriminator__input { text-align: end; } .UsernameEditor__error { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; margin-block: 8px 12px; margin-inline: 6px; font-size: 12px; line-height: 17px; color: #f44336; } .UsernameEditor__info { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; font-size: 12px; line-height: 17px; margin-block: 12px; margin-inline: 6px; } .UsernameEditor__info { color: #5e5e5e; } .dark-theme .UsernameEditor__info { color: #b9b9b9; } .UsernameEditor__info--no-error { margin-bottom: 37px; } .UsernameEditor__learn-more-button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .UsernameEditor__learn-more-button { border: 1px solid WindowText; } } .UsernameEditor__learn-more-button { color: #2c6bed; } .UsernameEditor__learn-more__title.module-Modal__title { display: flex; align-items: center; } .UsernameEditor__learn-more__hashtag { display: inline-block; width: 20px; height: 20px; margin-inline-end: 12px; -webkit-mask-size: 100%; content: ""; } .UsernameEditor__learn-more__hashtag { background-color: #3b3b3b; } .dark-theme .UsernameEditor__learn-more__hashtag { background-color: #dedede; } .UsernameEditor__learn-more__hashtag { -webkit-mask: url(../images/icons/v2/hashtag-24.svg) no-repeat center; } .UsernameEditor__button-footer { display: flex; flex-wrap: wrap; justify-content: flex-end; align-items: center; padding-block: 1em 16px; gap: 8px; } .UsernameEditor__button-footer .module-Button:not(:first-child) { margin-inline-start: 4px; } .UsernameEditor__input__container.Input__container { /** * Discriminator should always be to the right of the nickname. * This overrides the default direction of the page. */ /* stylelint-disable-next-line declaration-property-value-disallowed-list */ direction: ltr; margin-block-end: 8px; } .UsernameLinkEditor { display: flex; flex-direction: column; align-items: center; user-select: none; max-width: 500px; width: 100%; } .UsernameLinkEditor__container { display: flex; align-items: center; justify-content: center; } .UsernameLinkEditor__card { --bg-color: #506ecd; --fg-color: #2449c0; --text-color: #ffffff; padding-block: 22px; padding-inline: 28px; margin-block-start: 8px; background: var(--bg-color); border-radius: 18px; max-width: 204px; } .UsernameLinkEditor__card--shadow { box-shadow: 0px 0px 4px 0px rgba(0, 0, 0, 0.08); } .UsernameLinkEditor__card__qr { position: relative; display: flex; align-items: center; justify-content: center; padding: 10px; background-color: #ffffff; border-radius: 8px; width: 148px; height: 148px; } .UsernameLinkEditor__card--shadow .UsernameLinkEditor__card__qr { outline: 2px solid #e9e9e9; } .UsernameLinkEditor__card__qr__spinner__arc { background-color: var(--fg-color); } .UsernameLinkEditor__card__qr__blotches { width: 100%; } .UsernameLinkEditor__card__qr__error-icon { -webkit-mask-size: 100%; display: block; height: 28px; width: 28px; } .UsernameLinkEditor__card__qr__error-icon { -webkit-mask: url("../images/icons/v3/error/error-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .UsernameLinkEditor__card__qr__error-icon { background-color: WindowText; } } .UsernameLinkEditor__card__username { display: flex; justify-content: center; margin-block: 12px 2px; } .UsernameLinkEditor__card__username__text { color: var(--text-color); font-size: 16px; font-weight: 600; line-height: normal; letter-spacing: -0.252px; text-align: center; } .UsernameLinkEditor__card__username__copy__button { display: flex; flex-direction: row; gap: 4px; } .UsernameLinkEditor__card__username__copy__button i { flex-shrink: 0; margin-top: 2px; display: inline-block; width: 16px; height: 16px; } .UsernameLinkEditor__card__username__copy__button i { -webkit-mask: url("../images/icons/v3/copy/copy.svg") no-repeat center; -webkit-mask-size: 100%; background-color: var(--text-color); } @media (forced-colors: active) { .UsernameLinkEditor__card__username__copy__button i { background-color: WindowText; } } .UsernameLinkEditor__card__username__copy__button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .UsernameLinkEditor__card__username__copy__button { border: 1px solid WindowText; } } .keyboard-mode .UsernameLinkEditor__card__username__copy__button:focus { box-shadow: 0px 0px 0px 3px #2c6bed; } .dark-theme.keyboard-mode .UsernameLinkEditor__card__username__copy__button:focus { box-shadow: 0px 0px 0px 3px #6191f3; } .UsernameLinkEditor__actions { display: flex; flex-direction: row; gap: 12px; align-items: center; justify-content: center; margin-block-start: 16px; } .UsernameLinkEditor__actions__save, .UsernameLinkEditor__actions__color { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .UsernameLinkEditor__actions__save, .UsernameLinkEditor__actions__color { border: 1px solid WindowText; } } .keyboard-mode .UsernameLinkEditor__actions__save:focus, .keyboard-mode .UsernameLinkEditor__actions__color:focus { box-shadow: 0px 0px 0px 3px #2c6bed; } .dark-theme.keyboard-mode .UsernameLinkEditor__actions__save:focus, .dark-theme.keyboard-mode .UsernameLinkEditor__actions__color:focus { box-shadow: 0px 0px 0px 3px #6191f3; } .UsernameLinkEditor__actions__save, .UsernameLinkEditor__actions__color { font-size: 11px; line-height: 14px; letter-spacing: 0.06px; display: flex; flex-direction: column; gap: 4px; align-items: center; justify-content: center; min-width: 68px; border-radius: 8px; padding: 5px; } .UsernameLinkEditor__actions__save, .UsernameLinkEditor__actions__color { background-color: #e9e9e9; color: #000000; } .dark-theme .UsernameLinkEditor__actions__save, .dark-theme .UsernameLinkEditor__actions__color { background-color: #3b3b3b; color: #f6f6f6; } .UsernameLinkEditor__actions__save i, .UsernameLinkEditor__actions__color i { display: block; width: 20px; height: 20px; margin-block-start: 2px; } .UsernameLinkEditor__actions__save i { -webkit-mask: url("../images/icons/v3/save/save.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .UsernameLinkEditor__actions__save i { background-color: WindowText; } } .dark-theme .UsernameLinkEditor__actions__save i { -webkit-mask: url("../images/icons/v3/save/save.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #f6f6f6; } @media (forced-colors: active) { .dark-theme .UsernameLinkEditor__actions__save i { background-color: WindowText; } } .UsernameLinkEditor__actions__color i { -webkit-mask: url("../images/icons/v3/color/color.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .UsernameLinkEditor__actions__color i { background-color: WindowText; } } .dark-theme .UsernameLinkEditor__actions__color i { -webkit-mask: url("../images/icons/v3/color/color.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #f6f6f6; } @media (forced-colors: active) { .dark-theme .UsernameLinkEditor__actions__color i { background-color: WindowText; } } .UsernameLinkEditor__link { display: flex; flex-direction: row; gap: 12px; align-items: center; padding-block: 12px; padding-inline: 16px; border-radius: 12px; margin-block-start: 20px; width: 100%; } .UsernameLinkEditor__link { border: 2px solid #e9e9e9; } .dark-theme .UsernameLinkEditor__link { border: 2px solid #3b3b3b; } .UsernameLinkEditor__link__icon { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .UsernameLinkEditor__link__icon { border: 1px solid WindowText; } } .keyboard-mode .UsernameLinkEditor__link__icon:focus { box-shadow: 0px 0px 0px 3px #2c6bed; } .dark-theme.keyboard-mode .UsernameLinkEditor__link__icon:focus { box-shadow: 0px 0px 0px 3px #6191f3; } .UsernameLinkEditor__link__icon { border-radius: 2px; } .UsernameLinkEditor__link__icon:after { content: ""; display: block; width: 20px; height: 20px; flex-shrink: 0; } .UsernameLinkEditor__link__icon:after { -webkit-mask: url("../images/icons/v3/copy/copy.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .UsernameLinkEditor__link__icon:after { background-color: WindowText; } } .dark-theme .UsernameLinkEditor__link__icon:after { -webkit-mask: url("../images/icons/v3/copy/copy.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #f6f6f6; } @media (forced-colors: active) { .dark-theme .UsernameLinkEditor__link__icon:after { background-color: WindowText; } } .UsernameLinkEditor__link__icon:disabled:after { background-color: #848484; } .dark-theme .UsernameLinkEditor__link__icon:disabled:after { background-color: #b9b9b9; } .UsernameLinkEditor__link__text { word-break: break-all; user-select: text; } .UsernameLinkEditor__link__text--resetting { color: #848484; } .dark-theme .UsernameLinkEditor__link__text--resetting { color: #b9b9b9; } .UsernameLinkEditor__help { font-size: 12px; line-height: 16px; letter-spacing: 0; margin-block-start: 16px; text-align: center; } .UsernameLinkEditor__help { color: #5e5e5e; } .dark-theme .UsernameLinkEditor__help { color: #b9b9b9; } .UsernameLinkEditor__reset { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .UsernameLinkEditor__reset { border: 1px solid WindowText; } } .keyboard-mode .UsernameLinkEditor__reset:focus { box-shadow: 0px 0px 0px 3px #2c6bed; } .dark-theme.keyboard-mode .UsernameLinkEditor__reset:focus { box-shadow: 0px 0px 0px 3px #6191f3; } .UsernameLinkEditor__reset { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; margin-block: 12px 16px; } .UsernameLinkEditor__reset { color: #2c6bed; } .dark-theme .UsernameLinkEditor__reset { color: #6191f3; } .UsernameLinkEditor__button-footer { display: flex; flex-wrap: wrap; justify-content: flex-end; align-items: center; padding-block: 1em 16px; gap: 8px; } .UsernameLinkEditor__button-footer .module-Button:not(:first-child) { margin-inline-start: 4px; } .UsernameLinkEditor__done { width: 100%; margin-block-end: 8px; } .UsernameLinkEditor__colors__grid { display: grid; grid-template-columns: repeat(4, 1fr); grid-template-rows: 1fr 1fr; gap: 18px 20px; margin-block: 24px 30px; } .UsernameLinkEditor__colors__radio { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .UsernameLinkEditor__colors__radio { border: 1px solid WindowText; } } .keyboard-mode .UsernameLinkEditor__colors__radio:focus { box-shadow: 0px 0px 0px 3px #2c6bed; } .dark-theme.keyboard-mode .UsernameLinkEditor__colors__radio:focus { box-shadow: 0px 0px 0px 3px #6191f3; } .UsernameLinkEditor__colors__radio { display: flex; width: 48px; height: 48px; border-radius: 24px; } .UsernameLinkEditor__colors__radio[aria-pressed=true] { padding: 3px; } .UsernameLinkEditor__colors__radio[aria-pressed=true] { border: 2px solid #000000; } .dark-theme .UsernameLinkEditor__colors__radio[aria-pressed=true] { border: 2px solid #2c6bed; } .UsernameLinkEditor__colors__radio i { width: 100%; height: 100%; border-radius: 24px; border: 2px solid var(--fg-color); background: var(--bg-color); } .UsernameLinkEditor__colors__radio--white-bg i { border-color: #dedede; } .dark-theme .UsernameLinkEditor__colors__radio--white-bg i { border-color: #5e5e5e; } .UsernameMegaphone { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; border-radius: 10px; box-shadow: 0px 4px 8px 0px rgba(0, 0, 0, 0.08); display: flex; flex-direction: column; user-select: none; z-index: 75; padding-block: 12px; padding-inline: 8px; } .UsernameMegaphone { background-color: #ffffff; border: 1px solid #c6c6c6; } .dark-theme .UsernameMegaphone { background: #3b3b3b; border: 1px solid #5e5e5e; } .UsernameMegaphone__row { display: flex; flex-direction: row; margin-top: 4px; margin-bottom: 12px; gap: 12px; } .UsernameMegaphone__row__icon { flex-shrink: 0; width: 40px; height: 40px; margin-bottom: 2px; margin-inline-start: 8px; background-size: cover; } .UsernameMegaphone__row__icon { background-image: url(../images/usernames_40_color.svg); } .dark-theme .UsernameMegaphone__row__icon { background-image: url(../images/usernames_40_color_dark.svg); } .UsernameMegaphone__row__text { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; padding-inline-end: 8px; } .UsernameMegaphone__row__text h2 { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; font-weight: 600; margin: 0; line-height: 20px; } .UsernameMegaphone__row__text p { margin: 0; } .UsernameMegaphone__row__text p { color: #5e5e5e; } .dark-theme .UsernameMegaphone__row__text p { color: #b9b9b9; } .UsernameMegaphone__buttons { display: flex; flex-direction: row; justify-content: end; gap: 12px; } .UsernameMegaphone__buttons__button { margin-bottom: 0; font-weight: 600; padding-block: 5px; } .UsernameMegaphone__buttons__button { background: transparent; } .UsernameMegaphone__buttons__button:hover:not(:disabled):not([aria-disabled=true]), .UsernameMegaphone__buttons__button:active:not(:disabled):not([aria-disabled=true]) { background: transparent; } .dark-theme .UsernameMegaphone__buttons__button { background: transparent; } .dark-theme .UsernameMegaphone__buttons__button:hover:not(:disabled):not([aria-disabled=true]), .dark-theme .UsernameMegaphone__buttons__button:active:not(:disabled):not([aria-disabled=true]) { background: transparent; } .NavSidebar--narrow .UsernameMegaphone { display: none; } .UsernameOnboardingModal { display: flex; flex-direction: column; align-items: center; user-select: none; } .UsernameOnboardingModal__title { font-weight: 600; font-size: 20px; line-height: 26px; letter-spacing: -0.34px; margin-bottom: 20px; max-width: 240px; text-align: center; } .UsernameOnboardingModal__row { display: flex; gap: 24px; margin-bottom: 32px; } .UsernameOnboardingModal__row__icon { flex-shrink: 0; width: 40px; height: 40px; background-size: cover; } .UsernameOnboardingModal__row__icon--number { background-image: url(../images/phone_40_color.svg); } .dark-theme .UsernameOnboardingModal__row__icon--number { background-image: url(../images/phone_40_color_dark.svg); } .UsernameOnboardingModal__row__icon--username { background-image: url(../images/usernames_40_color.svg); } .dark-theme .UsernameOnboardingModal__row__icon--username { background-image: url(../images/usernames_40_color_dark.svg); } .UsernameOnboardingModal__row__icon--qr { background-image: url(../images/qr_codes_40_color.svg); } .dark-theme .UsernameOnboardingModal__row__icon--qr { background-image: url(../images/qr_codes_40_color_dark.svg); } .UsernameOnboardingModal__row__body { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; } .UsernameOnboardingModal__row__body { color: #5e5e5e; } .dark-theme .UsernameOnboardingModal__row__body { color: #b9b9b9; } .UsernameOnboardingModal__row__body { max-width: 248px; } .UsernameOnboardingModal__row__body h2 { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; margin-top: 0; margin-bottom: 2px; font-weight: 400; } .UsernameOnboardingModal__row__body h2 { color: #1b1b1b; } .dark-theme .UsernameOnboardingModal__row__body h2 { color: #e9e9e9; } .UsernameOnboardingModal__row--center { justify-content: center; } .UsernameOnboardingModal__submit { width: 100%; max-width: 296px; margin-top: 16px; margin-bottom: 12px; } .UsernameOnboardingModal__skip { margin-bottom: 0; } .UsernameOnboardingModal__skip { background: transparent; } .UsernameOnboardingModal__skip:hover:not(:disabled):not([aria-disabled=true]), .UsernameOnboardingModal__skip:active:not(:disabled):not([aria-disabled=true]) { background: transparent; } .dark-theme .UsernameOnboardingModal__skip { background: transparent; } .dark-theme .UsernameOnboardingModal__skip:hover:not(:disabled):not([aria-disabled=true]), .dark-theme .UsernameOnboardingModal__skip:active:not(:disabled):not([aria-disabled=true]) { background: transparent; } .WhatsNew { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .WhatsNew { border: 1px solid WindowText; } } .WhatsNew { color: #2c6bed; } /*# sourceMappingURL=manifest.css.map */ @charset "UTF-8"; @keyframes search-results-loading-pulsating-background-animation { 0% { opacity: 1; } 50% { opacity: 0.55; } 100% { opacity: 1; } } #app-container { height: 100%; } .inbox { height: 100%; overflow: hidden; position: relative; } .module-title-bar-drag-area { -webkit-app-region: drag; height: var(--title-bar-drag-area-height); inset-inline-start: 0; position: fixed; top: 0; width: 100%; z-index: 9000; } .module-splash-screen { display: flex; flex-direction: column; justify-content: center; align-items: center; } .module-splash-screen__logo { margin-block: 24px; margin-inline: 0; } .module-splash-screen__logo { -webkit-mask: url("../images/signal-logo.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b45fd; } @media (forced-colors: active) { .module-splash-screen__logo { background-color: WindowText; } } .dark-theme .module-splash-screen__logo { -webkit-mask: url("../images/signal-logo.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .dark-theme .module-splash-screen__logo { background-color: WindowText; } } .module-splash-screen__logo.module-splash-screen__logo--128 { height: 128px; width: 128px; } .module-splash-screen__logo.module-splash-screen__logo--96 { height: 96px; width: 96px; } .module-message { position: relative; display: flex; flex-direction: row; align-items: stretch; outline: none; padding-inline: 16px; transition-property: background, translate; transition-duration: 0.1s; transition-timing-function: ease-out; } .module-message__quote-story-reaction-header { font-size: 12px; line-height: 16px; letter-spacing: 0; margin-bottom: 6px; } .module-message__container-outgoing .module-message__quote-story-reaction-header { color: rgba(255, 255, 255, 0.8); } .module-message__container-incoming .module-message__quote-story-reaction-header { color: #5e5e5e; } .module-message--expired { animation: module-message__shake 0.2s linear infinite; } @keyframes module-message__shake { 0% { /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translateX(0px); } 25% { /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translateX(-5px); } 50% { /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translateX(0px); } 75% { /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translateX(5px); } 100% { /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translateX(0px); } } @keyframes module-message__highlight { 0% { filter: none; } 33% { filter: brightness(50%); } 66% { filter: brightness(50%); } 100% { filter: none; } } @keyframes module-message__highlight-lighter { 0% { filter: none; } 33% { filter: brightness(76%); } 66% { filter: brightness(76%); } 100% { filter: none; } } .module-message--outgoing { flex-direction: row-reverse; } .module-message__buttons { display: inline-flex; flex-direction: row; align-items: center; opacity: 0; } .module-message:hover .module-message__buttons, .module-message__buttons:has([data-axo-contextmenu-state=open]) { opacity: 1; } .module-message__buttons--incoming { padding-inline-start: 8px; } .module-message__buttons--incoming > * { margin-inline-start: 12px; } .module-message__buttons--incoming > *:first-child { margin-inline-start: 0; } .module-message__buttons--outgoing { padding-inline-end: 8px; flex-direction: row-reverse; } .module-message__buttons--outgoing > * { margin-inline-end: 12px; } .module-message__buttons--outgoing > *:first-child { margin-inline-end: 0; } .module-message__buttons__download { cursor: pointer; height: 20px; width: 20px; } .module-message__buttons__download { -webkit-mask: url("../images/icons/v3/save/save.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #848484; } @media (forced-colors: active) { .module-message__buttons__download { background-color: WindowText; } } .module-message__buttons__download:hover { -webkit-mask: url("../images/icons/v3/save/save.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #1b1b1b; } @media (forced-colors: active) { .module-message__buttons__download:hover { background-color: WindowText; } } .dark-theme .module-message__buttons__download { -webkit-mask: url("../images/icons/v3/save/save.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #848484; } @media (forced-colors: active) { .dark-theme .module-message__buttons__download { background-color: WindowText; } } .dark-theme .module-message__buttons__download:hover { -webkit-mask: url("../images/icons/v3/save/save.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #f6f6f6; } @media (forced-colors: active) { .dark-theme .module-message__buttons__download:hover { background-color: WindowText; } } .mouse-mode .module-message--targeted .module-message__buttons__download { background-color: #5e5e5e; } .dark-theme.mouse-mode .module-message--targeted .module-message__buttons__download { background-color: #ffffff; } .keyboard-mode .module-message:focus .module-message__buttons__download { background-color: #5e5e5e; } .dark-theme.keyboard-mode .module-message:focus .module-message__buttons__download { background-color: #ffffff; } .module-message__buttons__react { cursor: pointer; height: 20px; width: 20px; } .module-message__buttons__react { -webkit-mask: url("../images/icons/v3/heart/heart-plus.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #848484; } @media (forced-colors: active) { .module-message__buttons__react { background-color: WindowText; } } .module-message__buttons__react:hover { -webkit-mask: url("../images/icons/v3/heart/heart-plus.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #1b1b1b; } @media (forced-colors: active) { .module-message__buttons__react:hover { background-color: WindowText; } } .dark-theme .module-message__buttons__react { -webkit-mask: url("../images/icons/v3/heart/heart-plus.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #848484; } @media (forced-colors: active) { .dark-theme .module-message__buttons__react { background-color: WindowText; } } .dark-theme .module-message__buttons__react:hover { -webkit-mask: url("../images/icons/v3/heart/heart-plus.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #f6f6f6; } @media (forced-colors: active) { .dark-theme .module-message__buttons__react:hover { background-color: WindowText; } } .mouse-mode .module-message--targeted .module-message__buttons__react { background-color: #5e5e5e; } .dark-theme.mouse-mode .module-message--targeted .module-message__buttons__react { background-color: #ffffff; } .keyboard-mode .module-message:focus .module-message__buttons__react { background-color: #5e5e5e; } .dark-theme.keyboard-mode .module-message:focus .module-message__buttons__react { background-color: #ffffff; } .module-message__buttons__reply { cursor: pointer; height: 20px; width: 20px; } .module-message__buttons__reply { -webkit-mask: url("../images/icons/v3/reply/reply.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #848484; } @media (forced-colors: active) { .module-message__buttons__reply { background-color: WindowText; } } .module-message__buttons__reply:hover { -webkit-mask: url("../images/icons/v3/reply/reply.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #1b1b1b; } @media (forced-colors: active) { .module-message__buttons__reply:hover { background-color: WindowText; } } .dark-theme .module-message__buttons__reply { -webkit-mask: url("../images/icons/v3/reply/reply.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #848484; } @media (forced-colors: active) { .dark-theme .module-message__buttons__reply { background-color: WindowText; } } .dark-theme .module-message__buttons__reply:hover { -webkit-mask: url("../images/icons/v3/reply/reply.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #f6f6f6; } @media (forced-colors: active) { .dark-theme .module-message__buttons__reply:hover { background-color: WindowText; } } .mouse-mode .module-message--targeted .module-message__buttons__reply { background-color: #5e5e5e; } .dark-theme.mouse-mode .module-message--targeted .module-message__buttons__reply { background-color: #ffffff; } .keyboard-mode .module-message:focus .module-message__buttons__reply { background-color: #5e5e5e; } .dark-theme.keyboard-mode .module-message:focus .module-message__buttons__reply { background-color: #ffffff; } .module-message__buttons__menu { cursor: pointer; height: 20px; width: 20px; } .module-message__buttons__menu { -webkit-mask: url("../images/icons/v3/more/more.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #848484; } @media (forced-colors: active) { .module-message__buttons__menu { background-color: WindowText; } } .module-message__buttons__menu:hover { -webkit-mask: url("../images/icons/v3/more/more.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #1b1b1b; } @media (forced-colors: active) { .module-message__buttons__menu:hover { background-color: WindowText; } } .dark-theme .module-message__buttons__menu { -webkit-mask: url("../images/icons/v3/more/more.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #848484; } @media (forced-colors: active) { .dark-theme .module-message__buttons__menu { background-color: WindowText; } } .dark-theme .module-message__buttons__menu:hover { -webkit-mask: url("../images/icons/v3/more/more.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #f6f6f6; } @media (forced-colors: active) { .dark-theme .module-message__buttons__menu:hover { background-color: WindowText; } } .mouse-mode .module-message--targeted .module-message__buttons__menu { background-color: #5e5e5e; } .dark-theme.mouse-mode .module-message--targeted .module-message__buttons__menu { background-color: #ffffff; } .keyboard-mode .module-message:focus .module-message__buttons__menu { background-color: #5e5e5e; } .dark-theme.keyboard-mode .module-message:focus .module-message__buttons__menu { background-color: #ffffff; } .module-message__buttons__menu--container { border-radius: 4px; height: 20px; z-index: 2; } .module-message__error-container { min-width: 28px; position: relative; } .module-message__error { width: 20px; height: 20px; display: inline-block; position: absolute; bottom: 4px; } .module-message__error { -webkit-mask: url("../images/icons/v3/error/error-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #f44336; } @media (forced-colors: active) { .module-message__error { background-color: WindowText; } } .dark-theme .module-message__error { -webkit-mask: url("../images/icons/v3/error/error-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #f44336; } @media (forced-colors: active) { .dark-theme .module-message__error { background-color: WindowText; } } .module-message__error--paused { -webkit-mask: url("../images/icons/v3/error/error-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .module-message__error--paused { background-color: WindowText; } } .dark-theme .module-message__error--paused { -webkit-mask: url("../images/icons/v3/error/error-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #848484; } @media (forced-colors: active) { .dark-theme .module-message__error--paused { background-color: WindowText; } } .module-message__error--outgoing { inset-inline-start: 8px; } .module-message__error--incoming { inset-inline-end: 8px; } .module-message__container-outer { line-height: 0; display: flex; flex-direction: column; min-width: 0; max-width: min(306px, 100% - 16px - 22px); } .module-timeline--width-wide .module-message__container-outer, .module-message-detail .module-message__container-outer { max-width: 50vw; } .module-timeline--width-medium .module-message__container-outer { max-width: 370px; } .module-message__container { position: relative; display: inline-block; border-radius: 18px; outline: none; margin-bottom: 6px; margin-top: 6px; min-width: 0px; overflow: hidden; padding-inline: 12px; padding-top: 8px; padding-bottom: 8px; } .module-message--collapsed-above .module-message__container { margin-top: 1px; } .module-message--collapsed-below .module-message__container { margin-bottom: 1px; } .module-message--incoming.module-message--collapsed-above .module-message__container { border-start-start-radius: 4px; } .module-message--incoming.module-message--collapsed-below .module-message__container { border-end-start-radius: 4px; } .module-message--outgoing.module-message--collapsed-above .module-message__container { border-start-end-radius: 4px; } .module-message--outgoing.module-message--collapsed-below .module-message__container { border-end-end-radius: 4px; } .mouse-mode .module-message__container--targeted { animation: module-message__highlight 1.2s cubic-bezier(0.17, 0.17, 0, 1); } .mouse-mode .module-message__container--targeted-lighter { animation: module-message__highlight-lighter 1.2s cubic-bezier(0.17, 0.17, 0, 1); } .module-message__wrapper { position: relative; transition: background 0.1s ease-out; } .module-message__wrapper--select-mode .module-message--incoming:dir(ltr) { /* stylelint-disable-next-line declaration-property-value-disallowed-list */ translate: 38px 0; } .module-message__wrapper--select-mode .module-message--incoming:dir(rtl) { /* stylelint-disable-next-line declaration-property-value-disallowed-list */ translate: -38px 0; } .module-message__alt-accessibility-tree { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border-width: 0; } .module-message__wrapper--selected { background: rgba(44, 107, 237, 0.08); } .module-message__select-checkbox { position: absolute; top: 50%; inset-inline-start: 16px; transform: translateY(-50%); width: 20px; height: 20px; border-radius: 9999px; background: transparent; border: 1px solid #c6c6c6; animation: module-message__select-checkbox--fadeIn 0.2s ease-out; transition: background 0.1s ease-out, border-color 0.1s ease-out; } .module-message__select-checkbox::before { content: ""; display: block; width: 14px; height: 14px; margin: 2px; } .module-message__select-checkbox::before { -webkit-mask: url("../images/icons/v3/check/check-compact-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .module-message__select-checkbox::before { background-color: WindowText; } } .module-message__select-checkbox::before { opacity: 0; transition: opacity 0.1s ease-out; } .module-message__wrapper--selected .module-message__select-checkbox { background: #2c6bed; border-color: #2c6bed; } .module-message__wrapper--selected .module-message__select-checkbox::before { opacity: 1; } @keyframes module-message__select-checkbox--fadeIn { from { opacity: 0; } } .keyboard-mode .module-message:focus-within { background: rgba(44, 107, 237, 0.24); } .dark-theme.keyboard-mode .module-message:focus-within { background: #4a4a4a; } .module-message__container--emoji { padding-top: 4px; } .module-message__container--emoji .module-message__text--outgoing { text-align: end; } .module-message__container--outgoing { background-color: #2c6bed; color: #ffffff; } .dark-theme .module-message__container--outgoing { background-color: #2c6bed; color: #e9e9e9; } .module-message__container--incoming { background-color: #e9e9e9; color: #1b1b1b; } .dark-theme .module-message__container--incoming { background-color: #3b3b3b; color: #e9e9e9; } .module-message__container--outgoing-blue { background-color: #336ba3; } .dark-theme .module-message__container--outgoing-blue { background-color: #336ba3; } .module-message__container--outgoing-burlap { background-color: #6f6a58; } .dark-theme .module-message__container--outgoing-burlap { background-color: #6f6a58; } .module-message__container--outgoing-crimson { background-color: #cf163e; } .dark-theme .module-message__container--outgoing-crimson { background-color: #cf163e; } .module-message__container--outgoing-forest { background-color: #3b7845; } .dark-theme .module-message__container--outgoing-forest { background-color: #3b7845; } .module-message__container--outgoing-indigo { background-color: #6058ca; } .dark-theme .module-message__container--outgoing-indigo { background-color: #6058ca; } .module-message__container--outgoing-plum { background-color: #aa377a; } .dark-theme .module-message__container--outgoing-plum { background-color: #aa377a; } .module-message__container--outgoing-steel { background-color: #71717f; } .dark-theme .module-message__container--outgoing-steel { background-color: #71717f; } .module-message__container--outgoing-taupe { background-color: #8f616a; } .dark-theme .module-message__container--outgoing-taupe { background-color: #8f616a; } .module-message__container--outgoing-teal { background-color: #077d92; } .dark-theme .module-message__container--outgoing-teal { background-color: #077d92; } .module-message__container--outgoing-vermilion { background-color: #c73f0a; } .dark-theme .module-message__container--outgoing-vermilion { background-color: #c73f0a; } .module-message__container--outgoing-violet { background-color: #9932c8; } .dark-theme .module-message__container--outgoing-violet { background-color: #9932c8; } .module-message__container--outgoing-wintergreen { background-color: #1d8663; } .dark-theme .module-message__container--outgoing-wintergreen { background-color: #1d8663; } .module-message__container--outgoing-custom { background-attachment: fixed; } .module-message__container--outgoing-ultramarine { background-attachment: fixed; background-image: linear-gradient(180deg, #0552f0, #2c6bed); } .module-message__container--outgoing-basil { background-attachment: fixed; background-image: linear-gradient(180deg, #2f9373, #077343); } .module-message__container--outgoing-ember { background-attachment: fixed; background-image: linear-gradient(168deg, #e57c00, #5e0000); } .module-message__container--outgoing-fluorescent { background-attachment: fixed; background-image: linear-gradient(192deg, #ec13dd, #1b36c6); } .module-message__container--outgoing-infrared { background-attachment: fixed; background-image: linear-gradient(192deg, #f65560, #442ced); } .module-message__container--outgoing-lagoon { background-attachment: fixed; background-image: linear-gradient(180deg, #004066, #32867d); } .module-message__container--outgoing-midnight { background-attachment: fixed; background-image: linear-gradient(180deg, #2c2c3a, #787891); } .module-message__container--outgoing-sea { background-attachment: fixed; background-image: linear-gradient(180deg, #498fd4, #2c66a0); } .module-message__container--outgoing-sublime { background-attachment: fixed; background-image: linear-gradient(180deg, #6281d5, #974460); } .module-message__container--outgoing-tangerine { background-attachment: fixed; background-image: linear-gradient(192deg, #db7133, #911231); } .module-message__container--deleted-for-everyone { color: #1b1b1b; border: 1px solid #b9b9b9; background-color: transparent; background-image: none; } .dark-theme .module-message__container--deleted-for-everyone { color: #e9e9e9; border: 1px solid #3b3b3b; background-color: transparent; background-image: none; } .module-message__attachment-too-big { user-select: none; margin-inline: -12px; margin-top: -8px; margin-bottom: -8px; padding-top: 8px; padding-bottom: 8px; padding-inline: 12px; border-radius: 18px; font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-style: italic; } .module-message__attachment-too-big { color: #1b1b1b; border: 1px solid #e9e9e9; background-color: #ffffff; background-image: none; } .dark-theme .module-message__attachment-too-big { color: #e9e9e9; border: 1px solid #3b3b3b; background-color: #121212; background-image: none; } .module-message__attachment-too-big--content-above { margin-block-start: 0; border-top-left-radius: 0; border-top-right-radius: 0; } .module-message__attachment-too-big--content-below { border-bottom-left-radius: 0; border-bottom-right-radius: 0; border-bottom: none; margin-bottom: 7px; } .module-message__attachment-too-big--collapse-above--incoming { border-top-left-radius: 4px; } .module-message__attachment-too-big--collapse-above--outgoing { border-top-right-radius: 4px; } .module-message__attachment-too-big--collapse-below--incoming { border-bottom-left-radius: 4px; } .module-message__attachment-too-big--collapse-below--outgoing { border-bottom-right-radius: 4px; } .module-message__attachment-container { text-align: center; position: relative; margin-inline: -12px; margin-top: -8px; margin-bottom: -8px; line-height: 0; overflow: hidden; } .module-message__attachment-container { background-color: #ffffff; } .dark-theme .module-message__attachment-container { background-color: #121212; } .module-message__attachment-container--with-content-below { margin-bottom: 7px; } .module-message__attachment-container--with-content-above { margin-top: 4px; } .module-message__undownloadable-attachment { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; display: flex; padding-block: 9px 8px; padding-inline: 12px; margin-inline: -12px; margin-block-start: -8px; margin-block-end: -8px; } .module-message__undownloadable-attachment--with-content-below { margin-block-end: 7px; border-bottom: 0.5px solid rgba(255, 255, 255, 0.1); } .module-message__undownloadable-attachment--with-content-below { border-color: rgba(0, 0, 0, 0.1); } .dark-theme .module-message__undownloadable-attachment--with-content-below { border-color: rgba(255, 255, 255, 0.1); } .module-message__undownloadable-attachment--with-content-above { margin-block-start: 4px; } .module-message__container--outgoing .module-message__undownloadable-attachment--with-content-below { border-color: rgba(255, 255, 255, 0.3); } .module-message__container--is-clickable { cursor: pointer; } .module-message__sticker-container { text-align: center; margin-inline: -12px; margin-top: -9px; margin-bottom: -5px; } .module-message__sticker-container--with-content-below { margin-bottom: 5px; } .module-message__sticker-container--with-content-above { margin-top: 4px; } .module-message__img-attachment { margin-bottom: -3px; cursor: pointer; } .module-message__simple-attachment { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-message__simple-attachment { border: 1px solid WindowText; } } .module-message__simple-attachment { user-select: none; width: 100%; display: flex; flex-direction: row; align-items: center; border-radius: 4px; } .keyboard-mode .module-message__simple-attachment:focus { box-shadow: 0px 0px 0px 2px #2c6bed; } .keyboard-mode .module-message__container--outgoing .module-message__simple-attachment:focus { box-shadow: 0px 0px 0px 2px #ffffff; } .module-message__simple-attachment--with-content-below { padding-bottom: 8px; } .module-message__simple-attachment--with-content-above { padding-top: 4px; } .module-message__simple-attachment__icon__extension { font-size: 12px; line-height: 16px; letter-spacing: 0; text-transform: lowercase; user-select: none; text-align: center; margin-inline: auto; white-space: nowrap; overflow-x: hidden; text-overflow: clip; color: #1b1b1b; } .module-message__simple-attachment__icon__extension--more-char { font-size: 9px; line-height: 11px; letter-spacing: -0.2px; } .module-message__simple-attachment__text { flex-grow: 1; max-width: calc(100% - 42px); } .module-message__simple-attachment__file-name { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; margin-top: 2px; user-select: none; font-weight: 500; overflow-x: hidden; white-space: nowrap; text-overflow: ellipsis; } .module-message__simple-attachment__file-name { color: #ffffff; } .dark-theme .module-message__simple-attachment__file-name { color: rgba(255, 255, 255, 0.9); } .module-message__simple-attachment__file-name--incoming { color: #ffffff; } .module-message__simple-attachment__file-name--incoming { color: #1b1b1b; } .dark-theme .module-message__simple-attachment__file-name--incoming { color: #e9e9e9; } .module-message__simple-attachment__bottom-row { display: flex; flex-direction: row; } .module-message__simple-attachment__metadata-container { flex-grow: 1; padding-inline-start: 8px; padding-top: 6px; align-self: end; } .module-message__container--incoming .module-message__simple-attachment__file-name--undownloadable { color: #1b1b1b; } .dark-theme .module-message__container--incoming .module-message__simple-attachment__file-name--undownloadable { color: #e9e9e9; } .module-message__simple-attachment__file-size { flex-grow: 1; flex-shrink: 0; font-size: 12px; line-height: 16px; letter-spacing: 0px; margin-top: 2px; user-select: none; white-space: no-wrap; } .module-message__simple-attachment__file-size { color: rgba(255, 255, 255, 0.8); } .dark-theme .module-message__simple-attachment__file-size { color: rgba(255, 255, 255, 0.6); } .module-message__simple-attachment__file-size--incoming { color: #ffffff; } .module-message__simple-attachment__file-size--incoming { color: #5e5e5e; } .dark-theme .module-message__simple-attachment__file-size--incoming { color: #b9b9b9; } .module-message__undownloadable-attachment__icon-container { margin-inline-end: 8px; } .module-message__undownloadable-attachment__icon-container--file { margin-block-start: 1px; margin-inline-end: 3px; } .module-message__undownloadable-attachment__icon { height: 20px; width: 20px; } .module-message__undownloadable-attachment__icon--audio { -webkit-mask: url("../images/icons/v3/waveform/waveform-slash.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .module-message__undownloadable-attachment__icon--audio { background-color: WindowText; } } .module-message__undownloadable-attachment__icon--file { -webkit-mask: url("../images/icons/v3/error/error-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .module-message__undownloadable-attachment__icon--file { background-color: WindowText; } } .module-message__undownloadable-attachment__icon--sticker { -webkit-mask: url("../images/icons/v3/sticker/sticker-slash.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .module-message__undownloadable-attachment__icon--sticker { background-color: WindowText; } } .module-message__undownloadable-attachment__icon--tap-to-view { -webkit-mask: url("../images/icons/v3/view_once/view_once-slash-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .module-message__undownloadable-attachment__icon--tap-to-view { background-color: WindowText; } } .module-message__undownloadable-attachment__icon--small { width: 16px; height: 16px; } .module-message__undownloadable-attachment-info--file { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; } .module-message__container--incoming .module-message__undownloadable-attachment-info--file { color: #2e2e2e; } .dark-theme .module-message__container--incoming .module-message__undownloadable-attachment-info--file { color: #b9b9b9; } .module-message__undownloadable-attachment { min-width: 200px; } .module-message__undownloadable-attachment-file { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; display: flex; } .module-message__undownloadable-attachment-text { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-message__undownloadable-attachment-text { border: 1px solid WindowText; } } .module-message__undownloadable-attachment-text { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; width: calc(100% + 24px); margin-block-start: 9px; margin-inline: -12px; padding-block-start: 9px; padding-inline: 12px; border-block-start: 0.5px solid; } .module-message__undownloadable-attachment-text { border-block-start-color: rgba(0, 0, 0, 0.1); } .dark-theme .module-message__undownloadable-attachment-text { border-block-start-color: rgba(255, 255, 255, 0.1); } .module-message__container--outgoing .module-message__undownloadable-attachment-text { border-block-start-color: rgba(255, 255, 255, 0.3); } .module-message__undownloadable-attachment-text__icon-container { margin-inline-end: 8px; align-self: flex-start; } .module-message--outgoing .module-message__undownloadable-attachment + .module-message__metadata .module-message__metadata__date--with-sticker { color: inherit; } .module-message--outgoing .module-message__undownloadable-attachment + .module-message__metadata .module-message__metadata__status-icon--with-sticker { background-color: rgba(255, 255, 255, 0.8); } .module-message__undownloadable-attachment-learn-more { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-message__undownloadable-attachment-learn-more { border: 1px solid WindowText; } } .keyboard-mode .module-message__undownloadable-attachment-learn-more:focus { box-shadow: 0px 0px 0px 2px #2c6bed; } .module-message__undownloadable-attachment-learn-more { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; font-weight: 500; } .module-message__link-preview { cursor: pointer; } .module-message__link-preview--nonclickable { cursor: inherit; } .module-message__link-preview--nonclickable .module-image__image, .module-message__link-preview--nonclickable .module-image__border-overlay--with-click-handler { cursor: inherit; } .module-message__link-preview { display: block; margin-inline: -12px; width: calc(100% + 24px); outline: none; margin-top: -8px; margin-bottom: 5px; overflow: hidden; } .keyboard-mode .module-message__link-preview:focus { box-shadow: 0px 0px 0px 2px #2c6bed; } .module-message__link-preview--with-content-above { margin-top: 4px; } .module-message__link-preview__content { padding-block: 8px; padding-inline: 12px; display: flex; flex-direction: row; align-items: center; } .module-message__link-preview__content { background-color: #f6f6f6; } .dark-theme .module-message__link-preview__content { background-color: #2e2e2e; } .module-message__link-preview__icon_container { margin: -2px; margin-inline-end: 8px; display: inline-block; } .module-message__link-preview__text--with-icon { margin-top: 5px; } .module-message__link-preview__title { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; overflow: hidden; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; } .module-message__link-preview__title { color: #1b1b1b; } .dark-theme .module-message__link-preview__title { color: #e9e9e9; } .module-message__link-preview__description { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; margin-top: 4px; overflow: hidden; display: -webkit-box; -webkit-line-clamp: 5; -webkit-box-orient: vertical; overflow-wrap: break-word; word-wrap: break-word; word-break: break-word; } .module-message__link-preview__description { color: #1b1b1b; } .dark-theme .module-message__link-preview__description { color: #e9e9e9; } .module-message__link-preview__footer { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; display: flex; flex-flow: row wrap; align-items: center; margin-top: 2px; } .module-message__link-preview__footer { color: #5e5e5e; } .dark-theme .module-message__link-preview__footer { color: #b9b9b9; } .module-message__link-preview__footer > *:not(:first-child) { display: flex; flex-grow: 1; } .module-message__link-preview__footer > *:not(:first-child):before { content: "•"; font-size: 50%; margin-inline: 0.2rem; } .module-message__link-preview__location { text-transform: lowercase; } .module-message__author { font-size: 12px; line-height: 16px; letter-spacing: 0px; font-weight: 600; user-select: none; overflow: hidden; text-overflow: ellipsis; margin-bottom: 3px; } .module-message__author_with_sticker { font-size: 12px; line-height: 16px; letter-spacing: 0px; font-weight: 600; min-height: 18px; width: 300px; } .module-message__author_with_sticker { color: #1b1b1b; } .dark-theme .module-message__author_with_sticker { color: #e9e9e9; } .module-message__author--with-quote { margin-bottom: 3px; } .module-message__text { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; text-align: start; overflow-wrap: break-word; word-wrap: break-word; word-break: break-word; white-space: pre-wrap; } .module-message__text { color: rgba(255, 255, 255, 0.9); } .dark-theme .module-message__text { color: rgba(255, 255, 255, 0.9); } .module-message__text a { text-decoration: underline; outline: none; word-break: break-all; } .module-message__text a { color: rgba(255, 255, 255, 0.9); } .keyboard-mode .module-message__text a:focus { outline: 1px solid #1b1b1b; } .dark-theme .module-message__text a { color: rgba(255, 255, 255, 0.9); } .dark-theme.keyboard-mode .module-message__text a:focus { outline: 1px solid rgba(255, 255, 255, 0.9); } .module-message__text--incoming { color: #1b1b1b; } .dark-theme .module-message__text--incoming { color: #e9e9e9; } .module-message__text--incoming a { text-decoration: underline; outline: none; } .module-message__text--incoming a { color: #1b1b1b; } .keyboard-mode .module-message__text--incoming a:focus { outline: 1px solid #1b1b1b; } .dark-theme .module-message__text--incoming a { color: #e9e9e9; } .dark-theme.keyboard-mode .module-message__text--incoming a:focus { outline: 1px solid #e9e9e9; } .module-message__text--error { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-style: italic; } .module-message__text--delete-for-everyone { user-select: none; } .module-message__text--delete-for-everyone { color: #1b1b1b; } .dark-theme .module-message__text--delete-for-everyone { color: #e9e9e9; } .module-message__metadata { font-size: 11px; line-height: 14px; letter-spacing: 0.06px; align-items: center; display: flex; flex-direction: row; justify-content: flex-end; margin-top: 3px; font-style: normal; user-select: none; white-space: nowrap; color: light-dark(#5e5e5e, #b9b9b9); } .module-message__metadata--outgoing { color: rgba(255, 255, 255, 0.8); } .module-message__metadata--outline-only-bubble, .module-message__metadata--sticker { color: light-dark(#5e5e5e, #b9b9b9); } .module-message__metadata--with-image-no-caption { color: light-dark(#ffffff, rgba(255, 255, 255, 0.8)); } .module-message__metadata--inline { float: inline-end; margin-top: -14px; position: relative; z-index: 1; } .module-message__metadata__edited { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-message__metadata__edited { border: 1px solid WindowText; } } .module-message__metadata__edited { cursor: pointer; margin-inline-end: 6px; z-index: 1; } .module-message__metadata__sms { margin-inline-start: 6px; } .module-message__metadata--with-image-no-caption { position: absolute; bottom: 9px; z-index: 2; width: 100%; padding-inline-end: 24px; pointer-events: none; } .module-message__metadata__tapable { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-message__metadata__tapable { border: 1px solid WindowText; } } .module-message__metadata__status-icon { width: 12px; height: 12px; display: inline-block; margin-inline: 6px; margin-bottom: 2px; } .page-is-visible .module-message__metadata__status-icon--paused, .page-is-visible .module-message__metadata__status-icon--sending { animation: rotate 4s linear infinite; } .module-message__metadata__status-icon--paused, .module-message__metadata__status-icon--sending { -webkit-mask: url("../images/icons/v3/message_status/messagestatus-sending.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .module-message__metadata__status-icon--paused, .module-message__metadata__status-icon--sending { background-color: WindowText; } } .module-message__metadata__status-icon--sent { -webkit-mask: url("../images/icons/v3/message_status/messagestatus-sent.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .module-message__metadata__status-icon--sent { background-color: WindowText; } } .module-message__metadata__status-icon--delivered { margin-inline-end: 0px; width: 18px; } .module-message__metadata__status-icon--delivered { -webkit-mask: url("../images/icons/v3/message_status/messagestatus-delivered.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .module-message__metadata__status-icon--delivered { background-color: WindowText; } } .module-message__metadata__status-icon--read, .module-message__metadata__status-icon--viewed { margin-inline-end: 0px; width: 18px; } .module-message__metadata__status-icon--read, .module-message__metadata__status-icon--viewed { -webkit-mask: url("../images/icons/v3/message_status/messagestatus-read.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .module-message__metadata__status-icon--read, .module-message__metadata__status-icon--viewed { background-color: WindowText; } } .module-message__metadata__status-icon--with-image-no-caption { color: light-dark(#ffffff, #f6f6f6); } .module-message__metadata__spinner-container { margin-inline-start: 6px; } .module-message__send-message-button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-message__send-message-button { border: 1px solid WindowText; } } .module-message__send-message-button { width: calc(100% + 24px); font-size: 13px; line-height: 18px; letter-spacing: -0.03px; font-weight: 600; margin-top: 8px; margin-bottom: -8px; margin-inline: -12px; text-align: center; padding: 10px; border-bottom-left-radius: 18px; border-bottom-right-radius: 18px; } .module-message__send-message-button { color: #2c6bed; background-color: #f6f6f6; border: 1px solid rgba(0, 0, 0, 0.2); } .dark-theme .module-message__send-message-button { color: #6191f3; background-color: #3b3b3b; border: 1px solid #848484; } .keyboard-mode .module-message__send-message-button:focus { box-shadow: 0px 0px 0px 2px #2c6bed; } .module-message__send-message-button--no-bottom-left-curve { border-bottom-left-radius: 4px; } .module-message__send-message-button--no-bottom-right-curve { border-bottom-right-radius: 4px; } .module-message__author-avatar-container { align-items: flex-end; display: flex; justify-content: center; margin-inline-end: 8px; min-width: 28px; padding-bottom: 6px; } .module-message__author-avatar-container--with-reactions { padding-bottom: 15px; } .module-message__author-avatar-container--typing { flex-direction: row-reverse; overflow-y: clip; } .module-message__container-outer--typing-bubble { overflow-y: clip; } .module-message__typing-avatar-container { flex-direction: row-reverse; overflow-y: clip; } .module-message__typing-avatar { display: flex; justify-content: center; position: relative; z-index: 1; } .module-message__typing-avatar:not(:last-child) { margin-inline-start: -4px; } .module-message__typing-avatar--overflow-count .module-Avatar__contents { background: #e9e9e9; color: #5e5e5e; } .dark-theme .module-message__typing-avatar--overflow-count .module-Avatar__contents { background: #3b3b3b; color: #b9b9b9; } .module-message__typing-avatar--overflow-count .module-Avatar__label { font-size: 11px; line-height: 14px; letter-spacing: 0.06px; font-weight: 600; } .module-message__typing-avatar .module-Avatar { min-width: 28px; width: 28px; height: 28px; } .module-message__typing-avatar .module-Avatar__contents { outline: 3px solid; } .module-message__typing-avatar .module-Avatar__contents { outline-color: #ffffff; } .dark-theme .module-message__typing-avatar .module-Avatar__contents { outline-color: #121212; } .module-message__typing-avatar-spacer { flex: 0 1 24px; } .module-message__unopened-gift-badge { width: 240px; height: 132px; background-color: #2c6bed; position: relative; margin-inline: -12px; margin-top: -8px; margin-bottom: 8px; } .module-message__unopened-gift-badge--outgoing { border-bottom: 1px solid rgba(255, 255, 255, 0.8); } .dark-theme .module-message__unopened-gift-badge--outgoing { border-bottom: 1px solid #121212; } .module-message__unopened-gift-badge__container { cursor: default; user-select: none; } .module-message__unopened-gift-badge__ribbon-horizontal { position: absolute; inset-inline: 0; height: 16px; top: 50%; transform: translateY(-50%); background-color: #ffffff; } .module-message__unopened-gift-badge__ribbon-vertical { position: absolute; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translateX(-50%); top: 0; bottom: 0; width: 16px; background-color: #ffffff; } .module-message__unopened-gift-badge__bow { position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); margin-top: 3px; width: 81px; height: 60px; } .module-message__unopened-gift-badge__text { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; font-style: italic; } .module-message__unopened-gift-badge__text--incoming { color: #5e5e5e; } .dark-theme .module-message__unopened-gift-badge__text--incoming { color: #b9b9b9; } .module-message__unopened-gift-badge__container .module-message__text--incoming { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; font-style: italic; } .module-message__unopened-gift-badge__container .module-message__text--incoming { color: #5e5e5e; } .dark-theme .module-message__unopened-gift-badge__container .module-message__text--incoming { color: #b9b9b9; } .module-message__unopened-gift-badge__container .module-message__text--outgoing { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; font-style: italic; } .module-message__unopened-gift-badge__container .module-message__text--outgoing { color: rgba(255, 255, 255, 0.8); } .dark-theme .module-message__unopened-gift-badge__container .module-message__text--outgoing { color: rgba(255, 255, 255, 0.8); } .module-message__redeemed-gift-badge { display: flex; flex-direction: row; } .module-message__redeemed-gift-badge__container { user-select: none; } .module-message__redeemed-gift-badge__badge { height: 64px; width: 64px; margin-inline: 4px 12px; margin-top: 8px; margin-bottom: 16px; flex-grow: 0; flex-shrink: 0; } .module-message__redeemed-gift-badge__badge--missing-incoming { border-radius: 50%; } .module-message__redeemed-gift-badge__badge--missing-incoming { background-color: #dedede; } .dark-theme .module-message__redeemed-gift-badge__badge--missing-incoming { background-color: #5e5e5e; } .module-message__redeemed-gift-badge__badge--missing-outgoing { border-radius: 50%; } .module-message__redeemed-gift-badge__badge--missing-outgoing { background-color: rgba(255, 255, 255, 0.2); } .dark-theme .module-message__redeemed-gift-badge__badge--missing-outgoing { background-color: rgba(255, 255, 255, 0.2); } .module-message__redeemed-gift-badge__text { flex-grow: 1; margin-top: 19px; } .module-message__redeemed-gift-badge__title { margin-bottom: 6px; font-size: 14px; line-height: 20px; letter-spacing: -0.08px; } .module-message__redeemed-gift-badge__remaining { font-size: 12px; line-height: 16px; letter-spacing: 0; } .module-message__redeemed-gift-badge__remaining--incoming { color: #3b3b3b; } .dark-theme .module-message__redeemed-gift-badge__remaining--incoming { color: #b9b9b9; } .module-message__redeemed-gift-badge__remaining--outgoing { color: rgba(255, 255, 255, 0.8); } .dark-theme .module-message__redeemed-gift-badge__remaining--outgoing { color: rgba(255, 255, 255, 0.8); } .module-message__redeemed-gift-badge__button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-message__redeemed-gift-badge__button { border: 1px solid WindowText; } } .module-message__redeemed-gift-badge__button { color: #1b1b1b; background-color: #e9e9e9; } .dark-theme .module-message__redeemed-gift-badge__button { color: #e9e9e9; background-color: #4a4a4a; } .mouse-mode .module-message__redeemed-gift-badge__button:hover { background-color: rgb(198.05, 198.05, 198.05); } .dark-theme.mouse-mode .module-message__redeemed-gift-badge__button:hover { background-color: rgb(101.15, 101.15, 101.15); } .mouse-mode .module-message__redeemed-gift-badge__button:active { background-color: rgb(174.75, 174.75, 174.75); } .dark-theme.mouse-mode .module-message__redeemed-gift-badge__button:active { background-color: rgb(119.25, 119.25, 119.25); } .keyboard-mode .module-message__redeemed-gift-badge__button:active { background-color: rgb(174.75, 174.75, 174.75); } .dark-theme.keyboard-mode .module-message__redeemed-gift-badge__button:active { background-color: rgb(119.25, 119.25, 119.25); } .keyboard-mode .module-message__redeemed-gift-badge__button:focus { box-shadow: 0px 0px 0px 3px #2c6bed; } .dark-theme.keyboard-mode .module-message__redeemed-gift-badge__button:focus { box-shadow: 0px 0px 0px 3px #6191f3; } .module-message__redeemed-gift-badge__button { margin-inline: auto; width: 216px; margin-bottom: 7px; text-align: center; border-radius: 4px; font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; display: flex; flex-direction: column; align-items: center; cursor: pointer; } .module-message__redeemed-gift-badge__button--incoming { color: #1b1b1b; background-color: #ffffff; } .dark-theme .module-message__redeemed-gift-badge__button--incoming { color: #e9e9e9; background-color: #545454; } .mouse-mode .module-message__redeemed-gift-badge__button--incoming:hover { background-color: #ffffff; } .dark-theme.mouse-mode .module-message__redeemed-gift-badge__button--incoming:hover { background-color: #545454; } .module-message__redeemed-gift-badge__button--outgoing { color: #1b1b1b; background-color: rgba(255, 255, 255, 0.8); } .dark-theme .module-message__redeemed-gift-badge__button--outgoing { color: #1b1b1b; background-color: rgba(255, 255, 255, 0.8); } .mouse-mode .module-message__redeemed-gift-badge__button--outgoing:hover { background-color: rgba(255, 255, 255, 0.9); } .dark-theme.mouse-mode .module-message__redeemed-gift-badge__button--outgoing:hover { background-color: rgba(255, 255, 255, 0.9); } .keyboard-mode .module-message__redeemed-gift-badge__button--outgoing:focus { box-shadow: 0px 0px 0px 3px #6191f3; } .dark-theme.keyboard-mode .module-message__redeemed-gift-badge__button--outgoing:focus { box-shadow: 0px 0px 0px 3px #6191f3; } .mouse-mode .module-message__redeemed-gift-badge__button--outgoing:active { background-color: #ffffff; } .dark-theme.mouse-mode .module-message__redeemed-gift-badge__button--outgoing:active { background-color: #ffffff; } .keyboard-mode .module-message__redeemed-gift-badge__button--outgoing:active { background-color: #ffffff; } .dark-theme.keyboard-mode .module-message__redeemed-gift-badge__button--outgoing:active { background-color: #ffffff; } .module-message__redeemed-gift-badge__button__text { display: flex; flex-direction: row; align-items: center; height: 36px; } .module-message__redeemed-gift-badge__icon-check { height: 19px; width: 19px; margin-inline-end: 5px; display: inline-block; } .module-message__redeemed-gift-badge__icon-check--incoming { -webkit-mask: url("../images/icons/v3/check/check-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #1b1b1b; } @media (forced-colors: active) { .module-message__redeemed-gift-badge__icon-check--incoming { background-color: WindowText; } } .dark-theme .module-message__redeemed-gift-badge__icon-check--incoming { -webkit-mask: url("../images/icons/v3/check/check-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #e9e9e9; } @media (forced-colors: active) { .dark-theme .module-message__redeemed-gift-badge__icon-check--incoming { background-color: WindowText; } } .module-message__redeemed-gift-badge__icon-check--outgoing { -webkit-mask: url("../images/icons/v3/check/check-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #1b1b1b; } @media (forced-colors: active) { .module-message__redeemed-gift-badge__icon-check--outgoing { background-color: WindowText; } } .dark-theme .module-message__redeemed-gift-badge__icon-check--outgoing { -webkit-mask: url("../images/icons/v3/check/check-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #1b1b1b; } @media (forced-colors: active) { .dark-theme .module-message__redeemed-gift-badge__icon-check--outgoing { background-color: WindowText; } } .module-message__typing-animation-container { height: 16px; overflow-y: clip; display: flex; flex-direction: row; align-items: center; } .module-message__reactions { position: relative; z-index: 2; height: 22px; display: flex; user-select: none; } .module-message__reactions--incoming { align-self: flex-end; padding-inline-end: 8px; margin-inline-start: 8px; } .module-message__reactions--outgoing { align-self: flex-start; padding-inline-start: 8px; margin-inline-end: 8px; } .module-message__reactions__reaction { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-message__reactions__reaction { border: 1px solid WindowText; } } .module-message__reactions__reaction { min-width: 28px; height: 22px; border: 1px solid; border-radius: 33px; display: flex; justify-content: center; align-items: center; } .module-message__reactions__reaction--with-count { min-width: 40px; padding-block: 0; padding-inline: 6px; } .module-message__reactions__reaction__count { font-size: 11px; line-height: 14px; letter-spacing: 0.06px; font-weight: 600; margin-inline-start: 4px; } .module-message__reactions__reaction__count--no-emoji { margin-inline-start: 0px; } .module-message__reactions__reaction__count { color: #5e5e5e; } .dark-theme .module-message__reactions__reaction__count { color: #b9b9b9; } .dark-theme .module-message__reactions__reaction__count--is-me { color: #dedede; } .module-message__reactions__reaction:focus { outline: none; } .keyboard-mode .module-message__reactions__reaction:focus { box-shadow: 0px 0px 0px 2px #2c6bed; } .module-message__reactions__reaction { border-color: #ffffff; background: #e9e9e9; } .dark-theme .module-message__reactions__reaction { border-color: #121212; background: #1b1b1b; } .dark-theme .module-message__reactions__reaction--is-me { background: #5e5e5e; } .module-message__reactions__reaction--is-me { background: #b9b9b9; } .module-message__tap-to-view__icon--ready { -webkit-mask: url("../images/icons/v3/view_once/view_once-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #1b1b1b; } @media (forced-colors: active) { .module-message__tap-to-view__icon--ready { background-color: WindowText; } } .dark-theme .module-message__tap-to-view__icon--ready { -webkit-mask: url("../images/icons/v3/view_once/view_once-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #e9e9e9; } @media (forced-colors: active) { .dark-theme .module-message__tap-to-view__icon--ready { background-color: WindowText; } } .module-message__tap-to-view__icon--outgoing { -webkit-mask: url("../images/icons/v3/view_once/view_once-dash-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: rgba(255, 255, 255, 0.8); } @media (forced-colors: active) { .module-message__tap-to-view__icon--outgoing { background-color: WindowText; } } .module-message__tap-to-view__icon--viewed { -webkit-mask: url("../images/icons/v3/view_once/view_once-viewed-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #1b1b1b; } @media (forced-colors: active) { .module-message__tap-to-view__icon--viewed { background-color: WindowText; } } .dark-theme .module-message__tap-to-view__icon--viewed { -webkit-mask: url("../images/icons/v3/view_once/view_once-viewed-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #e9e9e9; } @media (forced-colors: active) { .dark-theme .module-message__tap-to-view__icon--viewed { background-color: WindowText; } } .module-message__tap-to-view__icon--not-available { -webkit-mask: url("../images/icons/v3/view_once/view_once-slash-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #1b1b1b; } @media (forced-colors: active) { .module-message__tap-to-view__icon--not-available { background-color: WindowText; } } .dark-theme .module-message__tap-to-view__icon--not-available { -webkit-mask: url("../images/icons/v3/view_once/view_once-slash-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #e9e9e9; } @media (forced-colors: active) { .dark-theme .module-message__tap-to-view__icon--not-available { background-color: WindowText; } } .module-expire-timer { width: 12px; height: 12px; display: inline-block; margin-inline-start: 6px; margin-bottom: 2px; } .module-expire-timer--60 { -webkit-mask: url("../images/icons/v3/message_timer/messagetimer-60.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .module-expire-timer--60 { background-color: WindowText; } } .module-expire-timer--55 { -webkit-mask: url("../images/icons/v3/message_timer/messagetimer-55.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .module-expire-timer--55 { background-color: WindowText; } } .module-expire-timer--50 { -webkit-mask: url("../images/icons/v3/message_timer/messagetimer-50.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .module-expire-timer--50 { background-color: WindowText; } } .module-expire-timer--45 { -webkit-mask: url("../images/icons/v3/message_timer/messagetimer-45.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .module-expire-timer--45 { background-color: WindowText; } } .module-expire-timer--40 { -webkit-mask: url("../images/icons/v3/message_timer/messagetimer-40.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .module-expire-timer--40 { background-color: WindowText; } } .module-expire-timer--35 { -webkit-mask: url("../images/icons/v3/message_timer/messagetimer-35.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .module-expire-timer--35 { background-color: WindowText; } } .module-expire-timer--30 { -webkit-mask: url("../images/icons/v3/message_timer/messagetimer-30.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .module-expire-timer--30 { background-color: WindowText; } } .module-expire-timer--25 { -webkit-mask: url("../images/icons/v3/message_timer/messagetimer-25.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .module-expire-timer--25 { background-color: WindowText; } } .module-expire-timer--20 { -webkit-mask: url("../images/icons/v3/message_timer/messagetimer-20.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .module-expire-timer--20 { background-color: WindowText; } } .module-expire-timer--15 { -webkit-mask: url("../images/icons/v3/message_timer/messagetimer-15.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .module-expire-timer--15 { background-color: WindowText; } } .module-expire-timer--10 { -webkit-mask: url("../images/icons/v3/message_timer/messagetimer-10.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .module-expire-timer--10 { background-color: WindowText; } } .module-expire-timer--05 { -webkit-mask: url("../images/icons/v3/message_timer/messagetimer-05.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .module-expire-timer--05 { background-color: WindowText; } } .module-expire-timer--00 { -webkit-mask: url("../images/icons/v3/message_timer/messagetimer-00.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .module-expire-timer--00 { background-color: WindowText; } } .module-about__container { margin-inline: auto; max-width: 248px; text-align: center; } .module-about__text { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; } .module-about__text { color: #5e5e5e; } .dark-theme .module-about__text { color: #b9b9b9; } .module-about__text { max-width: 400px; -webkit-box-orient: vertical; -webkit-line-clamp: 2; display: -webkit-box; overflow: hidden; text-overflow: ellipsis; } .module-embedded-contact { width: 100%; padding-top: 4px; padding-bottom: 4px; display: flex; flex-direction: row; align-items: center; } .module-embedded-contact--with-content-above { padding-top: 4px; } .module-embedded-contact--with-content-below { padding-bottom: 4px; } .module-embedded-contact__avatar-container { height: 52px; width: 52px; border-radius: 26px; } .keyboard-mode .module-embedded-contact__avatar-container:focus { box-shadow: 0px 0px 0px 2px #2c6bed; } .keyboard-mode .module-embedded-contact--outgoing .module-embedded-contact__avatar-container:focus { box-shadow: 0px 0px 0px 2px #ffffff; } .module-embedded-contact__avatar-container .AttachmentStatusIcon__container { margin: 0; height: 52px; width: 52px; } .module-embedded-contact__avatar-container .AttachmentStatusIcon__circle-icon-container { margin: 0; } .module-embedded-contact__avatar-container { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-embedded-contact__avatar-container { border: 1px solid WindowText; } } .module-embedded-contact__avatar-container .AttachmentStatusIcon__circle-icon-container { position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); } .module-embedded-contact__text-container { flex-grow: 1; margin-inline-start: 12px; max-width: calc(100% - 64px); } .module-embedded-contact__contact-name { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; margin-top: 6px; max-width: 100%; white-space: nowrap; overflow-x: hidden; text-overflow: ellipsis; } .module-embedded-contact__contact-name { color: #ffffff; } .dark-theme .module-embedded-contact__contact-name { color: #e9e9e9; } .module-embedded-contact__contact-name--incoming { color: #ffffff; } .module-embedded-contact__contact-name--incoming { color: #1b1b1b; } .dark-theme .module-embedded-contact__contact-name--incoming { color: #b9b9b9; } .module-embedded-contact__contact-method { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; margin-top: 3px; max-width: 100%; white-space: nowrap; overflow-x: hidden; text-overflow: ellipsis; } .dark-theme .module-embedded-contact__contact-method { color: rgba(255, 255, 255, 0.8); } .module-embedded-contact__contact-method { color: rgba(255, 255, 255, 0.8); } .module-embedded-contact__contact-method--incoming { color: rgba(255, 255, 255, 0.8); } .module-embedded-contact__contact-method--incoming { color: #5e5e5e; } .module-contact-detail { text-align: center; max-width: 300px; margin-inline: auto; } .module-contact-detail__avatar { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-contact-detail__avatar { border: 1px solid WindowText; } } .module-contact-detail__avatar { cursor: default; position: relative; height: 80px; width: 80px; margin-bottom: 10px; border-radius: 40px; } .module-contact-detail__avatar { background-color: #e9e9e9; } .dark-theme .module-contact-detail__avatar { background-color: #2e2e2e; } .module-contact-detail__avatar--clickable { cursor: pointer; } .module-contact-detail__avatar .AttachmentStatusIcon__container { height: 80px; width: 80px; margin: 0; } .module-contact-detail__avatar .AttachmentStatusIcon__circle-icon-container { position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); } .module-contact-detail__contact-name { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; } .module-contact-detail__contact-method { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; margin-top: 10px; } .module-contact-detail__send-message { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-contact-detail__send-message { border: 1px solid WindowText; } } .module-contact-detail__send-message { border-radius: 4px; background-color: #2c6bed; display: inline-block; padding: 6px; margin-top: 20px; color: #ffffff; flex-direction: column; align-items: center; } .module-contact-detail__send-message__inner { display: flex; align-items: center; padding-inline-end: 5px; font-size: 13px; line-height: 18px; letter-spacing: -0.03px; font-weight: 600; } .module-contact-detail__send-message__bubble-icon { height: 17px; width: 18px; display: inline-block; margin-inline-end: 5px; } .module-contact-detail__send-message__bubble-icon { -webkit-mask: url("../images/icons/v3/chat/chat.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .module-contact-detail__send-message__bubble-icon { background-color: WindowText; } } .dark-theme .module-contact-detail__send-message__bubble-icon { -webkit-mask: url("../images/icons/v3/chat/chat.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .dark-theme .module-contact-detail__send-message__bubble-icon { background-color: WindowText; } } .module-contact-detail__additional-contact { text-align: start; margin-top: 15px; padding-top: 8px; } .module-contact-detail__additional-contact { border-top: 1px solid #e9e9e9; } .dark-theme .module-contact-detail__additional-contact { border-top: 1px solid #3b3b3b; } .module-contact-detail__additional-contact__type { font-size: 11px; line-height: 14px; letter-spacing: 0.06px; font-weight: 600; color: #848484; margin-bottom: 3px; } .module-inline-notification-wrapper { outline: none; } .keyboard-mode .module-inline-notification-wrapper:focus { background: rgba(44, 107, 237, 0.24); } .dark-theme.keyboard-mode .module-inline-notification-wrapper:focus { background: #4a4a4a; } .module-group-notification__contact { font-weight: bold; } .module-error-boundary-notification { text-align: center; cursor: pointer; } .keyboard-mode .module-error-boundary-notification:focus { outline: 0; } .keyboard-mode .module-error-boundary-notification:focus .module-error-boundary-notification__message { opacity: 1; } .module-error-boundary-notification__message { opacity: 0.8; } .module-error-boundary-notification { color: #5e5e5e; } .dark-theme .module-error-boundary-notification { color: #e9e9e9; } .module-error-boundary-notification__icon-container { margin-inline: auto; display: inline-flex; flex-direction: row; align-items: center; margin-bottom: 8px; } .module-error-boundary-notification__icon { height: 20px; width: 20px; display: inline-block; opacity: 0.6; } .module-error-boundary-notification__icon { -webkit-mask: url("../images/icons/v2/error-solid-24.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .module-error-boundary-notification__icon { background-color: WindowText; } } .dark-theme .module-error-boundary-notification__icon { -webkit-mask: url("../images/icons/v2/error-solid-24.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #e9e9e9; } @media (forced-colors: active) { .dark-theme .module-error-boundary-notification__icon { background-color: WindowText; } } .module-notification--with-click-handler { cursor: pointer; } .module-notification__icon { height: 24px; width: 24px; margin-inline: auto; } .module-in-contacts-icon__icon { display: inline-block; height: 14px; width: 14px; margin-bottom: 2px; vertical-align: middle; } .module-in-contacts-icon__icon { -webkit-mask: url("../images/icons/v3/person/person-circle-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .module-in-contacts-icon__icon { background-color: WindowText; } } .dark-theme .module-in-contacts-icon__icon { -webkit-mask: url("../images/icons/v3/person/person-circle-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .dark-theme .module-in-contacts-icon__icon { background-color: WindowText; } } .keyboard-mode .module-in-contacts-icon__icon:focus { -webkit-mask: url("../images/icons/v3/person/person-circle-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #2c6bed; } @media (forced-colors: active) { .keyboard-mode .module-in-contacts-icon__icon:focus { background-color: WindowText; } } .conversation-details-panel { max-width: 750px; margin-block: 0; margin-inline: auto; user-select: none; } .conversation .conversation-details-panel { overflow-y: auto; } button.ConversationDetails__action-button { margin-inline-start: 16px; } .module-message-request-actions { padding-block: 8px 12px; padding-inline: 16px; } .module-message-request-actions { background: #ffffff; } .dark-theme .module-message-request-actions { background: #121212; } .module-message-request-actions__message { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; text-align: center; margin-bottom: 12px; } .module-message-request-actions__message { color: #5e5e5e; } .dark-theme .module-message-request-actions__message { color: #b9b9b9; } .module-message-request-actions__message__name { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; font-weight: 600; } .module-message-request-actions__message__learn-more { text-decoration: none; } .module-message-request-actions__buttons { display: flex; flex-direction: row; justify-content: center; } .module-message-request-actions__buttons .module-Button { min-width: 80px; } .module-message-request-actions__buttons .module-Button:not(:last-of-type) { margin-inline-end: 8px; } .module-image { position: relative; display: inline-block; vertical-align: middle; } .module-image--hidden { visibility: hidden; } .module-image--tap-to-play, .module-image--not-downloaded { align-items: center; display: flex; justify-content: center; } .module-image--tap-to-play span, .module-image--not-downloaded span { align-items: center; display: flex; justify-content: center; border-radius: 50px; height: 50px; width: 50px; background-color: rgba(0, 0, 0, 0.7); } .module-image--tap-to-play:hover span, .module-image--not-downloaded:hover span { background-color: rgba(0, 0, 0, 0.8); } .module-image--tap-to-play:focus span, .module-image--not-downloaded:focus span { background-color: #3b3b3b; border: 4px solid #2c6bed; box-sizing: border-box; outline: none; } .module-image--not-downloaded span:after { content: ""; height: 24px; width: 24px; } .module-image--not-downloaded span:after { -webkit-mask: url("../images/icons/v3/arrow/arrow-down.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .module-image--not-downloaded span:after { background-color: WindowText; } } .module-image--tap-to-play span:after { display: flex; flex-direction: column; align-items: center; content: "GIF"; font-size: 14px; line-height: 20px; letter-spacing: -0.08px; color: #ffffff; } .module-image__progress-circle-wrapper { position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); } .module-image__spinner-container { position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); } .module-image__spinner-container .module-image-spinner__arc { background-color: rgba(0, 0, 0, 0.8); } .module-image__spinner-container .module-image-spinner__circle { background-color: #ffffff; } .dark-theme .module-image__spinner-container .module-image-spinner__arc { background-color: rgba(0, 0, 0, 0.8); } .module-image--with-background { background-color: #ffffff; } .dark-theme .module-image--with-background { background-color: #000000; } .module-image__caption-icon { position: absolute; top: 6px; inset-inline-start: 6px; } .module-image--cropped { overflow: hidden; } .module-image__border-overlay { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-image__border-overlay { border: 1px solid WindowText; } } .module-image__border-overlay { width: 100%; cursor: inherit; pointer-events: none; position: absolute; top: 0; bottom: 0; inset-inline: 0; z-index: 2; } .module-image__border-overlay--with-click-handler { cursor: pointer; pointer-events: all; } .module-image__border-overlay--with-border { box-shadow: inset 0px 0px 0px 1px rgba(0, 0, 0, 0.085); } .dark-theme .module-image__border-overlay--with-border { box-shadow: inset 0px 0px 0px 1px rgba(255, 255, 255, 0.2); } .module-image--gif video { cursor: pointer; object-fit: cover; } .keyboard-mode button.module-image__border-overlay:focus { box-shadow: inset 0px 0px 0px 2px #2c6bed; } .module-image__border-overlay--dark { background-color: rgba(0, 0, 0, 0.2); } .module-image__loading-placeholder { display: inline-flex; flex-direction: row; align-items: center; } .module-image__loading-placeholder { background-color: rgba(0, 0, 0, 0.2); } .dark-theme .module-image__loading-placeholder { background-color: rgba(255, 255, 255, 0.2); } .module-image__image { object-fit: cover; cursor: pointer; } .module-image__bottom-overlay { height: 48px; background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0) 9%, rgba(0, 0, 0, 0.02) 17%, rgba(0, 0, 0, 0.05) 24%, rgba(0, 0, 0, 0.08) 31%, rgba(0, 0, 0, 0.12) 37%, rgba(0, 0, 0, 0.16) 44%, rgba(0, 0, 0, 0.2) 50%, rgba(0, 0, 0, 0.24) 56%, rgba(0, 0, 0, 0.28) 63%, rgba(0, 0, 0, 0.32) 69%, rgba(0, 0, 0, 0.35) 76%, rgba(0, 0, 0, 0.38) 83%, rgba(0, 0, 0, 0.4) 91%, rgba(0, 0, 0, 0.4)); position: absolute; bottom: 0; z-index: 1; inset-inline: 0; pointer-events: none; } .module-image__overlay-circle { position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); } .module-image__overlay-circle { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-image__overlay-circle { border: 1px solid WindowText; } } .module-image__overlay-circle { width: 50px; height: 50px; background-color: rgba(0, 0, 0, 0.8); border-radius: 25px; } .module-image__overlay-circle--undownloadable { background-color: rgba(0, 0, 0, 0.4); } .module-image__play-icon { position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); height: 24px; width: 24px; } .module-image__play-icon { -webkit-mask: url("../images/icons/v3/play/play-fill.svg") no-repeat center; -webkit-mask-size: 100%; background-color: var(--color-label-primary-on-color); } @media (forced-colors: active) { .module-image__play-icon { background-color: WindowText; } } .module-image__stop-icon { position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); height: 24px; width: 24px; } .module-image__stop-icon { -webkit-mask: url("../images/icons/v3/stop/stop-fill.svg") no-repeat center; -webkit-mask-size: 100%; background-color: var(--color-label-primary-on-color); } @media (forced-colors: active) { .module-image__stop-icon { background-color: WindowText; } } .module-image__download-icon { position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); height: 24px; width: 24px; } .module-image__download-icon { -webkit-mask: url("../images/icons/v3/arrow/arrow-down.svg") no-repeat center; -webkit-mask-size: 100%; background-color: var(--color-label-primary-on-color); } @media (forced-colors: active) { .module-image__download-icon { background-color: WindowText; } } .module-image__undownloadable-icon { position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); height: 24px; width: 24px; } .module-image__undownloadable-icon { -webkit-mask: url("../images/icons/v3/photo/photo-slash-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: var(--color-label-primary-on-color); } @media (forced-colors: active) { .module-image__undownloadable-icon { background-color: WindowText; } } .module-image__text-container { position: absolute; top: 0; inset-inline: 0; bottom: 0; z-index: 3; pointer-events: none; color: #ffffff; font-size: 14px; line-height: 20px; letter-spacing: -0.08px; text-align: center; } .module-image__close-button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-image__close-button { border: 1px solid WindowText; } } .module-image__close-button { position: absolute; top: 4px; inset-inline-end: 4px; width: 16px; height: 16px; z-index: 2; } .module-image__close-button::before { content: ""; display: block; width: 16px; height: 16px; } .module-image__close-button::before { -webkit-mask: url("../images/icons/v3/x/x-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .module-image__close-button::before { background-color: WindowText; } } .module-image__close-button { background-image: url("../images/icons/v3/x/x-compact.svg"); filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.6)); } .keyboard-mode .module-image__close-button:focus { outline: 2px solid #2c6bed; } .module-image-grid { position: relative; display: inline-flex; flex-direction: row; align-items: center; gap: 1px; } .module-image-grid__download-pill { position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); } .module-image-grid__download-pill { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-image-grid__download-pill { border: 1px solid WindowText; } } .module-image-grid__download-pill { background-color: rgba(0, 0, 0, 0.8); color: #ffffff; backdrop-filter: blur(10px); height: 44px; border-radius: 44px; display: inline-flex; flex-direction: row; align-items: center; } .module-image-grid__download_pill__icon-wrapper { position: relative; width: 44px; height: 44px; margin-inline-end: -6px; } .module-image-grid__download_pill__download-icon { position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); height: 24px; width: 24px; } .module-image-grid__download_pill__download-icon { -webkit-mask: url("../images/icons/v3/arrow/arrow-down.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .module-image-grid__download_pill__download-icon { background-color: WindowText; } } .module-image-grid__download_pill__text-wrapper { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; margin-inline-end: 14px; } .module-image-grid--one-image { margin-bottom: -5px; } .module-image-grid--with-sticker { padding: 8px; } .module-image-grid__column { display: inline-flex; flex-direction: column; align-items: center; gap: 1px; } .module-image-grid__row { display: inline-flex; flex-direction: row; align-items: center; flex-grow: 1; gap: 1px; } .module-typing-animation { display: inline-flex; flex-direction: row; align-items: center; height: 8px; width: 38px; padding-inline: 1px; } .module-message__typing-animation-container .module-typing-animation { width: 30px; } .module-typing-animation__dot { border-radius: 50%; height: 6px; width: 6px; opacity: 0.4; will-change: transform, opacity; } .dark-theme .module-typing-animation__dot { background-color: #ffffff; } .module-typing-animation__dot { background-color: #5e5e5e; } .page-is-visible .module-typing-animation__dot { animation-name: typing-animation; animation-duration: 1600ms; animation-timing-function: ease; animation-iteration-count: infinite; } .page-is-visible .module-left-pane .module-typing-animation__dot { animation-name: typing-animation-bare; } .module-typing-animation__dot--light { background-color: #ffffff; } .module-typing-animation__dot--light { background-color: #5e5e5e; } @keyframes typing-animation { 0% { opacity: 0.4; } 20% { transform: scale(1.3); opacity: 1; } 40% { opacity: 0.4; } } @keyframes typing-animation-bare { 0% { opacity: 0.4; } 20% { opacity: 1; } 40% { opacity: 0.4; } } .module-typing-animation__dot--second { animation-delay: 160ms; } .module-typing-animation__dot--third { animation-delay: 320ms; } .module-typing-animation__spacer { flex-grow: 1; } .module-attachments__header { height: 24px; position: relative; } .module-attachments__edit-icon { align-items: center; background: rgba(0, 0, 0, 0.6); border-radius: 100%; display: flex; height: 36px; justify-content: center; inset-inline-start: 50%; margin-inline-start: -20px; margin-top: -18px; position: absolute; top: 50%; visibility: hidden; width: 36px; } .module-attachments__edit-icon::after { -webkit-mask: url("../images/icons/v3/edit/edit-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .module-attachments__edit-icon::after { background-color: WindowText; } } .module-attachments__edit-icon::after { content: ""; height: 20px; width: 20px; } .module-attachments--editable { display: inline-block; position: relative; } .module-attachments--editable:hover .module-attachments__edit-icon { visibility: visible; } .module-attachments__close-button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-attachments__close-button { border: 1px solid WindowText; } } .module-attachments__close-button { position: absolute; top: 8px; inset-inline-end: 16px; width: 20px; height: 20px; z-index: 2; } .module-attachments__close-button { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .module-attachments__close-button { background-color: WindowText; } } .dark-theme .module-attachments__close-button { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .dark-theme .module-attachments__close-button { background-color: WindowText; } } .keyboard-mode .module-attachments__close-button:focus { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #2c6bed; } @media (forced-colors: active) { .keyboard-mode .module-attachments__close-button:focus { background-color: WindowText; } } .module-attachments__rail { margin-top: 12px; margin-inline-start: 12px; padding-inline-end: 12px; overflow-x: scroll; max-height: 142px; white-space: nowrap; overflow-y: hidden; margin-bottom: 6px; } .module-staged-attachment { margin-inline-end: 8px; } .module-staged-attachment.module-image::before { background: linear-gradient(180deg, rgba(0, 0, 0, 0.3) 0%, transparent 100%); content: ""; display: block; height: 40px; opacity: 0; position: absolute; transition: opacity 0.2s ease-out; width: 100%; } .module-staged-attachment.module-image:hover::before { opacity: 1; } .module-staged-generic-attachment { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 5px; height: 120px; width: 120px; position: relative; border-radius: 4px; padding: 7px; vertical-align: middle; white-space: nowrap; } .module-staged-generic-attachment { box-shadow: inset 0px 0px 0px 1px rgba(0, 0, 0, 0.2); background-color: #e9e9e9; } .dark-theme .module-staged-generic-attachment { box-shadow: inset 0px 0px 0px 1px #848484; background-color: #3b3b3b; color: #f6f6f6; } .module-staged-generic-attachment__close-button { position: absolute; inset-inline-end: 5px; top: 0; } .module-staged-generic-attachment__close-button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-staged-generic-attachment__close-button { border: 1px solid WindowText; } } .module-staged-generic-attachment__close-button { position: absolute; top: 4px; inset-inline-end: 4px; width: 16px; height: 16px; z-index: 2; } .module-staged-generic-attachment__close-button { -webkit-mask: url("../images/icons/v3/x/x-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .module-staged-generic-attachment__close-button { background-color: WindowText; } } .dark-theme .module-staged-generic-attachment__close-button { -webkit-mask: url("../images/icons/v3/x/x-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #848484; } @media (forced-colors: active) { .dark-theme .module-staged-generic-attachment__close-button { background-color: WindowText; } } .module-staged-generic-attachment__filename { font-size: 11px; line-height: 14px; letter-spacing: 0.06px; max-width: 100%; text-align: center; overflow: hidden; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; text-overflow: ellipsis; } .module-staged-placeholder-attachment { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-staged-placeholder-attachment { border: 1px solid WindowText; } } .module-staged-placeholder-attachment { margin: 1px; border-radius: 4px; height: 120px; width: 120px; display: inline-block; vertical-align: middle; position: relative; } .module-staged-placeholder-attachment { border: 1px solid #b9b9b9; } .module-staged-placeholder-attachment:hover { background: #e9e9e9; } .keyboard-mode .module-staged-placeholder-attachment:focus { box-shadow: inset 0 0 0 2px #2c6bed; } .dark-theme .module-staged-placeholder-attachment { border: 1px solid #5e5e5e; } .dark-theme .module-staged-placeholder-attachment:hover { background: #3b3b3b; } .dark-theme.keyboard-mode .module-staged-placeholder-attachment:focus { box-shadow: inset 0 0 0 2px #2c6bed; } .module-staged-placeholder-attachment__plus-icon { position: absolute; top: 50%; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 50%; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ transform: translate(-50%, -50%); height: 28px; width: 28px; } .module-staged-placeholder-attachment__plus-icon { -webkit-mask: url("../images/icons/v3/plus/plus-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #848484; } @media (forced-colors: active) { .module-staged-placeholder-attachment__plus-icon { background-color: WindowText; } } .dark-theme .module-staged-placeholder-attachment__plus-icon { -webkit-mask: url("../images/icons/v3/plus/plus-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .dark-theme .module-staged-placeholder-attachment__plus-icon { background-color: WindowText; } } .module-payment-notification__container { display: block; } .module-payment-notification__label { margin-block: 0 7px; margin-inline: 0; font-size: 12px; line-height: 16px; letter-spacing: 0; } .module-payment-notification__label { color: #5e5e5e; } .dark-theme .module-payment-notification__label { color: #b9b9b9; } .module-payment-notification__check_device_box { display: flex; gap: 9px; align-items: center; font-size: 13px; line-height: 18px; letter-spacing: -0.03px; padding-block: 22px; padding-inline: 7px; padding-inline-start: 12px; border-radius: 18px; margin-block: 0; margin-inline: -4px; } .module-payment-notification__check_device_box { background: rgba(255, 255, 255, 0.6); color: #1b1b1b; } .dark-theme .module-payment-notification__check_device_box { background: rgba(255, 255, 255, 0.2); color: #ffffff; } .module-payment-notification__check_device_box::before { content: ""; display: block; flex-shrink: 0; width: 16px; height: 16px; } .module-payment-notification__check_device_box::before { -webkit-mask: url("../images/icons/v3/info/info.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentcolor; } @media (forced-colors: active) { .module-payment-notification__check_device_box::before { background-color: WindowText; } } .module-payment-notification__note { margin-block: 9px 0; margin-inline: 0; font-size: 14px; line-height: 20px; letter-spacing: -0.08px; } .module-payment-notification--outgoing .module-payment-notification__label { color: rgba(255, 255, 255, 0.8); } .dark-theme .module-payment-notification--outgoing .module-payment-notification__label { color: rgba(255, 255, 255, 0.8); } .module-payment-notification--outgoing .module-payment-notification__check_device_box { background: rgba(255, 255, 255, 0.2); color: #ffffff; } .module-spinner__container { margin-inline: auto; position: relative; height: 56px; width: 56px; } .module-spinner__circle { position: absolute; top: 0; inset-inline-start: 0; z-index: 2; height: 100%; width: 100%; } .module-spinner__circle { -webkit-mask: url("../images/spinner-track-56.svg") no-repeat center; -webkit-mask-size: 100%; background-color: rgba(255, 255, 255, 0.4); } @media (forced-colors: active) { .module-spinner__circle { background-color: WindowText; } } .module-spinner__arc { position: absolute; top: 0; inset-inline-start: 0; z-index: 3; height: 100%; width: 100%; animation: rotate 1000ms linear infinite; } .module-spinner__arc { -webkit-mask: url("../images/spinner-56.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .module-spinner__arc { background-color: WindowText; } } .dark-theme .module-spinner__arc { -webkit-mask: url("../images/spinner-56.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #e9e9e9; } @media (forced-colors: active) { .dark-theme .module-spinner__arc { background-color: WindowText; } } .module-spinner__container--small { height: 24px; width: 24px; } .module-spinner__circle--small { -webkit-mask: url("../images/spinner-track-24.svg") no-repeat center; -webkit-mask-size: 100%; } .dark-theme .module-spinner__circle--small { -webkit-mask: url("../images/spinner-track-24.svg") no-repeat center; -webkit-mask-size: 100%; } .module-spinner__arc--small { -webkit-mask: url("../images/spinner-24.svg") no-repeat center; -webkit-mask-size: 100%; } .dark-theme .module-spinner__arc--small { -webkit-mask: url("../images/spinner-24.svg") no-repeat center; -webkit-mask-size: 100%; } .module-spinner__circle--incoming { background-color: rgba(255, 255, 255, 0.4); } .module-spinner__arc--incoming { background-color: #5e5e5e; } .dark-theme .module-spinner__arc--incoming { background-color: #f6f6f6; } .module-spinner__circle--outgoing { background-color: rgba(255, 255, 255, 0.4); } .dark-theme .module-spinner__circle--outgoing { background-color: rgba(255, 255, 255, 0.4); } .module-spinner__arc--outgoing { background-color: #ffffff; } .dark-theme .module-spinner__arc--outgoing { background-color: #e9e9e9; } .module-spinner__circle--on-avatar { background-color: rgba(255, 255, 255, 0.4); } .module-spinner__circle--on-background { background-color: #e9e9e9; } .dark-theme .module-spinner__circle--on-background { background-color: #3b3b3b; } .module-spinner__arc--on-background { background-color: #5e5e5e; } .dark-theme .module-spinner__arc--on-background { background-color: #b9b9b9; } .module-spinner__circle--on-primary-button { background-color: rgba(255, 255, 255, 0.4); } .module-spinner__circle--on-progress-dialog { background-color: #ffffff; } .dark-theme .module-spinner__circle--on-progress-dialog { background-color: #2e2e2e; } .module-spinner__arc--on-progress-dialog { background-color: #2c6bed; } .module-spinner__arc--on-avatar { background-color: #ffffff; } .module-spinner__arc--on-primary-button { background-color: #ffffff; } .module-reaction-viewer { width: 320px; height: 320px; border-radius: 8px; display: flex; flex-direction: column; } .module-reaction-viewer { box-shadow: 0px 8px 20px rgba(0, 0, 0, 0.3), 0px 0px 8px rgba(0, 0, 0, 0.05); } @media (forced-colors: active) { .module-reaction-viewer { border: 1px solid WindowText; } } .module-reaction-viewer { background: #ffffff; } .dark-theme .module-reaction-viewer { background: #3b3b3b; } .module-reaction-viewer__header { width: 100%; min-height: 44px; padding-block: 0px; padding-inline: 8px; display: flex; flex-direction: row; justify-content: flex-start; align-items: center; overflow-x: auto; } .module-reaction-viewer__header__button { min-height: 28px; border: none; border-radius: 18px; padding-block: 0px; padding-inline: 8px; display: flex; justify-content: center; align-items: center; flex-basis: 45px; flex-shrink: 0; background: none; } .module-reaction-viewer__header__button:not(:first-of-type) { margin-inline-start: 4px; } .module-reaction-viewer__header__button:focus { outline: none; } .keyboard-mode .module-reaction-viewer__header__button:focus { box-shadow: 0px 0px 0px 2px #2c6bed; } .module-reaction-viewer__header__button--selected { background: #e9e9e9; } .dark-theme .module-reaction-viewer__header__button--selected { background: #5e5e5e; } .module-reaction-viewer__header__button__count, .module-reaction-viewer__header__button__all { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; font-weight: 600; white-space: nowrap; } .module-reaction-viewer__header__button__count, .module-reaction-viewer__header__button__all { color: #1b1b1b; } .dark-theme .module-reaction-viewer__header__button__count, .dark-theme .module-reaction-viewer__header__button__all { color: #e9e9e9; } .module-reaction-viewer__header__button__count { margin-inline-start: 4px; } .module-reaction-viewer__body { flex-grow: 1; padding-block: 0; padding-inline: 16px; overflow: auto; } .module-reaction-viewer__body__row { margin-top: 12px; min-height: 32px; display: flex; flex-direction: row; justify-content: flex-start; align-items: center; } .module-reaction-viewer__body__row:last-of-type { margin-bottom: 12px; } .module-reaction-viewer__body__row__avatar { min-width: 32px; flex-shrink: 1; } .module-reaction-viewer__body__row__name { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; flex-grow: 1; margin-inline-start: 8px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .module-reaction-viewer__body__row__name { color: #1b1b1b; } .dark-theme .module-reaction-viewer__body__row__name { color: #e9e9e9; } .module-reaction-viewer__body__row__emoji { width: 18px; flex-shrink: 1; } .module-calling__modal-container { position: fixed; top: 0; inset-inline-start: 0; z-index: 100; } .module-calling__container { align-items: center; background-color: #1b1b1b; display: flex; flex-direction: column; height: 100vh; justify-content: center; position: fixed; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 0; top: 0; width: 100%; z-index: 101; } .module-calling__background { position: absolute; inset-inline-start: 0; inset-inline-end: 0; top: 0; bottom: 0; display: flex; align-items: center; flex-direction: column; justify-content: center; overflow: hidden; } .module-calling__background--darken { position: absolute; height: 100%; width: 100%; background-color: rgba(94, 94, 94, 0.6); } .module-calling__background--blur { background-repeat: no-repeat; background-size: cover; background-position: center; filter: blur(25px); height: 100%; position: absolute; width: 100%; transform: scale(1.2, 1.2); } .module-calling__camera-is-off { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; text-shadow: 0 0 4px rgba(0, 0, 0, 0.4); align-items: center; color: #ffffff; display: flex; flex-direction: column; flex-grow: 1; margin-block-start: 15px; margin-block-end: 15px; justify-content: center; text-align: center; transition: opacity 100ms ease-out; user-select: none; z-index: 1; } .module-calling__camera-is-off::before { content: ""; display: block; background-color: #ffffff; -webkit-mask-repeat: no-repeat; -webkit-mask-position: center; -webkit-mask-size: 100%; -webkit-mask-image: url("../images/icons/v3/video/video-slash-light.svg"); height: 24px; width: 24px; margin-block-end: 12px; } .module-calling__camera-is-off-spacer { flex-basis: 120px; } .module-calling__spacer { display: flex; flex-grow: 0; flex-shrink: 1; } @keyframes module-ongoing-call__controls--fade-in { from { opacity: 0; } to { opacity: 1; } } @keyframes module-ongoing-call__controls--fade-out { from { opacity: 1; } to { opacity: 0; } } .module-ongoing-call__container--hide-controls .module-ongoing-call__prev-page, .module-ongoing-call__container--hide-controls .module-ongoing-call__next-page { animation-name: module-ongoing-call__controls--fade-out; animation-duration: 1200ms; animation-timing-function: cubic-bezier(0.19, 1, 0.22, 1); animation-fill-mode: forwards; pointer-events: none; } .module-ongoing-call__remote-video-enabled { height: 100%; width: 100%; position: relative; } .module-ongoing-call__remote-video-enabled--reconnecting { filter: blur(15px); } .module-ongoing-call__remote-video-disabled { background-color: #121212; height: 100vh; width: 100%; display: flex; position: relative; align-items: center; justify-content: center; } .module-ongoing-call__container--direct:not(.module-ongoing-call__container--call-not-started) .module-ongoing-call__footer { position: absolute; } .module-ongoing-call__next-page, .module-ongoing-call__prev-page { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-ongoing-call__next-page, .module-ongoing-call__prev-page { border: 1px solid WindowText; } } .module-ongoing-call__next-page, .module-ongoing-call__prev-page { position: absolute; top: 50%; transform: translateY(-50%); height: 32px; width: 32px; display: flex; justify-content: center; align-items: center; border-radius: 50%; background-color: #343434; z-index: 3; } .module-ongoing-call__next-page--arrow, .module-ongoing-call__prev-page--arrow { width: 20px; height: 20px; } .module-ongoing-call__next-page { inset-inline-end: 4px; } .module-ongoing-call__next-page--arrow { -webkit-mask: url("../images/icons/v3/chevron/chevron-right.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .module-ongoing-call__next-page--arrow { background-color: WindowText; } } :dir(rtl) .module-ongoing-call__next-page--arrow { -webkit-mask: url("../images/icons/v3/chevron/chevron-left.svg") no-repeat center; } .module-ongoing-call__prev-page { inset-inline-start: 4px; } .module-ongoing-call__prev-page--arrow { -webkit-mask: url("../images/icons/v3/chevron/chevron-left.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .module-ongoing-call__prev-page--arrow { background-color: WindowText; } } :dir(rtl) .module-ongoing-call__prev-page--arrow { -webkit-mask: url("../images/icons/v3/chevron/chevron-right.svg") no-repeat center; } .module-ongoing-call__direct-call-ringing-spacer { flex: 1; z-index: -1; } .module-ongoing-call__direct-call-speaking-indicator { position: absolute; inset-inline-end: 16px; bottom: 112px; transition: bottom 0.3s cubic-bezier(0.17, 0.17, 0, 1); } .module-ongoing-call__direct-call-speaking-indicator--self-view-expanded { bottom: 330px; } .module-ongoing-call__direct-call-speaking-indicator--expanded-no-controls { bottom: 232px; } .module-ongoing-call__participants { display: flex; flex: 1 1 0; width: 100%; margin-block-start: 24px; z-index: 2; -webkit-app-region: no-drag; } .module-ongoing-call__participants__grid--wrapper { margin-block-start: 26px; margin-block-end: 16px; margin-inline: 16px; display: flex; width: 100%; } .module-ongoing-call__participants__grid { flex-grow: 1; position: relative; } .module-ongoing-call__participants__grid .module-ongoing-call__group-call-remote-participant--hand-raised .module-ongoing-call__group-call-remote-participant__info__contact-name { display: block; visibility: visible; } .module-ongoing-call__participants__grid .module-ongoing-call__group-call-remote-participant { container-type: size; position: relative; } @container (min-width: 180px) or (min-height: 180px) { .module-ongoing-call__participants__grid .module-ongoing-call__group-call-remote-participant .module-ongoing-call__group-call-remote-participant__footer { padding-block: 0 14px; padding-inline: 16px; } .module-ongoing-call__participants__grid .module-ongoing-call__group-call-remote-participant .module-ongoing-call__group-call-remote-participant__error { display: block; } } .module-ongoing-call__participants__grid .module-ongoing-call__group-call-remote-participant--hand-raised .module-ongoing-call__group-call-remote-participant__footer { padding-block: 0 8px; padding-inline: 8px; } .module-ongoing-call__participants__overflow { flex: 0 0 auto; position: relative; margin-block-start: calc(60px + var(--title-bar-drag-area-height)); margin-inline-end: 16px; } .module-ongoing-call__participants__overflow__inner { position: absolute; bottom: 0; inset-inline-start: 0; width: 100%; max-height: 100%; overflow-y: scroll; scrollbar-width: none; } .module-ongoing-call__participants__overflow .module-ongoing-call__group-call-remote-participant { width: 100%; margin-bottom: 1rem; } .module-ongoing-call__participants__overflow .module-ongoing-call__group-call-remote-participant__footer { height: 40px; padding-block: 0 8px; padding-inline: 10px; } .module-ongoing-call__participants__overflow .module-ongoing-call__group-call-remote-participant--hand-raised .module-ongoing-call__group-call-remote-participant__footer { padding-block: 0 6px; padding-inline: 6px; } .module-ongoing-call__participants__overflow__scroll-marker { scroll-behavior: smooth; } @media (prefers-reduced-motion) { .module-ongoing-call__participants__overflow__scroll-marker { scroll-behavior: auto; } } .module-ongoing-call__participants__overflow__scroll-marker { display: flex; justify-content: center; inset-inline-start: 0; opacity: 1; position: absolute; transition: opacity 200ms ease-out; width: 100%; z-index: 3; } .module-ongoing-call__participants__overflow__scroll-marker--hidden { opacity: 0; } .module-ongoing-call__participants__overflow__scroll-marker__button::before { -webkit-mask: url("../images/icons/v3/chevron/chevron-down.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .module-ongoing-call__participants__overflow__scroll-marker__button::before { background-color: WindowText; } } .module-ongoing-call__participants__overflow__scroll-marker__button::before { content: ""; display: block; height: 100%; width: 100%; } .module-ongoing-call__participants__overflow__scroll-marker__button { background: #343434; border-radius: 100%; border: 0; height: 24px; padding-inline: 4px; margin-inline: 0; opacity: 0; outline: none; transition: opacity 200ms ease-out; width: 24px; } .module-ongoing-call__participants__overflow__scroll-marker--top { top: 0; background: linear-gradient(#1b1b1b, transparent 20px, transparent); } .module-ongoing-call__participants__overflow__scroll-marker--top .module-ongoing-call__participants__overflow__scroll-marker__button { margin-block-start: 16px; transform: rotate(180deg); } .module-ongoing-call__participants__overflow__scroll-marker--bottom { bottom: 0; background: linear-gradient(to top, #1b1b1b, transparent 20px, transparent); } .module-ongoing-call__participants__overflow__scroll-marker--bottom .module-ongoing-call__participants__overflow__scroll-marker__button { margin-block-end: 16px; } .module-ongoing-call__participants__overflow:hover .module-ongoing-call__participants__overflow__scroll-marker__button { opacity: 1; } .module-ongoing-call__group-call--pagination-tile { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-ongoing-call__group-call--pagination-tile { border: 1px solid WindowText; } } .module-ongoing-call__group-call--pagination-tile { position: absolute; border-radius: 10px; background-color: #343434; display: flex; justify-content: center; align-items: center; font-size: 14px; line-height: 20px; letter-spacing: -0.08px; color: #c6c6c6; } .module-ongoing-call__group-call--pagination-tile--next-arrow { -webkit-mask: url("../images/icons/v3/chevron/chevron-right.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #c6c6c6; } @media (forced-colors: active) { .module-ongoing-call__group-call--pagination-tile--next-arrow { background-color: WindowText; } } :dir(rtl) .module-ongoing-call__group-call--pagination-tile--next-arrow { -webkit-mask: url("../images/icons/v3/chevron/chevron-left.svg") no-repeat center; } .module-ongoing-call__group-call--pagination-tile--next-arrow { height: 16px; width: 16px; } .module-ongoing-call__group-call--pagination-tile--prev-arrow { -webkit-mask: url("../images/icons/v3/chevron/chevron-left.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #c6c6c6; } @media (forced-colors: active) { .module-ongoing-call__group-call--pagination-tile--prev-arrow { background-color: WindowText; } } :dir(rtl) .module-ongoing-call__group-call--pagination-tile--prev-arrow { -webkit-mask: url("../images/icons/v3/chevron/chevron-right.svg") no-repeat center; } .module-ongoing-call__group-call--pagination-tile--prev-arrow { height: 16px; width: 16px; } .module-ongoing-call__group-call-remote-participant { display: flex; justify-content: center; position: relative; line-height: 0; overflow: hidden; border-radius: 10px; transition: top 200ms linear, inset-inline-start 200ms linear, transform 200ms linear, width 200ms linear, height 200ms linear; } @media (prefers-reduced-motion) { .module-ongoing-call__group-call-remote-participant { transition: none; } } .module-ongoing-call__group-call-remote-participant:after { content: ""; position: absolute; z-index: 3; width: 100%; height: 100%; border: 0 solid transparent; border-radius: 10px; transition-property: border-width, border-color; transition-duration: 300ms; transition-delay: 1000ms; transition-timing-function: ease-in-out; pointer-events: none; } .module-ongoing-call__group-call-remote-participant--speaking:after { border-width: 3px; border-color: #ffffff; transition-duration: 0ms; transition-delay: 0ms; } .module-ongoing-call__group-call-remote-participant__remote-video { background-color: #3b3b3b; } .module-ongoing-call__group-call-remote-participant__remote-video--reconnecting { filter: blur(15px); } .module-ongoing-call__group-call-remote-participant-background.module-calling__background--no-avatar { background-color: #343434; } .module-ongoing-call__group-call-remote-participant-background .module-calling__background--blur { pointer-events: none; } .module-ongoing-call__group-call-remote-participant__error { display: none; margin-block-end: 16px; margin-inline: 8px; font-size: 12px; line-height: 16px; color: #ffffff; text-align: center; z-index: 1; } .module-ongoing-call__group-call-remote-participant__more-info { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-ongoing-call__group-call-remote-participant__more-info { border: 1px solid WindowText; } } .module-ongoing-call__group-call-remote-participant__more-info { padding-block: 3px; padding-inline: 10px; border-radius: 16px; background-color: rgba(0, 0, 0, 0.3); color: #ffffff; font-size: 12px; line-height: 16px; text-overflow: ellipsis; white-space: nowrap; z-index: 2; } .module-ongoing-call__group-call-remote-participant__more-info-modal-title { -webkit-box-orient: vertical; -webkit-line-clamp: 2; display: -webkit-box; overflow: hidden; text-overflow: ellipsis; } .module-ongoing-call__group-call-remote-participant__more-info--icon { width: 20px; height: 20px; } .module-ongoing-call__group-call-remote-participant__more-info--icon-blocked { -webkit-mask: url("../images/icons/v3/block/block.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .module-ongoing-call__group-call-remote-participant__more-info--icon-blocked { background-color: WindowText; } } .module-ongoing-call__group-call-remote-participant__more-info--icon-missing-media-keys { -webkit-mask: url("../images/icons/v3/error/error-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .module-ongoing-call__group-call-remote-participant__more-info--icon-missing-media-keys { background-color: WindowText; } } .module-ongoing-call__group-call-remote-participant__error-icon { width: 20px; height: 20px; margin-block-end: 12px; } .module-ongoing-call__group-call-remote-participant__error-icon--blocked { -webkit-mask: url("../images/icons/v3/block/block.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .module-ongoing-call__group-call-remote-participant__error-icon--blocked { background-color: WindowText; } } .module-ongoing-call__group-call-remote-participant__error-icon--missing-media-keys { -webkit-mask: url("../images/icons/v3/error/error-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .module-ongoing-call__group-call-remote-participant__error-icon--missing-media-keys { background-color: WindowText; } } .module-ongoing-call__group-call-remote-participant__footer { display: flex; position: absolute; bottom: 0; height: 60px; padding-block: 0 10px; padding-inline: 12px; user-select: none; width: 100%; z-index: 2; } .module-ongoing-call__group-call-remote-participant__info { display: flex; align-items: center; align-self: flex-end; justify-content: space-between; max-width: 100%; } .module-ongoing-call__group-call-remote-participant__info__contact-name { flex-grow: 1; font-size: 13px; line-height: 18px; color: #ffffff; overflow: hidden; text-overflow: ellipsis; visibility: hidden; direction: inherit; white-space: nowrap; } .module-ongoing-call__group-call-remote-participant__info--clickable { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-ongoing-call__group-call-remote-participant__info--clickable { border: 1px solid WindowText; } } .module-ongoing-call__group-call-remote-participant--hand-raised .module-ongoing-call__group-call-remote-participant__footer { background: transparent; } .module-ongoing-call__group-call-remote-participant--hand-raised .module-ongoing-call__group-call-remote-participant__info { background: #ffffff; border-radius: 40px; } .module-ongoing-call__group-call-remote-participant--hand-raised .module-ongoing-call__group-call-remote-participant__info__contact-name { display: none; color: #000000; margin-inline-end: 12px; } .module-ongoing-call__group-call-remote-participant--is-on-top { z-index: 3; } .module-ongoing-call__group-call-remote-participant:hover .module-ongoing-call__group-call-remote-participant__info__contact-name { display: block; visibility: visible; } .module-ongoing-call__group-call-remote-participant:hover:not(.module-ongoing-call__group-call-remote-participant--hand-raised) .module-ongoing-call__group-call-remote-participant__footer { background: linear-gradient(180deg, transparent, rgba(0, 0, 0, 0.6) 100%); } .module-ongoing-call__local-preview-container { display: contents; } .module-ongoing-call__local-preview-fullsize { position: absolute; top: 0; display: flex; align-items: center; justify-content: center; width: 100%; height: 100%; z-index: -1; } .module-ongoing-call__local-preview-fullsize video { max-height: calc(100% - 24px); height: auto; transform: rotateY(180deg); width: calc(100% - 24px); border-radius: 8px; } .module-ongoing-call__local-preview-fullsize--presenting video { transform: none; } .module-ongoing-call__local-preview { z-index: 104; border-radius: 12px; position: absolute; display: flex; height: 80px; width: 106.67px; inset-inline-end: 16px; bottom: 16px; transition: all 0.3s cubic-bezier(0.17, 0.17, 0, 1); overflow: hidden; cursor: pointer; } .module-ongoing-call__local-preview--active { box-shadow: 0px 4px 14px 0px rgba(0, 0, 0, 0.4); } .module-ongoing-call__local-preview--expanded { bottom: 112px; width: 312px; height: 234px; } .module-ongoing-call__local-preview--controls-hidden { bottom: 16px; } .module-ongoing-call__local-preview__background { background-color: #343434; } .module-ongoing-call__local-preview__video { height: 100%; width: 100%; } .module-ongoing-call__local-preview__video video { background-color: #3b3b3b; height: 100%; width: 100%; transform: rotateY(180deg); } .module-ongoing-call__local-preview__video--presenting video { transform: inherit; } .module-ongoing-call__footer { bottom: 0; display: flex; flex-direction: row-reverse; justify-content: space-between; width: 100%; z-index: 2; } .module-ongoing-call__footer__actions { align-items: center; display: flex; flex-grow: 1; justify-content: center; } .module-ongoing-call__controls { z-index: 3; } .module-ongoing-call__controls--fadeIn { animation-name: module-ongoing-call__controls--fade-in; animation-duration: 1200ms; animation-timing-function: cubic-bezier(0.19, 1, 0.22, 1); animation-fill-mode: forwards; } .module-ongoing-call__controls--fadeOut { animation-name: module-ongoing-call__controls--fade-out; animation-duration: 1200ms; animation-timing-function: cubic-bezier(0.19, 1, 0.22, 1); animation-fill-mode: forwards; pointer-events: none; } .module-calling-tools { position: absolute; top: calc(32px + var(--title-bar-drag-area-height)); inset-inline-end: 0; display: flex; } .module-calling-tools__button { margin-inline-end: 12px; } .module-calling-tools__button:last-child { margin-inline-end: 24px; } .module-calling-tools .ContextMenu__container { background: none; text-wrap: nowrap; } .module-calling-pip { backface-visibility: hidden; background-color: #121212; border-radius: 18px; box-shadow: 0px 0px 8px rgba(0, 0, 0, 0.05), 0px 8px 20px rgba(0, 0, 0, 0.3); cursor: grab; height: 286px; width: 160px; position: fixed; z-index: 104; overflow: hidden; } .module-calling-pip .module-ongoing-call__group-call-remote-participant { border-radius: 0; } .module-calling-pip__video--remote { align-items: center; background-color: #121212; border-radius: 18px; height: 100%; width: 100%; display: flex; justify-content: center; overflow: hidden; position: relative; } .module-calling-pip__video--remote .module-Avatar img { -webkit-user-drag: none; -webkit-user-select: none; } .module-calling-pip__video--remote .module-calling__background--no-avatar { background: transparent; } .module-calling-pip__video--local, .module-calling-pip__video--local-presenting { position: absolute; top: 8px; inset-inline-start: 8px; height: 60px; width: 80px; border-radius: 12px; overflow: hidden; background-color: #2e2e2e; } .module-calling-pip__video--local video, .module-calling-pip__video--local-presenting video { width: 100%; height: 100%; object-fit: contain; } .module-calling-pip__video--local video { transform: rotateY(180deg); } .module-calling-pip__full-size-local-preview { width: 100%; height: 100%; object-fit: contain; position: relative; } .module-calling-pip__full-size-local-preview video { width: 100%; height: 100%; transform: rotateY(180deg); object-fit: contain; } .module-calling-pip__full-size-local-preview--presenting video { transform: none; } .module-calling-pip__pills { display: flex; flex-direction: row; align-items: center; position: absolute; bottom: 66px; inset-inline-start: 8px; transition: bottom 0.5s cubic-bezier(0.17, 0.17, 0, 1); } .module-calling-pip__pills--no-controls { bottom: 8px; } .module-calling-pip__pill { height: 28px; border-radius: 14px; padding: 6px; padding-inline-start: 12px; padding-inline-end: 12px; background-color: #2e2e2e; color: #e9e9e9; display: flex; flex-direction: row; align-items: center; font-size: 12px; line-height: 16px; letter-spacing: 0px; } .module-calling-pip__pill-icon { height: 16px; width: 16px; margin-inline-end: 4px; } .module-calling-pip__pill-icon__raised-hands { -webkit-mask: url("../images/icons/v3/raise_hand/raise_hand.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #e9e9e9; } @media (forced-colors: active) { .module-calling-pip__pill-icon__raised-hands { background-color: WindowText; } } .module-calling-pip__pill-icon__group-join { -webkit-mask: url("../images/icons/v3/person/person-plus-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #e9e9e9; } @media (forced-colors: active) { .module-calling-pip__pill-icon__group-join { background-color: WindowText; } } .module-calling-pip__actions { position: absolute; bottom: -60px; inset-inline-start: 4px; inset-inline-end: 4px; padding: 12px; height: 56px; opacity: 0; transition: all 0.5s cubic-bezier(0.17, 0.17, 0, 1); display: flex; align-items: center; flex-direction: row; border-radius: 18px; justify-content: space-around; background-color: #343434; } .module-calling-pip__actions--visible { opacity: 1; bottom: 4px; } .module-calling-pip__actions__spacer { flex-grow: 1; flex-shrink: 1; } .module-calling-pip__actions__button { flex-shrink: 0; flex-grow: 0; } .module-calling-pip__actions__middle-button { width: 62px; text-align: center; flex-shrink: 0; flex-grow: 0; } .module-calling-pip__actions .CallingButton__icon { height: 32px; width: 32px; } .module-calling-pip__un-pip-container { position: absolute; top: 16px; inset-inline-end: 16px; opacity: 0; transition: opacity 0.5s cubic-bezier(0.17, 0.17, 0, 1); } .module-calling-pip__un-pip-container--visible { opacity: 1; } .module-calling-pip__button--hangup { -webkit-mask: url("../images/icons/v3/phone/phone-down-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .module-calling-pip__button--hangup { background-color: WindowText; } } .module-calling-pip__button--hangup { height: 28px; width: 28px; border: none; } .dark-theme .module-calling-pip__button--hangup { -webkit-mask: url("../images/icons/v3/phone/phone-down-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .module-calling-pip__button--hangup { background-color: WindowText; } } .module-calling-pip__button--pip { -webkit-mask: url("../images/icons/v3/pip/pip-maximize-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .module-calling-pip__button--pip { background-color: WindowText; } } .module-calling-pip__button--pip { height: 24px; width: 24px; border: none; } .dark-theme .module-calling-pip__button--pip { -webkit-mask: url("../images/icons/v3/pip/pip-maximize-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .module-calling-pip__button--pip { background-color: WindowText; } } .module-calling-participants-list { display: flex; flex-direction: column; width: 320px; height: 440px; max-height: calc(100vh - 80px - 22px); padding-block: 5px 0; padding-inline: 5px; margin-block-end: 85px; margin-block-start: 20px; margin-inline: auto; background-color: #2e2e2e; border-radius: 10px; color: #ffffff; filter: drop-shadow(0px 4px 3px rgba(0, 0, 0, 0.2)); outline: 1px solid #545454; overflow: hidden; } .module-calling-participants-list__overlay { position: absolute; top: 0; display: flex; flex-direction: row; width: 100vw; height: 100vh; padding-inline-start: 15px; align-items: flex-end; inset-inline-start: 0; z-index: 101; } .module-calling-participants-list__overlay::after { content: ""; display: flex; flex-shrink: 1; flex-basis: 480px; } .module-calling-participants-list__title { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; font-weight: 600; } .module-calling-participants-list__contact-icon { margin-inline-start: 0.3em; background-color: #b9b9b9; } .module-calling-participants-list__list { height: 100%; overflow: auto; margin: 0; padding-block: 0; padding-inline: 0; } .module-calling-participants-list__contact { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; } .module-calling-participants-list__contact { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-calling-participants-list__contact { border: 1px solid WindowText; } } .module-calling-participants-list__contact { display: flex; align-items: center; width: 100%; margin-block: 2px; padding-block: 8px; padding-inline-start: 10px; padding-inline-end: 2px; list-style-type: none; border-radius: 6px; cursor: auto; } .module-calling-participants-list__contact:hover { background-color: #545454; } .module-calling-participants-list__contact[disabled] { cursor: auto; } .module-calling-participants-list__avatar-and-name { display: flex; flex-grow: 1; min-width: 0; align-items: center; } .module-calling-participants-list__name { display: inline-block; font-size: 13px; margin-inline-start: 8px; overflow: hidden; text-overflow: ellipsis; vertical-align: middle; white-space: nowrap; } .module-calling-participants-list__header { display: flex; justify-content: space-between; margin-block-end: 2px; padding-block: 8px; padding-inline: 10px 5px; } .module-calling-participants-list__close { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-calling-participants-list__close { border: 1px solid WindowText; } } .module-calling-participants-list__close { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .module-calling-participants-list__close { background-color: WindowText; } } .module-calling-participants-list__close { height: 18px; width: 18px; margin-inline-end: 4px; z-index: 2; } .keyboard-mode .module-calling-participants-list__close:focus { background: #2c6bed; } .module-calling-participants-list__status-icon { display: flex; flex: none; margin-inline: 8px; height: 16px; width: 16px; } .module-calling-participants-list__hand-raised { -webkit-mask: url("../images/icons/v3/raise_hand/raise_hand-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .module-calling-participants-list__hand-raised { background-color: WindowText; } } .module-calling-participants-list__muted--video { -webkit-mask: url("../images/icons/v3/video/video-slash-compact-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .module-calling-participants-list__muted--video { background-color: WindowText; } } .module-calling-participants-list__muted--audio { -webkit-mask: url("../images/icons/v3/mic/mic-slash-compact-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .module-calling-participants-list__muted--audio { background-color: WindowText; } } .module-calling-participants-list__presenting { -webkit-mask: url("../images/icons/v3/share_screen/share_screen-fill-light.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .module-calling-participants-list__presenting { background-color: WindowText; } } .module-calling-participants-list__remove { -webkit-mask: url("../images/icons/v3/minus/minus-circle-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .module-calling-participants-list__remove { background-color: WindowText; } } button.module-calling-participants-list__contact { cursor: pointer; } .module-call-need-permission-screen { align-items: center; background-color: #121212; color: #e9e9e9; display: flex; flex-direction: column; height: 100vh; justify-content: center; position: fixed; top: 0; /* stylelint-disable-next-line liberty/use-logical-spec */ left: 0; width: 100%; } .module-call-need-permission-screen__text { margin-block: 2em; margin-inline: 1em; max-width: 400px; font-size: 14px; line-height: 20px; letter-spacing: -0.08px; text-align: center; } .module-call-need-permission-screen__button { padding-block: 0.5em; padding-inline: 1em; border: 0; border-radius: 4px; font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; color: #e9e9e9; background: #4a4a4a; } .module-conversation-list { scrollbar-gutter: stable; padding-inline-start: 11px; padding-inline-end: calc(11px - var(--axo-scrollbar-gutter-thin-vertical)); } .module-conversation-list:not(:hover, :focus-within) { scrollbar-color: transparent transparent; } .module-left-pane--mode-choose-group-members .module-conversation-list, .module-left-pane--mode-compose .module-conversation-list { padding-inline: 0; } .module-conversation-list--has-dialog-padding { padding-block-start: 8px; } .module-conversation-list__item--archive-button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-conversation-list__item--archive-button { border: 1px solid WindowText; } } .module-conversation-list__item--archive-button { align-items: center; display: flex; justify-content: center; border-radius: 10px; height: 72px; line-height: 72px; text-align: center; width: 100%; padding-inline: 18px; display: flex; } .module-conversation-list__item--archive-button { color: #5e5e5e; } .module-conversation-list__item--archive-button:hover, .module-conversation-list__item--archive-button:focus { background-color: #e9e9e9; } .dark-theme .module-conversation-list__item--archive-button { color: #b9b9b9; } .dark-theme .module-conversation-list__item--archive-button:hover, .dark-theme .module-conversation-list__item--archive-button:focus { background-color: #3b3b3b; } .module-conversation-list__item--archive-button__icon::before { display: block; content: ""; width: 24px; height: 24px; } .module-conversation-list__item--archive-button__icon::before { -webkit-mask: url("../images/icons/v3/archive/archive.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .module-conversation-list__item--archive-button__icon::before { background-color: WindowText; } } .dark-theme .module-conversation-list__item--archive-button__icon::before { -webkit-mask: url("../images/icons/v3/archive/archive.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .dark-theme .module-conversation-list__item--archive-button__icon::before { background-color: WindowText; } } .module-conversation-list__item--archive-button__text { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; margin-inline: 8px; } .module-conversation-list__item--archive-button__archived-count { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; font-weight: 600; padding: 6px; padding-top: 1px; padding-bottom: 1px; border-radius: 10px; white-space: pre; } .module-conversation-list__item--archive-button__archived-count { color: #5e5e5e; background-color: #e9e9e9; } .dark-theme .module-conversation-list__item--archive-button__archived-count { color: #b9b9b9; background-color: #3b3b3b; } .module-conversation-list--width-narrow .module-conversation-list__item--archive-button__icon { display: block; width: 48px; height: 48px; padding: 12px; } .module-conversation-list--width-narrow .module-conversation-list__item--archive-button__text, .module-conversation-list--width-narrow .module-conversation-list__item--archive-button__archived-count { display: none; } .module-conversation-list__item--contact-or-conversation { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-conversation-list__item--contact-or-conversation { border: 1px solid WindowText; } } .module-conversation-list__item--contact-or-conversation { align-items: center; border-radius: 10px; cursor: inherit; display: flex; flex-direction: row; height: 72px; margin-block: 2px; margin-inline: 0; padding-block: 8px; padding-inline: 14px; user-select: none; width: 100%; } .module-conversation-list__item--contact-or-conversation .module-conversation-list__item--contact-or-conversation__unread-indicator { height: 18px; min-width: 18px; border-radius: 10px; display: flex; justify-content: center; align-items: center; } .module-conversation-list--width-narrow .module-conversation-list__item--contact-or-conversation .module-conversation-list__item--contact-or-conversation__unread-indicator { display: none; } .module-conversation-list__item--contact-or-conversation .module-conversation-list__item--contact-or-conversation__unread-indicator { background-color: #2c6bed; } .dark-theme .module-conversation-list__item--contact-or-conversation .module-conversation-list__item--contact-or-conversation__unread-indicator { background-color: #406ec9; } .module-conversation-list__item--contact-or-conversation .module-conversation-list__item--contact-or-conversation__unread-indicator--unread-messages, .module-conversation-list__item--contact-or-conversation .module-conversation-list__item--contact-or-conversation__unread-indicator--marked-unread { font-size: 11px; line-height: 14px; letter-spacing: 0.06px; font-weight: 600; text-align: center; word-break: normal; padding-inline: 4px; line-height: 100%; color: #ffffff; font-weight: 500; } .module-conversation-list__item--contact-or-conversation .module-conversation-list__item--contact-or-conversation__unread-indicator--unread-mentions__icon { -webkit-mask: url("../images/icons/v3/at/at.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .module-conversation-list__item--contact-or-conversation .module-conversation-list__item--contact-or-conversation__unread-indicator--unread-mentions__icon { background-color: WindowText; } } .module-conversation-list__item--contact-or-conversation .module-conversation-list__item--contact-or-conversation__unread-indicator--unread-mentions__icon { width: 12px; height: 12px; } .module-conversation-list__item--contact-or-conversation--is-button { cursor: pointer; } .module-conversation-list__item--contact-or-conversation--is-button:disabled { cursor: inherit; } .module-conversation-list__item--contact-or-conversation--is-checkbox { cursor: pointer; } .module-conversation-list__item--contact-or-conversation--is-checkbox--disabled { cursor: not-allowed; } .module-conversation-list__item--contact-or-conversation:hover:not(:disabled, .module-conversation-list__item--contact-or-conversation--disabled, .module-conversation-list__item--contact-or-conversation--is-selected), .module-conversation-list__item--contact-or-conversation[data-axo-contextmenu-state=open] { background-color: light-dark(#e9e9e9, #3b3b3b); } .module-conversation-list__item--contact-or-conversation:hover:not(:disabled, .module-conversation-list__item--contact-or-conversation--disabled, .module-conversation-list__item--contact-or-conversation--is-selected) .module-conversation-list__item--contact-or-conversation__unread-indicator, .module-conversation-list__item--contact-or-conversation[data-axo-contextmenu-state=open] .module-conversation-list__item--contact-or-conversation__unread-indicator { border-color: light-dark(#e9e9e9, #3b3b3b); } .keyboard-mode .module-conversation-list__item--contact-or-conversation:focus:not(:disabled, .keyboard-mode .module-conversation-list__item--contact-or-conversation--disabled, .keyboard-mode .module-conversation-list__item--contact-or-conversation--is-selected) { background-color: light-dark(#e9e9e9, #3b3b3b); } .keyboard-mode .module-conversation-list__item--contact-or-conversation:focus:not(:disabled, .keyboard-mode .module-conversation-list__item--contact-or-conversation--disabled, .keyboard-mode .module-conversation-list__item--contact-or-conversation--is-selected) .module-conversation-list__item--contact-or-conversation__unread-indicator { border-color: light-dark(#e9e9e9, #3b3b3b); } .module-conversation-list__item--contact-or-conversation--is-selected { background-color: #dedede; } .dark-theme .module-conversation-list__item--contact-or-conversation--is-selected { background-color: #4a4a4a; } .module-conversation-list__item--contact-or-conversation--is-selected .module-conversation-list__item--contact-or-conversation__avatar-container .module-conversation-list__item--contact-or-conversation__unread-indicator { border-color: #dedede; } .dark-theme .module-conversation-list__item--contact-or-conversation--is-selected .module-conversation-list__item--contact-or-conversation__avatar-container .module-conversation-list__item--contact-or-conversation__unread-indicator { border-color: #4a4a4a; } .module-conversation-list__item--contact-or-conversation__avatar-container { position: relative; } .module-conversation-list__item--contact-or-conversation__avatar-container .module-conversation-list__item--contact-or-conversation__unread-indicator { border-radius: 9999px; border: 3px solid transparent; height: 24px; margin: 0; min-width: 24px; position: absolute; top: -4px; display: none; } .module-conversation-list--width-narrow .module-conversation-list__item--contact-or-conversation__avatar-container .module-conversation-list__item--contact-or-conversation__unread-indicator { display: flex; } .module-conversation-list__item--contact-or-conversation__avatar-container .module-conversation-list__item--contact-or-conversation__unread-indicator { border-color: #f6f6f6; } .dark-theme .module-conversation-list__item--contact-or-conversation__avatar-container .module-conversation-list__item--contact-or-conversation__unread-indicator { border-color: #2e2e2e; } .module-conversation-list__item--contact-or-conversation__avatar-container .module-conversation-list__item--contact-or-conversation__unread-indicator--unread-messages, .module-conversation-list__item--contact-or-conversation__avatar-container .module-conversation-list__item--contact-or-conversation__unread-indicator--marked-unread { inset-inline-end: -8px; } .module-conversation-list__item--contact-or-conversation__avatar-container .module-conversation-list__item--contact-or-conversation__unread-indicator--unread-mentions { inset-inline-start: -8px; } .module-conversation-list__item--contact-or-conversation__avatar-container .module-conversation-list__item--contact-or-conversation__unread-indicator--is-selected { border-color: #dedede; } .dark-theme .module-conversation-list__item--contact-or-conversation__avatar-container .module-conversation-list__item--contact-or-conversation__unread-indicator--is-selected { border-color: #4a4a4a; } .module-conversation-list__item--contact-or-conversation__content { flex-grow: 1; margin-inline-start: 12px; display: flex; flex-direction: column; align-items: stretch; overflow: hidden; } .module-conversation-list__item--contact-or-conversation__content--disabled { opacity: 0.5; } .module-conversation-list__item--contact-or-conversation__content__header { display: flex; flex-direction: row; align-items: center; } .module-conversation-list--width-narrow .module-conversation-list__item--contact-or-conversation__content__header { display: none; } .module-conversation-list__item--contact-or-conversation__content__header__name { align-items: center; display: flex; flex-grow: 1; flex-shrink: 1; font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } .module-conversation-list__item--contact-or-conversation__content__header__name { color: #1b1b1b; } .dark-theme .module-conversation-list__item--contact-or-conversation__content__header__name { color: #e9e9e9; } .module-conversation-list__item--contact-or-conversation__content__header__name__contact-name { overflow: hidden; text-overflow: ellipsis; } .module-conversation-list__item--contact-or-conversation__content__header__name__contact-name .ContactModal__official-badge { position: relative; top: 1px; } .module-conversation-list__item--contact-or-conversation__content__header__name__mute-icon { height: 14px; margin-inline-start: 8px; min-width: 14px; width: 14px; } .module-conversation-list__item--contact-or-conversation__content__header__name__mute-icon { -webkit-mask: url("../images/icons/v3/bell/bell-slash-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #848484; } @media (forced-colors: active) { .module-conversation-list__item--contact-or-conversation__content__header__name__mute-icon { background-color: WindowText; } } .dark-theme .module-conversation-list__item--contact-or-conversation__content__header__name__mute-icon { -webkit-mask: url("../images/icons/v3/bell/bell-slash-bold.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .dark-theme .module-conversation-list__item--contact-or-conversation__content__header__name__mute-icon { background-color: WindowText; } } .module-conversation-list__item--contact-or-conversation__content__header__date { font-size: 11px; line-height: 14px; letter-spacing: 0.06px; display: inline-block; flex-shrink: 0; margin-inline-start: 6px; } .module-conversation-list__item--contact-or-conversation__content__header__date { color: #5e5e5e; } .dark-theme .module-conversation-list__item--contact-or-conversation__content__header__date { color: #b9b9b9; } .module-conversation-list__item--contact-or-conversation__content__message { display: flex; flex-direction: row; justify-content: flex-end; } .module-conversation-list--width-narrow .module-conversation-list__item--contact-or-conversation__content__message { align-items: center; justify-content: flex-start; } .module-conversation-list__item--contact-or-conversation--is-checkbox .module-conversation-list__item--contact-or-conversation__content__message__text { /* restrict the growth so it doesn't encroach on the checkbox */ -webkit-line-clamp: 1; } .module-conversation-list__item--contact-or-conversation__content__message__text { flex-grow: 1; flex-shrink: 1; font-size: 13px; line-height: 18px; letter-spacing: -0.03px; -webkit-box-orient: vertical; -webkit-line-clamp: 2; display: -webkit-box; overflow: hidden; text-overflow: ellipsis; text-align: start; } .module-conversation-list__item--contact-or-conversation__content__message__text { color: #5e5e5e; } .dark-theme .module-conversation-list__item--contact-or-conversation__content__message__text { color: #b9b9b9; } .module-conversation-list--width-narrow .module-conversation-list__item--contact-or-conversation__content__message__text { display: none; } .module-conversation-list__item--contact-or-conversation__content__message__text--always-full-size { height: 36px; } .module-conversation-list__item--contact-or-conversation__content__message__text__blocked { display: flex; align-items: center; } .module-conversation-list__item--contact-or-conversation__content__message__text__blocked::before { content: ""; display: inline-block; width: 16px; height: 16px; margin-inline-end: 4px; } .module-conversation-list__item--contact-or-conversation__content__message__text__blocked::before { -webkit-mask: url("../images/icons/v3/block/block.svg") no-repeat center; -webkit-mask-size: 100%; background-color: currentColor; } @media (forced-colors: active) { .module-conversation-list__item--contact-or-conversation__content__message__text__blocked::before { background-color: WindowText; } } .module-conversation-list__item--contact-or-conversation__content__message__text__message-request { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; font-weight: 600; } .module-conversation-list__item--contact-or-conversation__content__message__text__message-request { color: #5e5e5e; } .dark-theme .module-conversation-list__item--contact-or-conversation__content__message__text__message-request { color: #b9b9b9; } .module-conversation-list__item--contact-or-conversation__content__message__text__draft-prefix, .module-conversation-list__item--contact-or-conversation__content__message__text__deleted-for-everyone { font-style: italic; margin-inline-end: 3px; } .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon { flex-shrink: 0; margin-top: 4px; width: 12px; height: 12px; display: inline-block; margin-inline-start: 6px; } .module-conversation-list--width-narrow .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon { display: none; } .page-is-visible .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--sending { animation: rotate 4s linear infinite; } .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--sending { -webkit-mask: url("../images/icons/v3/message_status/messagestatus-sending.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--sending { background-color: WindowText; } } .dark-theme .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--sending { -webkit-mask: url("../images/icons/v3/message_status/messagestatus-sending.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #848484; } @media (forced-colors: active) { .dark-theme .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--sending { background-color: WindowText; } } .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--sent { -webkit-mask: url("../images/icons/v3/message_status/messagestatus-sent.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #848484; } @media (forced-colors: active) { .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--sent { background-color: WindowText; } } .dark-theme .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--sent { -webkit-mask: url("../images/icons/v3/message_status/messagestatus-sent.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .dark-theme .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--sent { background-color: WindowText; } } .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--delivered { -webkit-mask: url("../images/icons/v3/message_status/messagestatus-delivered.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #848484; } @media (forced-colors: active) { .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--delivered { background-color: WindowText; } } .dark-theme .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--delivered { -webkit-mask: url("../images/icons/v3/message_status/messagestatus-delivered.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .dark-theme .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--delivered { background-color: WindowText; } } .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--delivered { width: 18px; } .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--read, .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--viewed { -webkit-mask: url("../images/icons/v3/message_status/messagestatus-read.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #848484; } @media (forced-colors: active) { .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--read, .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--viewed { background-color: WindowText; } } .dark-theme .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--read, .dark-theme .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--viewed { -webkit-mask: url("../images/icons/v3/message_status/messagestatus-read.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .dark-theme .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--read, .dark-theme .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--viewed { background-color: WindowText; } } .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--read, .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--viewed { width: 18px; } .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--error, .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--partial-sent { -webkit-mask: url("../images/icons/v3/error/error-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #f44336; } @media (forced-colors: active) { .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--error, .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--partial-sent { background-color: WindowText; } } .dark-theme .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--error, .dark-theme .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--partial-sent { -webkit-mask: url("../images/icons/v3/error/error-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #f44336; } @media (forced-colors: active) { .dark-theme .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--error, .dark-theme .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--partial-sent { background-color: WindowText; } } .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--paused { -webkit-mask: url("../images/icons/v3/error/error-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--paused { background-color: WindowText; } } .dark-theme .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--paused { -webkit-mask: url("../images/icons/v3/error/error-circle.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #848484; } @media (forced-colors: active) { .dark-theme .module-conversation-list__item--contact-or-conversation__content__message__text__status-icon--paused { background-color: WindowText; } } .module-conversation-list__item--contact-or-conversation__content__message__text__message-search-result-contents { display: -webkit-box; white-space: initial; -webkit-box-orient: vertical; -webkit-line-clamp: 2; } .module-conversation-list__item--contact-or-conversation__content__message__text__start-new-conversation { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-style: italic; } .module-conversation-list__item--contact-or-conversation__content__unread-indicators { display: flex; flex-direction: row; gap: 4px; flex-shrink: 0; margin-inline-start: 10px; margin-top: 1px; } .module-conversation-list__item--contact-or-conversation__checkbox { -webkit-appearance: none; background: #ffffff; border-radius: 100%; height: 20px; margin-inline: 16px; width: 20px; min-width: 20px; pointer-events: none; } .module-conversation-list__item--contact-or-conversation__checkbox { border: 1px solid #dedede; } .dark-theme .module-conversation-list__item--contact-or-conversation__checkbox { border: 1px solid #2e2e2e; } .module-conversation-list__item--contact-or-conversation__checkbox:focus { outline: none; } .keyboard-mode .module-conversation-list__item--contact-or-conversation__checkbox:focus { border-width: 2px; border-color: #2c6bed; } .keyboard-mode .module-conversation-list__item--contact-or-conversation__checkbox:focus:checked { box-shadow: inset 0 0 0px 1px #ffffff; } .dark-theme.keyboard-mode .module-conversation-list__item--contact-or-conversation__checkbox:focus { border-width: 2px; border-color: #6191f3; } .dark-theme.keyboard-mode .module-conversation-list__item--contact-or-conversation__checkbox:focus:checked { box-shadow: inset 0 0 0px 1px #000000; } .module-conversation-list__item--contact-or-conversation__checkbox:disabled:not(:checked) { opacity: 0.5; } .module-conversation-list__item--contact-or-conversation__checkbox:checked { background: #2c6bed; display: flex; align-items: center; justify-content: center; } .module-conversation-list__item--contact-or-conversation__checkbox:checked::before { content: ""; display: block; } .module-conversation-list__item--contact-or-conversation__checkbox:checked::before { -webkit-mask: url("../images/icons/v3/check/check.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #ffffff; } @media (forced-colors: active) { .module-conversation-list__item--contact-or-conversation__checkbox:checked::before { background-color: WindowText; } } .module-conversation-list__item--contact-or-conversation__checkbox:checked::before { width: 13px; height: 13px; } .module-conversation-list__item--contact-or-conversation__checkbox:checked:disabled { background: #dedede; } .dark-theme .module-conversation-list__item--contact-or-conversation__checkbox:checked:disabled { background: #848484; } .module-conversation-list__item--contact-or-conversation__checkbox--container { margin-inline-start: 8px; /* prevent sibling content from pushing this smaller (min-width: the "!important" of width) */ min-width: 20px; } .module-conversation-list__item--clear-filter-button { height: 72px; } .module-conversation-list__item--header { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; align-items: flex-end; display: flex; height: 100%; overflow-x: hidden; padding-bottom: 8px; padding-inline-start: 16px; text-overflow: ellipsis; user-select: none; white-space: nowrap; } .dark-theme .module-conversation-list__item--header { color: #e9e9e9; } .module-conversation-list--width-narrow .module-conversation-list__item--header { border-radius: 9999px; display: block; height: 2px; margin-block: 19px; margin-inline: 14px 0; padding-bottom: 0; width: 48px; color: transparent; overflow: hidden; text-indent: -99999px; } .module-conversation-list--width-narrow .module-conversation-list__item--header { background: rgba(0, 0, 0, 0.12); } .dark-theme .module-conversation-list--width-narrow .module-conversation-list__item--header { background: rgba(255, 255, 255, 0.12); } .module-conversation-list__item--spinner { width: 100%; padding: 10px; text-align: center; } .module-conversation-list__empty-results { display: flex; align-items: center; justify-content: center; padding-block: 48px; padding-inline: 12px; } .module-conversation-list__generic-checkbox-icon { display: flex; align-items: center; justify-content: center; width: 32px; height: 32px; border-radius: 16px; background-color: light-dark(rgba(0, 0, 0, 0.06), rgba(255, 255, 255, 0.12)); } .module-conversation-list__generic-checkbox-icon::before { content: ""; display: block; width: 20px; height: 20px; } .module-conversation-list__generic-checkbox-icon--contact::before { -webkit-mask: url("../images/icons/v3/person/person.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#000000, #e9e9e9); } @media (forced-colors: active) { .module-conversation-list__generic-checkbox-icon--contact::before { background-color: WindowText; } } .module-conversation-list__generic-checkbox-icon--group::before { -webkit-mask: url("../images/icons/v3/group/group.svg") no-repeat center; -webkit-mask-size: 100%; background-color: light-dark(#000000, #e9e9e9); } @media (forced-colors: active) { .module-conversation-list__generic-checkbox-icon--group::before { background-color: WindowText; } } .module-left-pane { display: flex; flex-direction: column; height: 100%; width: 100%; position: relative; } .module-left-pane__header { flex-grow: 0; flex-shrink: 0; user-select: none; } .module-left-pane__header__contents { width: 100%; display: inline-flex; flex-direction: row; align-items: center; padding-block: 15px; } .module-left-pane__header__contents__back-button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-left-pane__header__contents__back-button { border: 1px solid WindowText; } } .module-left-pane__header__contents__back-button { margin-inline-start: 16px; width: 20px; height: 20px; } .module-left-pane__header__contents__back-button:disabled { cursor: not-allowed; } .module-left-pane__header__contents__back-button:dir(ltr) { -webkit-mask: url("../images/icons/v3/chevron/chevron-left.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .module-left-pane__header__contents__back-button:dir(ltr) { background-color: WindowText; } } :dir(rtl) .module-left-pane__header__contents__back-button:dir(ltr) { -webkit-mask: url("../images/icons/v3/chevron/chevron-right.svg") no-repeat center; } .module-left-pane__header__contents__back-button:dir(rtl) { -webkit-mask: url("../images/icons/v3/chevron/chevron-right.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #5e5e5e; } @media (forced-colors: active) { .module-left-pane__header__contents__back-button:dir(rtl) { background-color: WindowText; } } :dir(rtl) .module-left-pane__header__contents__back-button:dir(rtl) { -webkit-mask: url("../images/icons/v3/chevron/chevron-left.svg") no-repeat center; } .keyboard-mode .module-left-pane__header__contents__back-button:dir(ltr):focus { -webkit-mask: url("../images/icons/v3/chevron/chevron-left.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #2c6bed; } @media (forced-colors: active) { .keyboard-mode .module-left-pane__header__contents__back-button:dir(ltr):focus { background-color: WindowText; } } :dir(rtl) .keyboard-mode .module-left-pane__header__contents__back-button:dir(ltr):focus { -webkit-mask: url("../images/icons/v3/chevron/chevron-right.svg") no-repeat center; } .keyboard-mode .module-left-pane__header__contents__back-button:dir(rtl):focus { -webkit-mask: url("../images/icons/v3/chevron/chevron-right.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #2c6bed; } @media (forced-colors: active) { .keyboard-mode .module-left-pane__header__contents__back-button:dir(rtl):focus { background-color: WindowText; } } :dir(rtl) .keyboard-mode .module-left-pane__header__contents__back-button:dir(rtl):focus { -webkit-mask: url("../images/icons/v3/chevron/chevron-left.svg") no-repeat center; } .dark-theme .module-left-pane__header__contents__back-button:dir(ltr) { -webkit-mask: url("../images/icons/v3/chevron/chevron-left.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .dark-theme .module-left-pane__header__contents__back-button:dir(ltr) { background-color: WindowText; } } :dir(rtl) .dark-theme .module-left-pane__header__contents__back-button:dir(ltr) { -webkit-mask: url("../images/icons/v3/chevron/chevron-right.svg") no-repeat center; } .dark-theme .module-left-pane__header__contents__back-button:dir(rtl) { -webkit-mask: url("../images/icons/v3/chevron/chevron-right.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #b9b9b9; } @media (forced-colors: active) { .dark-theme .module-left-pane__header__contents__back-button:dir(rtl) { background-color: WindowText; } } :dir(rtl) .dark-theme .module-left-pane__header__contents__back-button:dir(rtl) { -webkit-mask: url("../images/icons/v3/chevron/chevron-left.svg") no-repeat center; } .dark-theme.keyboard-mode .module-left-pane__header__contents__back-button:dir(ltr):hover { -webkit-mask: url("../images/icons/v3/chevron/chevron-left.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #6191f3; } @media (forced-colors: active) { .dark-theme.keyboard-mode .module-left-pane__header__contents__back-button:dir(ltr):hover { background-color: WindowText; } } :dir(rtl) .dark-theme.keyboard-mode .module-left-pane__header__contents__back-button:dir(ltr):hover { -webkit-mask: url("../images/icons/v3/chevron/chevron-right.svg") no-repeat center; } .dark-theme.keyboard-mode .module-left-pane__header__contents__back-button:dir(rtl):hover { -webkit-mask: url("../images/icons/v3/chevron/chevron-right.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #6191f3; } @media (forced-colors: active) { .dark-theme.keyboard-mode .module-left-pane__header__contents__back-button:dir(rtl):hover { background-color: WindowText; } } :dir(rtl) .dark-theme.keyboard-mode .module-left-pane__header__contents__back-button:dir(rtl):hover { -webkit-mask: url("../images/icons/v3/chevron/chevron-left.svg") no-repeat center; } .NavSidebar--narrow .module-left-pane__header__contents__back-button { margin-inline-start: 0; } .module-left-pane__header__contents__text { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; flex-grow: 1; padding-inline-end: 36px; text-align: center; } .module-left-pane__header__contents__text { color: #1b1b1b; } .dark-theme .module-left-pane__header__contents__text { color: #e9e9e9; } .NavSidebar--narrow .module-left-pane__header__contents__text { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border-width: 0; } .NavSidebar--narrow .module-left-pane__header__contents { justify-content: center; } .module-left-pane__header__form { display: flex; flex-direction: column; } .module-left-pane__header__form__expire-timer { display: flex; flex-direction: row; align-items: center; margin-block: 0 16px; margin-inline: 16px; } .module-left-pane__header__form__expire-timer__label { margin-inline-end: 12px; } .module-left-pane__startComposingIcon { display: block; width: 20px; height: 20px; } .module-left-pane__startComposingIcon { -webkit-mask: url("../images/icons/v3/compose/compose.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .module-left-pane__startComposingIcon { background-color: WindowText; } } .dark-theme .module-left-pane__startComposingIcon { -webkit-mask: url("../images/icons/v3/compose/compose.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .module-left-pane__startComposingIcon { background-color: WindowText; } } .module-left-pane__moreActionsIcon { display: block; width: 20px; height: 20px; } .module-left-pane__moreActionsIcon { -webkit-mask: url("../images/icons/v3/more/more.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .module-left-pane__moreActionsIcon { background-color: WindowText; } } .dark-theme .module-left-pane__moreActionsIcon { -webkit-mask: url("../images/icons/v3/more/more.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .module-left-pane__moreActionsIcon { background-color: WindowText; } } .module-left-pane__dialogs + .module-left-pane__chatFolders { margin-top: 8px; } .module-left-pane__archive-helper-text { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; flex-grow: 0; flex-shrink: 0; user-select: none; padding: 1em; } .module-left-pane__archive-helper-text { color: #5e5e5e; background-color: #e9e9e9; } .dark-theme .module-left-pane__archive-helper-text { color: #b9b9b9; background-color: #3b3b3b; } .NavSidebar--narrow .module-left-pane__archive-helper-text { display: none; } .module-left-pane__no-search-results__unread-header { margin-bottom: 50px; } .module-left-pane__no-search-results--withHeader { display: flex; flex-direction: column; margin-top: 15px; margin-bottom: 20px; padding-inline: 1em; width: 100%; text-align: center; outline: none; } .module-left-pane__no-search-results, .module-left-pane__compose-no-contacts { margin-top: 27px; padding-inline: 1em; width: 100%; text-align: center; outline: none; } .module-left-pane__compose-no-contacts { flex-grow: 1; } .module-left-pane__no-search-results__sms-only { margin-top: 12px; } .module-left-pane__no-search-results__sms-only { color: #5e5e5e; } .dark-theme .module-left-pane__no-search-results__sms-only { color: #b9b9b9; } .module-left-pane__compose-search-form__input { flex-grow: 1; } .module-left-pane__list--measure { flex-grow: 1; flex-shrink: 1; outline: none; } .module-left-pane__list--wrapper { position: relative; } .module-left-pane__list { position: absolute; outline: none; } .module-left-pane__footer { bottom: 0; display: flex; flex-direction: row; justify-content: flex-end; inset-inline-start: 0; padding: 12px; position: absolute; width: 100%; } .module-left-pane__footer { background: linear-gradient(transparent, #f6f6f6); } .dark-theme .module-left-pane__footer { background: linear-gradient(transparent, #2e2e2e); } .module-left-pane__resize-grab-area { position: absolute; width: 8px; height: 100%; inset-inline-end: -8px; top: 0; z-index: 2; cursor: col-resize; } .module-timeline { display: flex; height: 100%; overflow: hidden; } .module-timeline--disabled { user-select: none; } .module-timeline__messages__container { flex: 1 1; overflow-x: hidden; overflow-y: auto; display: flex; flex-direction: column; scrollbar-width: auto; } .module-timeline__messages__container button { -webkit-app-region: initial; } .module-timeline__messages { display: flex; flex-direction: column; flex: 1 1; padding-bottom: 6px; position: relative; justify-content: flex-end; } .module-timeline__messages::after { content: ""; height: 1px; display: block; } .module-timeline__messages--have-newest:not(.module-timeline__messages--scroll-locked) > * { overflow-anchor: none; } .module-timeline__messages--have-newest:not(.module-timeline__messages--scroll-locked)::after { overflow-anchor: auto; } .module-timeline__messages--scroll-locked { flex-shrink: 0; } .module-timeline__messages--have-oldest { justify-content: flex-start; } .module-timeline__messages__at-bottom-detector { position: absolute; bottom: 0; } .module-timeline__scrolldown-buttons { z-index: 10; position: absolute; inset-inline-end: 16px; bottom: 12px; display: flex; flex-direction: column; gap: 14px; } .ReactVirtualized__List { outline: none; } .module-last-seen-indicator { padding-top: 25px; padding-bottom: 35px; user-select: none; } .module-last-seen-indicator__bar { background-color: #848484; width: 100%; height: 1px; } .module-last-seen-indicator__text { margin-top: 3px; font-size: 13px; line-height: 18px; letter-spacing: -0.03px; font-weight: 600; text-align: center; } .module-last-seen-indicator__text { color: #1b1b1b; } .dark-theme .module-last-seen-indicator__text { color: #e9e9e9; } /* Calling: Device Selection */ .module-calling-device-selection { position: relative; } .module-calling-device-selection__close-button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-calling-device-selection__close-button { border: 1px solid WindowText; } } .module-calling-device-selection__close-button { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .module-calling-device-selection__close-button { background-color: WindowText; } } .module-calling-device-selection__close-button { height: 24px; position: absolute; inset-inline-end: 5px; top: 0; width: 24px; z-index: 2; } .keyboard-mode .module-calling-device-selection__close-button:focus, .keyboard-mode .module-calling-device-selection__close-button:active, .keyboard-mode .module-calling-device-selection__close-button:hover { background-color: #2c6bed; } .module-calling-device-selection__title { font-weight: 600; font-size: 20px; line-height: 26px; letter-spacing: -0.34px; margin-top: 12px; margin-bottom: 20px; } .module-calling-device-selection__label { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; display: block; margin-bottom: 16px; } .module-calling-device-selection__select { margin-bottom: 20px; position: relative; } .module-group-v1-disabled-actions { padding-block: 8px 12px; padding-inline: 16px; max-width: 650px; margin-inline: auto; } .module-group-v1-disabled-actions { background: #ffffff; } .dark-theme .module-group-v1-disabled-actions { background: #121212; } .module-group-v1-disabled-actions__message { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; text-align: center; margin-bottom: 12px; } .module-group-v1-disabled-actions__message { color: #5e5e5e; } .dark-theme .module-group-v1-disabled-actions__message { color: #b9b9b9; } .module-group-v1-disabled-actions__message__learn-more { text-decoration: none; } .module-group-v1-disabled-actions__buttons { display: flex; flex-direction: row; justify-content: center; } .module-group-v1-disabled-actions__buttons__button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-group-v1-disabled-actions__buttons__button { border: 1px solid WindowText; } } .module-group-v1-disabled-actions__buttons__button { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; border-radius: 4px; padding: 8px; padding-inline: 30px; background-color: #2c6bed; } .module-group-v1-disabled-actions__buttons__button { color: #ffffff; border: 1px solid white; } .dark-theme .module-group-v1-disabled-actions__buttons__button { color: rgba(255, 255, 255, 0.9); border: 1px solid #121212; } .mouse-mode .module-group-v1-disabled-actions__buttons__button:hover { background-color: rgb(37.4, 90.95, 201.45); } .dark-theme.mouse-mode .module-group-v1-disabled-actions__buttons__button:hover { background-color: rgb(75.65, 129.2, 239.7); } .mouse-mode .module-group-v1-disabled-actions__buttons__button:active { background-color: rgb(33, 80.25, 177.75); } .dark-theme.mouse-mode .module-group-v1-disabled-actions__buttons__button:active { background-color: rgb(96.75, 144, 241.5); } .keyboard-mode .module-group-v1-disabled-actions__buttons__button:active { background-color: rgb(33, 80.25, 177.75); } .dark-theme.keyboard-mode .module-group-v1-disabled-actions__buttons__button:active { background-color: rgb(33, 80.25, 177.75); } .keyboard-mode .module-group-v1-disabled-actions__buttons__button:focus { box-shadow: 0px 0px 0px 3px #2c6bed; } .dark-theme.keyboard-mode .module-group-v1-disabled-actions__buttons__button:focus { box-shadow: 0px 0px 0px 3px #6191f3; } .module-group-v2-pending-approval-actions { padding-block: 8px 12px; padding-inline: 16px; max-width: 650px; margin-inline: auto; } .module-group-v2-pending-approval-actions { background: #ffffff; } .dark-theme .module-group-v2-pending-approval-actions { background: #121212; } .module-group-v2-pending-approval-actions__message { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; text-align: center; margin-bottom: 12px; } .module-group-v2-pending-approval-actions__message { color: #5e5e5e; } .dark-theme .module-group-v2-pending-approval-actions__message { color: #b9b9b9; } .module-group-v2-pending-approval-actions__buttons { display: flex; flex-direction: row; justify-content: center; } .module-group-v2-pending-approval-actions__buttons__button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-group-v2-pending-approval-actions__buttons__button { border: 1px solid WindowText; } } .module-group-v2-pending-approval-actions__buttons__button { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; border-radius: 4px; padding: 8px; padding-inline: 30px; } .module-group-v2-pending-approval-actions__buttons__button { color: #1b1b1b; background-color: #e9e9e9; } .dark-theme .module-group-v2-pending-approval-actions__buttons__button { color: #e9e9e9; background-color: #4a4a4a; } .mouse-mode .module-group-v2-pending-approval-actions__buttons__button:hover { background-color: rgb(198.05, 198.05, 198.05); } .dark-theme.mouse-mode .module-group-v2-pending-approval-actions__buttons__button:hover { background-color: rgb(101.15, 101.15, 101.15); } .mouse-mode .module-group-v2-pending-approval-actions__buttons__button:active { background-color: rgb(174.75, 174.75, 174.75); } .dark-theme.mouse-mode .module-group-v2-pending-approval-actions__buttons__button:active { background-color: rgb(119.25, 119.25, 119.25); } .keyboard-mode .module-group-v2-pending-approval-actions__buttons__button:active { background-color: rgb(174.75, 174.75, 174.75); } .dark-theme.keyboard-mode .module-group-v2-pending-approval-actions__buttons__button:active { background-color: rgb(119.25, 119.25, 119.25); } .keyboard-mode .module-group-v2-pending-approval-actions__buttons__button:focus { box-shadow: 0px 0px 0px 3px #2c6bed; } .dark-theme.keyboard-mode .module-group-v2-pending-approval-actions__buttons__button:focus { box-shadow: 0px 0px 0px 3px #6191f3; } .module-group-v2-pending-approval-actions__buttons__button { color: #5e5e5e; background-color: #e9e9e9; } .module-modal-host__overlay { background: rgba(0, 0, 0, 0.4); width: 100vw; height: 100vh; inset-inline-start: 0; top: 0; position: fixed; z-index: 102; } .module-modal-host__overlay-container { display: flex; flex-direction: row; width: 100vw; height: 100vh; inset-inline-start: 0; top: 0; justify-content: center; align-items: center; overflow: hidden; padding: 20px; position: fixed; z-index: 102; } .module-modal-host__width-container { max-width: 360px; width: 95%; } .module-modal-host--on-top-of-everything .module-modal-host__overlay, .module-modal-host--on-top-of-everything .module-modal-host__overlay-container { z-index: 9001; } .module-group-v2-join-dialog { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; border-radius: 8px; width: 360px; margin-inline: auto; padding: 20px; position: relative; } .module-group-v2-join-dialog { background-color: #ffffff; } .dark-theme .module-group-v2-join-dialog { background-color: #121212; } .module-group-v2-join-dialog__close-button { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-group-v2-join-dialog__close-button { border: 1px solid WindowText; } } .module-group-v2-join-dialog__close-button { position: absolute; inset-inline-end: 12px; top: 12px; height: 24px; width: 24px; } .module-group-v2-join-dialog__close-button { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #3b3b3b; } @media (forced-colors: active) { .module-group-v2-join-dialog__close-button { background-color: WindowText; } } .dark-theme .module-group-v2-join-dialog__close-button { -webkit-mask: url("../images/icons/v3/x/x.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .module-group-v2-join-dialog__close-button { background-color: WindowText; } } .keyboard-mode .module-group-v2-join-dialog__close-button:focus { background-color: #2c6bed; } .dark-theme.keyboard-mode .module-group-v2-join-dialog__close-button:focus { background-color: #6191f3; } .module-group-v2-join-dialog__title { font-weight: 600; font-size: 20px; line-height: 26px; letter-spacing: -0.34px; text-align: center; margin-top: 12px; margin-bottom: 2px; } .module-group-v2-join-dialog__avatar { text-align: center; } .module-group-v2-join-dialog__metadata { color: #5e5e5e; text-align: center; } .module-group-v2-join-dialog__prompt { margin-top: 40px; } .module-group-v2-join-dialog__prompt--approval { font-size: 12px; line-height: 16px; letter-spacing: 0; color: #848484; margin-top: 40px; } .module-group-v2-join-dialog__buttons { margin-top: 16px; text-align: center; display: flex; } .module-group-v2-join-dialog__button { flex: 1 1 0px; } .module-group-v2-join-dialog__button:not(:first-of-type) { margin-inline-start: 16px; } .module-group-v2-join-dialog__description { color: #5e5e5e; margin-top: 12px; } .module-progress-dialog { width: 138px; padding: 18px; border-radius: 8px; } .module-progress-dialog { box-shadow: 0px 8px 20px rgba(0, 0, 0, 0.3), 0px 0px 8px rgba(0, 0, 0, 0.05); } @media (forced-colors: active) { .module-progress-dialog { border: 1px solid WindowText; } } .module-progress-dialog { display: flex; flex-direction: column; justify-content: center; align-items: center; } .module-progress-dialog { background: #ffffff; color: #1b1b1b; } .dark-theme .module-progress-dialog { background: #2e2e2e; color: #e9e9e9; } .module-progress-dialog__spinner { padding: 10px; } .module-progress-dialog__text { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; } .module-progress-dialog__overlay { background: rgba(0, 0, 0, 0.4); position: fixed; inset-inline-start: 0; top: 0; width: 100vw; height: 100vh; display: flex; justify-content: center; align-items: center; z-index: 99; } .module-error-modal__button-container { margin-top: 10px; display: flex; flex-direction: row; justify-content: flex-end; } .module-button__small { font-size: 13px; line-height: 18px; letter-spacing: -0.03px; } .module-button__small { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-button__small { border: 1px solid WindowText; } } .keyboard-mode .module-button__small:focus { box-shadow: 0px 0px 0px 2px #2c6bed; } .module-button__small { color: #1b1b1b; border-color: #dedede; } .dark-theme .module-button__small { color: #e9e9e9; border-color: #4a4a4a; } .module-button__small { border-radius: 4px; border-style: solid; border-width: 1px; outline: none; padding-block: 7px; padding-inline: 12px; } .module-tooltip { --tooltip-text-color: #3b3b3b; --tooltip-background-color: #f6f6f6; } .module-tooltip--dark-theme { --tooltip-text-color: #e9e9e9; --tooltip-background-color: #4a4a4a; } .dark-theme .module-tooltip { --tooltip-text-color: #e9e9e9; --tooltip-background-color: #4a4a4a; } .module-tooltip { background-color: var(--tooltip-background-color); border-radius: 8px; color: var(--tooltip-text-color); display: inline-block; padding-block: 8px; padding-inline: 21px; position: fixed; text-align: center; z-index: 150; } .module-tooltip .module-tooltip-arrow { position: absolute; /* stylelint-disable-next-line declaration-property-value-disallowed-list */ direction: ltr; } .module-tooltip .module-tooltip-arrow::after { border: solid 6px transparent; content: ""; display: block; height: 0; /* stylelint-disable-next-line liberty/use-logical-spec */ margin-left: -6px; margin-top: -6px; position: absolute; width: 0; } .module-tooltip[data-placement=top] .module-tooltip-arrow { bottom: 0; } .module-tooltip[data-placement=top] .module-tooltip-arrow::after { bottom: -12px; border-top-color: var(--tooltip-background-color); } .module-tooltip[data-placement=right] .module-tooltip-arrow { /* stylelint-disable-next-line liberty/use-logical-spec */ left: 0; } .module-tooltip[data-placement=right] .module-tooltip-arrow::after { /* stylelint-disable-next-line liberty/use-logical-spec */ left: -6px; /* stylelint-disable-next-line liberty/use-logical-spec */ border-right-color: var(--tooltip-background-color); } .module-tooltip[data-placement=bottom] .module-tooltip-arrow { top: 0; } .module-tooltip[data-placement=bottom] .module-tooltip-arrow::after { top: -6px; border-bottom-color: var(--tooltip-background-color); } .module-tooltip[data-placement=left] .module-tooltip-arrow { /* stylelint-disable-next-line liberty/use-logical-spec */ right: 0; } .module-tooltip[data-placement=left] .module-tooltip-arrow::after { /* stylelint-disable-next-line liberty/use-logical-spec */ right: -12px; /* stylelint-disable-next-line liberty/use-logical-spec */ border-left-color: var(--tooltip-background-color); } .module-chat-session-refreshed-dialog__image { text-align: center; } .module-chat-session-refreshed-dialog__title { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; margin-top: 10px; margin-bottom: 3px; } .module-delivery-issue-dialog__image { text-align: center; } .module-delivery-issue-dialog__title { font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; margin-top: 10px; margin-bottom: 3px; } .module-message__container { max-width: 100%; } .module-message__container--incoming { align-self: flex-start; } .module-message__container--outgoing { align-self: flex-end; } .module-message__container--with-reactions { margin-bottom: -6px; } .module-message__container--deleted-for-everyone { font-style: italic; } .module-message__container--sticker-like { overflow: initial; } .module-message__context--icon::before { content: " "; display: inline-block; height: 16px; margin-inline-end: 8px; width: 16px; vertical-align: middle; } .module-message__context__copy-timestamp::before { -webkit-mask: url("../images/icons/v3/copy/copy-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #000000; } @media (forced-colors: active) { .module-message__context__copy-timestamp::before { background-color: WindowText; } } .dark-theme .module-message__context__copy-timestamp::before { -webkit-mask: url("../images/icons/v3/copy/copy-compact.svg") no-repeat center; -webkit-mask-size: 100%; background-color: #dedede; } @media (forced-colors: active) { .dark-theme .module-message__context__copy-timestamp::before { background-color: WindowText; } } .module-message__action { background: none; color: inherit; border: none; padding: 0; margin: 0; font: inherit; cursor: pointer; outline: inherit; text-align: inherit; } @media (forced-colors: active) { .module-message__action { border: 1px solid WindowText; } } .module-message__action { border-radius: 30px; margin-top: 14px; margin-bottom: 4px; padding: 8px; text-align: center; width: 100%; font-size: 14px; line-height: 20px; letter-spacing: -0.08px; font-weight: 600; } .module-message__action--outgoing { color: #ffffff; background-color: rgba(255, 255, 255, 0.22); } .module-message__action--outgoing:hover { background-color: rgba(255, 255, 255, 0.36); } .module-message__action--outgoing--in-another-call { color: rgba(255, 255, 255, 0.5); } .module-message__action--incoming { color: #315ff4; background-color: rgba(255, 255, 255, 0.7); } .module-message__action--incoming:hover { background-color: #ffffff; } .dark-theme .module-message__action--incoming { color: #ffffff; background-color: rgba(255, 255, 255, 0.07); } .dark-theme .module-message__action--incoming:hover { background-color: rgba(255, 255, 255, 0.17); } .module-message__action--incoming--in-another-call { color: rgba(49, 95, 244, 0.5); } .dark-theme .module-message__action--incoming--in-another-call { color: rgba(255, 255, 255, 0.5); } .module-message__link-preview__call-link-icon { display: flex; align-items: center; justify-content: center; margin-inline-end: 12px; margin-top: 4px; margin-bottom: 4px; } body { --zoom-factor: 1; --title-bar-drag-area-height: 0px; } body.os-macos:not(.full-screen), body .app-loading-screen--before-app-load { --title-bar-drag-area-height: calc(28px / var(--zoom-factor)); } /*# sourceMappingURL=manifest_bridge.css.map */ /** * Copyright 2026 Signal Messenger, LLC * SPDX-License-Identifier: AGPL-3.0-only */ @import 'tailwindcss' source(none); @import './tailwind-plugins/animate-general.css'; @import './tailwind-plugins/animate-enter-exit.css'; @import './tailwind-plugins/scrollbar.css'; @import './tailwind-plugins/superellipse.css'; @import '../ts/axo/_styles.css'; @source "../ts"; @source "../test"; @source "../.storybook"; @source "../*.{html,js}"; /** * Custom Variants * ---------------------------------------------------------------------------- */ @custom-variant dark (&:where(.dark-theme, .dark-theme *)); @custom-variant hovered (&:where(:hover:not(:disabled))); @custom-variant pressed (&:where(:active:not(:disabled))); @custom-variant focused (:where(.keyboard-mode) &:where(:focus)); /** * Color * ---------------------------------------------------------------------------- */ /* prettier-ignore */ @theme { --color-*: initial; /* reset defaults */ --color-transparent: transparent; /* Colors/Labels */ --color-label-primary: light-dark(--alpha(#000 / 85%), --alpha(#FFF / 85%)); --color-label-secondary: light-dark(--alpha(#000 / 55%), --alpha(#FFF / 55%)); --color-label-placeholder: light-dark(--alpha(#000 / 30%), --alpha(#FFF / 30%)); --color-label-disabled: light-dark(--alpha(#000 / 20%), --alpha(#FFF / 20%)); --color-label-primary-inverted: light-dark(--alpha(#FFF / 85%), /* */ #000 /* */); --color-label-secondary-inverted: light-dark(--alpha(#FFF / 55%), --alpha(#000 / 55%)); --color-label-placeholder-inverted: light-dark(--alpha(#FFF / 30%), --alpha(#000 / 30%)); --color-label-disabled-inverted: light-dark(--alpha(#FFF / 20%), --alpha(#000 / 20%)); --color-label-primary-on-color: light-dark(/* */ #FFF /* */, --alpha(#FFF / 90%)); --color-label-secondary-on-color: light-dark(--alpha(#FFF / 80%), --alpha(#FFF / 70%)); --color-label-placeholder-on-color: light-dark(--alpha(#FFF / 45%), --alpha(#FFF / 45%)); --color-label-disabled-on-color: light-dark(--alpha(#FFF / 35%), --alpha(#FFF / 30%)); /* Colors/Color Label */ --color-color-label-primary: light-dark(/* */ #030FFC /* */, /* */ #99A1FF /* */); --color-color-label-primary-disabled: light-dark(--alpha(#030FFC / 25%), --alpha(#99A1FF / 25%)); --color-color-label-light: light-dark(/* */ #99A1FF /* */, /* */ #99A1FF /* */); --color-color-label-light-disabled: light-dark(--alpha(#99A1FF / 25%), --alpha(#99A1FF / 25%)); --color-color-label-affirmative: light-dark(/* */ #00AD17 /* */, /* */ #30D150 /* */); --color-color-label-affirmative-disabled: light-dark(--alpha(#00AD17 / 25%), --alpha(#30D150 / 25%)); --color-color-label-destructive: light-dark(/* */ #F21602 /* */, /* */ #FF4A3A /* */); --color-color-label-destructive-disabled: light-dark(--alpha(#F21602 / 25%), --alpha(#FF4A3A / 25%)); /* Colors/Background */ --color-background-primary: light-dark(/* */ #FFFFFF /* */, /* */ #1A1A1A /* */); --color-background-secondary: light-dark(/* */ #F6F6F6 /* */, /* */ #262626 /* */); --color-background-overlay: light-dark(--alpha(#000000 / 20%), --alpha(#000000 / 40%)); /* Colors/Elevated Background */ --color-elevated-background-primary: light-dark(#FAFAFA, #2A2A2A); --color-elevated-background-secondary: light-dark(#F2F2F2, #323232); --color-elevated-background-tertiary: light-dark(#EAEAEA, #3A3A3A); --color-elevated-background-quaternary: light-dark(#2A2A2A, #424242); /* Colors/Fill */ --color-fill-primary: light-dark(/* */ #FFFFFF /* */, --alpha(#808080 / 20%)); --color-fill-primary-pressed: light-dark(/* */ #F6F6F6 /* */, --alpha(#808080 / 28%)); --color-fill-secondary: light-dark(--alpha(#808080 / 12%), --alpha(#808080 / 20%)); --color-fill-secondary-pressed: light-dark(--alpha(#808080 / 20%), --alpha(#808080 / 28%)); --color-fill-selected: light-dark(--alpha(#808080 / 25%), --alpha(#808080 / 32%)); --color-fill-inverted: light-dark(/* */ #424242 /* */, /* */ #DEDEDE /* */); --color-fill-inverted-pressed: light-dark(/* */ #4E4E4E /* */, /* */ #CACACA /* */); --color-fill-floating: light-dark(/* */ #FFFFFF /* */, /* */ #2A2A2A /* */); --color-fill-floating-pressed: light-dark(/* */ #F6F6F6 /* */, /* */ #323232 /* */); --color-fill-on-media: light-dark(--alpha(#000000 / 75%), --alpha(#000000 / 75%)); --color-fill-on-media-pressed: light-dark(--alpha(#000000 / 83%), --alpha(#000000 / 83%)); /* Colors/Message Fill */ --color-message-fill-incoming-primary: light-dark(/* */ #EAEAEA /* */, /* */ #3A3A3A /* */); --color-message-fill-incoming-secondary: light-dark(--alpha(#FFFFFF / 80%), --alpha(#FFFFFF / 20%)); --color-message-fill-incoming-tertiary: light-dark(--alpha(#FFFFFF / 60%), --alpha(#FFFFFF / 12%)); --color-message-fill-outgoing-primary: light-dark(/* */ #2267F5 /* */, /* */ #2267F5 /* */); --color-message-fill-outgoing-secondary: light-dark(--alpha(#FFFFFF / 60%), --alpha(#FFFFFF / 60%)); --color-message-fill-outgoing-tertiary: light-dark(--alpha(#FFFFFF / 20%), --alpha(#FFFFFF / 20%)); /* Colors/Color Fill */ --color-color-fill-primary: light-dark(#4655FF, #5563FF); --color-color-fill-primary-pressed: light-dark(#3B4AF4, #4856F2); --color-color-fill-affirmative: light-dark(#02C028, #02C529); --color-color-fill-affirmative-pressed: light-dark(#00B324, #00B725); --color-color-fill-warning: light-dark(#FFCC00, #FFD60A); --color-color-fill-warning-pressed: light-dark(#FFCC00, #F1C900); --color-color-fill-destructive: light-dark(#FD2512, #FB4332); --color-color-fill-destructive-pressed: light-dark(#EB1300, #E93120); /* Colors/Border */ --color-border-primary: light-dark(--alpha(#000000 / 16%), --alpha(#FFFFFF / 16%)); --color-border-secondary: light-dark(--alpha(#000000 / 08%), --alpha(#FFFFFF / 08%)); --color-border-focused: light-dark(/* */ #C1C7FE /* */, /* */ #C1C7FE /* */); --color-border-selected: light-dark(/* */ #4655FF /* */, /* */ #5563FF /* */); --color-border-selected-on-color: light-dark(/* */ #FFFFFF /* */, --alpha(#FFFFFF / 90%)); --color-border-error: light-dark(/* */ #FD2512 /* */, /* */ #FB4332 /* */); /* Colors/Shadow */ --color-shadow-elevation-1: light-dark(--alpha(#000 / 08%), --alpha(#000 / 16%)); --color-shadow-elevation-2: light-dark(--alpha(#000 / 08%), --alpha(#000 / 16%)); --color-shadow-elevation-3: light-dark(--alpha(#000 / 10%), --alpha(#000 / 20%)); --color-shadow-elevation-4: light-dark(--alpha(#000 / 12%), --alpha(#000 / 24%)); --color-shadow-elevation-5: light-dark(--alpha(#000 / 20%), --alpha(#000 / 40%)); --color-shadow-outline: light-dark(--alpha(#000 / 12%), /* */ transparent); --color-shadow-highlight: light-dark(/* */ transparent, --alpha(#FFF / 08%)); /** * Colors/Legacy * ------------- * These should all eventually be removed, but in places where we need new * components to specifically match the colors of older components, we can * add them here. */ --color-legacy-conversation-header-bg: light-dark(#fff, #121212); } @layer theme { /* High Contrast Mode */ /* prettier-ignore */ @media (prefers-contrast: more) { :root { /* Colors/Labels */ --color-label-primary: light-dark(/* */ #000 /* */, /* */ #FFF /* */); --color-label-secondary: light-dark(--alpha(#000 / 70%), --alpha(#FFF / 70%)); --color-label-placeholder: light-dark(--alpha(#000 / 50%), --alpha(#FFF / 50%)); --color-label-disabled: light-dark(--alpha(#000 / 40%), --alpha(#FFF / 40%)); --color-label-primary-inverted: light-dark(/* */ #FFF /* */, /* */ #000 /* */); --color-label-secondary-inverted: light-dark(--alpha(#FFF / 70%), --alpha(#000 / 70%)); --color-label-placeholder-inverted: light-dark(--alpha(#FFF / 50%), --alpha(#000 / 50%)); --color-label-disabled-inverted: light-dark(--alpha(#FFF / 40%), --alpha(#000 / 40%)); --color-label-primary-on-color: light-dark(/* */ #FFF /* */, /* */ #FFF /* */); --color-label-secondary-on-color: light-dark(--alpha(#FFF / 90%), --alpha(#FFF / 90%)); --color-label-placeholder-on-color: light-dark(--alpha(#FFF / 60%), --alpha(#FFF / 60%)); --color-label-disabled-on-color: light-dark(--alpha(#FFF / 50%), --alpha(#FFF / 50%)); /* Colors/Color Label */ --color-color-label-primary: light-dark(/* */ #000ECC /* */, /* */ #D5D9FF /* */); --color-color-label-primary-disabled: light-dark(--alpha(#000ECC / 40%), --alpha(#D5D9FF / 40%)); --color-color-label-light: light-dark(/* */ #D5D9FF /* */, /* */ #D5D9FF /* */); --color-color-label-light-disabled: light-dark(--alpha(#D5D9FF / 40%), --alpha(#D5D9FF / 40%)); --color-color-label-affirmative: light-dark(/* */ #004D0F /* */, /* */ #4CEF6D /* */); --color-color-label-affirmative-disabled: light-dark(--alpha(#004D0F / 40%), --alpha(#4CEF6D / 40%)); --color-color-label-destructive: light-dark(/* */ #8A0B00 /* */, /* */ #FFC5C2 /* */); --color-color-label-destructive-disabled: light-dark(--alpha(#8A0B00 / 40%), --alpha(#FFC5C2 / 40%)); /* Colors/Background */ --color-background-primary: light-dark(/* */ #FFFFFF /* */, /* */ #121212 /* */); --color-background-secondary: light-dark(/* */ #F6F6F6 /* */, /* */ #1E1E1E /* */); --color-background-overlay: light-dark(--alpha(#000000 / 40%), --alpha(#000000 / 60%)); /* Colors/Elevated Background */ --color-elevated-background-primary: light-dark(#FFFFFF, #222222); --color-elevated-background-secondary: light-dark(#F2F2F2, #2A2A2A); --color-elevated-background-tertiary: light-dark(#EAEAEA, #323232); --color-elevated-background-quaternary: light-dark(#262626, #3A3A3A); /* Colors/Fill */ --color-fill-primary: light-dark(/* */ #FFFFFF /* */, --alpha(#808080 / 30%)); --color-fill-primary-pressed: light-dark(/* */ #EAEAEA /* */, --alpha(#808080 / 38%)); --color-fill-secondary: light-dark(--alpha(#808080 / 22%), --alpha(#808080 / 30%)); --color-fill-secondary-pressed: light-dark(--alpha(#808080 / 30%), --alpha(#808080 / 38%)); --color-fill-selected: light-dark(--alpha(#808080 / 34%), --alpha(#808080 / 42%)); --color-fill-inverted: light-dark(/* */ #2A2A2A /* */, /* */ #F6F6F6 /* */); --color-fill-inverted-pressed: light-dark(/* */ #363636 /* */, /* */ #E2E2E2 /* */); --color-fill-floating: light-dark(/* */ #FFFFFF /* */, /* */ #323232 /* */); --color-fill-floating-pressed: light-dark(/* */ #EAEAEA /* */, /* */ #3A3A3A /* */); --color-fill-on-media: light-dark(--alpha(#000000 / 85%), --alpha(#000000 / 85%)); --color-fill-on-media-pressed: light-dark(--alpha(#000000 / 93%), --alpha(#000000 / 93%)); /* Colors/Message Fill */ --color-message-fill-incoming-primary: light-dark(/* */ #E0E0E0 /* */, /* */ #424242 /* */); --color-message-fill-incoming-secondary: light-dark(--alpha(#FFFFFF / 90%), --alpha(#FFFFFF / 30%)); --color-message-fill-incoming-tertiary: light-dark(--alpha(#FFFFFF / 70%), --alpha(#FFFFFF / 22%)); --color-message-fill-outgoing-primary: light-dark(/* */ #0842B9 /* */, /* */ #0842B9 /* */); --color-message-fill-outgoing-secondary: light-dark(--alpha(#FFFFFF / 70%), --alpha(#FFFFFF / 70%)); --color-message-fill-outgoing-tertiary: light-dark(--alpha(#FFFFFF / 30%), --alpha(#FFFFFF / 30%)); /* Colors/Color Fill */ --color-color-fill-primary: light-dark(#2B3BED, #2B3BED); --color-color-fill-primary-pressed: light-dark(#1E2EE0, #1E2EE0); --color-color-fill-affirmative: light-dark(#1D7A2F, #1D7A2F); --color-color-fill-affirmative-pressed: light-dark(#115E23, #116E23); --color-color-fill-warning: light-dark(#F0C000, #F0C000); --color-color-fill-warning-pressed: light-dark(#E4B600, #E4B600); --color-color-fill-destructive: light-dark(#B7271A, #B7271A); --color-color-fill-destructive-pressed: light-dark(#A61609, #A61609); /* Colors/Border */ --color-border-primary: light-dark(--alpha(#000000 / 32%), --alpha(#FFFFFF / 32%)); --color-border-secondary: light-dark(--alpha(#000000 / 16%), --alpha(#FFFFFF / 16%)); --color-border-focused: light-dark(/* */ #A0A7FE /* */, /* */ #A0A7FE /* */); --color-border-selected: light-dark(/* */ #2B3BED /* */, /* */ #5563FF /* */); --color-border-selected-on-color: light-dark(/* */ #FFFFFF /* */, /* */ #FFFFFF /* */); --color-border-error: light-dark(/* */ #B7271A /* */, /* */ #FB4332 /* */); /* Colors/Shadow */ --color-shadow-elevation-1: light-dark(--alpha(#000 / 08%), --alpha(#000 / 16%)); --color-shadow-elevation-2: light-dark(--alpha(#000 / 08%), --alpha(#000 / 16%)); --color-shadow-elevation-3: light-dark(--alpha(#000 / 10%), --alpha(#000 / 20%)); --color-shadow-elevation-4: light-dark(--alpha(#000 / 12%), --alpha(#000 / 24%)); --color-shadow-elevation-5: light-dark(--alpha(#000 / 20%), --alpha(#000 / 40%)); --color-shadow-outline: light-dark(--alpha(#000 / 32%), /* */ transparent); --color-shadow-highlight: light-dark(/* */ transparent, --alpha(#FFF / 32%)); } } } /** * Font Family * ---------------------------------------------------------------------------- */ @theme { --font-*: initial; /* reset defaults */ /* Note: --font-sans also has language */ --font-sans: Inter, 'Source Sans Pro', 'Source Han Sans', -apple-system, system-ui, 'Segoe UI', 'Noto Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; /* Note: This font-family is checked for in matchMonospace, to support paste scenarios */ --font-mono: 'SF Mono', SFMono-Regular, ui-monospace, 'DejaVu Sans Mono', Menlo, Consolas, monospace; --font-symbols: 'SignalSymbols'; } @font-face { font-family: 'SignalSymbols'; font-style: normal; font-weight: 300 400 700; font-display: block; src: url('../fonts/signal-symbols/SignalSymbolsVariable.woff2'); } @layer base { /* Japanese */ :lang(ja) { --font-sans: Inter, 'SF Pro', 'SF Pro JP', 'BIZ UDGothic', 'Hiragino Kaku Gothic Pro', 'ヒラギノ角ゴ Pro W3', メイリオ, Meiryo, 'MS Pゴシック', 'Helvetica Neue', Helvetica, Arial, sans-serif; } /* Farsi (Persian) */ :lang(fa) { --font-sans: 'Vazirmatn', -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Tahoma, 'Noto Sans Arabic', Helvetica, Arial, sans-serif; } /* Urdu */ :lang(ur) { --font-sans: 'Noto Nastaliq Urdu', Gulzar, 'Jameel Noori Nastaleeq', 'Faiz Lahori Nastaleeq', 'Urdu Typesetting', Helvetica, Arial, sans-serif; } } /** * Typography * ---------------------------------------------------------------------------- * Should prefer to use the `type-*` utility when possible. */ @theme { /* text-size */ --text-*: initial; /* reset defaults */ --type-text-title-large: 1.5rem /* 24px */; --type-text-title-medium: 1.125rem /* 18px */; --type-text-title-small: 0.875rem /* 14px */; --type-text-body-large: 0.875rem /* 14px */; --type-text-body-medium: 0.8125rem /* 13px */; --type-text-body-small: 0.75rem /* 12px */; --type-text-caption: 0.6875rem /* 11px */; /* font-weight */ --font-weight-*: initial; /* reset defaults */ --font-weight-semibold: 600; --font-weight-medium: 500; --font-weight-regular: 400; --font-weight-light: 300; --type-font-weight-title-large: var(--font-weight-semibold); --type-font-weight-title-medium: var(--font-weight-semibold); --type-font-weight-title-small: var(--font-weight-semibold); --type-font-weight-body-large: var(--font-weight-regular); --type-font-weight-body-medium: var(--font-weight-regular); --type-font-weight-body-small: var(--font-weight-regular); --type-font-weight-caption: var(--font-weight-regular); /* letter-spacing */ --tracking-*: initial; /* reset defaults */ --type-tracking-title-large: -0.019em /* (@ 24px) -0.46px */; --type-tracking-title-medium: -0.014em /* (@ 18px) -0.25px */; --type-tracking-title-small: -0.006em /* (@ 14px) -0.08px */; --type-tracking-body-large: -0.006em /* (@ 14px) -0.08px */; --type-tracking-body-medium: -0.003em /* (@ 13px) -0.04px */; --type-tracking-body-small: 0em /* (@ 12px) 0px */; --type-tracking-caption: 0.005em /* (@ 11px) 0.05px */; /* line-height */ --leading-*: initial; /* reset defaults */ --leading-none: 1; --type-leading-title-large: 2rem /* 32px */; --type-leading-title-medium: 1.5rem /* 24px */; --type-leading-title-small: 1.25rem /* 20px */; --type-leading-body-large: 1.25rem /* 20px */; --type-leading-body-medium: 1.125rem /* 18px */; --type-leading-body-small: 1rem /* 16px */; --type-leading-caption: 0.875rem /* 14px */; } /* prettier-ignore */ @utility type-* { font-size: --value(--type-text-*); font-weight: --value(--type-font-weight-*); letter-spacing: --value(--type-tracking-*); line-height: --value(--type-leading-*); } /** * Shadow * ---------------------------------------------------------------------------- */ /* prettier-ignore */ @theme { /* shared shadow styles */ --base-shadow-outline: inset 0 0 0 0.5px var(--color-shadow-highlight), 0 0 0 0.5px var(--color-shadow-outline); --base-shadow-elevation-0: 0 1px 2px 0 var(--color-shadow-elevation-1); --base-shadow-elevation-1: 0 2px 8px 0 var(--color-shadow-elevation-2); --base-shadow-elevation-2: 0 4px 12px 0 var(--color-shadow-elevation-3); --base-shadow-elevation-3: 0 6px 16px 0 var(--color-shadow-elevation-4); --base-shadow-elevation-4: 0 12px 56px 0 var(--color-shadow-elevation-5); /* box-shadow */ --shadow-*: initial; /* reset defaults */ /* Note: Use 'shadow-no-outline' to remove the outline/highlight shadows */ --shadow-elevation-0: var(--axo-shadow-no-outline, var(--base-shadow-outline)), var(--base-shadow-elevation-0); --shadow-elevation-1: var(--axo-shadow-no-outline, var(--base-shadow-outline)), var(--base-shadow-elevation-1); --shadow-elevation-2: var(--axo-shadow-no-outline, var(--base-shadow-outline)), var(--base-shadow-elevation-2); --shadow-elevation-3: var(--axo-shadow-no-outline, var(--base-shadow-outline)), var(--base-shadow-elevation-3); --shadow-elevation-4: var(--axo-shadow-no-outline, var(--base-shadow-outline)), var(--base-shadow-elevation-4); /* box-shadow: inset */ --inset-shadow-*: initial; /* reset defaults */ --inset-shadow-on-color: inset 0 0.5px 1px 0 --alpha(#000 / 12%); /* filter: drop-shadow() */ --drop-shadow-*: initial; /* reset defaults */ /* Note: Use 'drop-shadow-no-outline' to remove the outline/highlight shadows */ --drop-shadow-elevation-0: var(--axo-drop-shadow-no-outline, var(--base-shadow-outline)), var(--shadow-elevation-0); --drop-shadow-elevation-1: var(--axo-drop-shadow-no-outline, var(--base-shadow-outline)), var(--shadow-elevation-1); --drop-shadow-elevation-2: var(--axo-drop-shadow-no-outline, var(--base-shadow-outline)), var(--shadow-elevation-2); --drop-shadow-elevation-3: var(--axo-drop-shadow-no-outline, var(--base-shadow-outline)), var(--shadow-elevation-3); --drop-shadow-elevation-4: var(--axo-drop-shadow-no-outline, var(--base-shadow-outline)), var(--shadow-elevation-4); } @property --axo-shadow-no-outline { syntax: '*'; inherits: false; } @property --axo-drop-shadow-no-outline { syntax: '*'; inherits: false; } @utility shadow-no-outline { --axo-shadow-no-outline: 0 0 #0000; /* invisible shadow */ } @utility drop-shadow-no-outline { --axo-drop-shadow-outline: 0 0 #0000; /* invisible shadow */ } /** * Blur * ---------------------------------------------------------------------------- */ @theme { /* filter/backdrop-filter: blur() */ --blur-*: initial; /* reset defaults */ --blur-thin: 10px; --blur-regular: 40px; --blur-thick: 80px; } /** * Easing * ---------------------------------------------------------------------------- */ @theme { --ease-*: initial; /* reset defaults */ --ease-in-cubic: cubic-bezier(0.32, 0, 0.67, 0); --ease-out-cubic: cubic-bezier(0.33, 1, 0.68, 1); --east-in-out-cubic: cubic-bezier(0.65, 0, 0.35, 1); } /** * Transitions * ---------------------------------------------------------------------------- */ @theme { --default-transition-duration: 120ms; --default-transition-timing-function: var(--ease-out-cubic); } /** * Animations * ---------------------------------------------------------------------------- */ @theme { --default-animation-duration: 120ms; --default-animation-timing-function: var(--ease-out-cubic); --animate-*: initial; /* reset defaults */ --animate-spinner-v2-rotate: animate-spinner-v2-rotate 2s linear infinite; --animate-spinner-v2-dash: animate-spinner-v2-dash 1.5s ease-in-out infinite; } @layer base { @keyframes animate-spinner-v2-rotate { 0% { transform: rotate(-180deg); } 100% { transform: rotate(180deg); } } @keyframes animate-spinner-v2-dash { 0% { stroke-dasharray: 2%, 300%; stroke-dashoffset: 0; } 50% { stroke-dasharray: 180%, 300%; stroke-dashoffset: -70%; } 100% { stroke-dasharray: 180%, 300%; stroke-dashoffset: -248%; } } } @property --axo-select-trigger-mask-start { syntax: ''; inherits: false; initial-value: transparent; } /** * Scrollbars */ @theme { --default-scrollbar-width: thin; --default-scrollbar-track: transparent; --default-scrollbar-thumb: var(--color-label-placeholder); } /** * Legacy z-index values * Keep in sync with $z-index-* variables in stylesheets/_variables.scss */ @theme { /* General */ --legacy-z-index-negative: -1; --legacy-z-index-base: 1; --legacy-z-index-above-base: 2; --legacy-z-index-above-above-base: 3; --legacy-z-index-megaphone: 75; --legacy-z-index-popup-overlay: 99; --legacy-z-index-popup: 100; --legacy-z-index-context-menu: 125; --legacy-z-index-tooltip: 150; --legacy-z-index-toast: 200; --legacy-z-index-on-top-of-everything: 9000; --legacy-z-index-window-controls: 10000; /* Component specific */ --legacy-z-index-story-meta: 3; --legacy-z-index-scroll-down-button: 10; --legacy-z-index-stories: 98; --legacy-z-index-calling-container: 100; --legacy-z-index-calling: 101; --legacy-z-index-modal-host: 102; --legacy-z-index-above-popup: 103; --legacy-z-index-calling-pip: 104; --legacy-z-index-above-context-menu: 126; } @utility legacy-z-index-* { z-index: --value(--legacy-z-index-*); } /*! tailwindcss v4.1.7 | MIT License | https://tailwindcss.com */ @layer properties; @layer theme, base, components, utilities; @layer theme { :root, :host { --spacing: 0.25rem; --container-4xl: 56rem; --radius-xs: 0.125rem; --radius-sm: 0.25rem; --radius-md: 0.375rem; --radius-lg: 0.5rem; --radius-xl: 0.75rem; --radius-2xl: 1rem; --radius-3xl: 1.5rem; --default-transition-duration: 120ms; --default-transition-timing-function: var(--ease-out-cubic); --default-font-family: var(--font-sans); --default-mono-font-family: var(--font-mono); --default-animation-duration: 120ms; --default-animation-timing-function: var(--ease-out-cubic); --default-scrollbar-width: thin; --default-scrollbar-track: transparent; --default-scrollbar-thumb: var(--color-label-placeholder); --color-transparent: transparent; --color-label-primary: light-dark(color-mix(in oklab, #000 85%, transparent), color-mix(in oklab, #FFF 85%, transparent)); --color-label-secondary: light-dark(color-mix(in oklab, #000 55%, transparent), color-mix(in oklab, #FFF 55%, transparent)); --color-label-placeholder: light-dark(color-mix(in oklab, #000 30%, transparent), color-mix(in oklab, #FFF 30%, transparent)); --color-label-disabled: light-dark(color-mix(in oklab, #000 20%, transparent), color-mix(in oklab, #FFF 20%, transparent)); --color-label-primary-inverted: light-dark(color-mix(in oklab, #FFF 85%, transparent), /* */ #000 /* */); --color-label-disabled-inverted: light-dark(color-mix(in oklab, #FFF 20%, transparent), color-mix(in oklab, #000 20%, transparent)); --color-label-primary-on-color: light-dark(/* */ #FFF /* */, color-mix(in oklab, #FFF 90%, transparent)); --color-label-secondary-on-color: light-dark(color-mix(in oklab, #FFF 80%, transparent), color-mix(in oklab, #FFF 70%, transparent)); --color-label-disabled-on-color: light-dark(color-mix(in oklab, #FFF 35%, transparent), color-mix(in oklab, #FFF 30%, transparent)); --color-color-label-primary: light-dark(/* */ #030FFC /* */, /* */ #99A1FF /* */); --color-color-label-primary-disabled: light-dark(color-mix(in oklab, #030FFC 25%, transparent), color-mix(in oklab, #99A1FF 25%, transparent)); --color-color-label-light: light-dark(/* */ #99A1FF /* */, /* */ #99A1FF /* */); --color-color-label-light-disabled: light-dark(color-mix(in oklab, #99A1FF 25%, transparent), color-mix(in oklab, #99A1FF 25%, transparent)); --color-color-label-affirmative: light-dark(/* */ #00AD17 /* */, /* */ #30D150 /* */); --color-color-label-affirmative-disabled: light-dark(color-mix(in oklab, #00AD17 25%, transparent), color-mix(in oklab, #30D150 25%, transparent)); --color-color-label-destructive: light-dark(/* */ #F21602 /* */, /* */ #FF4A3A /* */); --color-color-label-destructive-disabled: light-dark(color-mix(in oklab, #F21602 25%, transparent), color-mix(in oklab, #FF4A3A 25%, transparent)); --color-background-primary: light-dark(/* */ #FFFFFF /* */, /* */ #1A1A1A /* */); --color-background-secondary: light-dark(/* */ #F6F6F6 /* */, /* */ #262626 /* */); --color-background-overlay: light-dark(color-mix(in oklab, #000000 20%, transparent), color-mix(in oklab, #000000 40%, transparent)); --color-elevated-background-primary: light-dark(#FAFAFA, #2A2A2A); --color-elevated-background-secondary: light-dark(#F2F2F2, #323232); --color-elevated-background-tertiary: light-dark(#EAEAEA, #3A3A3A); --color-elevated-background-quaternary: light-dark(#2A2A2A, #424242); --color-fill-primary: light-dark(/* */ #FFFFFF /* */, color-mix(in oklab, #808080 20%, transparent)); --color-fill-primary-pressed: light-dark(/* */ #F6F6F6 /* */, color-mix(in oklab, #808080 28%, transparent)); --color-fill-secondary: light-dark(color-mix(in oklab, #808080 12%, transparent), color-mix(in oklab, #808080 20%, transparent)); --color-fill-secondary-pressed: light-dark(color-mix(in oklab, #808080 20%, transparent), color-mix(in oklab, #808080 28%, transparent)); --color-fill-selected: light-dark(color-mix(in oklab, #808080 25%, transparent), color-mix(in oklab, #808080 32%, transparent)); --color-fill-inverted: light-dark(/* */ #424242 /* */, /* */ #DEDEDE /* */); --color-fill-inverted-pressed: light-dark(/* */ #4E4E4E /* */, /* */ #CACACA /* */); --color-fill-floating: light-dark(/* */ #FFFFFF /* */, /* */ #2A2A2A /* */); --color-fill-floating-pressed: light-dark(/* */ #F6F6F6 /* */, /* */ #323232 /* */); --color-fill-on-media: light-dark(color-mix(in oklab, #000000 75%, transparent), color-mix(in oklab, #000000 75%, transparent)); --color-message-fill-outgoing-tertiary: light-dark(color-mix(in oklab, #FFFFFF 20%, transparent), color-mix(in oklab, #FFFFFF 20%, transparent)); --color-color-fill-primary: light-dark(#4655FF, #5563FF); --color-color-fill-primary-pressed: light-dark(#3B4AF4, #4856F2); --color-color-fill-affirmative: light-dark(#02C028, #02C529); --color-color-fill-affirmative-pressed: light-dark(#00B324, #00B725); --color-color-fill-destructive: light-dark(#FD2512, #FB4332); --color-color-fill-destructive-pressed: light-dark(#EB1300, #E93120); --color-border-primary: light-dark(color-mix(in oklab, #000000 16%, transparent), color-mix(in oklab, #FFFFFF 16%, transparent)); --color-border-secondary: light-dark(color-mix(in oklab, #000000 08%, transparent), color-mix(in oklab, #FFFFFF 08%, transparent)); --color-border-focused: light-dark(/* */ #C1C7FE /* */, /* */ #C1C7FE /* */); --color-border-selected: light-dark(/* */ #4655FF /* */, /* */ #5563FF /* */); --color-border-error: light-dark(/* */ #FD2512 /* */, /* */ #FB4332 /* */); --color-shadow-elevation-1: light-dark(color-mix(in oklab, #000 08%, transparent), color-mix(in oklab, #000 16%, transparent)); --color-shadow-elevation-2: light-dark(color-mix(in oklab, #000 08%, transparent), color-mix(in oklab, #000 16%, transparent)); --color-shadow-elevation-3: light-dark(color-mix(in oklab, #000 10%, transparent), color-mix(in oklab, #000 20%, transparent)); --color-shadow-elevation-4: light-dark(color-mix(in oklab, #000 12%, transparent), color-mix(in oklab, #000 24%, transparent)); --color-shadow-outline: light-dark(color-mix(in oklab, #000 12%, transparent), /* */ transparent); --color-shadow-highlight: light-dark(/* */ transparent, color-mix(in oklab, #FFF 08%, transparent)); --color-legacy-conversation-header-bg: light-dark(#fff, #121212); --font-sans: Inter, 'Source Sans Pro', 'Source Han Sans', -apple-system, system-ui, 'Segoe UI', 'Noto Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; --font-mono: 'SF Mono', SFMono-Regular, ui-monospace, 'DejaVu Sans Mono', Menlo, Consolas, monospace; --font-symbols: 'SignalSymbols'; --type-text-title-large: 1.5rem /* 24px */; --type-text-title-medium: 1.125rem /* 18px */; --type-text-title-small: 0.875rem /* 14px */; --type-text-body-large: 0.875rem /* 14px */; --type-text-body-medium: 0.8125rem /* 13px */; --type-text-body-small: 0.75rem /* 12px */; --type-text-caption: 0.6875rem /* 11px */; --font-weight-semibold: 600; --font-weight-medium: 500; --font-weight-regular: 400; --font-weight-light: 300; --type-font-weight-title-large: var(--font-weight-semibold); --type-font-weight-title-medium: var(--font-weight-semibold); --type-font-weight-title-small: var(--font-weight-semibold); --type-font-weight-body-large: var(--font-weight-regular); --type-font-weight-body-medium: var(--font-weight-regular); --type-font-weight-body-small: var(--font-weight-regular); --type-font-weight-caption: var(--font-weight-regular); --type-tracking-title-large: -0.019em /* (@ 24px) -0.46px */; --type-tracking-title-medium: -0.014em /* (@ 18px) -0.25px */; --type-tracking-title-small: -0.006em /* (@ 14px) -0.08px */; --type-tracking-body-large: -0.006em /* (@ 14px) -0.08px */; --type-tracking-body-medium: -0.003em /* (@ 13px) -0.04px */; --type-tracking-body-small: 0em /* (@ 12px) 0px */; --type-tracking-caption: 0.005em /* (@ 11px) 0.05px */; --leading-none: 1; --type-leading-title-large: 2rem /* 32px */; --type-leading-title-medium: 1.5rem /* 24px */; --type-leading-title-small: 1.25rem /* 20px */; --type-leading-body-large: 1.25rem /* 20px */; --type-leading-body-medium: 1.125rem /* 18px */; --type-leading-body-small: 1rem /* 16px */; --type-leading-caption: 0.875rem /* 14px */; --base-shadow-outline: inset 0 0 0 0.5px var(--color-shadow-highlight), 0 0 0 0.5px var(--color-shadow-outline); --base-shadow-elevation-0: 0 1px 2px 0 var(--color-shadow-elevation-1); --base-shadow-elevation-1: 0 2px 8px 0 var(--color-shadow-elevation-2); --base-shadow-elevation-2: 0 4px 12px 0 var(--color-shadow-elevation-3); --base-shadow-elevation-3: 0 6px 16px 0 var(--color-shadow-elevation-4); --blur-thin: 10px; --ease-out-cubic: cubic-bezier(0.33, 1, 0.68, 1); --animate-spinner-v2-rotate: animate-spinner-v2-rotate 2s linear infinite; --animate-spinner-v2-dash: animate-spinner-v2-dash 1.5s ease-in-out infinite; --legacy-z-index-context-menu: 125; --legacy-z-index-modal-host: 102; --legacy-z-index-above-popup: 103; } } @layer base { *, ::after, ::before, ::backdrop, ::file-selector-button { box-sizing: border-box; margin: 0; padding: 0; border: 0 solid; } html, :host { line-height: 1.5; -webkit-text-size-adjust: 100%; tab-size: 4; font-family: var(--default-font-family, ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"); font-feature-settings: var(--default-font-feature-settings, normal); font-variation-settings: var(--default-font-variation-settings, normal); -webkit-tap-highlight-color: transparent; } hr { height: 0; color: inherit; border-top-width: 1px; } abbr:where([title]) { -webkit-text-decoration: underline dotted; text-decoration: underline dotted; } h1, h2, h3, h4, h5, h6 { font-size: inherit; font-weight: inherit; } a { color: inherit; -webkit-text-decoration: inherit; text-decoration: inherit; } b, strong { font-weight: bolder; } code, kbd, samp, pre { font-family: var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace); font-feature-settings: var(--default-mono-font-feature-settings, normal); font-variation-settings: var(--default-mono-font-variation-settings, normal); font-size: 1em; } small { font-size: 80%; } sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; } sub { bottom: -0.25em; } sup { top: -0.5em; } table { text-indent: 0; border-color: inherit; border-collapse: collapse; } :-moz-focusring { outline: auto; } progress { vertical-align: baseline; } summary { display: list-item; } ol, ul, menu { list-style: none; } img, svg, video, canvas, audio, iframe, embed, object { display: block; vertical-align: middle; } img, video { max-width: 100%; height: auto; } button, input, select, optgroup, textarea, ::file-selector-button { font: inherit; font-feature-settings: inherit; font-variation-settings: inherit; letter-spacing: inherit; color: inherit; border-radius: 0; background-color: transparent; opacity: 1; } :where(select:is([multiple], [size])) optgroup { font-weight: bolder; } :where(select:is([multiple], [size])) optgroup option { padding-inline-start: 20px; } ::file-selector-button { margin-inline-end: 4px; } ::placeholder { opacity: 1; } @supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px) { ::placeholder { color: currentcolor; @supports (color: color-mix(in lab, red, red)) { color: color-mix(in oklab, currentcolor 50%, transparent); } } } textarea { resize: vertical; } ::-webkit-search-decoration { -webkit-appearance: none; } ::-webkit-date-and-time-value { min-height: 1lh; text-align: inherit; } ::-webkit-datetime-edit { display: inline-flex; } ::-webkit-datetime-edit-fields-wrapper { padding: 0; } ::-webkit-datetime-edit, ::-webkit-datetime-edit-year-field, ::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-hour-field, ::-webkit-datetime-edit-minute-field, ::-webkit-datetime-edit-second-field, ::-webkit-datetime-edit-millisecond-field, ::-webkit-datetime-edit-meridiem-field { padding-block: 0; } :-moz-ui-invalid { box-shadow: none; } button, input:where([type="button"], [type="reset"], [type="submit"]), ::file-selector-button { appearance: button; } ::-webkit-inner-spin-button, ::-webkit-outer-spin-button { height: auto; } [hidden]:where(:not([hidden="until-found"])) { display: none !important; } } @layer utilities { .\@container { container-type: inline-size; } .pointer-events-none { pointer-events: none; } .collapse { visibility: collapse; } .invisible { visibility: hidden; } .visible { visibility: visible; } .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border-width: 0; } .absolute { position: absolute; } .fixed { position: fixed; } .relative { position: relative; } .relative\! { position: relative !important; } .static { position: static; } .sticky { position: sticky; } .inset-0 { inset: calc(var(--spacing) * 0); } .inset-x-0 { inset-inline: calc(var(--spacing) * 0); } .inset-y-0 { inset-block: calc(var(--spacing) * 0); } .start-0 { inset-inline-start: calc(var(--spacing) * 0); } .start-0\.5 { inset-inline-start: calc(var(--spacing) * 0.5); } .start-1\/2 { inset-inline-start: calc(1/2 * 100%); } .-end-1\.5 { inset-inline-end: calc(var(--spacing) * -1.5); } .-end-\[calc\(2\.75px-3\%\)\] { inset-inline-end: calc(calc(2.75px - 3%) * -1); } .end-0 { inset-inline-end: calc(var(--spacing) * 0); } .end-2 { inset-inline-end: calc(var(--spacing) * 2); } .-top-1 { top: calc(var(--spacing) * -1); } .top-0 { top: calc(var(--spacing) * 0); } .top-1\/2 { top: calc(1/2 * 100%); } .top-4 { top: calc(var(--spacing) * 4); } .top-4\/10 { top: calc(4/10 * 100%); } .-bottom-\[calc\(6\.25px-1\%\)\] { bottom: calc(calc(6.25px - 1%) * -1); } .bottom-0 { bottom: calc(var(--spacing) * 0); } .bottom-1 { bottom: calc(var(--spacing) * 1); } .bottom-1\.5 { bottom: calc(var(--spacing) * 1.5); } .left-1\/2 { left: calc(1/2 * 100%); } .isolate { isolation: isolate; } .legacy-z-index-above-popup { z-index: var(--legacy-z-index-above-popup); } .legacy-z-index-context-menu { z-index: var(--legacy-z-index-context-menu); } .legacy-z-index-modal-host { z-index: var(--legacy-z-index-modal-host); } .z-0 { z-index: 0; } .z-10 { z-index: 10; } .z-20 { z-index: 20; } .z-20\! { z-index: 20 !important; } .col-\[back-slot\] { grid-column: back-slot; } .col-\[close-slot\] { grid-column: close-slot; } .col-\[title-slot\] { grid-column: title-slot; } .col-span-full { grid-column: 1 / -1; } .col-start-1 { grid-column-start: 1; } .col-start-2 { grid-column-start: 2; } .col-end-1 { grid-column-end: 1; } .col-end-2 { grid-column-end: 2; } .float-end { float: inline-end; } .float-left { float: left; } .float-right { float: right; } .float-start { float: inline-start; } .clear-end { clear: inline-end; } .clear-left { clear: left; } .clear-right { clear: right; } .clear-start { clear: inline-start; } .container { width: 100%; @media (width >= 40rem) { max-width: 40rem; } @media (width >= 48rem) { max-width: 48rem; } @media (width >= 64rem) { max-width: 64rem; } @media (width >= 80rem) { max-width: 80rem; } @media (width >= 96rem) { max-width: 96rem; } } .m-auto { margin: auto; } .mx-0\.5 { margin-inline: calc(var(--spacing) * 0.5); } .mx-0\.75 { margin-inline: calc(var(--spacing) * 0.75); } .mx-1 { margin-inline: calc(var(--spacing) * 1); } .mx-2\.5 { margin-inline: calc(var(--spacing) * 2.5); } .mx-4 { margin-inline: calc(var(--spacing) * 4); } .mx-\[10px\] { margin-inline: 10px; } .mx-auto { margin-inline: auto; } .-my-px { margin-block: -1px; } .my-1 { margin-block: calc(var(--spacing) * 1); } .my-1\.5 { margin-block: calc(var(--spacing) * 1.5); } .my-2 { margin-block: calc(var(--spacing) * 2); } .my-3 { margin-block: calc(var(--spacing) * 3); } .my-4 { margin-block: calc(var(--spacing) * 4); } .my-\[29px\] { margin-block: 29px; } .-ms-1 { margin-inline-start: calc(var(--spacing) * -1); } .ms-0\.5 { margin-inline-start: calc(var(--spacing) * 0.5); } .ms-2 { margin-inline-start: calc(var(--spacing) * 2); } .ms-3 { margin-inline-start: calc(var(--spacing) * 3); } .ms-4 { margin-inline-start: calc(var(--spacing) * 4); } .ms-5 { margin-inline-start: calc(var(--spacing) * 5); } .ms-\[-4px\] { margin-inline-start: -4px; } .ms-\[5px\] { margin-inline-start: 5px; } .ms-auto { margin-inline-start: auto; } .me-1 { margin-inline-end: calc(var(--spacing) * 1); } .me-1\.5 { margin-inline-end: calc(var(--spacing) * 1.5); } .me-2 { margin-inline-end: calc(var(--spacing) * 2); } .me-3 { margin-inline-end: calc(var(--spacing) * 3); } .me-4 { margin-inline-end: calc(var(--spacing) * 4); } .mt-0\.5 { margin-top: calc(var(--spacing) * 0.5); } .mt-1 { margin-top: calc(var(--spacing) * 1); } .mt-1\.5 { margin-top: calc(var(--spacing) * 1.5); } .mt-2 { margin-top: calc(var(--spacing) * 2); } .mt-2\.5 { margin-top: calc(var(--spacing) * 2.5); } .mt-3 { margin-top: calc(var(--spacing) * 3); } .mt-4 { margin-top: calc(var(--spacing) * 4); } .mt-5 { margin-top: calc(var(--spacing) * 5); } .mt-6 { margin-top: calc(var(--spacing) * 6); } .mt-6\.5 { margin-top: calc(var(--spacing) * 6.5); } .mt-8 { margin-top: calc(var(--spacing) * 8); } .mt-9 { margin-top: calc(var(--spacing) * 9); } .mt-\[-3px\] { margin-top: -3px; } .mt-\[2px\] { margin-top: 2px; } .mt-\[3px\] { margin-top: 3px; } .mt-\[30px\] { margin-top: 30px; } .mb-1 { margin-bottom: calc(var(--spacing) * 1); } .mb-1\.5 { margin-bottom: calc(var(--spacing) * 1.5); } .mb-2 { margin-bottom: calc(var(--spacing) * 2); } .mb-2\.5 { margin-bottom: calc(var(--spacing) * 2.5); } .mb-3 { margin-bottom: calc(var(--spacing) * 3); } .mb-4 { margin-bottom: calc(var(--spacing) * 4); } .mb-4\.5 { margin-bottom: calc(var(--spacing) * 4.5); } .mb-5 { margin-bottom: calc(var(--spacing) * 5); } .mb-6 { margin-bottom: calc(var(--spacing) * 6); } .mb-8 { margin-bottom: calc(var(--spacing) * 8); } .mb-12 { margin-bottom: calc(var(--spacing) * 12); } .mb-13 { margin-bottom: calc(var(--spacing) * 13); } .mb-\[17px\] { margin-bottom: 17px; } .line-clamp-4 { overflow: hidden; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 4; } .block { display: block; } .contents { display: contents; } .flex { display: flex; } .grid { display: grid; } .hidden { display: none; } .inline { display: inline; } .inline-block { display: inline-block; } .inline-flex { display: inline-flex; } .table { display: table; } .field-sizing-content { field-sizing: content; } .aspect-square { aspect-ratio: 1 / 1; } .size-1\.5 { width: calc(var(--spacing) * 1.5); height: calc(var(--spacing) * 1.5); } .size-4 { width: calc(var(--spacing) * 4); height: calc(var(--spacing) * 4); } .size-5 { width: calc(var(--spacing) * 5); height: calc(var(--spacing) * 5); } .size-6 { width: calc(var(--spacing) * 6); height: calc(var(--spacing) * 6); } .size-7 { width: calc(var(--spacing) * 7); height: calc(var(--spacing) * 7); } .size-8 { width: calc(var(--spacing) * 8); height: calc(var(--spacing) * 8); } .size-9 { width: calc(var(--spacing) * 9); height: calc(var(--spacing) * 9); } .size-10 { width: calc(var(--spacing) * 10); height: calc(var(--spacing) * 10); } .size-12\.5 { width: calc(var(--spacing) * 12.5); height: calc(var(--spacing) * 12.5); } .size-20 { width: calc(var(--spacing) * 20); height: calc(var(--spacing) * 20); } .size-30 { width: calc(var(--spacing) * 30); height: calc(var(--spacing) * 30); } .size-100 { width: calc(var(--spacing) * 100); height: calc(var(--spacing) * 100); } .size-250 { width: calc(var(--spacing) * 250); height: calc(var(--spacing) * 250); } .size-\[1em\] { width: 1em; height: 1em; } .size-\[9px\] { width: 9px; height: 9px; } .size-\[20px\] { width: 20px; height: 20px; } .size-\[24px\] { width: 24px; height: 24px; } .size-\[28px\] { width: 28px; height: 28px; } .size-\[30px\] { width: 30px; height: 30px; } .size-\[32px\] { width: 32px; height: 32px; } .size-\[36px\] { width: 36px; height: 36px; } .size-\[40px\] { width: 40px; height: 40px; } .size-\[48px\] { width: 48px; height: 48px; } .size-\[52px\] { width: 52px; height: 52px; } .size-\[56px\] { width: 56px; height: 56px; } .size-\[64px\] { width: 64px; height: 64px; } .size-\[72px\] { width: 72px; height: 72px; } .size-\[76px\] { width: 76px; height: 76px; } .size-\[80px\] { width: 80px; height: 80px; } .size-\[96px\] { width: 96px; height: 96px; } .size-\[216px\] { width: 216px; height: 216px; } .size-\[calc\(5px\+37\.5\%\)\] { width: calc(5px + 37.5%); height: calc(5px + 37.5%); } .size-fit { width: fit-content; height: fit-content; } .size-full { width: 100%; height: 100%; } .h-0\.5 { height: calc(var(--spacing) * 0.5); } .h-2 { height: calc(var(--spacing) * 2); } .h-5 { height: calc(var(--spacing) * 5); } .h-8 { height: calc(var(--spacing) * 8); } .h-10 { height: calc(var(--spacing) * 10); } .h-11\.5 { height: calc(var(--spacing) * 11.5); } .h-12 { height: calc(var(--spacing) * 12); } .h-14 { height: calc(var(--spacing) * 14); } .h-32 { height: calc(var(--spacing) * 32); } .h-96 { height: calc(var(--spacing) * 96); } .h-100 { height: calc(var(--spacing) * 100); } .h-\[0\.5px\] { height: 0.5px; } .h-\[18px\] { height: 18px; } .h-\[36px\] { height: 36px; } .h-\[244px\] { height: 244px; } .h-full { height: 100%; } .h-px { height: 1px; } .h-screen { height: 100vh; } .max-h-\(--radix-popper-available-height\) { max-height: var(--radix-popper-available-height); } .max-h-48 { max-height: calc(var(--spacing) * 48); } .max-h-50 { max-height: calc(var(--spacing) * 50); } .max-h-full { max-height: 100%; } .min-h-0 { min-height: calc(var(--spacing) * 0); } .min-h-3\.5 { min-height: calc(var(--spacing) * 3.5); } .min-h-4 { min-height: calc(var(--spacing) * 4); } .min-h-4\.5 { min-height: calc(var(--spacing) * 4.5); } .min-h-20 { min-height: calc(var(--spacing) * 20); } .min-h-24 { min-height: calc(var(--spacing) * 24); } .min-h-\[26px\] { min-height: 26px; } .min-h-\[40px\] { min-height: 40px; } .min-h-\[52px\] { min-height: 52px; } .min-h-\[55px\] { min-height: 55px; } .min-h-\[80px\] { min-height: 80px; } .min-h-\[100px\] { min-height: 100px; } .min-h-fit { min-height: fit-content; } .min-h-full { min-height: 100%; } .w-0\.5 { width: calc(var(--spacing) * 0.5); } .w-3\.5 { width: calc(var(--spacing) * 3.5); } .w-5\.5 { width: calc(var(--spacing) * 5.5); } .w-7\.5 { width: calc(var(--spacing) * 7.5); } .w-8 { width: calc(var(--spacing) * 8); } .w-9\.5 { width: calc(var(--spacing) * 9.5); } .w-24 { width: calc(var(--spacing) * 24); } .w-50 { width: calc(var(--spacing) * 50); } .w-64 { width: calc(var(--spacing) * 64); } .w-100 { width: calc(var(--spacing) * 100); } .w-\[46px\] { width: 46px; } .w-\[102px\] { width: 102px; } .w-\[150px\] { width: 150px; } .w-\[275px\] { width: 275px; } .w-\[280px\] { width: 280px; } .w-\[331px\] { width: 331px; } .w-fit { width: fit-content; } .w-full { width: 100%; } .w-max { width: max-content; } .max-w-4xl { max-width: var(--container-4xl); } .max-w-\[192px\] { max-width: 192px; } .max-w-\[228px\] { max-width: 228px; } .max-w-\[300px\] { max-width: 300px; } .max-w-\[320px\] { max-width: 320px; } .max-w-\[335px\] { max-width: 335px; } .max-w-\[340px\] { max-width: 340px; } .max-w-\[350px\] { max-width: 350px; } .max-w-\[500px\] { max-width: 500px; } .max-w-\[520px\] { max-width: 520px; } .max-w-\[640px\]\! { max-width: 640px !important; } .max-w-\[660px\] { max-width: 660px; } .max-w-\[680px\] { max-width: 680px; } .max-w-\[798px\] { max-width: 798px; } .max-w-\[calc\(100\%-20px\)\] { max-width: calc(100% - 20px); } .max-w-full { max-width: 100%; } .min-w-0 { min-width: calc(var(--spacing) * 0); } .min-w-3\.5 { min-width: calc(var(--spacing) * 3.5); } .min-w-4 { min-width: calc(var(--spacing) * 4); } .min-w-4\.5 { min-width: calc(var(--spacing) * 4.5); } .min-w-5 { min-width: calc(var(--spacing) * 5); } .min-w-12 { min-width: calc(var(--spacing) * 12); } .min-w-14 { min-width: calc(var(--spacing) * 14); } .min-w-16 { min-width: calc(var(--spacing) * 16); } .min-w-\[5em\] { min-width: 5em; } .min-w-\[200px\] { min-width: 200px; } .min-w-\[360px\] { min-width: 360px; } .min-w-\[400px\] { min-width: 400px; } .min-w-\[calc-size\(fit-content\,min\(20ch\,size\)\)\] { min-width: calc-size(fit-content,min(20ch, size)); } .min-w-fit { min-width: fit-content; } .min-w-full { min-width: 100%; } .min-w-min { min-width: min-content; } .flex-1 { flex: 1; } .flex-auto { flex: auto; } .shrink { flex-shrink: 1; } .shrink-0 { flex-shrink: 0; } .flex-grow { flex-grow: 1; } .grow { flex-grow: 1; } .grow-0 { flex-grow: 0; } .basis-\[min-content\] { flex-basis: min-content; } .basis-auto { flex-basis: auto; } .border-separate { border-collapse: separate; } .border-spacing-2 { --tw-border-spacing-x: calc(var(--spacing) * 2); --tw-border-spacing-y: calc(var(--spacing) * 2); border-spacing: var(--tw-border-spacing-x) var(--tw-border-spacing-y); } .origin-center { transform-origin: center; } .-translate-1\/2 { --tw-translate-x: calc(calc(1/2 * 100%) * -1); --tw-translate-y: calc(calc(1/2 * 100%) * -1); translate: var(--tw-translate-x) var(--tw-translate-y); } .-translate-x-1\/2 { --tw-translate-x: calc(calc(1/2 * 100%) * -1); translate: var(--tw-translate-x) var(--tw-translate-y); } .-translate-x-3\.5 { --tw-translate-x: calc(var(--spacing) * -3.5); translate: var(--tw-translate-x) var(--tw-translate-y); } .scale-110 { --tw-scale-x: 110%; --tw-scale-y: 110%; --tw-scale-z: 110%; scale: var(--tw-scale-x) var(--tw-scale-y); } .-rotate-90 { rotate: calc(90deg * -1); } .transform { transform: var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,); } .transform-\[translateY\(-40\%\)\] { transform: translateY(-40%); } .animate-spinner-v2-dash { animation: var(--animate-spinner-v2-dash); } .animate-spinner-v2-rotate { animation: var(--animate-spinner-v2-rotate); } .cursor-grab { cursor: grab; } .cursor-pointer { cursor: pointer; } .resize { resize: both; } .resize-none { resize: none; } .snap-both { scroll-snap-type: both var(--tw-scroll-snap-strictness); } .snap-mandatory { --tw-scroll-snap-strictness: mandatory; } .snap-center { scroll-snap-align: center; } .scroll-px-\[20\%\] { scroll-padding-inline: 20%; } .list-decimal { list-style-type: decimal; } .list-disc { list-style-type: disc; } .grid-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)); } .grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); } .grid-cols-\[\[back-slot\]_1fr_\[title-slot\]_auto_\[close-slot\]_1fr\] { grid-template-columns: [back-slot] 1fr [title-slot] auto [close-slot] 1fr; } .grid-cols-\[min-content_1fr\] { grid-template-columns: min-content 1fr; } .grid-cols-\[repeat\(3\,_minmax\(100px\,_120px\)\)\] { grid-template-columns: repeat(3, minmax(100px, 120px)); } .grid-cols-subgrid { grid-template-columns: subgrid; } .flex-col { flex-direction: column; } .flex-row { flex-direction: row; } .flex-wrap { flex-wrap: wrap; } .flex-wrap-reverse { flex-wrap: wrap-reverse; } .items-baseline { align-items: baseline; } .items-center { align-items: center; } .items-center-safe { align-items: safe center; } .items-end { align-items: flex-end; } .items-start { align-items: flex-start; } .items-stretch { align-items: stretch; } .justify-between { justify-content: space-between; } .justify-center { justify-content: center; } .justify-center-safe { justify-content: safe center; } .justify-end { justify-content: flex-end; } .justify-start { justify-content: flex-start; } .justify-items-stretch { justify-items: stretch; } .gap-0\.5 { gap: calc(var(--spacing) * 0.5); } .gap-1 { gap: calc(var(--spacing) * 1); } .gap-1\.5 { gap: calc(var(--spacing) * 1.5); } .gap-2 { gap: calc(var(--spacing) * 2); } .gap-3 { gap: calc(var(--spacing) * 3); } .gap-4 { gap: calc(var(--spacing) * 4); } .gap-5 { gap: calc(var(--spacing) * 5); } .gap-6 { gap: calc(var(--spacing) * 6); } .gap-8 { gap: calc(var(--spacing) * 8); } .gap-10 { gap: calc(var(--spacing) * 10); } .gap-50 { gap: calc(var(--spacing) * 50); } .space-y-2 { :where(& > :not(:last-child)) { --tw-space-y-reverse: 0; margin-block-start: calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse)); margin-block-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse))); } } .space-y-3 { :where(& > :not(:last-child)) { --tw-space-y-reverse: 0; margin-block-start: calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse)); margin-block-end: calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse))); } } .space-y-16 { :where(& > :not(:last-child)) { --tw-space-y-reverse: 0; margin-block-start: calc(calc(var(--spacing) * 16) * var(--tw-space-y-reverse)); margin-block-end: calc(calc(var(--spacing) * 16) * calc(1 - var(--tw-space-y-reverse))); } } .gap-x-2 { column-gap: calc(var(--spacing) * 2); } .gap-x-4 { column-gap: calc(var(--spacing) * 4); } .gap-y-3 { row-gap: calc(var(--spacing) * 3); } .self-start { align-self: flex-start; } .self-stretch { align-self: stretch; } .truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .overflow-auto { overflow: auto; } .overflow-clip { overflow: clip; } .overflow-hidden { overflow: hidden; } .overflow-x-auto { overflow-x: auto; } .overflow-y-auto { overflow-y: auto; } .overflow-y-clip { overflow-y: clip; } .overflow-y-scroll { overflow-y: scroll; } .overscroll-contain { overscroll-behavior: contain; } .scroll-auto { scroll-behavior: auto; } .scroll-smooth { scroll-behavior: smooth; } .curved-3xl { border-radius: calc(var(--radius-3xl) * 1.15); corner-shape: superellipse(1.25); } .curved-md { border-radius: calc(var(--radius-md) * 1.15); corner-shape: superellipse(1.25); } .curved-xl { border-radius: calc(var(--radius-xl) * 1.15); corner-shape: superellipse(1.25); } .rounded { border-radius: 0.25rem; } .rounded-2xl { border-radius: var(--radius-2xl); } .rounded-\[2px\] { border-radius: 2px; } .rounded-\[8px\] { border-radius: 8px; } .rounded-\[10px\] { border-radius: 10px; } .rounded-\[14px\] { border-radius: 14px; } .rounded-\[18px\] { border-radius: 18px; } .rounded-\[27px\] { border-radius: 27px; } .rounded-full { border-radius: calc(infinity * 1px); } .rounded-lg { border-radius: var(--radius-lg); } .rounded-md { border-radius: var(--radius-md); } .rounded-sm { border-radius: var(--radius-sm); } .rounded-xs { border-radius: var(--radius-xs); } .rounded-s { border-start-start-radius: 0.25rem; border-end-start-radius: 0.25rem; } .rounded-s-full { border-start-start-radius: calc(infinity * 1px); border-end-start-radius: calc(infinity * 1px); } .rounded-ss { border-start-start-radius: 0.25rem; } .rounded-e { border-start-end-radius: 0.25rem; border-end-end-radius: 0.25rem; } .rounded-se { border-start-end-radius: 0.25rem; } .rounded-ee { border-end-end-radius: 0.25rem; } .rounded-es { border-end-start-radius: 0.25rem; } .rounded-l { border-top-left-radius: 0.25rem; border-bottom-left-radius: 0.25rem; } .rounded-tl { border-top-left-radius: 0.25rem; } .rounded-r { border-top-right-radius: 0.25rem; border-bottom-right-radius: 0.25rem; } .rounded-tr { border-top-right-radius: 0.25rem; } .rounded-br { border-bottom-right-radius: 0.25rem; } .rounded-bl { border-bottom-left-radius: 0.25rem; } .border { border-style: var(--tw-border-style); border-width: 1px; } .border-1 { border-style: var(--tw-border-style); border-width: 1px; } .border-2 { border-style: var(--tw-border-style); border-width: 2px; } .border-\[0\.5px\] { border-style: var(--tw-border-style); border-width: 0.5px; } .border-\[1\.5px\] { border-style: var(--tw-border-style); border-width: 1.5px; } .border-\[1px\] { border-style: var(--tw-border-style); border-width: 1px; } .border-\[2\.5px\] { border-style: var(--tw-border-style); border-width: 2.5px; } .border-\[2px\] { border-style: var(--tw-border-style); border-width: 2px; } .border-\[3px\] { border-style: var(--tw-border-style); border-width: 3px; } .border-\[4px\] { border-style: var(--tw-border-style); border-width: 4px; } .border-t { border-top-style: var(--tw-border-style); border-top-width: 1px; } .border-t-\[0\.5px\] { border-top-style: var(--tw-border-style); border-top-width: 0.5px; } .border-dotted { --tw-border-style: dotted; border-style: dotted; } .border-solid { --tw-border-style: solid; border-style: solid; } .border-border-error { border-color: var(--color-border-error); } .border-border-primary { border-color: var(--color-border-primary); } .border-border-secondary { border-color: var(--color-border-secondary); } .border-border-selected { border-color: var(--color-border-selected); } .border-color-fill-primary { border-color: var(--color-color-fill-primary); } .border-label-placeholder { border-color: var(--color-label-placeholder); } .border-label-primary { border-color: var(--color-label-primary); } .border-label-primary-on-color { border-color: var(--color-label-primary-on-color); } .border-label-secondary { border-color: var(--color-label-secondary); } .border-transparent { border-color: transparent; } .border-t-border-primary { border-top-color: var(--color-border-primary); } .bg-\[\#000\]\/20 { background-color: color-mix(in oklab, #000 20%, transparent); } .bg-\[black\]\/70 { background-color: color-mix(in oklab, black 70%, transparent); } .bg-background-overlay { background-color: var(--color-background-overlay); } .bg-background-primary { background-color: var(--color-background-primary); } .bg-background-secondary { background-color: var(--color-background-secondary); } .bg-border-primary { background-color: var(--color-border-primary); } .bg-color-fill-affirmative { background-color: var(--color-color-fill-affirmative); } .bg-color-fill-destructive { background-color: var(--color-color-fill-destructive); } .bg-color-fill-destructive\/10 { background-color: color-mix(in srgb, light-dark(#FD2512, #FB4332) 10%, transparent); @supports (color: color-mix(in lab, red, red)) { background-color: color-mix(in oklab, var(--color-color-fill-destructive) 10%, transparent); } } .bg-color-fill-primary { background-color: var(--color-color-fill-primary); } .bg-color-fill-primary-pressed\/20 { background-color: color-mix(in srgb, light-dark(#3B4AF4, #4856F2) 20%, transparent); @supports (color: color-mix(in lab, red, red)) { background-color: color-mix(in oklab, var(--color-color-fill-primary-pressed) 20%, transparent); } } .bg-color-fill-primary\/10 { background-color: color-mix(in srgb, light-dark(#4655FF, #5563FF) 10%, transparent); @supports (color: color-mix(in lab, red, red)) { background-color: color-mix(in oklab, var(--color-color-fill-primary) 10%, transparent); } } .bg-color-label-light-disabled { background-color: var(--color-color-label-light-disabled); } .bg-elevated-background-primary { background-color: var(--color-elevated-background-primary); } .bg-elevated-background-quaternary { background-color: var(--color-elevated-background-quaternary); } .bg-elevated-background-secondary { background-color: var(--color-elevated-background-secondary); } .bg-elevated-background-tertiary { background-color: var(--color-elevated-background-tertiary); } .bg-fill-floating { background-color: var(--color-fill-floating); } .bg-fill-inverted { background-color: var(--color-fill-inverted); } .bg-fill-on-media { background-color: var(--color-fill-on-media); } .bg-fill-primary { background-color: var(--color-fill-primary); } .bg-fill-primary-pressed { background-color: var(--color-fill-primary-pressed); } .bg-fill-secondary { background-color: var(--color-fill-secondary); } .bg-fill-selected { background-color: var(--color-fill-selected); } .bg-label-disabled { background-color: var(--color-label-disabled); } .bg-label-placeholder { background-color: var(--color-label-placeholder); } .bg-label-primary-on-color { background-color: var(--color-label-primary-on-color); } .bg-label-secondary { background-color: var(--color-label-secondary); } .bg-legacy-conversation-header-bg { background-color: var(--color-legacy-conversation-header-bg); } .bg-message-fill-outgoing-tertiary { background-color: var(--color-message-fill-outgoing-tertiary); } .bg-transparent { background-color: transparent; } .bg-linear-to-b { --tw-gradient-position: to bottom; @supports (background-image: linear-gradient(in lab, red, red)) { --tw-gradient-position: to bottom in oklab; } background-image: linear-gradient(var(--tw-gradient-stops)); } .bg-gradient-to-b { --tw-gradient-position: to bottom in oklab; background-image: linear-gradient(var(--tw-gradient-stops)); } .bg-gradient-to-l { --tw-gradient-position: to left in oklab; background-image: linear-gradient(var(--tw-gradient-stops)); } .bg-gradient-to-r { --tw-gradient-position: to right in oklab; background-image: linear-gradient(var(--tw-gradient-stops)); } .bg-gradient-to-t { --tw-gradient-position: to top in oklab; background-image: linear-gradient(var(--tw-gradient-stops)); } .bg-\[url\(\.\.\/images\/generic-file-dangerous\.svg\)\] { background-image: url(../images/generic-file-dangerous.svg); } .bg-\[url\(\.\.\/images\/generic-file\.svg\)\] { background-image: url(../images/generic-file.svg); } .from-shadow-outline { --tw-gradient-from: var(--color-shadow-outline); --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); } .from-transparent { --tw-gradient-from: transparent; --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); } .to-\[rgba\(0\,0\,0\,0\.6\)\] { --tw-gradient-to: rgba(0,0,0,0.6); --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); } .to-transparent { --tw-gradient-to: transparent; --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); } .\[mask-image\:linear-gradient\(to_left\,var\(--axo-select-trigger-mask-start\)_19px\,black_38px\)\] { mask-image: linear-gradient(to left,var(--axo-select-trigger-mask-start) 19px,black 38px); } .bg-contain { background-size: contain; } .bg-center { background-position: center; } .bg-no-repeat { background-repeat: no-repeat; } .\[mask-position\:right\] { mask-position: right; } .\[mask-repeat\:no-repeat\] { mask-repeat: no-repeat; } .fill-current { fill: currentcolor; } .fill-elevated-background-quaternary { fill: var(--color-elevated-background-quaternary); } .fill-none { fill: none; } .stroke-border-primary { stroke: var(--color-border-primary); } .stroke-border-selected { stroke: var(--color-border-selected); } .stroke-color-fill-primary { stroke: var(--color-color-fill-primary); } .stroke-color-label-affirmative { stroke: var(--color-color-label-affirmative); } .stroke-color-label-destructive { stroke: var(--color-color-label-destructive); } .stroke-color-label-primary { stroke: var(--color-color-label-primary); } .stroke-fill-secondary { stroke: var(--color-fill-secondary); } .stroke-label-disabled-on-color { stroke: var(--color-label-disabled-on-color); } .stroke-label-placeholder { stroke: var(--color-label-placeholder); } .stroke-label-primary { stroke: var(--color-label-primary); } .stroke-label-primary-on-color { stroke: var(--color-label-primary-on-color); } .stroke-none { stroke: none; } .object-cover { object-fit: cover; } .object-center { object-position: center; } .p-0\.5 { padding: calc(var(--spacing) * 0.5); } .p-1 { padding: calc(var(--spacing) * 1); } .p-1\.5 { padding: calc(var(--spacing) * 1.5); } .p-2 { padding: calc(var(--spacing) * 2); } .p-2\.5 { padding: calc(var(--spacing) * 2.5); } .p-3 { padding: calc(var(--spacing) * 3); } .p-4 { padding: calc(var(--spacing) * 4); } .p-4\! { padding: calc(var(--spacing) * 4) !important; } .p-5 { padding: calc(var(--spacing) * 5); } .p-6 { padding: calc(var(--spacing) * 6); } .p-10 { padding: calc(var(--spacing) * 10); } .p-12 { padding: calc(var(--spacing) * 12); } .p-50 { padding: calc(var(--spacing) * 50); } .p-\[1\.5px\] { padding: 1.5px; } .p-\[2px\] { padding: 2px; } .p-\[3\.5px\] { padding: 3.5px; } .p-\[3px\] { padding: 3px; } .p-\[4px\] { padding: 4px; } .p-\[5px\] { padding: 5px; } .p-\[6px\] { padding: 6px; } .p-px { padding: 1px; } .px-1 { padding-inline: calc(var(--spacing) * 1); } .px-2 { padding-inline: calc(var(--spacing) * 2); } .px-2\.5 { padding-inline: calc(var(--spacing) * 2.5); } .px-3 { padding-inline: calc(var(--spacing) * 3); } .px-3\.5 { padding-inline: calc(var(--spacing) * 3.5); } .px-4 { padding-inline: calc(var(--spacing) * 4); } .px-4\.5 { padding-inline: calc(var(--spacing) * 4.5); } .px-5 { padding-inline: calc(var(--spacing) * 5); } .px-6 { padding-inline: calc(var(--spacing) * 6); } .px-\[1px\] { padding-inline: 1px; } .px-\[3px\] { padding-inline: 3px; } .px-\[4px\] { padding-inline: 4px; } .px-\[5px\] { padding-inline: 5px; } .px-\[7px\] { padding-inline: 7px; } .px-\[10px\] { padding-inline: 10px; } .px-\[11\.5px\] { padding-inline: 11.5px; } .px-\[13px\] { padding-inline: 13px; } .px-\[14px\] { padding-inline: 14px; } .py-0\.5 { padding-block: calc(var(--spacing) * 0.5); } .py-1 { padding-block: calc(var(--spacing) * 1); } .py-1\.5 { padding-block: calc(var(--spacing) * 1.5); } .py-2 { padding-block: calc(var(--spacing) * 2); } .py-2\.5 { padding-block: calc(var(--spacing) * 2.5); } .py-3 { padding-block: calc(var(--spacing) * 3); } .py-3\.5 { padding-block: calc(var(--spacing) * 3.5); } .py-4 { padding-block: calc(var(--spacing) * 4); } .py-6 { padding-block: calc(var(--spacing) * 6); } .py-50 { padding-block: calc(var(--spacing) * 50); } .py-\[1px\] { padding-block: 1px; } .py-\[3px\] { padding-block: 3px; } .py-\[5px\] { padding-block: 5px; } .py-\[7px\] { padding-block: 7px; } .py-\[10px\] { padding-block: 10px; } .ps-1 { padding-inline-start: calc(var(--spacing) * 1); } .ps-2 { padding-inline-start: calc(var(--spacing) * 2); } .ps-3 { padding-inline-start: calc(var(--spacing) * 3); } .ps-3\.5 { padding-inline-start: calc(var(--spacing) * 3.5); } .ps-4 { padding-inline-start: calc(var(--spacing) * 4); } .ps-\[2px\] { padding-inline-start: 2px; } .pe-2 { padding-inline-end: calc(var(--spacing) * 2); } .pe-2\.5 { padding-inline-end: calc(var(--spacing) * 2.5); } .pe-3 { padding-inline-end: calc(var(--spacing) * 3); } .pe-6\.5 { padding-inline-end: calc(var(--spacing) * 6.5); } .pe-\[33px\] { padding-inline-end: 33px; } .pt-1 { padding-top: calc(var(--spacing) * 1); } .pt-1\.5 { padding-top: calc(var(--spacing) * 1.5); } .pt-2 { padding-top: calc(var(--spacing) * 2); } .pt-3 { padding-top: calc(var(--spacing) * 3); } .pt-4 { padding-top: calc(var(--spacing) * 4); } .pt-5 { padding-top: calc(var(--spacing) * 5); } .pt-7\.5 { padding-top: calc(var(--spacing) * 7.5); } .pt-\[10px\] { padding-top: 10px; } .pb-1 { padding-bottom: calc(var(--spacing) * 1); } .pb-2 { padding-bottom: calc(var(--spacing) * 2); } .pb-3 { padding-bottom: calc(var(--spacing) * 3); } .pb-4 { padding-bottom: calc(var(--spacing) * 4); } .pb-5 { padding-bottom: calc(var(--spacing) * 5); } .pb-8 { padding-bottom: calc(var(--spacing) * 8); } .text-center { text-align: center; } .text-end { text-align: end; } .text-left { text-align: left; } .text-right { text-align: right; } .text-start { text-align: start; } .align-middle { vertical-align: middle; } .align-top { vertical-align: top; } .font-mono { font-family: var(--font-mono); } .font-symbols { font-family: var(--font-symbols); } .type-body-large { font-size: var(--type-text-body-large); font-weight: var(--type-font-weight-body-large); letter-spacing: var(--type-tracking-body-large); line-height: var(--type-leading-body-large); } .type-body-medium { font-size: var(--type-text-body-medium); font-weight: var(--type-font-weight-body-medium); letter-spacing: var(--type-tracking-body-medium); line-height: var(--type-leading-body-medium); } .type-body-small { font-size: var(--type-text-body-small); font-weight: var(--type-font-weight-body-small); letter-spacing: var(--type-tracking-body-small); line-height: var(--type-leading-body-small); } .type-caption { font-size: var(--type-text-caption); font-weight: var(--type-font-weight-caption); letter-spacing: var(--type-tracking-caption); line-height: var(--type-leading-caption); } .type-title-large { font-size: var(--type-text-title-large); font-weight: var(--type-font-weight-title-large); letter-spacing: var(--type-tracking-title-large); line-height: var(--type-leading-title-large); } .type-title-medium { font-size: var(--type-text-title-medium); font-weight: var(--type-font-weight-title-medium); letter-spacing: var(--type-tracking-title-medium); line-height: var(--type-leading-title-medium); } .type-title-small { font-size: var(--type-text-title-small); font-weight: var(--type-font-weight-title-small); letter-spacing: var(--type-tracking-title-small); line-height: var(--type-leading-title-small); } .text-\[8px\] { font-size: 8px; } .text-\[9px\] { font-size: 9px; } .text-\[10px\] { font-size: 10px; } .text-\[11px\] { font-size: 11px; } .text-\[12px\] { font-size: 12px; } .text-\[20px\] { font-size: 20px; } .text-\[28px\] { font-size: 28px; } .leading-0 { --tw-leading: calc(var(--spacing) * 0); line-height: calc(var(--spacing) * 0); } .leading-3\.5 { --tw-leading: calc(var(--spacing) * 3.5); line-height: calc(var(--spacing) * 3.5); } .leading-4 { --tw-leading: calc(var(--spacing) * 4); line-height: calc(var(--spacing) * 4); } .leading-4\.5 { --tw-leading: calc(var(--spacing) * 4.5); line-height: calc(var(--spacing) * 4.5); } .leading-5 { --tw-leading: calc(var(--spacing) * 5); line-height: calc(var(--spacing) * 5); } .leading-none { --tw-leading: 1; line-height: 1; } .leading-none { --tw-leading: var(--leading-none); line-height: var(--leading-none); } .font-\[600\] { --tw-font-weight: 600; font-weight: 600; } .font-light { --tw-font-weight: var(--font-weight-light); font-weight: var(--font-weight-light); } .font-medium { --tw-font-weight: var(--font-weight-medium); font-weight: var(--font-weight-medium); } .font-semibold { --tw-font-weight: var(--font-weight-semibold); font-weight: var(--font-weight-semibold); } .text-balance { text-wrap: balance; } .break-words { overflow-wrap: break-word; } .text-ellipsis { text-overflow: ellipsis; } .hyphens-auto { -webkit-hyphens: auto; hyphens: auto; } .whitespace-nowrap { white-space: nowrap; } .whitespace-pre-wrap { white-space: pre-wrap; } .text-\[\#fff\] { color: #fff; } .text-\[hsl\(255\,255\,255\)\] { color: hsl(255,255,255); } .text-\[rgb\(255\,255\,255\)\] { color: rgb(255,255,255); } .text-\[rgba\(0\,0\,0\,0\.85\)\] { color: rgba(0,0,0,0.85); } .text-color-fill-destructive { color: var(--color-color-fill-destructive); } .text-color-fill-primary { color: var(--color-color-fill-primary); } .text-color-fill-primary-pressed { color: var(--color-color-fill-primary-pressed); } .text-color-label-affirmative { color: var(--color-color-label-affirmative); } .text-color-label-destructive { color: var(--color-color-label-destructive); } .text-color-label-primary { color: var(--color-color-label-primary); } .text-label-placeholder { color: var(--color-label-placeholder); } .text-label-primary { color: var(--color-label-primary); } .text-label-primary-on-color { color: var(--color-label-primary-on-color); } .text-label-secondary { color: var(--color-label-secondary); } .text-label-secondary-on-color { color: var(--color-label-secondary-on-color); } .capitalize { text-transform: capitalize; } .lowercase { text-transform: lowercase; } .uppercase { text-transform: uppercase; } .italic { font-style: italic; } .underline { text-decoration-line: underline; } .scheme-light { color-scheme: light; } .scheme-only-dark { color-scheme: only dark; } .scheme-only-light { color-scheme: only light; } .opacity-0 { opacity: 0%; } .opacity-100 { opacity: 100%; } .shadow-\[0\.5px_0_0\.5px_0\.5px\,-0\.5px_0_0\.5px_0\.5px\] { --tw-shadow: 0.5px 0 0.5px 0.5px var(--tw-shadow-color, currentcolor), -0.5px 0 0.5px 0.5px var(--tw-shadow-color, currentcolor); box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); } .shadow-elevation-0 { --tw-shadow: var(--axo-shadow-no-outline, var(--base-shadow-outline)), var(--base-shadow-elevation-0); box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); } .shadow-elevation-1 { --tw-shadow: var(--axo-shadow-no-outline, var(--base-shadow-outline)), var(--base-shadow-elevation-1); box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); } .shadow-elevation-2 { --tw-shadow: var(--axo-shadow-no-outline, var(--base-shadow-outline)), var(--base-shadow-elevation-2); box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); } .shadow-elevation-3 { --tw-shadow: var(--axo-shadow-no-outline, var(--base-shadow-outline)), var(--base-shadow-elevation-3); box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); } .ring { --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor); box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); } .inset-shadow-on-color { --tw-inset-shadow: inset 0 0.5px 1px 0 var(--tw-inset-shadow-color, color-mix(in oklab, #000 12%, transparent)); box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); } .shadow-\[\#000\]\/12 { --tw-shadow-color: color-mix(in srgb, #000 12%, transparent); @supports (color: color-mix(in lab, red, red)) { --tw-shadow-color: color-mix(in oklab, color-mix(in oklab, #000 12%, transparent) var(--tw-shadow-alpha), transparent); } } .outline { outline-style: var(--tw-outline-style); outline-width: 1px; } .outline-0 { outline-style: var(--tw-outline-style); outline-width: 0px; } .outline-\[2\.5px\] { outline-style: var(--tw-outline-style); outline-width: 2.5px; } .-outline-offset-\[2\.5px\] { outline-offset: calc(2.5px * -1); } .outline-offset-\[-2\.5px\] { outline-offset: -2.5px; } .outline-border-error { outline-color: var(--color-border-error); } .outline-border-focused { outline-color: var(--color-border-focused); } .blur-thin { --tw-blur: blur(var(--blur-thin)); filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,); } .filter { filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,); } .transition { transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter, display, visibility, content-visibility, overlay, pointer-events; transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); transition-duration: var(--tw-duration, var(--default-transition-duration)); } .transition-\[filter\] { transition-property: filter; transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); transition-duration: var(--tw-duration, var(--default-transition-duration)); } .transition-\[height\] { transition-property: height; transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); transition-duration: var(--tw-duration, var(--default-transition-duration)); } .transition-\[scrollbar-color\] { transition-property: scrollbar-color; transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); transition-duration: var(--tw-duration, var(--default-transition-duration)); } .transition-\[stroke-dashoffset\] { transition-property: stroke-dashoffset; transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); transition-duration: var(--tw-duration, var(--default-transition-duration)); } .transition-\[width\] { transition-property: width; transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); transition-duration: var(--tw-duration, var(--default-transition-duration)); } .transition-all { transition-property: all; transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); transition-duration: var(--tw-duration, var(--default-transition-duration)); } .transition-colors { transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to; transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); transition-duration: var(--tw-duration, var(--default-transition-duration)); } .transition-opacity { transition-property: opacity; transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); transition-duration: var(--tw-duration, var(--default-transition-duration)); } .\[transition-property\:--axo-select-trigger-mask-start\] { transition-property: --axo-select-trigger-mask-start; } .duration-100 { --tw-duration: 100ms; transition-duration: 100ms; } .duration-150 { --tw-duration: 150ms; transition-duration: 150ms; } .duration-200 { --tw-duration: 200ms; transition-duration: 200ms; } .duration-250 { --tw-duration: 250ms; transition-duration: 250ms; } .duration-500 { --tw-duration: 500ms; transition-duration: 500ms; } .ease-out-cubic { --tw-ease: var(--ease-out-cubic); transition-timing-function: var(--ease-out-cubic); } .contain-layout { --tw-contain-layout: layout; contain: var(--tw-contain-size,) var(--tw-contain-layout,) var(--tw-contain-paint,) var(--tw-contain-style,); } .contain-strict { contain: strict; } .forced-color-adjust-none { forced-color-adjust: none; } .animate-duration-1 { --tw-animate-duration: calc(1 * 1ms); animation-duration: calc(1 * 1ms); } .animate-duration-300\! { --tw-animate-duration: calc(300 * 1ms) !important; animation-duration: calc(300 * 1ms) !important; } .outline-none { --tw-outline-style: none; outline-style: none; } .select-all { -webkit-user-select: all; user-select: all; } .select-none { -webkit-user-select: none; user-select: none; } .\[--axo-select-trigger-mask-start\:black\] { --axo-select-trigger-mask-start: black; } .\[animation-name\:axo-scroll-area-hint-reveal\] { animation-name: axo-scroll-area-hint-reveal; } .\[scrollbar-width\:none\] { scrollbar-width: none; } .animate-both { animation-fill-mode: both; } .animate-opacity-0 { --tw-animate-opacity: calc(0 * 1%); } .animate-reverse { animation-direction: reverse; } .animate-scale-98 { --tw-animate-scale: scale(calc(98 * 1%)); } .animate-translate-y-1 { --tw-animate-translate-y: translateY(calc(var(--spacing) * 1)); } .paused { animation-play-state: paused; } .running { animation-play-state: running; } .scrollbar-gutter-auto { scrollbar-gutter: auto; } .scrollbar-gutter-stable { scrollbar-gutter: stable; } .scrollbar-width-auto { scrollbar-width: auto; } .scrollbar-width-none { scrollbar-width: none; } .scrollbar-width-thin { scrollbar-width: thin; } .shadow-no-outline { --axo-shadow-no-outline: 0 0 #0000; } .\*\:relative { :is(& > *) { position: relative; } } .\*\:z-20 { :is(& > *) { z-index: 20; } } .\*\:mx-0 { :is(& > *) { margin-inline: calc(var(--spacing) * 0); } } .not-hover\:not-focus-within\:scrollbar-thumb-transparent { &:not(*:hover) { &:not(*:focus-within) { --tw-scrollbar-thumb: var(--color-transparent); scrollbar-color: var(--tw-scrollbar-thumb, var(--default-scrollbar-thumb)) var(--tw-scrollbar-track, var(--default-scrollbar-track)); } } @media not (hover: hover) { &:not(*:focus-within) { --tw-scrollbar-thumb: var(--color-transparent); scrollbar-color: var(--tw-scrollbar-thumb, var(--default-scrollbar-thumb)) var(--tw-scrollbar-track, var(--default-scrollbar-track)); } } } .not-dark\:hidden { &:not(*:where(.dark-theme, .dark-theme *)) { display: none; } } .not-forced-colors\:outline-0 { @media not (forced-colors: active) { outline-style: var(--tw-outline-style); outline-width: 0px; } } .group-hover\:opacity-100 { &:is(:where(.group):hover *) { @media (hover: hover) { opacity: 100%; } } } .group-focus\:opacity-100 { &:is(:where(.group):focus *) { opacity: 100%; } } .group-focus\:\[--axo-select-trigger-mask-start\:transparent\] { &:is(:where(.group):focus *) { --axo-select-trigger-mask-start: transparent; } } .group-data-\[disabled\]\:w-7\.5 { &:is(:where(.group)[data-disabled] *) { width: calc(var(--spacing) * 7.5); } } .group-data-\[disabled\]\:rounded-full { &:is(:where(.group)[data-disabled] *) { border-radius: calc(infinity * 1px); } } .group-data-\[focused\]\:opacity-100 { &:is(:where(.group)[data-focused] *) { opacity: 100%; } } .group-data-\[hovered\]\:underline { &:is(:where(.group)[data-hovered] *) { text-decoration-line: underline; } } .group-data-\[state\=active\]\:bg-label-primary { &:is(:where(.group)[data-state="active"] *) { background-color: var(--color-label-primary); } } .group-data-\[state\=checked\]\:translate-x-0 { &:is(:where(.group)[data-state="checked"] *) { --tw-translate-x: calc(var(--spacing) * 0); translate: var(--tw-translate-x) var(--tw-translate-y); } } .group-data-\[state\=checked\]\:opacity-100 { &:is(:where(.group)[data-state="checked"] *) { opacity: 100%; } } .group-data-\[state\=open\]\:opacity-100 { &:is(:where(.group)[data-state="open"] *) { opacity: 100%; } } .group-data-\[state\=open\]\:\[--axo-select-trigger-mask-start\:transparent\] { &:is(:where(.group)[data-state="open"] *) { --axo-select-trigger-mask-start: transparent; } } .group-hovered\:bg-color-fill-destructive\/15 { &:is(:where(.group):where(:hover:not(:disabled)) *) { background-color: color-mix(in srgb, light-dark(#FD2512, #FB4332) 15%, transparent); @supports (color: color-mix(in lab, red, red)) { background-color: color-mix(in oklab, var(--color-color-fill-destructive) 15%, transparent); } } } .group-hovered\:bg-color-fill-primary\/15 { &:is(:where(.group):where(:hover:not(:disabled)) *) { background-color: color-mix(in srgb, light-dark(#4655FF, #5563FF) 15%, transparent); @supports (color: color-mix(in lab, red, red)) { background-color: color-mix(in oklab, var(--color-color-fill-primary) 15%, transparent); } } } .group-hovered\:opacity-100 { &:is(:where(.group):where(:hover:not(:disabled)) *) { opacity: 100%; } } .group-hovered\:\[--axo-select-trigger-mask-start\:transparent\] { &:is(:where(.group):where(:hover:not(:disabled)) *) { --axo-select-trigger-mask-start: transparent; } } .group-pressed\:bg-color-fill-primary-pressed { &:is(:where(.group):where(:active:not(:disabled)) *) { background-color: var(--color-color-fill-primary-pressed); } } .group-focused\:opacity-100 { &:is(:where(.keyboard-mode) :where(.group):where(:focus) *) { opacity: 100%; } } .group-focused\:outline-\[2\.5px\] { &:is(:where(.keyboard-mode) :where(.group):where(:focus) *) { outline-style: var(--tw-outline-style); outline-width: 2.5px; } } .placeholder\:text-label-placeholder { &::placeholder { color: var(--color-label-placeholder); } } .focus-within\:border-border-focused { &:focus-within { border-color: var(--color-border-focused); } } .hover\:bg-\[\#000\]\/40 { &:hover { @media (hover: hover) { background-color: color-mix(in oklab, #000 40%, transparent); } } } .hover\:bg-fill-secondary { &:hover { @media (hover: hover) { background-color: var(--color-fill-secondary); } } } .hover\:underline { &:hover { @media (hover: hover) { text-decoration-line: underline; } } } .focus\:border-border-focused { &:focus { border-color: var(--color-border-focused); } } .focus\:bg-fill-secondary { &:focus { background-color: var(--color-fill-secondary); } } .focus\:bg-fill-selected { &:focus { background-color: var(--color-fill-selected); } } .focus-visible\:border-color-label-light { &:focus-visible { border-color: var(--color-color-label-light); } } .focus-visible\:bg-fill-selected { &:focus-visible { background-color: var(--color-fill-selected); } } .disabled\:text-color-label-affirmative-disabled { &:disabled { color: var(--color-color-label-affirmative-disabled); } } .disabled\:text-color-label-destructive-disabled { &:disabled { color: var(--color-color-label-destructive-disabled); } } .disabled\:text-color-label-primary-disabled { &:disabled { color: var(--color-color-label-primary-disabled); } } .disabled\:text-label-disabled { &:disabled { color: var(--color-label-disabled); } } .disabled\:text-label-disabled-on-color { &:disabled { color: var(--color-label-disabled-on-color); } } .aria-pressed\:bg-color-fill-primary { &[aria-pressed="true"] { background-color: var(--color-color-fill-primary); } } .aria-pressed\:bg-fill-inverted { &[aria-pressed="true"] { background-color: var(--color-fill-inverted); } } .aria-pressed\:text-label-primary-inverted { &[aria-pressed="true"] { color: var(--color-label-primary-inverted); } } .aria-pressed\:text-label-primary-on-color { &[aria-pressed="true"] { color: var(--color-label-primary-on-color); } } .aria-pressed\:disabled\:text-label-disabled-inverted { &[aria-pressed="true"] { &:disabled { color: var(--color-label-disabled-inverted); } } } .aria-pressed\:disabled\:text-label-disabled-on-color { &[aria-pressed="true"] { &:disabled { color: var(--color-label-disabled-on-color); } } } .data-focused\:bg-fill-secondary { &[data-focused] { background-color: var(--color-fill-secondary); } } .data-hovered\:bg-fill-secondary { &[data-hovered] { background-color: var(--color-fill-secondary); } } .data-pressed\:bg-fill-secondary-pressed { &[data-pressed] { background-color: var(--color-fill-secondary-pressed); } } .data-\[axo-contextmenu-state\=open\]\:bg-fill-secondary { &[data-axo-contextmenu-state="open"] { background-color: var(--color-fill-secondary); } } .data-\[axo-dropdownmenu-state\=open\]\:bg-color-fill-affirmative-pressed { &[data-axo-dropdownmenu-state="open"] { background-color: var(--color-color-fill-affirmative-pressed); } } .data-\[axo-dropdownmenu-state\=open\]\:bg-color-fill-destructive-pressed { &[data-axo-dropdownmenu-state="open"] { background-color: var(--color-color-fill-destructive-pressed); } } .data-\[axo-dropdownmenu-state\=open\]\:bg-color-fill-primary-pressed { &[data-axo-dropdownmenu-state="open"] { background-color: var(--color-color-fill-primary-pressed); } } .data-\[axo-dropdownmenu-state\=open\]\:bg-fill-floating-pressed { &[data-axo-dropdownmenu-state="open"] { background-color: var(--color-fill-floating-pressed); } } .data-\[axo-dropdownmenu-state\=open\]\:bg-fill-secondary-pressed { &[data-axo-dropdownmenu-state="open"] { background-color: var(--color-fill-secondary-pressed); } } .data-\[disabled\]\:border-border-secondary { &[data-disabled] { border-color: var(--color-border-secondary); } } .data-\[disabled\]\:bg-fill-primary { &[data-disabled] { background-color: var(--color-fill-primary); } } .data-\[disabled\]\:bg-label-disabled-on-color { &[data-disabled] { background-color: var(--color-label-disabled-on-color); } } .data-\[disabled\]\:text-label-disabled { &[data-disabled] { color: var(--color-label-disabled); } } .data-\[focused\]\:border-color-label-light { &[data-focused] { border-color: var(--color-color-label-light); } } .data-\[focused\]\:outline-\[2\.5px\] { &[data-focused] { outline-style: var(--tw-outline-style); outline-width: 2.5px; } } .data-\[highlighted\]\:bg-fill-secondary-pressed { &[data-highlighted] { background-color: var(--color-fill-secondary-pressed); } } .data-\[hovered\]\:bg-background-secondary { &[data-hovered] { background-color: var(--color-background-secondary); } } .data-\[pressed\]\:bg-fill-secondary-pressed { &[data-pressed] { background-color: var(--color-fill-secondary-pressed); } } .data-\[state\=active\]\:animate-enter { &[data-state="active"] { animation-name: tw-animate-enter; animation-duration: var( --tw-animate-duration, var(--default-animation-duration) ); animation-timing-function: var( --tw-animate-ease, var(--default-animation-timing-function) ); } } .data-\[state\=active\]\:animate-translate-y-\[-100\%\] { &[data-state="active"] { --tw-animate-translate-y: translateY(-100%); } } .data-\[state\=active\]\:animate-translate-y-\[100\%\] { &[data-state="active"] { --tw-animate-translate-y: translateY(100%); } } .data-\[state\=checked\]\:translate-x-3\.5 { &[data-state="checked"] { --tw-translate-x: calc(var(--spacing) * 3.5); translate: var(--tw-translate-x) var(--tw-translate-y); } } .data-\[state\=checked\]\:bg-color-fill-primary { &[data-state="checked"] { background-color: var(--color-color-fill-primary); } } .data-\[state\=checked\]\:bg-label-primary-on-color { &[data-state="checked"] { background-color: var(--color-label-primary-on-color); } } .data-\[state\=checked\]\:text-label-primary-on-color { &[data-state="checked"] { color: var(--color-label-primary-on-color); } } .data-\[state\=checked\]\:data-\[disabled\]\:bg-label-disabled-on-color { &[data-state="checked"] { &[data-disabled] { background-color: var(--color-label-disabled-on-color); } } } .data-\[state\=checked\]\:data-\[disabled\]\:text-label-disabled-on-color { &[data-state="checked"] { &[data-disabled] { color: var(--color-label-disabled-on-color); } } } .data-\[state\=closed\]\:animate-exit { &[data-state="closed"] { animation-name: tw-animate-exit; animation-duration: var( --tw-animate-duration, var(--default-animation-duration) ); animation-timing-function: var( --tw-animate-ease, var(--default-animation-timing-function) ); } } .data-\[state\=inactive\]\:animate-exit { &[data-state="inactive"] { animation-name: tw-animate-exit; animation-duration: var( --tw-animate-duration, var(--default-animation-duration) ); animation-timing-function: var( --tw-animate-ease, var(--default-animation-timing-function) ); } } .data-\[state\=inactive\]\:animate-translate-y-\[-100\%\] { &[data-state="inactive"] { --tw-animate-translate-y: translateY(-100%); } } .data-\[state\=inactive\]\:animate-translate-y-\[100\%\] { &[data-state="inactive"] { --tw-animate-translate-y: translateY(100%); } } .data-\[state\=open\]\:animate-enter { &[data-state="open"] { animation-name: tw-animate-enter; animation-duration: var( --tw-animate-duration, var(--default-animation-duration) ); animation-timing-function: var( --tw-animate-ease, var(--default-animation-timing-function) ); } } .data-\[state\=open\]\:not-data-\[highlighted\]\:bg-fill-secondary { &[data-state="open"] { &:not(*[data-highlighted]) { background-color: var(--color-fill-secondary); } } } .data-\[state\=unchecked\]\:bg-fill-primary { &[data-state="unchecked"] { background-color: var(--color-fill-primary); } } .motion-reduce\:transition-none { @media (prefers-reduced-motion: reduce) { transition-property: none; } } .sm\:grid-cols-2 { @media (width >= 40rem) { grid-template-columns: repeat(2, minmax(0, 1fr)); } } .md\:grid-cols-3 { @media (width >= 48rem) { grid-template-columns: repeat(3, minmax(0, 1fr)); } } .lg\:grid-cols-4 { @media (width >= 64rem) { grid-template-columns: repeat(4, minmax(0, 1fr)); } } .xl\:grid-cols-5 { @media (width >= 80rem) { grid-template-columns: repeat(5, minmax(0, 1fr)); } } .\32 xl\:grid-cols-6 { @media (width >= 96rem) { grid-template-columns: repeat(6, minmax(0, 1fr)); } } .\@min-\[260px\]\:block { @container (width >= 260px) { display: block; } } .\@min-\[260px\]\:hidden { @container (width >= 260px) { display: none; } } .\@min-\[455px\]\:grid-cols-\[repeat\(4\,_minmax\(100px\,_120px\)\)\] { @container (width >= 455px) { grid-template-columns: repeat(4, minmax(100px, 120px)); } } .\@min-\[560px\]\:grid-cols-\[repeat\(5\,_minmax\(100px\,_120px\)\)\] { @container (width >= 560px) { grid-template-columns: repeat(5, minmax(100px, 120px)); } } .rtl\:translate-x-3\.5 { &:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *) { --tw-translate-x: calc(var(--spacing) * 3.5); translate: var(--tw-translate-x) var(--tw-translate-y); } } .rtl\:bg-gradient-to-l { &:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *) { --tw-gradient-position: to left in oklab; background-image: linear-gradient(var(--tw-gradient-stops)); } } .rtl\:bg-gradient-to-r { &:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *) { --tw-gradient-position: to right in oklab; background-image: linear-gradient(var(--tw-gradient-stops)); } } .rtl\:\[mask-image\:linear-gradient\(to_right\,var\(--axo-select-trigger-mask-start\)_19px\,black_38px\)\] { &:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *) { mask-image: linear-gradient(to right,var(--axo-select-trigger-mask-start) 19px,black 38px); } } .rtl\:\[mask-position\:left\] { &:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *) { mask-position: left; } } .rtl\:data-\[state\=checked\]\:-translate-x-3\.5 { &:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *) { &[data-state="checked"] { --tw-translate-x: calc(var(--spacing) * -3.5); translate: var(--tw-translate-x) var(--tw-translate-y); } } } .dark\:block { &:where(.dark-theme, .dark-theme *) { display: block; } } .dark\:hidden { &:where(.dark-theme, .dark-theme *) { display: none; } } .dark\:inline { &:where(.dark-theme, .dark-theme *) { display: inline; } } .dark\:bg-elevated-background-tertiary { &:where(.dark-theme, .dark-theme *) { background-color: var(--color-elevated-background-tertiary); } } .dark\:from-shadow-elevation-1 { &:where(.dark-theme, .dark-theme *) { --tw-gradient-from: var(--color-shadow-elevation-1); --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); } } .forced-colors\:visible { @media (forced-colors: active) { visibility: visible; } } .forced-colors\:h-px { @media (forced-colors: active) { height: 1px; } } .forced-colors\:w-px { @media (forced-colors: active) { width: 1px; } } .forced-colors\:border { @media (forced-colors: active) { border-style: var(--tw-border-style); border-width: 1px; } } .forced-colors\:border-\[ButtonBorder\] { @media (forced-colors: active) { border-color: ButtonBorder; } } .forced-colors\:bg-\[AccentColor\] { @media (forced-colors: active) { background-color: AccentColor; } } .forced-colors\:bg-\[ButtonBorder\] { @media (forced-colors: active) { background-color: ButtonBorder; } } .forced-colors\:bg-\[ButtonFace\] { @media (forced-colors: active) { background-color: ButtonFace; } } .forced-colors\:bg-\[Canvas\] { @media (forced-colors: active) { background-color: Canvas; } } .forced-colors\:bg-\[Mark\] { @media (forced-colors: active) { background-color: Mark; } } .forced-colors\:bg-\[SelectedItem\] { @media (forced-colors: active) { background-color: SelectedItem; } } .forced-colors\:text-\[AccentColorText\] { @media (forced-colors: active) { color: AccentColorText; } } .forced-colors\:text-\[ButtonText\] { @media (forced-colors: active) { color: ButtonText; } } .forced-colors\:text-\[CanvasText\] { @media (forced-colors: active) { color: CanvasText; } } .forced-colors\:text-\[MarkText\] { @media (forced-colors: active) { color: MarkText; } } .forced-colors\:text-\[SelectedItemText\] { @media (forced-colors: active) { color: SelectedItemText; } } .forced-colors\:text-\[inherit\] { @media (forced-colors: active) { color: inherit; } } .forced-colors\:group-data-\[disabled\]\:bg-\[GrayText\] { @media (forced-colors: active) { &:is(:where(.group)[data-disabled] *) { background-color: GrayText; } } } .forced-colors\:disabled\:text-\[GrayText\] { @media (forced-colors: active) { &:disabled { color: GrayText; } } } .forced-colors\:aria-pressed\:bg-\[SelectedItem\] { @media (forced-colors: active) { &[aria-pressed="true"] { background-color: SelectedItem; } } } .forced-colors\:aria-pressed\:text-\[SelectedItemText\] { @media (forced-colors: active) { &[aria-pressed="true"] { color: SelectedItemText; } } } .forced-colors\:data-\[axo-contextmenu-state\=open\]\:bg-\[Highlight\] { @media (forced-colors: active) { &[data-axo-contextmenu-state="open"] { background-color: Highlight; } } } .forced-colors\:data-\[axo-contextmenu-state\=open\]\:text-\[HighlightText\] { @media (forced-colors: active) { &[data-axo-contextmenu-state="open"] { color: HighlightText; } } } .forced-colors\:data-\[disabled\]\:bg-\[ButtonFace\] { @media (forced-colors: active) { &[data-disabled] { background-color: ButtonFace; } } } .forced-colors\:data-\[disabled\]\:text-\[GrayText\] { @media (forced-colors: active) { &[data-disabled] { color: GrayText; } } } .forced-colors\:data-\[highlighted\]\:bg-\[Highlight\] { @media (forced-colors: active) { &[data-highlighted] { background-color: Highlight; } } } .forced-colors\:data-\[highlighted\]\:text-\[HighlightText\] { @media (forced-colors: active) { &[data-highlighted] { color: HighlightText; } } } .forced-colors\:data-\[state\=checked\]\:bg-\[SelectedItemText\] { @media (forced-colors: active) { &[data-state="checked"] { background-color: SelectedItemText; } } } .forced-colors\:data-\[state\=checked\]\:bg-\[SelectedItem\] { @media (forced-colors: active) { &[data-state="checked"] { background-color: SelectedItem; } } } .forced-colors\:data-\[state\=open\]\:not-data-\[highlighted\]\:bg-\[Highlight\] { @media (forced-colors: active) { &[data-state="open"] { &:not(*[data-highlighted]) { background-color: Highlight; } } } } .forced-colors\:data-\[state\=open\]\:not-data-\[highlighted\]\:text-\[HighlightText\] { @media (forced-colors: active) { &[data-state="open"] { &:not(*[data-highlighted]) { color: HighlightText; } } } } .hovered\:bg-fill-secondary { &:where(:hover:not(:disabled)) { background-color: var(--color-fill-secondary); } } .pressed\:bg-color-fill-affirmative-pressed { &:where(:active:not(:disabled)) { background-color: var(--color-color-fill-affirmative-pressed); } } .pressed\:bg-color-fill-destructive-pressed { &:where(:active:not(:disabled)) { background-color: var(--color-color-fill-destructive-pressed); } } .pressed\:bg-color-fill-primary-pressed { &:where(:active:not(:disabled)) { background-color: var(--color-color-fill-primary-pressed); } } .pressed\:bg-fill-floating-pressed { &:where(:active:not(:disabled)) { background-color: var(--color-fill-floating-pressed); } } .pressed\:bg-fill-secondary-pressed { &:where(:active:not(:disabled)) { background-color: var(--color-fill-secondary-pressed); } } .aria-pressed\:pressed\:bg-color-fill-primary-pressed { &[aria-pressed="true"] { &:where(:active:not(:disabled)) { background-color: var(--color-color-fill-primary-pressed); } } } .aria-pressed\:pressed\:bg-fill-inverted-pressed { &[aria-pressed="true"] { &:where(:active:not(:disabled)) { background-color: var(--color-fill-inverted-pressed); } } } .data-\[state\=checked\]\:pressed\:bg-color-fill-primary-pressed { &[data-state="checked"] { &:where(:active:not(:disabled)) { background-color: var(--color-color-fill-primary-pressed); } } } .data-\[state\=unchecked\]\:pressed\:bg-fill-primary-pressed { &[data-state="unchecked"] { &:where(:active:not(:disabled)) { background-color: var(--color-fill-primary-pressed); } } } .focused\:outline-\[2\.5px\] { :where(.keyboard-mode) &:where(:focus) { outline-style: var(--tw-outline-style); outline-width: 2.5px; } } .not-forced-colors\:focused\:outline-\[2\.5px\] { @media not (forced-colors: active) { :where(.keyboard-mode) &:where(:focus) { outline-style: var(--tw-outline-style); outline-width: 2.5px; } } } .\[\:where\(\.keyboard-mode\)_\&\:has\(\[data-axo-scroll-area-viewport\]\:focus\)\]\:outline-\[2\.5px\] { :where(.keyboard-mode) &:has([data-axo-scroll-area-viewport]:focus) { outline-style: var(--tw-outline-style); outline-width: 2.5px; } } } @property --tw-animate-duration { syntax: '*'; inherits: false; } @property --tw-animate-ease { syntax: '*'; inherits: false; } @property --tw-animate-opacity { syntax: '*'; inherits: false; } @property --tw-animate-rotate { syntax: '*'; inherits: false; } @property --tw-animate-scale { syntax: '*'; inherits: false; } @property --tw-animate-translate-x { syntax: '*'; inherits: false; } @property --tw-animate-translate-y { syntax: '*'; inherits: false; } @layer utilities { @keyframes tw-animate-enter { from { opacity: var(--tw-animate-opacity); transform: var(--tw-animate-rotate,) var(--tw-animate-scale,) var(--tw-animate-translate-x,) var(--tw-animate-translate-y,); } } @keyframes tw-animate-exit { to { opacity: var(--tw-animate-opacity); transform: var(--tw-animate-rotate,) var(--tw-animate-scale,) var(--tw-animate-translate-x,) var(--tw-animate-translate-y,); } } } @property --tw-scrollbar-track { syntax: '*'; inherits: false; } @property --tw-scrollbar-thumb { syntax: '*'; inherits: false; } @layer base { * { scrollbar-width: var(--default-scrollbar-width); scrollbar-color: var(--default-scrollbar-thumb) var(--default-scrollbar-track); } } @layer components { @keyframes axo-scroll-area-hint-reveal { from { opacity: 0; } to { opacity: 1; } } } @layer components { @property --axo-scroll-area-mask-top-from-color { syntax: ''; inherits: false; initial-value: black; } @property --axo-scroll-area-mask-top-via-color { syntax: ''; inherits: false; initial-value: black; } @property --axo-scroll-area-mask-bottom-from-color { syntax: ''; inherits: false; initial-value: black; } @property --axo-scroll-area-mask-bottom-via-color { syntax: ''; inherits: false; initial-value: black; } @property --axo-scroll-area-mask-inline-start-from-color { syntax: ''; inherits: false; initial-value: black; } @property --axo-scroll-area-mask-inline-start-via-color { syntax: ''; inherits: false; initial-value: black; } @property --axo-scroll-area-mask-inline-end-from-color { syntax: ''; inherits: false; initial-value: black; } @property --axo-scroll-area-mask-inline-end-via-color { syntax: ''; inherits: false; initial-value: black; } @keyframes axo-scroll-area-mask-top-from-color { to { --axo-scroll-area-mask-top-from-color: transparent; } } @keyframes axo-scroll-area-mask-top-via-color { to { --axo-scroll-area-mask-top-via-color: transparent; } } @keyframes axo-scroll-area-mask-bottom-from-color { to { --axo-scroll-area-mask-bottom-from-color: transparent; } } @keyframes axo-scroll-area-mask-bottom-via-color { to { --axo-scroll-area-mask-bottom-via-color: transparent; } } @keyframes axo-scroll-area-mask-inline-start-from-color { to { --axo-scroll-area-mask-inline-start-from-color: transparent; } } @keyframes axo-scroll-area-mask-inline-start-via-color { to { --axo-scroll-area-mask-inline-start-via-color: transparent; } } @keyframes axo-scroll-area-mask-inline-end-from-color { to { --axo-scroll-area-mask-inline-end-from-color: transparent; } } @keyframes axo-scroll-area-mask-inline-end-via-color { to { --axo-scroll-area-mask-inline-end-via-color: transparent; } } .axo-scroll-area-mask { --axo-scroll-area-mask-inline-start-side: left; --axo-scroll-area-mask-inline-end-side: right; &:dir(rtl) { --axo-scroll-area-mask-inline-start-side: right; --axo-scroll-area-mask-inline-end-side: left; } mask-image: linear-gradient(black), linear-gradient(black), linear-gradient( to bottom, var(--axo-scroll-area-mask-top-from-color) var(--axo-scroll-area-mask-start), var(--axo-scroll-area-mask-top-via-color) var(--axo-scroll-area-mask-padding), black var(--axo-scroll-area-mask-end) ), linear-gradient( to top, var(--axo-scroll-area-mask-bottom-from-color) var(--axo-scroll-area-mask-start), var(--axo-scroll-area-mask-bottom-via-color) var(--axo-scroll-area-mask-padding), black var(--axo-scroll-area-mask-end) ), linear-gradient( to var(--axo-scroll-area-mask-inline-end-side), var(--axo-scroll-area-mask-inline-start-from-color) var(--axo-scroll-area-mask-start), var(--axo-scroll-area-mask-inline-start-via-color) var(--axo-scroll-area-mask-padding), black var(--axo-scroll-area-mask-end) ), linear-gradient( to var(--axo-scroll-area-mask-inline-start-side), var(--axo-scroll-area-mask-inline-end-from-color) var(--axo-scroll-area-mask-start), var(--axo-scroll-area-mask-inline-end-via-color) var(--axo-scroll-area-mask-padding), black var(--axo-scroll-area-mask-end) ); mask-composite: add, add, intersect, intersect, intersect, intersect; mask-size: var(--axo-scroll-area-mask-scrollbar-gutter-vertical) 100%, 100% var(--axo-scroll-area-mask-scrollbar-gutter-horizontal), calc(100% - var(--axo-scroll-area-mask-scrollbar-gutter-vertical)) calc(100% - var(--axo-scroll-area-mask-scrollbar-gutter-horizontal)), calc(100% - var(--axo-scroll-area-mask-scrollbar-gutter-vertical)) calc(100% - var(--axo-scroll-area-mask-scrollbar-gutter-horizontal)), calc(100% - var(--axo-scroll-area-mask-scrollbar-gutter-vertical)) calc(100% - var(--axo-scroll-area-mask-scrollbar-gutter-horizontal)), calc(100% - var(--axo-scroll-area-mask-scrollbar-gutter-vertical)) calc(100% - var(--axo-scroll-area-mask-scrollbar-gutter-horizontal)); mask-position: top 0px var(--axo-scroll-area-mask-inline-end-side) 0px, bottom 0px var(--axo-scroll-area-mask-inline-start-side) 0px, top 0px var(--axo-scroll-area-mask-inline-start-side) 0px, bottom var(--axo-scroll-area-mask-scrollbar-gutter-horizontal) var(--axo-scroll-area-mask-inline-start-side) 0px, top 0px var(--axo-scroll-area-mask-inline-start-side) 0px, top 0px var(--axo-scroll-area-mask-inline-end-side) var(--axo-scroll-area-mask-scrollbar-gutter-vertical); mask-mode: alpha; mask-repeat: no-repeat; animation-name: axo-scroll-area-mask-top-from-color, axo-scroll-area-mask-top-via-color, axo-scroll-area-mask-bottom-from-color, axo-scroll-area-mask-bottom-via-color, axo-scroll-area-mask-inline-start-from-color, axo-scroll-area-mask-inline-start-via-color, axo-scroll-area-mask-inline-end-from-color, axo-scroll-area-mask-inline-end-via-color; animation-timeline: --axo-scroll-area-timeline-vertical, --axo-scroll-area-timeline-vertical, --axo-scroll-area-timeline-vertical, --axo-scroll-area-timeline-vertical, --axo-scroll-area-timeline-horizontal, --axo-scroll-area-timeline-horizontal, --axo-scroll-area-timeline-horizontal, --axo-scroll-area-timeline-horizontal; animation-range: var(--axo-scroll-area-animation-start) var(--axo-scroll-area-animation-padding), var(--axo-scroll-area-animation-start) var(--axo-scroll-area-animation-end), calc(100% - var(--axo-scroll-area-animation-padding)) calc(100% - var(--axo-scroll-area-animation-start)), calc(100% - var(--axo-scroll-area-animation-end)) calc(100% - var(--axo-scroll-area-animation-start)), var(--axo-scroll-area-animation-start) var(--axo-scroll-area-animation-padding), var(--axo-scroll-area-animation-start) var(--axo-scroll-area-animation-end), calc(100% - var(--axo-scroll-area-animation-padding)) calc(100% - var(--axo-scroll-area-animation-start)), calc(100% - var(--axo-scroll-area-animation-end)) calc(100% - var(--axo-scroll-area-animation-start)); animation-direction: normal, normal, reverse, reverse, normal, normal, reverse, reverse; animation-duration: 1ms; animation-fill-mode: both; } } @layer theme { @media (prefers-contrast: more) { :root { --color-label-primary: light-dark(/* */ #000 /* */, /* */ #FFF /* */); --color-label-secondary: light-dark(color-mix(in oklab, #000 70%, transparent), color-mix(in oklab, #FFF 70%, transparent)); --color-label-placeholder: light-dark(color-mix(in oklab, #000 50%, transparent), color-mix(in oklab, #FFF 50%, transparent)); --color-label-disabled: light-dark(color-mix(in oklab, #000 40%, transparent), color-mix(in oklab, #FFF 40%, transparent)); --color-label-primary-inverted: light-dark(/* */ #FFF /* */, /* */ #000 /* */); --color-label-secondary-inverted: light-dark(color-mix(in oklab, #FFF 70%, transparent), color-mix(in oklab, #000 70%, transparent)); --color-label-placeholder-inverted: light-dark(color-mix(in oklab, #FFF 50%, transparent), color-mix(in oklab, #000 50%, transparent)); --color-label-disabled-inverted: light-dark(color-mix(in oklab, #FFF 40%, transparent), color-mix(in oklab, #000 40%, transparent)); --color-label-primary-on-color: light-dark(/* */ #FFF /* */, /* */ #FFF /* */); --color-label-secondary-on-color: light-dark(color-mix(in oklab, #FFF 90%, transparent), color-mix(in oklab, #FFF 90%, transparent)); --color-label-placeholder-on-color: light-dark(color-mix(in oklab, #FFF 60%, transparent), color-mix(in oklab, #FFF 60%, transparent)); --color-label-disabled-on-color: light-dark(color-mix(in oklab, #FFF 50%, transparent), color-mix(in oklab, #FFF 50%, transparent)); --color-color-label-primary: light-dark(/* */ #000ECC /* */, /* */ #D5D9FF /* */); --color-color-label-primary-disabled: light-dark(color-mix(in oklab, #000ECC 40%, transparent), color-mix(in oklab, #D5D9FF 40%, transparent)); --color-color-label-light: light-dark(/* */ #D5D9FF /* */, /* */ #D5D9FF /* */); --color-color-label-light-disabled: light-dark(color-mix(in oklab, #D5D9FF 40%, transparent), color-mix(in oklab, #D5D9FF 40%, transparent)); --color-color-label-affirmative: light-dark(/* */ #004D0F /* */, /* */ #4CEF6D /* */); --color-color-label-affirmative-disabled: light-dark(color-mix(in oklab, #004D0F 40%, transparent), color-mix(in oklab, #4CEF6D 40%, transparent)); --color-color-label-destructive: light-dark(/* */ #8A0B00 /* */, /* */ #FFC5C2 /* */); --color-color-label-destructive-disabled: light-dark(color-mix(in oklab, #8A0B00 40%, transparent), color-mix(in oklab, #FFC5C2 40%, transparent)); --color-background-primary: light-dark(/* */ #FFFFFF /* */, /* */ #121212 /* */); --color-background-secondary: light-dark(/* */ #F6F6F6 /* */, /* */ #1E1E1E /* */); --color-background-overlay: light-dark(color-mix(in oklab, #000000 40%, transparent), color-mix(in oklab, #000000 60%, transparent)); --color-elevated-background-primary: light-dark(#FFFFFF, #222222); --color-elevated-background-secondary: light-dark(#F2F2F2, #2A2A2A); --color-elevated-background-tertiary: light-dark(#EAEAEA, #323232); --color-elevated-background-quaternary: light-dark(#262626, #3A3A3A); --color-fill-primary: light-dark(/* */ #FFFFFF /* */, color-mix(in oklab, #808080 30%, transparent)); --color-fill-primary-pressed: light-dark(/* */ #EAEAEA /* */, color-mix(in oklab, #808080 38%, transparent)); --color-fill-secondary: light-dark(color-mix(in oklab, #808080 22%, transparent), color-mix(in oklab, #808080 30%, transparent)); --color-fill-secondary-pressed: light-dark(color-mix(in oklab, #808080 30%, transparent), color-mix(in oklab, #808080 38%, transparent)); --color-fill-selected: light-dark(color-mix(in oklab, #808080 34%, transparent), color-mix(in oklab, #808080 42%, transparent)); --color-fill-inverted: light-dark(/* */ #2A2A2A /* */, /* */ #F6F6F6 /* */); --color-fill-inverted-pressed: light-dark(/* */ #363636 /* */, /* */ #E2E2E2 /* */); --color-fill-floating: light-dark(/* */ #FFFFFF /* */, /* */ #323232 /* */); --color-fill-floating-pressed: light-dark(/* */ #EAEAEA /* */, /* */ #3A3A3A /* */); --color-fill-on-media: light-dark(color-mix(in oklab, #000000 85%, transparent), color-mix(in oklab, #000000 85%, transparent)); --color-fill-on-media-pressed: light-dark(color-mix(in oklab, #000000 93%, transparent), color-mix(in oklab, #000000 93%, transparent)); --color-message-fill-incoming-primary: light-dark(/* */ #E0E0E0 /* */, /* */ #424242 /* */); --color-message-fill-incoming-secondary: light-dark(color-mix(in oklab, #FFFFFF 90%, transparent), color-mix(in oklab, #FFFFFF 30%, transparent)); --color-message-fill-incoming-tertiary: light-dark(color-mix(in oklab, #FFFFFF 70%, transparent), color-mix(in oklab, #FFFFFF 22%, transparent)); --color-message-fill-outgoing-primary: light-dark(/* */ #0842B9 /* */, /* */ #0842B9 /* */); --color-message-fill-outgoing-secondary: light-dark(color-mix(in oklab, #FFFFFF 70%, transparent), color-mix(in oklab, #FFFFFF 70%, transparent)); --color-message-fill-outgoing-tertiary: light-dark(color-mix(in oklab, #FFFFFF 30%, transparent), color-mix(in oklab, #FFFFFF 30%, transparent)); --color-color-fill-primary: light-dark(#2B3BED, #2B3BED); --color-color-fill-primary-pressed: light-dark(#1E2EE0, #1E2EE0); --color-color-fill-affirmative: light-dark(#1D7A2F, #1D7A2F); --color-color-fill-affirmative-pressed: light-dark(#115E23, #116E23); --color-color-fill-warning: light-dark(#F0C000, #F0C000); --color-color-fill-warning-pressed: light-dark(#E4B600, #E4B600); --color-color-fill-destructive: light-dark(#B7271A, #B7271A); --color-color-fill-destructive-pressed: light-dark(#A61609, #A61609); --color-border-primary: light-dark(color-mix(in oklab, #000000 32%, transparent), color-mix(in oklab, #FFFFFF 32%, transparent)); --color-border-secondary: light-dark(color-mix(in oklab, #000000 16%, transparent), color-mix(in oklab, #FFFFFF 16%, transparent)); --color-border-focused: light-dark(/* */ #A0A7FE /* */, /* */ #A0A7FE /* */); --color-border-selected: light-dark(/* */ #2B3BED /* */, /* */ #5563FF /* */); --color-border-selected-on-color: light-dark(/* */ #FFFFFF /* */, /* */ #FFFFFF /* */); --color-border-error: light-dark(/* */ #B7271A /* */, /* */ #FB4332 /* */); --color-shadow-elevation-1: light-dark(color-mix(in oklab, #000 08%, transparent), color-mix(in oklab, #000 16%, transparent)); --color-shadow-elevation-2: light-dark(color-mix(in oklab, #000 08%, transparent), color-mix(in oklab, #000 16%, transparent)); --color-shadow-elevation-3: light-dark(color-mix(in oklab, #000 10%, transparent), color-mix(in oklab, #000 20%, transparent)); --color-shadow-elevation-4: light-dark(color-mix(in oklab, #000 12%, transparent), color-mix(in oklab, #000 24%, transparent)); --color-shadow-elevation-5: light-dark(color-mix(in oklab, #000 20%, transparent), color-mix(in oklab, #000 40%, transparent)); --color-shadow-outline: light-dark(color-mix(in oklab, #000 32%, transparent), /* */ transparent); --color-shadow-highlight: light-dark(/* */ transparent, color-mix(in oklab, #FFF 32%, transparent)); } } } @font-face { font-family: 'SignalSymbols'; font-style: normal; font-weight: 300 400 700; font-display: block; src: url('../fonts/signal-symbols/SignalSymbolsVariable.woff2'); } @layer base { :lang(ja) { --font-sans: Inter, 'SF Pro', 'SF Pro JP', 'BIZ UDGothic', 'Hiragino Kaku Gothic Pro', 'ヒラギノ角ゴ Pro W3', メイリオ, Meiryo, 'MS Pゴシック', 'Helvetica Neue', Helvetica, Arial, sans-serif; } :lang(fa) { --font-sans: 'Vazirmatn', -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Tahoma, 'Noto Sans Arabic', Helvetica, Arial, sans-serif; } :lang(ur) { --font-sans: 'Noto Nastaliq Urdu', Gulzar, 'Jameel Noori Nastaleeq', 'Faiz Lahori Nastaleeq', 'Urdu Typesetting', Helvetica, Arial, sans-serif; } } @property --axo-shadow-no-outline { syntax: '*'; inherits: false; } @property --axo-drop-shadow-no-outline { syntax: '*'; inherits: false; } @layer base { @keyframes animate-spinner-v2-rotate { 0% { transform: rotate(-180deg); } 100% { transform: rotate(180deg); } } @keyframes animate-spinner-v2-dash { 0% { stroke-dasharray: 2%, 300%; stroke-dashoffset: 0; } 50% { stroke-dasharray: 180%, 300%; stroke-dashoffset: -70%; } 100% { stroke-dasharray: 180%, 300%; stroke-dashoffset: -248%; } } } @property --axo-select-trigger-mask-start { syntax: ''; inherits: false; initial-value: transparent; } @property --tw-border-spacing-x { syntax: ""; inherits: false; initial-value: 0; } @property --tw-border-spacing-y { syntax: ""; inherits: false; initial-value: 0; } @property --tw-translate-x { syntax: "*"; inherits: false; initial-value: 0; } @property --tw-translate-y { syntax: "*"; inherits: false; initial-value: 0; } @property --tw-translate-z { syntax: "*"; inherits: false; initial-value: 0; } @property --tw-scale-x { syntax: "*"; inherits: false; initial-value: 1; } @property --tw-scale-y { syntax: "*"; inherits: false; initial-value: 1; } @property --tw-scale-z { syntax: "*"; inherits: false; initial-value: 1; } @property --tw-rotate-x { syntax: "*"; inherits: false; } @property --tw-rotate-y { syntax: "*"; inherits: false; } @property --tw-rotate-z { syntax: "*"; inherits: false; } @property --tw-skew-x { syntax: "*"; inherits: false; } @property --tw-skew-y { syntax: "*"; inherits: false; } @property --tw-scroll-snap-strictness { syntax: "*"; inherits: false; initial-value: proximity; } @property --tw-space-y-reverse { syntax: "*"; inherits: false; initial-value: 0; } @property --tw-border-style { syntax: "*"; inherits: false; initial-value: solid; } @property --tw-gradient-position { syntax: "*"; inherits: false; } @property --tw-gradient-from { syntax: ""; inherits: false; initial-value: #0000; } @property --tw-gradient-via { syntax: ""; inherits: false; initial-value: #0000; } @property --tw-gradient-to { syntax: ""; inherits: false; initial-value: #0000; } @property --tw-gradient-stops { syntax: "*"; inherits: false; } @property --tw-gradient-via-stops { syntax: "*"; inherits: false; } @property --tw-gradient-from-position { syntax: ""; inherits: false; initial-value: 0%; } @property --tw-gradient-via-position { syntax: ""; inherits: false; initial-value: 50%; } @property --tw-gradient-to-position { syntax: ""; inherits: false; initial-value: 100%; } @property --tw-leading { syntax: "*"; inherits: false; } @property --tw-font-weight { syntax: "*"; inherits: false; } @property --tw-shadow { syntax: "*"; inherits: false; initial-value: 0 0 #0000; } @property --tw-shadow-color { syntax: "*"; inherits: false; } @property --tw-shadow-alpha { syntax: ""; inherits: false; initial-value: 100%; } @property --tw-inset-shadow { syntax: "*"; inherits: false; initial-value: 0 0 #0000; } @property --tw-inset-shadow-color { syntax: "*"; inherits: false; } @property --tw-inset-shadow-alpha { syntax: ""; inherits: false; initial-value: 100%; } @property --tw-ring-color { syntax: "*"; inherits: false; } @property --tw-ring-shadow { syntax: "*"; inherits: false; initial-value: 0 0 #0000; } @property --tw-inset-ring-color { syntax: "*"; inherits: false; } @property --tw-inset-ring-shadow { syntax: "*"; inherits: false; initial-value: 0 0 #0000; } @property --tw-ring-inset { syntax: "*"; inherits: false; } @property --tw-ring-offset-width { syntax: ""; inherits: false; initial-value: 0px; } @property --tw-ring-offset-color { syntax: "*"; inherits: false; initial-value: #fff; } @property --tw-ring-offset-shadow { syntax: "*"; inherits: false; initial-value: 0 0 #0000; } @property --tw-outline-style { syntax: "*"; inherits: false; initial-value: solid; } @property --tw-blur { syntax: "*"; inherits: false; } @property --tw-brightness { syntax: "*"; inherits: false; } @property --tw-contrast { syntax: "*"; inherits: false; } @property --tw-grayscale { syntax: "*"; inherits: false; } @property --tw-hue-rotate { syntax: "*"; inherits: false; } @property --tw-invert { syntax: "*"; inherits: false; } @property --tw-opacity { syntax: "*"; inherits: false; } @property --tw-saturate { syntax: "*"; inherits: false; } @property --tw-sepia { syntax: "*"; inherits: false; } @property --tw-drop-shadow { syntax: "*"; inherits: false; } @property --tw-drop-shadow-color { syntax: "*"; inherits: false; } @property --tw-drop-shadow-alpha { syntax: ""; inherits: false; initial-value: 100%; } @property --tw-drop-shadow-size { syntax: "*"; inherits: false; } @property --tw-duration { syntax: "*"; inherits: false; } @property --tw-ease { syntax: "*"; inherits: false; } @property --tw-contain-size { syntax: "*"; inherits: false; } @property --tw-contain-layout { syntax: "*"; inherits: false; } @property --tw-contain-paint { syntax: "*"; inherits: false; } @property --tw-contain-style { syntax: "*"; inherits: false; } @layer properties { @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) { *, ::before, ::after, ::backdrop { --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-translate-z: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scale-z: 1; --tw-rotate-x: initial; --tw-rotate-y: initial; --tw-rotate-z: initial; --tw-skew-x: initial; --tw-skew-y: initial; --tw-scroll-snap-strictness: proximity; --tw-space-y-reverse: 0; --tw-border-style: solid; --tw-gradient-position: initial; --tw-gradient-from: #0000; --tw-gradient-via: #0000; --tw-gradient-to: #0000; --tw-gradient-stops: initial; --tw-gradient-via-stops: initial; --tw-gradient-from-position: 0%; --tw-gradient-via-position: 50%; --tw-gradient-to-position: 100%; --tw-leading: initial; --tw-font-weight: initial; --tw-shadow: 0 0 #0000; --tw-shadow-color: initial; --tw-shadow-alpha: 100%; --tw-inset-shadow: 0 0 #0000; --tw-inset-shadow-color: initial; --tw-inset-shadow-alpha: 100%; --tw-ring-color: initial; --tw-ring-shadow: 0 0 #0000; --tw-inset-ring-color: initial; --tw-inset-ring-shadow: 0 0 #0000; --tw-ring-inset: initial; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-outline-style: solid; --tw-blur: initial; --tw-brightness: initial; --tw-contrast: initial; --tw-grayscale: initial; --tw-hue-rotate: initial; --tw-invert: initial; --tw-opacity: initial; --tw-saturate: initial; --tw-sepia: initial; --tw-drop-shadow: initial; --tw-drop-shadow-color: initial; --tw-drop-shadow-alpha: 100%; --tw-drop-shadow-size: initial; --tw-duration: initial; --tw-ease: initial; --tw-contain-size: initial; --tw-contain-layout: initial; --tw-contain-paint: initial; --tw-contain-style: initial; --tw-animate-duration: initial; --tw-animate-ease: initial; --tw-animate-opacity: initial; --tw-animate-rotate: initial; --tw-animate-scale: initial; --tw-animate-translate-x: initial; --tw-animate-translate-y: initial; --tw-scrollbar-track: initial; --tw-scrollbar-thumb: initial; --axo-shadow-no-outline: initial; --axo-drop-shadow-no-outline: initial; --axo-select-trigger-mask-start: transparent; } } } /* Copyright 2013 The Chromium Authors * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ .peer-connection-dump-root { font-size: 0.8em; padding-bottom: 3px; } .update-log-container { float: left; width: 50em; overflow: auto; } .update-log-failure { background-color: #be2026; } .stats-graph-container { clear: both; margin: 0.5em 0 0.5em 0; } .stats-graph-sub-container { float: left; margin: 0.5em; } .stats-graph-sub-container > div { float: left; } .stats-graph-sub-container > div:first-child { float: none; } .stats-table-container { float: left; padding: 0 0 0 0; overflow: auto; } .stats-table-container >div:first-child { font-size: 0.8em; font-weight: bold; text-align: center; padding: 0 0 1em 0; } .stats-table-active-connection { font-weight: bold; } body { font-family: 'Lucida Grande', sans-serif; } table { border: none; margin: 0 1em 1em 0; } td { border: none; font-size: 0.8em; padding: 0 1em 0.5em 0; min-width: 10em; word-break: break-all; } table > tr { vertical-align: top; } th { border: none; font-size: 0.8em; padding: 0 0 0.5em 0; } .tab-head { background-color: rgb(220, 220, 220); margin: 10px 2px 0 2px; text-decoration: underline; cursor: pointer; display: inline-block; overflow: hidden; width: 20em; height: 3em; } .active-tab-head { background-color: turquoise; font-weight: bold; } .tab-body { border: 1px solid turquoise; border-top-width: 3px; padding: 0 10px 500px 10px; display: none; } .active-tab-body { display: block; } .user-media-request-div-class { background-color: lightgray; margin: 10px 0 10px 0; } .user-media-request-div-class > div { margin: 5px 0 5px 0; } .dumps-info { max-width: 60em; } details[open] details summary { background-color: rgb(220, 220, 220); } .peerconnection-deprecations { font-weight: bold; } .candidategrid tr { text-align: center; word-break: break-word; } .candidategrid-active { font-weight: bold; } .candidategrid-candidatepair { background-color: #ccc; } .candidategrid-candidatepair td:first-of-type { text-align: left; } .candidategrid-candidate { background-color: #ddd; } .candidategrid-candidate td:first-of-type { text-align: right; } "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var AttachmentCrypto_node_exports = {}; __export(AttachmentCrypto_node_exports, { _generateAttachmentIv: () => _generateAttachmentIv, decryptAndReencryptLocally: () => decryptAndReencryptLocally, decryptAttachmentV2: () => decryptAttachmentV2, decryptAttachmentV2ToSink: () => decryptAttachmentV2ToSink, encryptAttachmentV2: () => encryptAttachmentV2, encryptAttachmentV2ToDisk: () => encryptAttachmentV2ToDisk, generateAttachmentKeys: () => generateAttachmentKeys, generateKeys: () => generateKeys, getPlaintextHashForInMemoryAttachment: () => getPlaintextHashForInMemoryAttachment, measureSize: () => measureSize, safeUnlink: () => safeUnlink, splitKeys: () => splitKeys }); module.exports = __toCommonJS(AttachmentCrypto_node_exports); var import_node_fs = require("node:fs"); var import_promises = require("node:fs/promises"); var import_node_crypto = require("node:crypto"); var import_node_stream = require("node:stream"); var import_promises2 = require("node:stream/promises"); var import_lodash = __toESM(require("lodash")); var import_fs_extra = __toESM(require("fs-extra")); var import_incremental_mac = require("@signalapp/libsignal-client/dist/incremental_mac.js"); var import_node_path = require("node:path"); var import_log_std = require("./logging/log.std.js"); var import_Crypto_std = require("./types/Crypto.std.js"); var import_Crypto_node = require("./Crypto.node.js"); var import_attachmentPath_node = require("./util/attachmentPath.node.js"); var import_logPadding_node = require("./util/logPadding.node.js"); var import_prependStream_node = require("./util/prependStream.node.js"); var import_appendMacStream_node = require("./util/appendMacStream.node.js"); var import_finalStream_node = require("./util/finalStream.node.js"); var import_getMacAndUpdateHmac_node = require("./util/getMacAndUpdateHmac.node.js"); var import_trimPadding_node = require("./util/trimPadding.node.js"); var import_assert_std = require("./util/assert.std.js"); var Errors = __toESM(require("./types/errors.std.js")); var import_isNotNil_std = require("./util/isNotNil.std.js"); var import_missingCaseError_std = require("./util/missingCaseError.std.js"); var import_environment_std = require("./environment.std.js"); var import_Bytes_std = require("./Bytes.std.js"); var import_decipherWithAesKey_node = require("./util/decipherWithAesKey.node.js"); var import_AttachmentCrypto_std = require("./util/AttachmentCrypto.std.js"); var import_AttachmentDownload_std = require("./types/AttachmentDownload.std.js"); const { ensureFile } = import_fs_extra.default; const { isNumber } = import_lodash.default; const log = (0, import_log_std.createLogger)("AttachmentCrypto"); function _generateAttachmentIv() { return (0, import_node_crypto.randomBytes)(import_Crypto_std.IV_LENGTH); } __name(_generateAttachmentIv, "_generateAttachmentIv"); function generateAttachmentKeys() { return (0, import_node_crypto.randomBytes)(import_Crypto_std.KEY_SET_LENGTH); } __name(generateAttachmentKeys, "generateAttachmentKeys"); async function encryptAttachmentV2ToDisk(args) { const relativeTargetPath = (0, import_attachmentPath_node.getRelativePath)((0, import_attachmentPath_node.createName)()); const absoluteTargetPath = args.getAbsoluteAttachmentPath(relativeTargetPath); await ensureFile(absoluteTargetPath); let encryptResult; try { encryptResult = await encryptAttachmentV2({ ...args, sink: (0, import_node_fs.createWriteStream)(absoluteTargetPath) }); } catch (error) { await safeUnlink(absoluteTargetPath); throw error; } return { ...encryptResult, path: relativeTargetPath }; } __name(encryptAttachmentV2ToDisk, "encryptAttachmentV2ToDisk"); async function encryptAttachmentV2({ _testOnlyDangerousIv, _testOnlyDangerousSkipPadding, keys, needIncrementalMac, plaintext, sink }) { const logId = "encryptAttachmentV2"; const { aesKey, macKey } = splitKeys(keys); if (_testOnlyDangerousIv != null || _testOnlyDangerousSkipPadding != null) { if ((0, import_environment_std.getEnvironment)() !== import_environment_std.Environment.Test) { throw new Error( `${logId}: Used _testOnlyDangerousIv or _testOnlyDangerousSkipPadding outside tests!` ); } } const iv = (0, import_Bytes_std.isNotEmpty)(_testOnlyDangerousIv) ? _testOnlyDangerousIv : _generateAttachmentIv(); const plaintextHash = (0, import_node_crypto.createHash)(import_Crypto_std.HashType.size256); const digest = (0, import_node_crypto.createHash)(import_Crypto_std.HashType.size256); let ciphertextSize; let mac; let incrementalDigestCreator; let chunkSizeChoice; try { let source; let size; if ("data" in plaintext) { const { data } = plaintext; source = import_node_stream.Readable.from([Buffer.from(data)]); size = data.byteLength; } else if ("stream" in plaintext) { source = plaintext.stream; size = plaintext.size; } else { const { absolutePath } = plaintext; if (needIncrementalMac) { const fileData = await (0, import_promises.stat)(absolutePath); size = fileData.size; } source = (0, import_node_fs.createReadStream)(absolutePath); } if (needIncrementalMac) { (0, import_assert_std.strictAssert)( isNumber(size), "Need size if we are to generate incrementalMac!" ); } chunkSizeChoice = isNumber(size) ? (0, import_incremental_mac.inferChunkSize)( (0, import_AttachmentCrypto_std.getAttachmentCiphertextSize)({ unpaddedPlaintextSize: size, mediaTier: import_AttachmentDownload_std.MediaTier.STANDARD }) ) : void 0; incrementalDigestCreator = needIncrementalMac && chunkSizeChoice ? new import_incremental_mac.DigestingPassThrough(Buffer.from(macKey), chunkSizeChoice) : void 0; await (0, import_promises2.pipeline)( [ source, peekAndUpdateHash(plaintextHash), _testOnlyDangerousSkipPadding === true ? void 0 : (0, import_logPadding_node.appendPaddingStream)(), (0, import_node_crypto.createCipheriv)(import_Crypto_std.CipherType.AES256CBC, aesKey, iv), prependIv(iv), (0, import_appendMacStream_node.appendMacStream)(macKey, (macValue) => { mac = macValue; }), peekAndUpdateHash(digest), incrementalDigestCreator, measureSize({ onComplete: /* @__PURE__ */ __name((finalSize) => { ciphertextSize = finalSize; }, "onComplete") }), sink ?? new import_node_stream.PassThrough().resume() ].filter(import_isNotNil_std.isNotNil) ); } catch (error) { log.error( `${logId}: Failed to encrypt attachment`, Errors.toLogFormat(error) ); throw error; } const ourPlaintextHash = plaintextHash.digest(); const ourDigest = digest.digest(); (0, import_assert_std.strictAssert)( ourPlaintextHash.byteLength === import_Crypto_std.PLAINTEXT_HASH_LENGTH, `${logId}: Failed to generate plaintext hash!` ); (0, import_assert_std.strictAssert)( ourDigest.byteLength === import_Crypto_std.DIGEST_LENGTH, `${logId}: Failed to generate ourDigest!` ); (0, import_assert_std.strictAssert)(ciphertextSize != null, "Failed to measure ciphertext size!"); (0, import_assert_std.strictAssert)(mac != null, "Failed to compute mac!"); const incrementalMac = incrementalDigestCreator?.getFinalDigest(); return { chunkSize: incrementalMac && chunkSizeChoice ? (0, import_incremental_mac.chunkSizeInBytes)(chunkSizeChoice) : void 0, ciphertextSize, digest: ourDigest, incrementalMac, iv, plaintextHash: (0, import_Bytes_std.toHex)(ourPlaintextHash) }; } __name(encryptAttachmentV2, "encryptAttachmentV2"); async function decryptAttachmentV2(options) { const logId = `decryptAttachmentV2(${options.idForLogging})`; const relativeTargetPath = (0, import_attachmentPath_node.getRelativePath)((0, import_attachmentPath_node.createName)()); const absoluteTargetPath = options.getAbsoluteAttachmentPath(relativeTargetPath); let writeFd; try { try { await ensureFile(absoluteTargetPath); writeFd = await (0, import_promises.open)(absoluteTargetPath, "w"); } catch (cause) { throw new Error(`${logId}: Failed to create write path`, { cause }); } const result = await decryptAttachmentV2ToSink( options, writeFd.createWriteStream() ); return { ...result, path: relativeTargetPath }; } catch (error) { log.error( `${logId}: Failed to decrypt attachment to disk`, Errors.toLogFormat(error) ); await safeUnlink(absoluteTargetPath); throw error; } finally { await writeFd?.close(); } } __name(decryptAttachmentV2, "decryptAttachmentV2"); async function decryptAttachmentV2ToSink(options, sink) { const { idForLogging, outerEncryption } = options; let aesKey; let macKey; if ("aesKey" in options) { ({ aesKey, macKey } = options); } else { const { keysBase64 } = options; const keys = Buffer.from(keysBase64, "base64"); ({ aesKey, macKey } = splitKeys(keys)); } const logId = `decryptAttachmentV2(${idForLogging})`; const digest = (0, import_node_crypto.createHash)(import_Crypto_std.HashType.size256); const hmac = (0, import_node_crypto.createHmac)(import_Crypto_std.HashType.size256, macKey); const plaintextHash = (0, import_node_crypto.createHash)(import_Crypto_std.HashType.size256); let theirMac; let theirOuterMac; const outerHmac = outerEncryption ? (0, import_node_crypto.createHmac)(import_Crypto_std.HashType.size256, outerEncryption.macKey) : void 0; const maybeOuterEncryptionGetIvAndDecipher = outerEncryption ? (0, import_decipherWithAesKey_node.decipherWithAesKey)(outerEncryption.aesKey) : void 0; const maybeOuterEncryptionGetMacAndUpdateMac = outerHmac ? (0, import_getMacAndUpdateHmac_node.getMacAndUpdateHmac)(outerHmac, (theirOuterMacValue) => { theirOuterMac = theirOuterMacValue; }) : void 0; let readFd; let ourPlaintextHash; let ourDigest; let ciphertextStream; try { if ("ciphertextPath" in options) { try { readFd = await (0, import_promises.open)(options.ciphertextPath, "r"); ciphertextStream = readFd.createReadStream(); } catch (cause) { throw new Error(`${logId}: Read path doesn't exist`, { cause }); } } else if ("ciphertextStream" in options) { ciphertextStream = options.ciphertextStream; } else { throw (0, import_missingCaseError_std.missingCaseError)(options); } const incrementalDigestValidator = options.type === "standard" && options.theirIncrementalMac && options.theirChunkSize ? new import_incremental_mac.ValidatingPassThrough( Buffer.from(macKey), (0, import_incremental_mac.everyNthByte)(options.theirChunkSize), Buffer.from(options.theirIncrementalMac) ) : void 0; await (0, import_promises2.pipeline)( [ ciphertextStream, maybeOuterEncryptionGetMacAndUpdateMac, maybeOuterEncryptionGetIvAndDecipher, peekAndUpdateHash(digest), incrementalDigestValidator, (0, import_getMacAndUpdateHmac_node.getMacAndUpdateHmac)(hmac, (theirMacValue) => { theirMac = theirMacValue; }), (0, import_decipherWithAesKey_node.decipherWithAesKey)(aesKey), (0, import_trimPadding_node.trimPadding)(options.size), peekAndUpdateHash(plaintextHash), (0, import_finalStream_node.finalStream)(() => { const ourMac = hmac.digest(); ourDigest = digest.digest(); ourPlaintextHash = plaintextHash.digest(); (0, import_assert_std.strictAssert)( ourMac.byteLength === import_Crypto_std.ATTACHMENT_MAC_LENGTH, `${logId}: Failed to generate ourMac!` ); (0, import_assert_std.strictAssert)( theirMac != null && theirMac.byteLength === import_Crypto_std.ATTACHMENT_MAC_LENGTH, `${logId}: Failed to find theirMac!` ); (0, import_assert_std.strictAssert)( ourDigest.byteLength === import_Crypto_std.DIGEST_LENGTH, `${logId}: Failed to generate ourDigest!` ); (0, import_assert_std.strictAssert)( ourPlaintextHash.byteLength === import_Crypto_std.DIGEST_LENGTH, `${logId}: Failed to generate ourPlaintextHash!` ); if (!(0, import_Crypto_node.constantTimeEqual)(ourMac, theirMac)) { throw new Error(`${logId}: Bad MAC`); } const { type } = options; switch (type) { case "local": case "backupThumbnail": break; case "standard": checkIntegrity({ locallyCalculatedDigest: ourDigest, locallyCalculatedPlaintextHash: ourPlaintextHash, integrityCheck: options.integrityCheck, logId }); break; default: throw (0, import_missingCaseError_std.missingCaseError)(type); } if (!outerEncryption) { return; } (0, import_assert_std.strictAssert)(outerHmac, "outerHmac must exist"); const ourOuterMac = outerHmac.digest(); (0, import_assert_std.strictAssert)( ourOuterMac.byteLength === import_Crypto_std.ATTACHMENT_MAC_LENGTH, `${logId}: Failed to generate ourOuterMac!` ); (0, import_assert_std.strictAssert)( theirOuterMac != null && theirOuterMac.byteLength === import_Crypto_std.ATTACHMENT_MAC_LENGTH, `${logId}: Failed to find theirOuterMac!` ); if (!(0, import_Crypto_node.constantTimeEqual)(ourOuterMac, theirOuterMac)) { throw new Error(`${logId}: Bad outer encryption MAC`); } }), sink ].filter(import_isNotNil_std.isNotNil) ); } catch (error) { if (error.name === "AbortError" || error.code === "ERR_STREAM_PREMATURE_CLOSE") { throw error; } log.error( `${logId}: Failed to decrypt attachment`, Errors.toLogFormat(error) ); sink.end(); throw error; } finally { await readFd?.close(); } (0, import_assert_std.strictAssert)( ourPlaintextHash != null && ourPlaintextHash.byteLength === import_Crypto_std.DIGEST_LENGTH, `${logId}: Failed to generate plaintext hash!` ); (0, import_assert_std.strictAssert)( ourDigest != null && ourDigest.byteLength === import_Crypto_std.DIGEST_LENGTH, `${logId}: Failed to generate digest!` ); return { plaintextHash: (0, import_Bytes_std.toHex)(ourPlaintextHash), digest: (0, import_Bytes_std.toBase64)(ourDigest) }; } __name(decryptAttachmentV2ToSink, "decryptAttachmentV2ToSink"); async function decryptAndReencryptLocally(options) { const { idForLogging, size } = options; const logId = `reencryptAttachmentV2(${idForLogging})`; const relativeTargetPath = (0, import_attachmentPath_node.getRelativePath)((0, import_attachmentPath_node.createName)()); const absoluteTargetPath = options.getAbsoluteAttachmentPath(relativeTargetPath); let writeFd; try { try { await ensureFile(absoluteTargetPath); writeFd = await (0, import_promises.open)(absoluteTargetPath, "w"); } catch (cause) { throw new Error(`${logId}: Failed to create write path`, { cause }); } const keys = generateKeys(); const passthrough = new import_node_stream.PassThrough(); const [result] = await Promise.all([ decryptAttachmentV2ToSink(options, passthrough), await encryptAttachmentV2({ keys, needIncrementalMac: false, plaintext: { stream: passthrough }, sink: (0, import_node_fs.createWriteStream)(absoluteTargetPath) }) ]); return { localKey: (0, import_Bytes_std.toBase64)(keys), path: relativeTargetPath, plaintextHash: result.plaintextHash, digest: result.digest, version: 2, size }; } catch (error) { log.error( `${logId}: Failed to decrypt and reencrypt attachment`, Errors.toLogFormat(error) ); await safeUnlink(absoluteTargetPath); throw error; } finally { await writeFd?.close(); } } __name(decryptAndReencryptLocally, "decryptAndReencryptLocally"); function splitKeys(keys) { (0, import_assert_std.strictAssert)( keys.byteLength === import_Crypto_std.KEY_SET_LENGTH, `attachment keys must be ${import_Crypto_std.KEY_SET_LENGTH} bytes, got ${keys.byteLength}` ); const aesKey = keys.subarray(0, import_Crypto_std.AES_KEY_LENGTH); const macKey = keys.subarray(import_Crypto_std.AES_KEY_LENGTH, import_Crypto_std.KEY_SET_LENGTH); return { aesKey, macKey }; } __name(splitKeys, "splitKeys"); function generateKeys() { return (0, import_node_crypto.randomBytes)(import_Crypto_std.KEY_SET_LENGTH); } __name(generateKeys, "generateKeys"); function peekAndUpdateHash(hash) { return new import_node_stream.Transform({ transform(chunk, _encoding, callback) { try { hash.update(chunk); callback(null, chunk); } catch (error) { callback(error); } } }); } __name(peekAndUpdateHash, "peekAndUpdateHash"); function measureSize({ downloadOffset = 0, onComplete, onSizeUpdate }) { let totalBytes = 0; const passthrough = new import_node_stream.PassThrough(); passthrough.on("data", (chunk) => { totalBytes += chunk.length; onSizeUpdate?.(totalBytes + downloadOffset); }); passthrough.on("end", () => { onComplete(totalBytes); }); return passthrough; } __name(measureSize, "measureSize"); function checkIntegrity({ locallyCalculatedDigest, locallyCalculatedPlaintextHash, integrityCheck, logId }) { const { type } = integrityCheck; switch (type) { case "encrypted": if (!(0, import_Crypto_node.constantTimeEqual)(locallyCalculatedDigest, integrityCheck.digest)) { throw new Error(`${logId}: Bad digest`); } break; case "plaintext": if (!(0, import_Crypto_node.constantTimeEqual)( locallyCalculatedPlaintextHash, integrityCheck.plaintextHash )) { throw new Error(`${logId}: Bad plaintextHash`); } break; default: throw (0, import_missingCaseError_std.missingCaseError)(type); } } __name(checkIntegrity, "checkIntegrity"); function prependIv(iv) { (0, import_assert_std.strictAssert)( iv.byteLength === import_Crypto_std.IV_LENGTH, `prependIv: iv should be ${import_Crypto_std.IV_LENGTH} bytes, got ${iv.byteLength} bytes` ); return (0, import_prependStream_node.prependStream)(iv); } __name(prependIv, "prependIv"); function getPlaintextHashForInMemoryAttachment(data) { return (0, import_node_crypto.createHash)(import_Crypto_std.HashType.size256).update(data).digest("hex"); } __name(getPlaintextHashForInMemoryAttachment, "getPlaintextHashForInMemoryAttachment"); async function safeUnlink(absoluteFilePath) { (0, import_assert_std.assertDev)( (0, import_node_path.isAbsolute)(absoluteFilePath), "safeUnlink: a relative path was passed instead of an absolute one" ); try { await (0, import_promises.unlink)(absoluteFilePath); } catch (error) { if (error.code !== "ENOENT") { log.error("Failed to unlink", error); throw error; } } } __name(safeUnlink, "safeUnlink"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { _generateAttachmentIv, decryptAndReencryptLocally, decryptAttachmentV2, decryptAttachmentV2ToSink, encryptAttachmentV2, encryptAttachmentV2ToDisk, generateAttachmentKeys, generateKeys, getPlaintextHashForInMemoryAttachment, measureSize, safeUnlink, splitKeys }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var Bytes_std_exports = {}; __export(Bytes_std_exports, { areEqual: () => areEqual, byteLength: () => byteLength, concatenate: () => concatenate, fromBase64: () => fromBase64, fromBase64url: () => fromBase64url, fromBinary: () => fromBinary, fromHex: () => fromHex, fromString: () => fromString, isEmpty: () => isEmpty, isNotEmpty: () => isNotEmpty, readBigUint64BE: () => readBigUint64BE, toBase64: () => toBase64, toBase64url: () => toBase64url, toBinary: () => toBinary, toHex: () => toHex, toString: () => toString }); module.exports = __toCommonJS(Bytes_std_exports); var import_Bytes_std = require("./context/Bytes.std.js"); const bytes = globalThis.window?.SignalContext?.bytes || new import_Bytes_std.Bytes(); function fromBase64(value) { return bytes.fromBase64(value); } __name(fromBase64, "fromBase64"); function fromBase64url(value) { return bytes.fromBase64url(value); } __name(fromBase64url, "fromBase64url"); function fromHex(value) { return bytes.fromHex(value); } __name(fromHex, "fromHex"); function fromBinary(value) { return bytes.fromBinary(value); } __name(fromBinary, "fromBinary"); function fromString(value) { return bytes.fromString(value); } __name(fromString, "fromString"); function toBase64(data) { return bytes.toBase64(data); } __name(toBase64, "toBase64"); function toBase64url(data) { return bytes.toBase64url(data); } __name(toBase64url, "toBase64url"); function toHex(data) { return bytes.toHex(data); } __name(toHex, "toHex"); function toBinary(data) { return bytes.toBinary(data); } __name(toBinary, "toBinary"); function toString(data) { return bytes.toString(data); } __name(toString, "toString"); function byteLength(value) { return bytes.byteLength(value); } __name(byteLength, "byteLength"); function concatenate(list) { return bytes.concatenate(list); } __name(concatenate, "concatenate"); function isEmpty(data) { return bytes.isEmpty(data); } __name(isEmpty, "isEmpty"); function isNotEmpty(data) { return !bytes.isEmpty(data); } __name(isNotEmpty, "isNotEmpty"); function areEqual(a, b) { return bytes.areEqual(a, b); } __name(areEqual, "areEqual"); function readBigUint64BE(value) { return bytes.readBigUint64BE(value); } __name(readBigUint64BE, "readBigUint64BE"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { areEqual, byteLength, concatenate, fromBase64, fromBase64url, fromBinary, fromHex, fromString, isEmpty, isNotEmpty, readBigUint64BE, toBase64, toBase64url, toBinary, toHex, toString }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var Crypto_node_exports = {}; __export(Crypto_node_exports, { CipherType: () => import_Crypto_std.CipherType, HashType: () => import_Crypto_std.HashType, PaddedLengths: () => PaddedLengths, computeHash: () => computeHash, constantTimeEqual: () => constantTimeEqual, decrypt: () => decrypt, decryptAes256CbcPkcsPadding: () => decryptAes256CbcPkcsPadding, decryptAesCtr: () => decryptAesCtr, decryptAesGcm: () => decryptAesGcm, decryptAttachmentV1: () => decryptAttachmentV1, decryptDeviceCreatedAt: () => decryptDeviceCreatedAt, decryptDeviceName: () => decryptDeviceName, decryptProfile: () => decryptProfile, decryptProfileName: () => decryptProfileName, decryptSymmetric: () => decryptSymmetric, deriveMasterKey: () => deriveMasterKey, deriveMasterKeyFromGroupV1: () => deriveMasterKeyFromGroupV1, deriveSecrets: () => deriveSecrets, deriveStickerPackKey: () => deriveStickerPackKey, deriveStorageItemKey: () => deriveStorageItemKey, deriveStorageManifestKey: () => deriveStorageManifestKey, deriveStorageServiceKey: () => deriveStorageServiceKey, encrypt: () => encrypt, encryptAes256CbcPkcsPadding: () => encryptAes256CbcPkcsPadding, encryptAesCtr: () => encryptAesCtr, encryptAesGcm: () => encryptAesGcm, encryptAttachment: () => encryptAttachment, encryptDeviceCreatedAt: () => encryptDeviceCreatedAt, encryptDeviceName: () => encryptDeviceName, encryptProfile: () => encryptProfile, encryptProfileItemWithPadding: () => encryptProfileItemWithPadding, encryptSymmetric: () => encryptSymmetric, generateAvatarColor: () => generateAvatarColor, generateRegistrationId: () => generateRegistrationId, getAccessKeyVerifier: () => getAccessKeyVerifier, getFirstBytes: () => getFirstBytes, getIdentifierHash: () => getIdentifierHash, getRandomBytes: () => getRandomBytes, getZeroes: () => getZeroes, hash: () => hash, hashProfileKey: () => hashProfileKey, highBitsToInt: () => highBitsToInt, hmacSha256: () => hmacSha256, intsToByteHighAndLow: () => intsToByteHighAndLow, padAndEncryptAttachment: () => padAndEncryptAttachment, randomInt: () => randomInt, sha256: () => sha256, sign: () => sign, trimForDisplay: () => trimForDisplay, verifyAccessKey: () => verifyAccessKey, verifyHmacSha256: () => verifyHmacSha256 }); module.exports = __toCommonJS(Crypto_node_exports); var import_long = __toESM(require("long")); var import_lodash = __toESM(require("lodash")); var import_libsignal_client = require("@signalapp/libsignal-client"); var import_AccountKeys = require("@signalapp/libsignal-client/dist/AccountKeys.js"); var Bytes = __toESM(require("./Bytes.std.js")); var import_Crypto_node = require("./context/Crypto.node.js"); var import_Curve_node = require("./Curve.node.js"); var import_Crypto_std = require("./types/Crypto.std.js"); var import_Colors_std = require("./types/Colors.std.js"); var import_errors_std = require("./types/errors.std.js"); var import_uuidToBytes_std = require("./util/uuidToBytes.std.js"); var import_logPadSize_std = require("./util/logPadSize.std.js"); var import_environment_std = require("./environment.std.js"); var import_webSafeBase64_std = require("./util/webSafeBase64.std.js"); const { sample } = import_lodash.default; const PROFILE_IV_LENGTH = 12; const PROFILE_KEY_LENGTH = 32; const PaddedLengths = { Name: [53, 257], About: [128, 254, 512], AboutEmoji: [32], PaymentAddress: [554] }; function generateRegistrationId() { return randomInt(1, 16383); } __name(generateRegistrationId, "generateRegistrationId"); function deriveStickerPackKey(packKey) { const salt = getZeroes(32); const info = Bytes.fromString("Sticker Pack"); const [part1, part2] = deriveSecrets(packKey, salt, info); return Bytes.concatenate([part1, part2]); } __name(deriveStickerPackKey, "deriveStickerPackKey"); function deriveSecrets(input, salt, info) { const output = (0, import_libsignal_client.hkdf)(3 * 32, input, info, salt); return [ output.subarray(0, 32), output.subarray(32, 64), output.subarray(64, 96) ]; } __name(deriveSecrets, "deriveSecrets"); function deriveMasterKeyFromGroupV1(groupV1Id) { const salt = getZeroes(32); const info = Bytes.fromString("GV2 Migration"); const [part1] = deriveSecrets(groupV1Id, salt, info); return part1; } __name(deriveMasterKeyFromGroupV1, "deriveMasterKeyFromGroupV1"); function hashProfileKey(profileKey, aci) { if (!profileKey) { return "none"; } const profileKeyBytes = Bytes.fromBase64(profileKey); const aciBytes = import_libsignal_client.Aci.parseFromServiceIdString(aci).getRawUuidBytes(); const hashBytes = hmacSha256( profileKeyBytes, Bytes.concatenate([Bytes.fromString("profileKeyHash"), aciBytes]) ); const webSafe = (0, import_webSafeBase64_std.toWebSafeBase64)(Bytes.toBase64(hashBytes)); return webSafe.slice(-3); } __name(hashProfileKey, "hashProfileKey"); function computeHash(data) { return Bytes.toBase64(hash(import_Crypto_std.HashType.size512, data)); } __name(computeHash, "computeHash"); function encryptDeviceName(deviceName, identityPublic) { const plaintext = Bytes.fromString(deviceName); const ephemeralKeyPair = (0, import_Curve_node.generateKeyPair)(); const masterSecret = (0, import_Curve_node.calculateAgreement)( identityPublic, ephemeralKeyPair.privateKey ); const key1 = hmacSha256(masterSecret, Bytes.fromString("auth")); const syntheticIv = getFirstBytes(hmacSha256(key1, plaintext), 16); const key2 = hmacSha256(masterSecret, Bytes.fromString("cipher")); const cipherKey = hmacSha256(key2, syntheticIv); const counter = getZeroes(16); const ciphertext = encryptAesCtr(cipherKey, plaintext, counter); return { ephemeralPublic: ephemeralKeyPair.publicKey, syntheticIv, ciphertext }; } __name(encryptDeviceName, "encryptDeviceName"); function decryptDeviceName({ ephemeralPublic, syntheticIv, ciphertext }, identityPrivate) { const masterSecret = (0, import_Curve_node.calculateAgreement)(ephemeralPublic, identityPrivate); const key2 = hmacSha256(masterSecret, Bytes.fromString("cipher")); const cipherKey = hmacSha256(key2, syntheticIv); const counter = getZeroes(16); const plaintext = decryptAesCtr(cipherKey, ciphertext, counter); const key1 = hmacSha256(masterSecret, Bytes.fromString("auth")); const ourSyntheticIv = getFirstBytes(hmacSha256(key1, plaintext), 16); if (!constantTimeEqual(ourSyntheticIv, syntheticIv)) { throw new Error("decryptDeviceName: synthetic IV did not match"); } return Bytes.toString(plaintext); } __name(decryptDeviceName, "decryptDeviceName"); function encryptDeviceCreatedAt(createdAt, deviceId, registrationId, identityPublic) { const createdAtBuffer = new ArrayBuffer(8); const dataView = new DataView(createdAtBuffer); dataView.setBigUint64(0, BigInt(createdAt), false); const createdAtBytes = new Uint8Array(createdAtBuffer); const associatedData = getAssociatedDataForDeviceCreatedAt( deviceId, registrationId ); return identityPublic.seal(createdAtBytes, "deviceCreatedAt", associatedData); } __name(encryptDeviceCreatedAt, "encryptDeviceCreatedAt"); function decryptDeviceCreatedAt(createdAtCiphertext, deviceId, registrationId, identityPrivate) { const associatedData = getAssociatedDataForDeviceCreatedAt( deviceId, registrationId ); const createdAtData = identityPrivate.open( createdAtCiphertext, "deviceCreatedAt", associatedData ); return Number(Bytes.readBigUint64BE(createdAtData)); } __name(decryptDeviceCreatedAt, "decryptDeviceCreatedAt"); function getAssociatedDataForDeviceCreatedAt(deviceId, registrationId) { if (deviceId > 255) { throw new Error("deviceId above 255, must be 1 byte"); } const associatedDataBuffer = new ArrayBuffer(5); const dataView = new DataView(associatedDataBuffer); dataView.setUint8(0, deviceId); dataView.setUint32(1, registrationId, false); return new Uint8Array(associatedDataBuffer); } __name(getAssociatedDataForDeviceCreatedAt, "getAssociatedDataForDeviceCreatedAt"); function deriveMasterKey(accountEntropyPool) { return import_AccountKeys.AccountEntropyPool.deriveSvrKey(accountEntropyPool); } __name(deriveMasterKey, "deriveMasterKey"); function deriveStorageServiceKey(masterKey) { return hmacSha256(masterKey, Bytes.fromString("Storage Service Encryption")); } __name(deriveStorageServiceKey, "deriveStorageServiceKey"); function deriveStorageManifestKey(storageServiceKey, version = import_long.default.fromNumber(0)) { return hmacSha256(storageServiceKey, Bytes.fromString(`Manifest_${version}`)); } __name(deriveStorageManifestKey, "deriveStorageManifestKey"); const STORAGE_SERVICE_ITEM_KEY_INFO_PREFIX = "20240801_SIGNAL_STORAGE_SERVICE_ITEM_"; const STORAGE_SERVICE_ITEM_KEY_LEN = 32; function deriveStorageItemKey({ storageServiceKey, recordIkm, key }) { if (recordIkm == null) { const itemID = Bytes.toBase64(key); return hmacSha256(storageServiceKey, Bytes.fromString(`Item_${itemID}`)); } return (0, import_libsignal_client.hkdf)( STORAGE_SERVICE_ITEM_KEY_LEN, recordIkm, Bytes.concatenate([ Bytes.fromString(STORAGE_SERVICE_ITEM_KEY_INFO_PREFIX), key ]), new Uint8Array(0) ); } __name(deriveStorageItemKey, "deriveStorageItemKey"); function getAccessKeyVerifier(accessKey) { const plaintext = getZeroes(32); return hmacSha256(accessKey, plaintext); } __name(getAccessKeyVerifier, "getAccessKeyVerifier"); function verifyAccessKey(accessKey, theirVerifier) { const ourVerifier = getAccessKeyVerifier(accessKey); if (constantTimeEqual(ourVerifier, theirVerifier)) { return true; } return false; } __name(verifyAccessKey, "verifyAccessKey"); const IV_LENGTH = 16; const NONCE_LENGTH = 16; const SYMMETRIC_MAC_LENGTH = 16; function encryptSymmetric(key, plaintext) { const iv = getZeroes(IV_LENGTH); const nonce = getRandomBytes(NONCE_LENGTH); const cipherKey = hmacSha256(key, nonce); const macKey = hmacSha256(key, cipherKey); const ciphertext = encryptAes256CbcPkcsPadding(cipherKey, plaintext, iv); const mac = getFirstBytes( hmacSha256(macKey, ciphertext), SYMMETRIC_MAC_LENGTH ); return Bytes.concatenate([nonce, ciphertext, mac]); } __name(encryptSymmetric, "encryptSymmetric"); function decryptSymmetric(key, data) { const iv = getZeroes(IV_LENGTH); const nonce = getFirstBytes(data, NONCE_LENGTH); const ciphertext = (0, import_uuidToBytes_std.getBytesSubarray)( data, NONCE_LENGTH, data.byteLength - NONCE_LENGTH - SYMMETRIC_MAC_LENGTH ); const theirMac = (0, import_uuidToBytes_std.getBytesSubarray)( data, data.byteLength - SYMMETRIC_MAC_LENGTH, SYMMETRIC_MAC_LENGTH ); const cipherKey = hmacSha256(key, nonce); const macKey = hmacSha256(key, cipherKey); const ourMac = getFirstBytes( hmacSha256(macKey, ciphertext), SYMMETRIC_MAC_LENGTH ); if (!constantTimeEqual(theirMac, ourMac)) { throw new Error( "decryptSymmetric: Failed to decrypt; MAC verification failed" ); } return decryptAes256CbcPkcsPadding(cipherKey, ciphertext, iv); } __name(decryptSymmetric, "decryptSymmetric"); function hmacSha256(key, plaintext) { return sign(key, plaintext); } __name(hmacSha256, "hmacSha256"); function verifyHmacSha256(plaintext, key, theirMac, length) { const ourMac = hmacSha256(key, plaintext); if (theirMac.byteLength !== length || ourMac.byteLength < length) { throw new Error("Bad MAC length"); } let result = 0; for (let i = 0; i < theirMac.byteLength; i += 1) { result |= ourMac[i] ^ theirMac[i]; } if (result !== 0) { throw new Error("Bad MAC"); } } __name(verifyHmacSha256, "verifyHmacSha256"); function encryptAes256CbcPkcsPadding(key, plaintext, iv) { return encrypt(import_Crypto_std.CipherType.AES256CBC, { key, plaintext, iv }); } __name(encryptAes256CbcPkcsPadding, "encryptAes256CbcPkcsPadding"); function decryptAes256CbcPkcsPadding(key, ciphertext, iv) { return decrypt(import_Crypto_std.CipherType.AES256CBC, { key, ciphertext, iv }); } __name(decryptAes256CbcPkcsPadding, "decryptAes256CbcPkcsPadding"); function encryptAesCtr(key, plaintext, counter) { return encrypt(import_Crypto_std.CipherType.AES256CTR, { key, plaintext, iv: counter }); } __name(encryptAesCtr, "encryptAesCtr"); function decryptAesCtr(key, ciphertext, counter) { return decrypt(import_Crypto_std.CipherType.AES256CTR, { key, ciphertext, iv: counter }); } __name(decryptAesCtr, "decryptAesCtr"); function encryptAesGcm(key, iv, plaintext, aad) { return encrypt(import_Crypto_std.CipherType.AES256GCM, { key, plaintext, iv, aad }); } __name(encryptAesGcm, "encryptAesGcm"); function decryptAesGcm(key, iv, ciphertext) { return decrypt(import_Crypto_std.CipherType.AES256GCM, { key, ciphertext, iv }); } __name(decryptAesGcm, "decryptAesGcm"); function sha256(data) { return hash(import_Crypto_std.HashType.size256, data); } __name(sha256, "sha256"); function getZeroes(n) { return new Uint8Array(n); } __name(getZeroes, "getZeroes"); function highBitsToInt(byte) { return (byte & 255) >> 4; } __name(highBitsToInt, "highBitsToInt"); function intsToByteHighAndLow(highValue, lowValue) { return (highValue << 4 | lowValue) & 255; } __name(intsToByteHighAndLow, "intsToByteHighAndLow"); function getFirstBytes(data, n) { return data.subarray(0, n); } __name(getFirstBytes, "getFirstBytes"); function trimForDisplay(padded) { let paddingEnd = 0; for (paddingEnd; paddingEnd < padded.length; paddingEnd += 1) { if (padded[paddingEnd] === 0) { break; } } return padded.subarray(0, paddingEnd); } __name(trimForDisplay, "trimForDisplay"); function verifyDigest(data, theirDigest) { const ourDigest = sha256(data); let result = 0; for (let i = 0; i < theirDigest.byteLength; i += 1) { result |= ourDigest[i] ^ theirDigest[i]; } if (result !== 0) { throw new Error("Bad digest"); } } __name(verifyDigest, "verifyDigest"); function decryptAttachmentV1(encryptedBin, keys, theirDigest) { if (keys.byteLength !== 64) { throw new Error("Got invalid length attachment keys"); } if (encryptedBin.byteLength < 16 + 32) { throw new Error("Got invalid length attachment"); } const aesKey = keys.subarray(0, 32); const macKey = keys.subarray(32, 64); const iv = encryptedBin.subarray(0, 16); const ciphertext = encryptedBin.subarray(16, encryptedBin.byteLength - 32); const ivAndCiphertext = encryptedBin.subarray( 0, encryptedBin.byteLength - 32 ); const mac = encryptedBin.subarray( encryptedBin.byteLength - 32, encryptedBin.byteLength ); verifyHmacSha256(ivAndCiphertext, macKey, mac, 32); if (theirDigest) { verifyDigest(encryptedBin, theirDigest); } return decryptAes256CbcPkcsPadding(aesKey, ciphertext, iv); } __name(decryptAttachmentV1, "decryptAttachmentV1"); function encryptAttachment({ plaintext, keys, dangerousTestOnlyIv }) { const logId = "encryptAttachment"; if (!(plaintext instanceof Uint8Array)) { throw new TypeError( `${logId}: \`plaintext\` must be an \`Uint8Array\`; got: ${typeof plaintext}` ); } if (keys.byteLength !== 64) { throw new Error(`${logId}: invalid length attachment keys`); } if (dangerousTestOnlyIv && (0, import_environment_std.getEnvironment)() !== import_environment_std.Environment.Test) { throw new Error(`${logId}: Used dangerousTestOnlyIv outside tests!`); } const iv = dangerousTestOnlyIv || getRandomBytes(16); const aesKey = keys.subarray(0, 32); const macKey = keys.subarray(32, 64); const ciphertext = encryptAes256CbcPkcsPadding(aesKey, plaintext, iv); const ivAndCiphertext = Bytes.concatenate([iv, ciphertext]); const mac = hmacSha256(macKey, ivAndCiphertext); const encryptedBin = Bytes.concatenate([ivAndCiphertext, mac]); const digest = sha256(encryptedBin); return { ciphertext: encryptedBin, digest }; } __name(encryptAttachment, "encryptAttachment"); function padAndEncryptAttachment({ plaintext, keys, dangerousTestOnlyIv }) { const size = plaintext.byteLength; const paddedSize = (0, import_logPadSize_std.logPadSize)(size); const padding = getZeroes(paddedSize - size); return { ...encryptAttachment({ plaintext: Bytes.concatenate([plaintext, padding]), keys, dangerousTestOnlyIv }), // We generate the plaintext hash here for forwards-compatibility with streaming // attachment encryption, which may be the only place that the whole attachment flows // through memory plaintextHash: Bytes.toHex(sha256(plaintext)) }; } __name(padAndEncryptAttachment, "padAndEncryptAttachment"); function encryptProfile(data, key) { const iv = getRandomBytes(PROFILE_IV_LENGTH); if (key.byteLength !== PROFILE_KEY_LENGTH) { throw new Error("Got invalid length profile key"); } if (iv.byteLength !== PROFILE_IV_LENGTH) { throw new Error("Got invalid length profile iv"); } const ciphertext = encryptAesGcm(key, iv, data); return Bytes.concatenate([iv, ciphertext]); } __name(encryptProfile, "encryptProfile"); function decryptProfile(data, key) { if (data.byteLength < 12 + 16 + 1) { throw new Error(`Got too short input: ${data.byteLength}`); } const iv = data.subarray(0, PROFILE_IV_LENGTH); const ciphertext = data.subarray(PROFILE_IV_LENGTH, data.byteLength); if (key.byteLength !== PROFILE_KEY_LENGTH) { throw new Error("Got invalid length profile key"); } if (iv.byteLength !== PROFILE_IV_LENGTH) { throw new Error("Got invalid length profile iv"); } try { return decryptAesGcm(key, iv, ciphertext); } catch (_) { throw new import_errors_std.ProfileDecryptError( "Failed to decrypt profile data. Most likely the profile key has changed." ); } } __name(decryptProfile, "decryptProfile"); function encryptProfileItemWithPadding(item, profileKey, paddedLengths) { const paddedLength = paddedLengths.find( (length) => item.byteLength <= length ); if (!paddedLength) { throw new Error("Oversized value"); } const padded = new Uint8Array(paddedLength); padded.set(new Uint8Array(item)); return encryptProfile(padded, profileKey); } __name(encryptProfileItemWithPadding, "encryptProfileItemWithPadding"); function decryptProfileName(encryptedProfileName, key) { const data = Bytes.fromBase64(encryptedProfileName); const padded = decryptProfile(data, key); let givenEnd; for (givenEnd = 0; givenEnd < padded.length; givenEnd += 1) { if (padded[givenEnd] === 0) { break; } } let familyEnd; for (familyEnd = givenEnd + 1; familyEnd < padded.length; familyEnd += 1) { if (padded[familyEnd] === 0) { break; } } const foundFamilyName = familyEnd > givenEnd + 1; return { given: padded.subarray(0, givenEnd), family: foundFamilyName ? padded.subarray(givenEnd + 1, familyEnd) : null }; } __name(decryptProfileName, "decryptProfileName"); const crypto = globalThis.window?.SignalContext.crypto || new import_Crypto_node.Crypto(); function sign(key, data) { return crypto.sign(key, data); } __name(sign, "sign"); function hash(type, data) { return crypto.hash(type, data); } __name(hash, "hash"); function encrypt(...args) { return crypto.encrypt(...args); } __name(encrypt, "encrypt"); function decrypt(...args) { return crypto.decrypt(...args); } __name(decrypt, "decrypt"); function randomInt(min, max) { return crypto.randomInt(min, max + 1); } __name(randomInt, "randomInt"); function getRandomBytes(size) { return crypto.getRandomBytes(size); } __name(getRandomBytes, "getRandomBytes"); function constantTimeEqual(left, right) { return crypto.constantTimeEqual(left, right); } __name(constantTimeEqual, "constantTimeEqual"); function getIdentifierHash({ aci, e164, pni, groupId }) { let identifier; if (aci != null) { identifier = import_libsignal_client.Aci.parseFromServiceIdString(aci).getServiceIdBinary(); } else if (e164 != null) { identifier = Bytes.fromString(e164); } else if (pni != null) { identifier = import_libsignal_client.Pni.parseFromServiceIdString(pni).getServiceIdBinary(); } else if (groupId != null) { identifier = Bytes.fromBase64(groupId); } else { return null; } const digest = hash(import_Crypto_std.HashType.size256, identifier); return digest[0]; } __name(getIdentifierHash, "getIdentifierHash"); function generateAvatarColor({ aci, e164, pni, groupId }) { const hashValue = getIdentifierHash({ aci, e164, pni, groupId }); if (hashValue == null) { return sample(import_Colors_std.AvatarColors) || import_Colors_std.AvatarColors[0]; } return import_Colors_std.AvatarColors[hashValue % import_Colors_std.AVATAR_COLOR_COUNT]; } __name(generateAvatarColor, "generateAvatarColor"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { CipherType, HashType, PaddedLengths, computeHash, constantTimeEqual, decrypt, decryptAes256CbcPkcsPadding, decryptAesCtr, decryptAesGcm, decryptAttachmentV1, decryptDeviceCreatedAt, decryptDeviceName, decryptProfile, decryptProfileName, decryptSymmetric, deriveMasterKey, deriveMasterKeyFromGroupV1, deriveSecrets, deriveStickerPackKey, deriveStorageItemKey, deriveStorageManifestKey, deriveStorageServiceKey, encrypt, encryptAes256CbcPkcsPadding, encryptAesCtr, encryptAesGcm, encryptAttachment, encryptDeviceCreatedAt, encryptDeviceName, encryptProfile, encryptProfileItemWithPadding, encryptSymmetric, generateAvatarColor, generateRegistrationId, getAccessKeyVerifier, getFirstBytes, getIdentifierHash, getRandomBytes, getZeroes, hash, hashProfileKey, highBitsToInt, hmacSha256, intsToByteHighAndLow, padAndEncryptAttachment, randomInt, sha256, sign, trimForDisplay, verifyAccessKey, verifyHmacSha256 }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var Curve_node_exports = {}; __export(Curve_node_exports, { calculateAgreement: () => calculateAgreement, calculateSignature: () => calculateSignature, clampPrivateKey: () => clampPrivateKey, createKeyPair: () => createKeyPair, generateKeyPair: () => generateKeyPair, generateKyberPreKey: () => generateKyberPreKey, generatePreKey: () => generatePreKey, generateSignedPreKey: () => generateSignedPreKey, isNonNegativeInteger: () => isNonNegativeInteger, prefixPublicKey: () => prefixPublicKey, setPublicKeyTypeByte: () => setPublicKeyTypeByte, verifySignature: () => verifySignature }); module.exports = __toCommonJS(Curve_node_exports); var client = __toESM(require("@signalapp/libsignal-client")); var Bytes = __toESM(require("./Bytes.std.js")); var import_Crypto_node = require("./Crypto.node.js"); var import_log_std = require("./logging/log.std.js"); const log = (0, import_log_std.createLogger)("Curve"); function isNonNegativeInteger(n) { return typeof n === "number" && n % 1 === 0 && n >= 0; } __name(isNonNegativeInteger, "isNonNegativeInteger"); function generateSignedPreKey(identityKeyPair, keyId) { if (!isNonNegativeInteger(keyId)) { throw new TypeError( `generateSignedPreKey: Invalid argument for keyId: ${keyId}` ); } const keyPair = generateKeyPair(); const signature = calculateSignature( identityKeyPair.privateKey, keyPair.publicKey.serialize() ); return { keyId, keyPair, signature }; } __name(generateSignedPreKey, "generateSignedPreKey"); function generatePreKey(keyId) { if (!isNonNegativeInteger(keyId)) { throw new TypeError(`generatePreKey: Invalid argument for keyId: ${keyId}`); } const keyPair = generateKeyPair(); return { keyId, keyPair }; } __name(generatePreKey, "generatePreKey"); function generateKyberPreKey(identityKeyPair, keyId) { if (!isNonNegativeInteger(keyId)) { throw new TypeError( `generateKyberPreKey: Invalid argument for keyId: ${keyId}` ); } const keyPair = client.KEMKeyPair.generate(); const signature = calculateSignature( identityKeyPair.privateKey, keyPair.getPublicKey().serialize() ); return client.KyberPreKeyRecord.new(keyId, Date.now(), keyPair, signature); } __name(generateKyberPreKey, "generateKyberPreKey"); function generateKeyPair() { const privKey = client.PrivateKey.generate(); const pubKey = privKey.getPublicKey(); return new client.IdentityKeyPair(pubKey, privKey); } __name(generateKeyPair, "generateKeyPair"); function createKeyPair(incomingKey) { const copy = new Uint8Array(incomingKey); clampPrivateKey(copy); if (!(0, import_Crypto_node.constantTimeEqual)(copy, incomingKey)) { log.warn("createKeyPair: incoming private key was not clamped!"); } if (incomingKey.length !== 32) { throw new Error("key must be 32 bytes long"); } const privKey = client.PrivateKey.deserialize(incomingKey); const pubKey = privKey.getPublicKey(); return new client.IdentityKeyPair(pubKey, privKey); } __name(createKeyPair, "createKeyPair"); function prefixPublicKey(pubKey) { return Bytes.concatenate([ new Uint8Array([5]), validatePubKeyFormat(pubKey) ]); } __name(prefixPublicKey, "prefixPublicKey"); function calculateAgreement(pubKey, privKey) { return privKey.agree(pubKey); } __name(calculateAgreement, "calculateAgreement"); function verifySignature(pubKey, message, signature) { return pubKey.verify(message, signature); } __name(verifySignature, "verifySignature"); function calculateSignature(privKey, plaintext) { return privKey.sign(plaintext); } __name(calculateSignature, "calculateSignature"); function validatePubKeyFormat(pubKey) { if (pubKey === void 0 || (pubKey.byteLength !== 33 || pubKey[0] !== 5) && pubKey.byteLength !== 32) { throw new Error("Invalid public key"); } if (pubKey.byteLength === 33) { return pubKey.subarray(1); } return pubKey; } __name(validatePubKeyFormat, "validatePubKeyFormat"); function setPublicKeyTypeByte(publicKey) { publicKey[0] = 5; } __name(setPublicKeyTypeByte, "setPublicKeyTypeByte"); function clampPrivateKey(privateKey) { privateKey[0] &= 248; privateKey[31] &= 127; privateKey[31] |= 64; } __name(clampPrivateKey, "clampPrivateKey"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { calculateAgreement, calculateSignature, clampPrivateKey, createKeyPair, generateKeyPair, generateKyberPreKey, generatePreKey, generateSignedPreKey, isNonNegativeInteger, prefixPublicKey, setPublicKeyTypeByte, verifySignature }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var MessageSeenStatus_std_exports = {}; __export(MessageSeenStatus_std_exports, { SeenStatus: () => SeenStatus, maxSeenStatus: () => maxSeenStatus }); module.exports = __toCommonJS(MessageSeenStatus_std_exports); var SeenStatus = /* @__PURE__ */ ((SeenStatus2) => { SeenStatus2[SeenStatus2["NotApplicable"] = 0] = "NotApplicable"; SeenStatus2[SeenStatus2["Unseen"] = 1] = "Unseen"; SeenStatus2[SeenStatus2["Seen"] = 2] = "Seen"; return SeenStatus2; })(SeenStatus || {}); const STATUS_NUMBERS = { [0 /* NotApplicable */]: 0, [1 /* Unseen */]: 1, [2 /* Seen */]: 2 }; const maxSeenStatus = /* @__PURE__ */ __name((a, b) => STATUS_NUMBERS[a] > STATUS_NUMBERS[b] ? a : b, "maxSeenStatus"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { SeenStatus, maxSeenStatus }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var WebAudioRecorder_std_exports = {}; __export(WebAudioRecorder_std_exports, { WebAudioRecorder: () => WebAudioRecorder }); module.exports = __toCommonJS(WebAudioRecorder_std_exports); const DEFAULT_OPTIONS = { bufferSize: void 0, // buffer size (use browser default) encodeAfterRecord: false, mp3: { mimeType: "audio/mpeg", bitRate: 160 // (CBR only): bit rate = [64 .. 320] }, numChannels: 2, // number of channels progressInterval: 1e3, // encoding progress report interval (millisec) timeLimit: 300 // recording time limit (sec) }; class WebAudioRecorder { static { __name(this, "WebAudioRecorder"); } #buffer; #options; #context; #input; #onComplete; #onError; processor; worker; constructor(sourceNode, options, callbacks) { this.#options = { ...DEFAULT_OPTIONS, ...options }; this.#context = sourceNode.context; this.#input = this.#context.createGain(); sourceNode.connect(this.#input); this.#buffer = []; this.#initWorker(); this.#onComplete = callbacks.onComplete; this.#onError = callbacks.onError; } isRecording() { return this.processor != null; } startRecording() { if (this.isRecording()) { this.error("startRecording: previous recording is running"); return; } const { worker } = this; const buffer = this.#buffer; const { bufferSize, numChannels } = this.#options; if (!worker) { this.error("startRecording: worker not initialized"); return; } this.processor = this.#context.createScriptProcessor( bufferSize, numChannels, numChannels ); this.#input.connect(this.processor); this.processor.connect(this.#context.destination); this.processor.onaudioprocess = (event) => { for (let ch = 0; ch < numChannels; ++ch) { buffer[ch] = event.inputBuffer.getChannelData(ch); } worker.postMessage({ command: "record", buffer }); }; worker.postMessage({ command: "start", bufferSize: this.processor.bufferSize }); } cancelRecording() { if (!this.isRecording()) { this.error("cancelRecording: no recording is running"); return; } if (!this.worker || !this.processor) { this.error("startRecording: worker not initialized"); return; } this.#input.disconnect(); this.processor.disconnect(); delete this.processor; this.worker.postMessage({ command: "cancel" }); } finishRecording() { if (!this.isRecording()) { this.error("finishRecording: no recording is running"); return; } if (!this.worker || !this.processor) { this.error("startRecording: worker not initialized"); return; } this.#input.disconnect(); this.processor.disconnect(); delete this.processor; this.worker.postMessage({ command: "finish" }); } #initWorker() { if (this.worker != null) { this.worker.terminate(); } this.worker = new Worker("js/WebAudioRecorderMp3.js"); this.worker.onmessage = (event) => { const { data } = event; switch (data.command) { case "complete": this.#onComplete(this, data.blob); break; case "error": this.error(data.message); break; default: break; } }; this.worker.postMessage({ command: "init", config: { sampleRate: this.#context.sampleRate, numChannels: this.#options.numChannels }, options: this.#options }); } error(message) { this.#onError(this, `WebAudioRecorder.js: ${message}`); } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { WebAudioRecorder }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var AxoTokens_std_exports = {}; __export(AxoTokens_std_exports, { AxoTokens: () => AxoTokens }); module.exports = __toCommonJS(AxoTokens_std_exports); var import_assert_std = require("./_internal/assert.std.js"); var AxoTokens; ((AxoTokens2) => { function hexColor(input) { return input; } __name(hexColor, "hexColor"); let Avatar; ((Avatar2) => { const Colors = { A100: { bg: hexColor("#e3e3fe"), fg: hexColor("#3838f5") }, A110: { bg: hexColor("#dde7fc"), fg: hexColor("#1251d3") }, A120: { bg: hexColor("#d8e8f0"), fg: hexColor("#086da0") }, A130: { bg: hexColor("#cde4cd"), fg: hexColor("#067906") }, A140: { bg: hexColor("#eae0fd"), fg: hexColor("#661aff") }, A150: { bg: hexColor("#f5e3fe"), fg: hexColor("#9f00f0") }, A160: { bg: hexColor("#f6d8ec"), fg: hexColor("#b8057c") }, A170: { bg: hexColor("#f5d7d7"), fg: hexColor("#be0404") }, A180: { bg: hexColor("#fef5d0"), fg: hexColor("#836b01") }, A190: { bg: hexColor("#eae6d5"), fg: hexColor("#7d6f40") }, A200: { bg: hexColor("#d2d2dc"), fg: hexColor("#4f4f6d") }, A210: { bg: hexColor("#d7d7d9"), fg: hexColor("#5c5c5c") } }; const ALL_COLOR_NAMES = Object.keys(Colors); function getColorValues(color) { return (0, import_assert_std.assert)(Colors[color], `Missing avatar color: ${color}`); } Avatar2.getColorValues = getColorValues; __name(getColorValues, "getColorValues"); function getAllColorNames() { return ALL_COLOR_NAMES; } Avatar2.getAllColorNames = getAllColorNames; __name(getAllColorNames, "getAllColorNames"); function getColorNameByHash(hash) { (0, import_assert_std.assert)( Number.isInteger(hash) && hash >= 0, "Hash must be positive integer" ); return ALL_COLOR_NAMES[hash % ALL_COLOR_NAMES.length]; } Avatar2.getColorNameByHash = getColorNameByHash; __name(getColorNameByHash, "getColorNameByHash"); const Gradients = [ { start: hexColor("#252568"), end: hexColor("#9C8F8F") }, { start: hexColor("#2A4275"), end: hexColor("#9D9EA1") }, { start: hexColor("#2E4B5F"), end: hexColor("#8AA9B1") }, { start: hexColor("#2E426C"), end: hexColor("#7A9377") }, { start: hexColor("#1A341A"), end: hexColor("#807F6E") }, { start: hexColor("#464E42"), end: hexColor("#D5C38F") }, { start: hexColor("#595643"), end: hexColor("#93A899") }, { start: hexColor("#2C2F36"), end: hexColor("#687466") }, { start: hexColor("#2B1E18"), end: hexColor("#968980") }, { start: hexColor("#7B7067"), end: hexColor("#A5A893") }, { start: hexColor("#706359"), end: hexColor("#BDA194") }, { start: hexColor("#383331"), end: hexColor("#A48788") }, { start: hexColor("#924F4F"), end: hexColor("#897A7A") }, { start: hexColor("#663434"), end: hexColor("#C58D77") }, { start: hexColor("#8F4B02"), end: hexColor("#AA9274") }, { start: hexColor("#784747"), end: hexColor("#8C8F6F") }, { start: hexColor("#747474"), end: hexColor("#ACACAC") }, { start: hexColor("#49484C"), end: hexColor("#A5A6B5") }, { start: hexColor("#4A4E4D"), end: hexColor("#ABAFAE") }, { start: hexColor("#3A3A3A"), end: hexColor("#929887") } ]; function getGradientValuesByHash(hash) { (0, import_assert_std.assert)( Number.isInteger(hash) && hash >= 0, "Hash must be positive integer" ); return Gradients[hash % Gradients.length]; } Avatar2.getGradientValuesByHash = getGradientValuesByHash; __name(getGradientValuesByHash, "getGradientValuesByHash"); function getGradientsCount() { return Gradients.length; } Avatar2.getGradientsCount = getGradientsCount; __name(getGradientsCount, "getGradientsCount"); function gradientToCssBackgroundImage(gradient) { return `linear-gradient(to bottom, ${gradient.start}, ${gradient.end})`; } Avatar2.gradientToCssBackgroundImage = gradientToCssBackgroundImage; __name(gradientToCssBackgroundImage, "gradientToCssBackgroundImage"); const ContactPresetColors = { abstract_01: "A130", abstract_02: "A120", abstract_03: "A170", cat: "A190", dog: "A140", fox: "A190", tucan: "A120", pig: "A160", dinosour: "A130", sloth: "A180", incognito: "A210", ghost: "A100" }; const GroupPresetColors = { balloon: "A180", book: "A120", briefcase: "A110", celebration: "A170", drink: "A100", football: "A210", heart: "A100", house: "A180", melon: "A120", soccerball: "A110", sunset: "A130", surfboard: "A210" }; const PresetColors = { ...ContactPresetColors, ...GroupPresetColors }; function getAllContactPresetNames() { return Object.keys( ContactPresetColors ); } Avatar2.getAllContactPresetNames = getAllContactPresetNames; __name(getAllContactPresetNames, "getAllContactPresetNames"); function getAllGroupPresetNames() { return Object.keys(GroupPresetColors); } Avatar2.getAllGroupPresetNames = getAllGroupPresetNames; __name(getAllGroupPresetNames, "getAllGroupPresetNames"); function getPresetColorName(preset) { return (0, import_assert_std.assert)(PresetColors[preset], `Missing avatar preset: ${preset}`); } Avatar2.getPresetColorName = getPresetColorName; __name(getPresetColorName, "getPresetColorName"); })(Avatar = AxoTokens2.Avatar || (AxoTokens2.Avatar = {})); })(AxoTokens || (AxoTokens = {})); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { AxoTokens }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var AxoSymbolDefs_generated_std_exports = {}; __export(AxoSymbolDefs_generated_std_exports, { _getAllAxoSymbolIconNames: () => _getAllAxoSymbolIconNames, _getAllAxoSymbolInlineGlyphNames: () => _getAllAxoSymbolInlineGlyphNames, getAxoSymbolIcon: () => getAxoSymbolIcon, getAxoSymbolInlineGlyph: () => getAxoSymbolInlineGlyph }); module.exports = __toCommonJS(AxoSymbolDefs_generated_std_exports); const IconDefs = { "signal-logo": "\uE000", album: "\uE163", appearance: "\uE031", "appearance-fill": "\uE164", archive: "\uE09B", "archive-fill": "\uE165", "archive-down": "\uE205", "archive-down-fill": "\uE206", "archive-up": "\uE09C", "archive-up-fill": "\uE166", "archive-alt-down": "\uE09D", "archive-alt-down-fill": "\uE167", "archive-alt-up": "\uE09E", "archive-alt-up-fill": "\uE168", "arrow-[start]": { ltr: "\uE169", rtl: "\uE16A" }, "arrow-[end]": { ltr: "\uE16A", rtl: "\uE169" }, "arrow-up": "\uE16B", "arrow-down": "\uE16C", "arrow-up[start]": { ltr: "\uE16D", rtl: "\uE16E" }, "arrow-up[end]": { ltr: "\uE16E", rtl: "\uE16D" }, "arrow-down[start]": { ltr: "\uE16F", rtl: "\uE170" }, "arrow-down[end]": { ltr: "\uE170", rtl: "\uE16F" }, "arrow-circle-[start]": { ltr: "\uE00B", rtl: "\uE00C" }, "arrow-circle-[end]": { ltr: "\uE00C", rtl: "\uE00B" }, "arrow-circle-up": "\uE00D", "arrow-circle-down": "\uE00E", "arrow-circle-up[start]": { ltr: "\uE00F", rtl: "\uE010" }, "arrow-circle-up[end]": { ltr: "\uE010", rtl: "\uE00F" }, "arrow-circle-down[start]": { ltr: "\uE011", rtl: "\uE012" }, "arrow-circle-down[end]": { ltr: "\uE012", rtl: "\uE011" }, "arrow-circle-[start]-fill": { ltr: "\uE003", rtl: "\uE004" }, "arrow-circle-[end]-fill": { ltr: "\uE004", rtl: "\uE003" }, "arrow-circle-up-fill": "\uE005", "arrow-circle-down-fill": "\uE006", "arrow-circle-up[start]-fill": { ltr: "\uE007", rtl: "\uE008" }, "arrow-circle-up[end]-fill": { ltr: "\uE008", rtl: "\uE007" }, "arrow-circle-down[start]-fill": { ltr: "\uE009", rtl: "\uE00A" }, "arrow-circle-down[end]-fill": { ltr: "\uE00A", rtl: "\uE009" }, "arrow-square-[start]": { ltr: "\uE013", rtl: "\uE014" }, "arrow-square-[end]": { ltr: "\uE014", rtl: "\uE013" }, "arrow-square-up": "\uE015", "arrow-square-down": "\uE016", "arrow-square-up[start]": { ltr: "\uE017", rtl: "\uE018" }, "arrow-square-up[end]": { ltr: "\uE018", rtl: "\uE017" }, "arrow-square-down[start]": { ltr: "\uE019", rtl: "\uE01A" }, "arrow-square-down[end]": { ltr: "\uE01A", rtl: "\uE019" }, "arrow-square-[start]-fill": { ltr: "\uE08A", rtl: "\uE08B" }, "arrow-square-[end]-fill": { ltr: "\uE08B", rtl: "\uE08A" }, "arrow-square-up-fill": "\uE08C", "arrow-square-down-fill": "\uE08D", "arrow-square-up[start]-fill": { ltr: "\uE08E", rtl: "\uE08F" }, "arrow-square-up[end]-fill": { ltr: "\uE08F", rtl: "\uE08E" }, "arrow-square-down[start]-fill": { ltr: "\uE090", rtl: "\uE091" }, "arrow-square-down[end]-fill": { ltr: "\uE091", rtl: "\uE090" }, "arrow-rectangle-up": "\uE0CD", "arrow-rectangle-up-fill": "\uE173", "arrow-circle-dash-down": "\uE172", aspectratio: "\uE134", "aspectratio-fill": "\uE176", at: "\uE01B", attach: "\uE058", audio: "\uE01C", "audio-rectangle": "\uE178", "audio-rectangle-fill": "\uE179", backspace: "\uE203", "backspace-rtl": "\uE17B", "backspace-fill": "\uE20F", "backspace-fill-rtl": "\uE210", backup: "\uE09F", "backup-error": "\uE0A0", badge: "\uE099", "badge-fill": "\uE09A", "badge-set": "\uE0DA", "badge-set-fill": "\uE17D", bell: "\uE01E", "bell-fill": "\uE248", "bell-slash": "\uE01F", "bell-slash-fill": "\uE249", "bell-ring": "\uE020", "bell-ring-fill": "\uE24A", "bell-sleep": "\uE0A1", "bell-sleep-fill": "\uE24B", block: "\uE002", blur: "\uE0DB", "blur-light": "\uE211", "blur-medium": "\uE212", "blur-heavy": "\uE247", bolt: "\uE0B8", "bolt-fill": "\uE218", boost: "\uE0E2", "boost-fill": "\uE219", "brushsize-thin": "\uE0E1", "brushsize-regular": "\uE0E0", "brushsize-medium": "\uE0DF", "brushsize-heavy": "\uE0DE", calendar: "\uE0A2", "calendar-week": "\uE0A4", "calendar-day": "\uE0A5", "calendar-blank": "\uE0A3", "calendar-search": "\uE0E3", camera: "\uE0E4", "camera-fill": "\uE17E", "camera-swap": "\uE0E5", "camera-swap-fill": "\uE17F", check: "\uE180", "check-circle": "\uE022", "check-circle-fill": "\uE182", "check-square": "\uE023", "check-square-fill": "\uE183", "chevron-[start]": { ltr: "\uE024", rtl: "\uE025" }, "chevron-[end]": { ltr: "\uE025", rtl: "\uE024" }, "chevron-up": "\uE026", "chevron-down": "\uE027", "chevron-circle-[start]": { ltr: "\uE028", rtl: "\uE029" }, "chevron-circle-[end]": { ltr: "\uE029", rtl: "\uE028" }, "chevron-circle-up": "\uE02A", "chevron-circle-down": "\uE02B", "chevron-circle-[start]-fill": { ltr: "\uE1F2", rtl: "\uE1F3" }, "chevron-circle-[end]-fill": { ltr: "\uE1F3", rtl: "\uE1F2" }, "chevron-circle-up-fill": "\uE1F4", "chevron-circle-down-fill": "\uE1F5", "chevron-square-[start]": { ltr: "\uE02C", rtl: "\uE02D" }, "chevron-square-[end]": { ltr: "\uE02D", rtl: "\uE02C" }, "chevron-square-up": "\uE02E", "chevron-square-down": "\uE02F", "chevron-square-[start]-fill": { ltr: "\uE1F6", rtl: "\uE1F7" }, "chevron-square-[end]-fill": { ltr: "\uE1F7", rtl: "\uE1F6" }, "chevron-square-up-fill": "\uE1F8", "chevron-square-down-fill": "\uE1F9", "chevron-shallow-[start]": { ltr: "\uE0E6", rtl: "\uE0E7" }, "chevron-shallow-[end]": { ltr: "\uE0E7", rtl: "\uE0E6" }, "chevron-shallow-up": "\uE0E8", "chevron-shallow-down": "\uE0E9", "chevron-double-left-right": "\uE207", "chevron-double-up-down": "\uE081", circle: "\uE160", "circle-fill": "\uE184", "circle-dash": "\uE07A", clock: "\uE265", "clock-hour-1": "\uE266", "clock-hour-2": "\uE267", "clock-hour-3": "\uE268", "clock-hour-4": "\uE269", "clock-hour-5": "\uE26A", "clock-hour-6": "\uE26B", "clock-hour-7": "\uE26C", "clock-hour-8": "\uE26D", "clock-hour-9": "\uE26E", "clock-hour-10": "\uE26F", "clock-hour-11": "\uE270", "clock-hour-12": "\uE271", compose: "\uE0EA", connections: "\uE0AD", "connections-fill": "\uE185", contrast: "\uE281", copy: "\uE0EB", "copy-alt": "\uE0EC", creditcard: "\uE127", "creditcard-fill": "\uE187", crop: "\uE0ED", "crop-rotate": "\uE0EE", "device-phone": "\uE0F2", "device-phone-fill": "\uE18A", "device-tablet": "\uE0F3", "device-tablet-fill": "\uE18B", "device-laptop": "\uE0F4", "device-laptop-fill": "\uE18C", download: "\uE0C8", draghandle: "\uE0F5", "draghandle-alt": "\uE0F6", emoji: "\uE18D", "emoji-fill": "\uE18E", "emoji-plus": "\uE0F8", "emoji-excited": "\uE0F9", "emoji-sad": "\uE0FA", "emoji-angry": "\uE0FB", "emoji-surprised": "\uE0FD", "emoji-animal": "\uE0FE", "emoji-celebrate": "\uE0FF", "emoji-food": "\uE100", "emoji-activity": "\uE101", "emoji-travel": "\uE102", "emoji-object": "\uE103", "emoji-symbol": "\uE104", "emoji-flag": "\uE105", emoticon: "\uE106", error: "\uE032", "error-fill": "\uE093", "error-triangle": "\uE092", "error-triangle-fill": "\uE094", "error-octagon": "\uE033", "error-octagon-fill": "\uE18F", file: "\uE034", "file-fill": "\uE190", "file-slash": "\uE0B1", "file-slash-fill": "\uE191", filter: "\uE107", "filter-circle": "\uE108", "filter-circle-fill": "\uE1FA", flash: "\uE109", "flash-fill": "\uE192", "flash-slash": "\uE10A", "flash-slash-fill": "\uE193", "flash-auto": "\uE10B", "flash-auto-fill": "\uE194", flip: "\uE10C", folder: "\uE0B2", "folder-plus": "\uE0B3", "folder-minus": "\uE274", "folder-settings": "\uE0B4", forward: "\uE035", "forward-fill": "\uE036", fullscreen: "\uE10D", gif: "\uE037", "gif-rectangle": "\uE195", "gif-rectangle-fill": "\uE196", gift: "\uE0B5", "gift-fill": "\uE253", globe: "\uE0B6", "globe-fill": "\uE254", grid: "\uE10E", "grid-fill": "\uE198", "grid-rectangle": "\uE10F", "grid-rectangle-fill": "\uE199", "grid-sidebar": "\uE13B", "grid-sidebar-fill": "\uE23C", group: "\uE19B", "group-fill": "\uE19D", hd: "\uE132", "hd-slash": "\uE133", headphones: "\uE110", "headphones-fill": "\uE1A3", heart: "\uE039", "heart-fill": "\uE1A4", "heart-plus": "\uE0B7", "heart-plus-fill": "\uE1A5", help: "\uE0D8", "help-fill": "\uE1A6", info: "\uE03B", "info-fill": "\uE1A7", invite: "\uE0B9", key: "\uE0BA", "key-fill": "\uE245", "key-slash": "\uE0BB", "key-slash-fill": "\uE246", keyboard: "\uE111", label: "\uE27F", "label-fill": "\uE280", leave: "\uE1AA", "leave-rtl": "\uE1AB", link: "\uE03E", "link-alt": "\uE03F", "link-broken": "\uE057", "link-slash": "\uE040", "list-bullet": "\uE113", "list-bullet-rtl": "\uE115", "list-circle": "\uE114", "list-circle-rtl": "\uE116", location: "\uE0BC", "location-fill": "\uE275", "location-circle": "\uE0BD", "location-circle-fill": "\uE1AC", lock: "\uE041", "lock-fill": "\uE1AD", "lock-open": "\uE07D", "lock-open-fill": "\uE1AE", megaphone: "\uE042", menu: "\uE11B", merge: "\uE043", message: "\uE0A6", "message-fill": "\uE1AF", "message-badge": "\uE0A7", "message-badge-fill": "\uE1B0", "message-arrow": "\uE0A8", "message-arrow-fill": "\uE1B1", "message-check": "\uE0A9", "message-check-fill": "\uE1B2", "message-more": "\uE0AA", "message-more-fill": "\uE1B3", "message-x": "\uE0AB", "message-x-fill": "\uE1B4", "message-thread": "\uE071", "message-thread-fill": "\uE072", mic: "\uE055", "mic-fill": "\uE1B5", "mic-slash": "\uE056", "mic-slash-fill": "\uE1B6", minus: "\uE1B7", "minus-circle": "\uE1B8", "minus-circle-fill": "\uE1B9", "minus-square": "\uE059", "minus-square-fill": "\uE1BA", "missed-incoming": "\uE05A", "missed-outgoing": "\uE05B", moon: "\uE0BE", "moon-fill": "\uE0D9", "moon-slash": "\uE209", "moon-slash-fill": "\uE20A", more: "\uE120", "more-circle": "\uE121", "more-circle-fill": "\uE208", note: "\uE095", "note-rtl": "\uE096", nothing: "\uE189", number: "\uE0BF", "number-square": "\uE0C0", "number-square-fill": "\uE1BC", numberpad: "\uE123", officialbadge: "\uE086", "officialbadge-fill": "\uE087", open: "\uE0C1", palette: "\uE0AC", "palette-fill": "\uE1BD", pause: "\uE124", "pause-fill": "\uE1BE", "pause-circle": "\uE125", "pause-circle-fill": "\uE1BF", "pause-square": "\uE126", "pause-square-fill": "\uE1C0", pencil: "\uE030", "pencil-fill": "\uE1C1", person: "\uE05D", "person-fill": "\uE1C3", "person-circle": "\uE05E", "person-circle-fill": "\uE1C4", "person-square": "\uE129", "person-square-fill": "\uE1C5", "person-rectangle": "\uE12A", "person-rectangle-fill": "\uE1C6", phone: "\uE063", "phone-fill": "\uE064", "phone-down": "\uE12B", "phone-down-fill": "\uE25F", "phone-plus": "\uE12C", "phone-plus-fill": "\uE260", "phone-speaker": "\uE12D", "phone-speaker-fill": "\uE261", photo: "\uE1C8", "photo-slash": "\uE1C9", piechart: "\uE0F1", "piechart-fill": "\uE1CA", pin: "\uE12E", "pin-fill": "\uE1CB", "pin-slash": "\uE12F", "pin-slash-fill": "\uE1CC", pip: "\uE130", "pip-fill": "\uE23E", play: "\uE067", "play-fill": "\uE1CD", "play-circle": "\uE068", "play-circle-fill": "\uE1CE", "play-square": "\uE069", "play-square-fill": "\uE1CF", plus: "\uE1D1", "plus-circle": "\uE1D2", "plus-circle-fill": "\uE1D3", "plus-square": "\uE06C", "plus-square-fill": "\uE1D4", poll: "\uE082", "poll-rtl": "\uE272", "poll-fill": "\uE083", "poll-fill-rtl": "\uE273", press: "\uE14A", "press-fill": "\uE14B", qrcode: "\uE0C2", raisehand: "\uE07E", "raisehand-fill": "\uE084", receipt: "\uE135", "receipt-rtl": "\uE136", recent: "\uE0C3", rectangle: "\uE162", "rectangle-fill": "\uE1D6", "rectangle-dash": "\uE214", redo: "\uE0C6", refresh: "\uE0C4", reply: "\uE06D", "reply-fill": "\uE06E", rotate: "\uE137", scan: "\uE138", "scan-qrcode": "\uE216", scribble: "\uE0F7", search: "\uE0C7", send: "\uE20B", "send-fill": "\uE0C9", settings: "\uE0CA", "settings-fill": "\uE0CB", "settings-alt": "\uE0CC", share: "\uE139", "share-alt": "\uE13A", "shield-check": "\uE06F", "shield-check-fill": "\uE1D8", sidebar: "\uE13C", "sidebar-fill": "\uE243", "sort-vertical": "\uE0CE", "sort-horizontal": "\uE0CF", speaker: "\uE13F", "speaker-fill": "\uE23F", "speaker-x": "\uE140", "speaker-x-fill": "\uE240", "speaker-bluetooth": "\uE141", "speaker-bluetooth-fill": "\uE241", "speaker-slash": "\uE142", "speaker-slash-fill": "\uE242", square: "\uE161", "square-fill": "\uE1FB", "square-dash": "\uE17C", star: "\uE0AF", "star-fill": "\uE0B0", "star-slash": "\uE276", "star-slash-fill": "\uE277", sticker: "\uE070", "sticker-smiley": "\uE143", "sticker-slash": "\uE144", stickerpack: "\uE145", "stickerpack-plus": "\uE146", stop: "\uE147", "stop-fill": "\uE1D9", "stop-circle": "\uE148", "stop-circle-fill": "\uE1DA", "stop-square": "\uE149", "stop-square-fill": "\uE1DB", stories: "\uE0D0", "stories-fill": "\uE0D1", sun: "\uE0D2", "sun-fill": "\uE1DC", "sun-horizon": "\uE0D3", "sun-horizon-fill": "\uE1DD", swap: "\uE0D4", "text-square": "\uE14D", "text-square-fill": "\uE1DE", "text-outline": "\uE14E", "textalign-[start]": { ltr: "\uE14F", rtl: "\uE151" }, "textalign-center": "\uE150", "textalign-[end]": { ltr: "\uE151", rtl: "\uE14F" }, "textalign-justifed": "\uE152", texteffects: "\uE153", "texteffects-fill": "\uE1DF", "textformat-bold": "\uE154", "textformat-italic": "\uE155", "textformat-strikethrough": "\uE156", "textformat-monospace": "\uE157", "textformat-spoiler": "\uE158", thumbsdown: "\uE262", "thumbsdown-fill": "\uE263", thumbsup: "\uE0FC", "thumbsup-fill": "\uE264", ticks: "\uE044", timer: "\uE073", "timer-fill": "\uE1E0", "timer-slash": "\uE074", "timer-slash-fill": "\uE1E1", "timer-countdown-0": "\uE048", "timer-countdown-1": "\uE049", "timer-countdown-2": "\uE04A", "timer-countdown-3": "\uE04B", "timer-countdown-4": "\uE04C", "timer-countdown-5": "\uE04D", "timer-countdown-6": "\uE04E", "timer-countdown-7": "\uE04F", "timer-countdown-8": "\uE050", "timer-countdown-9": "\uE051", "timer-countdown-10": "\uE052", "timer-countdown-11": "\uE053", "timer-countdown-12": "\uE054", trash: "\uE0D5", "trash-fill": "\uE0D6", trending: "\uE159", tune: "\uE15A", undo: "\uE0C5", upload: "\uE0D7", video: "\uE1E2", "video-fill": "\uE1E4", "video-slash": "\uE1E3", "video-slash-fill": "\uE1E6", videocamera: "\uE1E8", "videocamera-fill": "\uE1EA", "videocamera-slash": "\uE1E9", "videocamera-slash-fill": "\uE1EB", viewonce: "\uE078", "viewonce-dash": "\uE079", "viewonce-slash": "\uE204", visible: "\uE15B", "visible-slash": "\uE15C", wifi: "\uE15D", "wifi-error": "\uE15E", x: "\uE1ED", "x-circle": "\uE1EE", "x-circle-fill": "\uE1F0", "x-circle-dash": "\uE15F", "x-square": "\uE1EF", "x-square-fill": "\uE1F1", "zoom-in": "\uE282", "zoom-out": "\uE283" }; const InlineDefs = { album: "\uE001", "arrow-rectangle-up": "\uE171", "arrow-rectangle-up-fill": "\uE174", aspectratio: "\uE175", "aspectratio-fill": "\uE177", "audio-rectangle": "\uE01D", "audio-rectangle-fill": "\uE17A", "check-circle-double": "\uE046", "check-circle-double-fill": "\uE047", creditcard: "\uE186", "creditcard-fill": "\uE188", "emoji-plus": "\uE20C", "gif-rectangle": "\uE097", "gif-rectangle-fill": "\uE098", "grid-rectangle": "\uE197", "grid-rectangle-fill": "\uE19A", "grid-sidebar": "\uE213", "grid-sidebar-fill": "\uE23D", group: "\uE038", "group-fill": "\uE19E", "group-x": "\uE0AE", "group-x-fill": "\uE1A0", invite: "\uE1A8", keyboard: "\uE1A9", leave: "\uE03C", "leave-rtl": "\uE03D", "person-check": "\uE05F", "person-check-fill": "\uE256", "person-plus": "\uE061", "person-plus-fill": "\uE258", "person-minus": "\uE062", "person-minus-fill": "\uE25A", "person-x": "\uE060", "person-x-fill": "\uE25C", "person-question": "\uE06A", "person-question-fill": "\uE25E", "person-rectangle": "\uE1C2", "person-rectangle-fill": "\uE1C7", photo: "\uE065", "photo-slash": "\uE066", rectangle: "\uE1D5", "rectangle-fill": "\uE1D7", "rectangle-dash": "\uE215", sidebar: "\uE217", "sidebar-fill": "\uE244", video: "\uE088", "video-fill": "\uE1E5", "video-slash": "\uE089", "video-slash-fill": "\uE1E7", videocamera: "\uE075", "videocamera-fill": "\uE077", "videocamera-slash": "\uE076", "videocamera-slash-fill": "\uE1EC" }; function _getAllAxoSymbolIconNames() { return Object.keys(IconDefs); } __name(_getAllAxoSymbolIconNames, "_getAllAxoSymbolIconNames"); function _getAllAxoSymbolInlineGlyphNames() { return Object.keys(IconDefs); } __name(_getAllAxoSymbolInlineGlyphNames, "_getAllAxoSymbolInlineGlyphNames"); function getAxoSymbolIcon(name, dir) { const value = IconDefs[name]; if (value == null) { throw new TypeError(`Invalid symbol name for icon: ${name}`); } return typeof value === "string" ? value : value[dir]; } __name(getAxoSymbolIcon, "getAxoSymbolIcon"); function getAxoSymbolInlineGlyph(name, dir) { const value = InlineDefs[name] ?? IconDefs[name]; if (value == null) { throw new TypeError(`Invalid symbol name for inline glyph: ${name}`); } return typeof value === "string" ? value : value[dir]; } __name(getAxoSymbolInlineGlyph, "getAxoSymbolInlineGlyph"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { _getAllAxoSymbolIconNames, _getAllAxoSymbolInlineGlyphNames, getAxoSymbolIcon, getAxoSymbolInlineGlyph }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var assert_std_exports = {}; __export(assert_std_exports, { AssertionError: () => AssertionError, assert: () => assert, unreachable: () => unreachable }); module.exports = __toCommonJS(assert_std_exports); class AssertionError extends TypeError { static { __name(this, "AssertionError"); } name = "AssertionError"; } function assert(input, message) { if (input === false || input == null) { debugger; throw new AssertionError(message ?? `input is ${input}`); } return input; } __name(assert, "assert"); function unreachable(_value) { debugger; throw new AssertionError("unreachable"); } __name(unreachable, "unreachable"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { AssertionError, assert, unreachable }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var storybook_fixtures_std_exports = {}; __export(storybook_fixtures_std_exports, { BADGES_FIXTURE: () => BADGES_FIXTURE }); module.exports = __toCommonJS(storybook_fixtures_std_exports); const BADGES_FIXTURE = { planet: { id: "R_MED", category: "donor", name: "Signal Planet", description: "{short_name} supports Signal with a monthly donation. Signal is a nonprofit with no advertisers or investors, supported only by people like you.", svg: { size: 160, src: "fixtures/badges/planet/planet-160.svg" }, svgs: { 16: { size: 16, light: "fixtures/badges/planet/planet-16-light.svg", dark: "fixtures/badges/planet/planet-16-dark.svg" }, 24: { size: 24, light: "fixtures/badges/planet/planet-24-light.svg", dark: "fixtures/badges/planet/planet-24-dark.svg" }, 36: { size: 36, light: "fixtures/badges/planet/planet-36-light.svg", dark: "fixtures/badges/planet/planet-36-dark.svg" } } }, rocket: { id: "BOOST", category: "donor", name: "Signal Boost", description: "{short_name} supported Signal with a donation. Signal is a nonprofit with no advertisers or investors, supported only by people like you.", svg: { size: 160, src: "fixtures/badges/rocket/rocket-160.svg" }, svgs: { 16: { size: 16, light: "fixtures/badges/rocket/rocket-16-light.svg", dark: "fixtures/badges/rocket/rocket-16-dark.svg" }, 24: { size: 24, light: "fixtures/badges/rocket/rocket-24-light.svg", dark: "fixtures/badges/rocket/rocket-24-dark.svg" }, 36: { size: 36, light: "fixtures/badges/rocket/rocket-36-light.svg", dark: "fixtures/badges/rocket/rocket-36-dark.svg" } } }, star: { id: "R_LOW", category: "donor", name: "Signal Star", description: "{short_name} supports Signal with a monthly donation. Signal is a nonprofit with no advertisers or investors, supported only by people like you.", svg: { size: 160, src: "fixtures/badges/star/star-160.svg" }, svgs: { 16: { size: 16, light: "fixtures/badges/star/star-16-light.svg", dark: "fixtures/badges/star/star-16-dark.svg" }, 24: { size: 24, light: "fixtures/badges/star/star-24-light.svg", dark: "fixtures/badges/star/star-24-dark.svg" }, 36: { size: 36, light: "fixtures/badges/star/star-36-light.svg", dark: "fixtures/badges/star/star-36-dark.svg" } } }, sun: { id: "R_HIGH", category: "donor", name: "Signal Sun", description: "{short_name} supports Signal with a monthly donation. Signal is a nonprofit with no advertisers or investors, supported only by people like you.", svg: { size: 160, src: "fixtures/badges/sun/sun-160.svg" }, svgs: { 16: { size: 16, light: "fixtures/badges/sun/sun-16-light.svg", dark: "fixtures/badges/sun/sun-16-dark.svg" }, 24: { size: 24, light: "fixtures/badges/sun/sun-24-light.svg", dark: "fixtures/badges/sun/sun-24-dark.svg" }, 36: { size: 36, light: "fixtures/badges/sun/sun-36-light.svg", dark: "fixtures/badges/sun/sun-36-dark.svg" } } }, ufo: { id: "GIFT", category: "donor", name: "Signal UFO", description: "A friend made a donation to Signal on behalf of {short_name}. Signal is a nonprofit with no advertisers or investors, supported only by people like you.", svg: { size: 160, src: "fixtures/badges/ufo/ufo-160.svg" }, svgs: { 16: { size: 16, light: "fixtures/badges/ufo/ufo-16-light.svg", dark: "fixtures/badges/ufo/ufo-16-dark.svg" }, 24: { size: 24, light: "fixtures/badges/ufo/ufo-24-light.svg", dark: "fixtures/badges/ufo/ufo-24-dark.svg" }, 36: { size: 36, light: "fixtures/badges/ufo/ufo-36-light.svg", dark: "fixtures/badges/ufo/ufo-36-dark.svg" } } } }; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { BADGES_FIXTURE }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var BadgeCategory_std_exports = {}; __export(BadgeCategory_std_exports, { BadgeCategory: () => BadgeCategory, parseBadgeCategory: () => parseBadgeCategory }); module.exports = __toCommonJS(BadgeCategory_std_exports); var import_enum_std = require("../util/enum.std.js"); var BadgeCategory = /* @__PURE__ */ ((BadgeCategory2) => { BadgeCategory2["Donor"] = "donor"; BadgeCategory2["Other"] = "other"; return BadgeCategory2; })(BadgeCategory || {}); const parseBadgeCategory = (0, import_enum_std.makeEnumParser)( BadgeCategory, "other" /* Other */ ); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { BadgeCategory, parseBadgeCategory }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var BadgeImageTheme_std_exports = {}; __export(BadgeImageTheme_std_exports, { BadgeImageTheme: () => BadgeImageTheme, parseBadgeImageTheme: () => parseBadgeImageTheme }); module.exports = __toCommonJS(BadgeImageTheme_std_exports); var import_enum_std = require("../util/enum.std.js"); var BadgeImageTheme = /* @__PURE__ */ ((BadgeImageTheme2) => { BadgeImageTheme2["Light"] = "light"; BadgeImageTheme2["Dark"] = "dark"; BadgeImageTheme2["Transparent"] = "transparent"; return BadgeImageTheme2; })(BadgeImageTheme || {}); const parseBadgeImageTheme = (0, import_enum_std.makeEnumParser)( BadgeImageTheme, "transparent" /* Transparent */ ); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { BadgeImageTheme, parseBadgeImageTheme }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var getBadgeImageFileLocalPath_std_exports = {}; __export(getBadgeImageFileLocalPath_std_exports, { getBadgeImageFileLocalPath: () => getBadgeImageFileLocalPath }); module.exports = __toCommonJS(getBadgeImageFileLocalPath_std_exports); var import_lodash = __toESM(require("lodash")); var import_BadgeImageTheme_std = require("./BadgeImageTheme.std.js"); const { find, findLast, first, last } = import_lodash.default; function getBadgeImageFileLocalPath(badge, size, theme) { if (!badge) { return void 0; } const localPathsForTheme = badge.images.map( (image) => image[theme]?.localPath ); if (theme === import_BadgeImageTheme_std.BadgeImageTheme.Transparent) { const search = size < 36 ? find : findLast; return search(localPathsForTheme, Boolean); } if (size < 24) { return first(localPathsForTheme); } if (size < 36) { return localPathsForTheme[1]; } if (size < 160) { return localPathsForTheme[2]; } return last(localPathsForTheme) || localPathsForTheme[2]; } __name(getBadgeImageFileLocalPath, "getBadgeImageFileLocalPath"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getBadgeImageFileLocalPath }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var isBadgeImageFileUrlValid_std_exports = {}; __export(isBadgeImageFileUrlValid_std_exports, { isBadgeImageFileUrlValid: () => isBadgeImageFileUrlValid }); module.exports = __toCommonJS(isBadgeImageFileUrlValid_std_exports); var import_url_std = require("../util/url.std.js"); function isBadgeImageFileUrlValid(url, updatesUrl) { const expectedPrefix = new URL("/static/badges", updatesUrl).href; return url.startsWith(expectedPrefix) && Boolean((0, import_url_std.maybeParseUrl)(url)); } __name(isBadgeImageFileUrlValid, "isBadgeImageFileUrlValid"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { isBadgeImageFileUrlValid }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var isBadgeVisible_std_exports = {}; __export(isBadgeVisible_std_exports, { isBadgeVisible: () => isBadgeVisible }); module.exports = __toCommonJS(isBadgeVisible_std_exports); const isBadgeVisible = /* @__PURE__ */ __name((badge) => "isVisible" in badge ? badge.isVisible : true, "isBadgeVisible"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { isBadgeVisible }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var parseBadgesFromServer_std_exports = {}; __export(parseBadgesFromServer_std_exports, { badgeFromServerSchema: () => badgeFromServerSchema, boostBadgesFromServerSchema: () => boostBadgesFromServerSchema, parseBadgeFromServer: () => parseBadgeFromServer, parseBadgesFromServer: () => parseBadgesFromServer, parseBoostBadgeListFromServer: () => parseBoostBadgeListFromServer }); module.exports = __toCommonJS(parseBadgesFromServer_std_exports); var z = __toESM(require("zod")); var import_lodash = __toESM(require("lodash")); var import_isRecord_std = require("../util/isRecord.std.js"); var import_isNormalNumber_std = require("../util/isNormalNumber.std.js"); var import_log_std = require("../logging/log.std.js"); var import_BadgeCategory_std = require("./BadgeCategory.std.js"); var import_BadgeImageTheme_std = require("./BadgeImageTheme.std.js"); var import_schemas_std = require("../util/schemas.std.js"); const { isEmpty } = import_lodash.default; const log = (0, import_log_std.createLogger)("parseBadgesFromServer"); const MAX_BADGES = 1e3; const badgeFromServerSchema = z.object({ category: z.string(), description: z.string(), id: z.string(), name: z.string(), svg: z.string(), svgs: z.array(z.record(z.string())).length(3), expiration: z.number().optional(), visible: z.boolean().optional() }); const boostBadgesFromServerSchema = z.object({ levels: z.record( z.object({ badge: z.unknown() }).or(z.undefined()) ) }); function parseBoostBadgeListFromServer(value, updatesUrl) { const result = {}; const parseResult = (0, import_schemas_std.safeParseUnknown)(boostBadgesFromServerSchema, value); if (!parseResult.success) { log.warn( "parseBoostBadgeListFromServer: server response was invalid:", parseResult.error.format() ); throw new Error( "parseBoostBadgeListFromServer: Failed to parse server response" ); } const boostBadges = parseResult.data; Object.keys(boostBadges.levels).forEach((level) => { const item = boostBadges.levels[level]; if (!item) { log.warn(`parseBoostBadgeListFromServer: level ${level} had no badge`); return; } const parsed = parseBadgeFromServer(item.badge, updatesUrl); if (parsed) { result[level] = parsed; } }); return result; } __name(parseBoostBadgeListFromServer, "parseBoostBadgeListFromServer"); function parseBadgeFromServer(value, updatesUrl) { const parseResult = (0, import_schemas_std.safeParseUnknown)(badgeFromServerSchema, value); if (!parseResult.success) { log.warn( "parseBadgeFromServer: badge was invalid:", parseResult.error.format() ); return void 0; } const { category, description: descriptionTemplate, expiration, id, name, svg, svgs, visible } = parseResult.data; const images = parseImages(svgs, svg, updatesUrl); if (images.length !== 4) { log.warn("Got invalid number of SVGs from the server"); return void 0; } return { id, category: (0, import_BadgeCategory_std.parseBadgeCategory)(category), name, descriptionTemplate, images, ...(0, import_isNormalNumber_std.isNormalNumber)(expiration) && typeof visible === "boolean" ? { expiresAt: expiration * 1e3, isVisible: visible } : {} }; } __name(parseBadgeFromServer, "parseBadgeFromServer"); function parseBadgesFromServer(value, updatesUrl) { if (!Array.isArray(value)) { return []; } const result = []; const numberOfBadgesToParse = Math.min(value.length, MAX_BADGES); for (let i = 0; i < numberOfBadgesToParse; i += 1) { const item = value[i]; const parsed = parseBadgeFromServer(item, updatesUrl); if (!parsed) { continue; } result.push(parsed); } return result; } __name(parseBadgesFromServer, "parseBadgesFromServer"); const parseImages = /* @__PURE__ */ __name((rawSvgs, rawSvg, updatesUrl) => { const result = []; for (const item of rawSvgs) { if (!(0, import_isRecord_std.isRecord)(item)) { log.warn("Got invalid SVG from the server"); continue; } const image = {}; for (const [rawTheme, filename] of Object.entries(item)) { if (typeof filename !== "string") { log.warn("Got an SVG from the server that lacked a valid filename"); continue; } const theme = (0, import_BadgeImageTheme_std.parseBadgeImageTheme)(rawTheme); image[theme] = { url: parseImageFilename(filename, updatesUrl) }; } if (isEmpty(image)) { log.warn("Got an SVG from the server that lacked valid values"); } else { result.push(image); } } result.push({ [import_BadgeImageTheme_std.BadgeImageTheme.Transparent]: { url: parseImageFilename(rawSvg, updatesUrl) } }); return result; }, "parseImages"); const parseImageFilename = /* @__PURE__ */ __name((filename, updatesUrl) => new URL(`/static/badges/${filename}`, updatesUrl).toString(), "parseImageFilename"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { badgeFromServerSchema, boostBadgesFromServerSchema, parseBadgeFromServer, parseBadgesFromServer, parseBoostBadgeListFromServer }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var types_std_exports = {}; module.exports = __toCommonJS(types_std_exports); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var constants_std_exports = {}; __export(constants_std_exports, { AUDIO_LEVEL_INTERVAL_MS: () => AUDIO_LEVEL_INTERVAL_MS, FRAME_BUFFER_SIZE: () => FRAME_BUFFER_SIZE, MAX_FRAME_HEIGHT: () => MAX_FRAME_HEIGHT, MAX_FRAME_WIDTH: () => MAX_FRAME_WIDTH, REQUESTED_GROUP_VIDEO_HEIGHT: () => REQUESTED_GROUP_VIDEO_HEIGHT, REQUESTED_GROUP_VIDEO_WIDTH: () => REQUESTED_GROUP_VIDEO_WIDTH, REQUESTED_SCREEN_SHARE_FRAMERATE: () => REQUESTED_SCREEN_SHARE_FRAMERATE, REQUESTED_SCREEN_SHARE_HEIGHT: () => REQUESTED_SCREEN_SHARE_HEIGHT, REQUESTED_SCREEN_SHARE_WIDTH: () => REQUESTED_SCREEN_SHARE_WIDTH, REQUESTED_VIDEO_FRAMERATE: () => REQUESTED_VIDEO_FRAMERATE, REQUESTED_VIDEO_HEIGHT: () => REQUESTED_VIDEO_HEIGHT, REQUESTED_VIDEO_WIDTH: () => REQUESTED_VIDEO_WIDTH }); module.exports = __toCommonJS(constants_std_exports); const AUDIO_LEVEL_INTERVAL_MS = 200; const REQUESTED_VIDEO_WIDTH = 960; const REQUESTED_VIDEO_HEIGHT = 720; const REQUESTED_VIDEO_FRAMERATE = 30; const REQUESTED_GROUP_VIDEO_WIDTH = 640; const REQUESTED_GROUP_VIDEO_HEIGHT = 480; const REQUESTED_SCREEN_SHARE_WIDTH = 2880; const REQUESTED_SCREEN_SHARE_HEIGHT = 1800; const REQUESTED_SCREEN_SHARE_FRAMERATE = 5; const MAX_FRAME_WIDTH = 2880; const MAX_FRAME_HEIGHT = 1800; const FRAME_BUFFER_SIZE = MAX_FRAME_WIDTH * MAX_FRAME_HEIGHT * 4; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { AUDIO_LEVEL_INTERVAL_MS, FRAME_BUFFER_SIZE, MAX_FRAME_HEIGHT, MAX_FRAME_WIDTH, REQUESTED_GROUP_VIDEO_HEIGHT, REQUESTED_GROUP_VIDEO_WIDTH, REQUESTED_SCREEN_SHARE_FRAMERATE, REQUESTED_SCREEN_SHARE_HEIGHT, REQUESTED_SCREEN_SHARE_WIDTH, REQUESTED_VIDEO_FRAMERATE, REQUESTED_VIDEO_HEIGHT, REQUESTED_VIDEO_WIDTH }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var findBestMatchingDevice_std_exports = {}; __export(findBestMatchingDevice_std_exports, { findBestMatchingAudioDeviceIndex: () => findBestMatchingAudioDeviceIndex, findBestMatchingCameraId: () => findBestMatchingCameraId }); module.exports = __toCommonJS(findBestMatchingDevice_std_exports); function findBestMatchingAudioDeviceIndex({ available, preferred }, isWindows) { if (!preferred) { return available.length > 0 ? 0 : void 0; } if (preferred.index === 0 || isWindows && preferred.index === 1 && available.length >= 2) { return preferred.index; } const offset = isWindows ? 2 : 1; const searchArr = available.slice(offset); if (preferred.uniqueId) { const idMatchIndex = searchArr.findIndex( (d) => d.uniqueId === preferred.uniqueId ); if (idMatchIndex !== -1) { return idMatchIndex + offset; } } const nameMatchIndex = searchArr.findIndex((d) => d.name === preferred.name); if (nameMatchIndex !== -1) { return nameMatchIndex + offset; } return available.length > 0 ? 0 : void 0; } __name(findBestMatchingAudioDeviceIndex, "findBestMatchingAudioDeviceIndex"); function findBestMatchingCameraId(available, preferred) { const matchingId = available.filter((d) => d.deviceId === preferred); const nonInfrared = available.filter((d) => !d.label.includes("IR Camera")); if (matchingId.length > 0) { return matchingId[0].deviceId; } if (nonInfrared.length > 0) { return nonInfrared[0].deviceId; } return void 0; } __name(findBestMatchingCameraId, "findBestMatchingCameraId"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { findBestMatchingAudioDeviceIndex, findBestMatchingCameraId }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var truncateAudioLevel_std_exports = {}; __export(truncateAudioLevel_std_exports, { truncateAudioLevel: () => truncateAudioLevel }); module.exports = __toCommonJS(truncateAudioLevel_std_exports); const LOWEST = 500 / 32767; const LOW = 1e3 / 32767; const MEDIUM = 5e3 / 32767; const HIGH = 16e3 / 32767; function truncateAudioLevel(audioLevel) { if (audioLevel < LOWEST) { return 0; } if (audioLevel < LOW) { return 0.25; } if (audioLevel < MEDIUM) { return 0.5; } if (audioLevel < HIGH) { return 0.75; } return 1; } __name(truncateAudioLevel, "truncateAudioLevel"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { truncateAudioLevel }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var useGetCallingFrameBuffer_std_exports = {}; __export(useGetCallingFrameBuffer_std_exports, { useGetCallingFrameBuffer: () => useGetCallingFrameBuffer }); module.exports = __toCommonJS(useGetCallingFrameBuffer_std_exports); var import_react = require("react"); var import_constants_std = require("./constants.std.js"); function useGetCallingFrameBuffer() { const ref = (0, import_react.useRef)(null); return (0, import_react.useCallback)(() => { if (!ref.current) { ref.current = new Uint8Array(import_constants_std.FRAME_BUFFER_SIZE); } return ref.current; }, []); } __name(useGetCallingFrameBuffer, "useGetCallingFrameBuffer"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { useGetCallingFrameBuffer }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var util_std_exports = {}; __export(util_std_exports, { WidthBreakpoint: () => WidthBreakpoint, cleanId: () => cleanId, getNavSidebarWidthBreakpoint: () => getNavSidebarWidthBreakpoint }); module.exports = __toCommonJS(util_std_exports); function cleanId(id) { return id.replace(/[^\u0020-\u007e\u00a0-\u00ff]/g, "_"); } __name(cleanId, "cleanId"); var WidthBreakpoint = /* @__PURE__ */ ((WidthBreakpoint2) => { WidthBreakpoint2["Wide"] = "wide"; WidthBreakpoint2["Medium"] = "medium"; WidthBreakpoint2["Narrow"] = "narrow"; return WidthBreakpoint2; })(WidthBreakpoint || {}); function getNavSidebarWidthBreakpoint(width) { return width >= 150 ? "wide" /* Wide */ : "narrow" /* Narrow */; } __name(getNavSidebarWidthBreakpoint, "getNavSidebarWidthBreakpoint"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { WidthBreakpoint, cleanId, getNavSidebarWidthBreakpoint }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var util_std_exports = {}; __export(util_std_exports, { RequestState: () => RequestState, bemGenerator: () => bemGenerator }); module.exports = __toCommonJS(util_std_exports); var import_classnames = __toESM(require("classnames")); var RequestState = /* @__PURE__ */ ((RequestState2) => { RequestState2[RequestState2["Inactive"] = 0] = "Inactive"; RequestState2[RequestState2["InactiveWithError"] = 1] = "InactiveWithError"; RequestState2[RequestState2["Active"] = 2] = "Active"; return RequestState2; })(RequestState || {}); const bemGenerator = /* @__PURE__ */ __name((block) => (element, modifier) => { const base = `${block}__${element}`; const classes = [base]; let conditionals = {}; if (modifier) { if (typeof modifier === "string") { classes.push(`${base}--${modifier}`); } else { conditionals = Object.keys(modifier).reduce( (acc, key) => ({ ...acc, [`${base}--${key}`]: modifier[key] }), {} ); } } return (0, import_classnames.default)(classes, conditionals); }, "bemGenerator"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { RequestState, bemGenerator }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var groupMediaItemsByDate_std_exports = {}; __export(groupMediaItemsByDate_std_exports, { groupMediaItemsByDate: () => groupMediaItemsByDate }); module.exports = __toCommonJS(groupMediaItemsByDate_std_exports); var import_moment = __toESM(require("moment")); var import_lodash = __toESM(require("lodash")); var import_missingCaseError_std = require("../../../util/missingCaseError.std.js"); const { compact, groupBy, sortBy } = import_lodash.default; const groupMediaItemsByDate = /* @__PURE__ */ __name((timestamp, mediaItems) => { const referenceDateTime = (0, import_moment.default)(timestamp); const sortedMediaItem = sortBy(mediaItems, (mediaItem) => { const { message } = mediaItem; return -message.receivedAt; }); const messagesWithSection = sortedMediaItem.map( withSection(referenceDateTime) ); const groupedMediaItem = groupBy(messagesWithSection, "type"); const yearMonthMediaItem = Object.values( groupBy(groupedMediaItem.yearMonth, "order") ).reverse(); return compact([ toSection(groupedMediaItem.today), toSection(groupedMediaItem.yesterday), toSection(groupedMediaItem.thisWeek), toSection(groupedMediaItem.thisMonth), ...yearMonthMediaItem.map(toSection) ]); }, "groupMediaItemsByDate"); const toSection = /* @__PURE__ */ __name((messagesWithSection) => { if (!messagesWithSection || messagesWithSection.length === 0) { return void 0; } const firstMediaItemWithSection = messagesWithSection[0]; if (!firstMediaItemWithSection) { return void 0; } const mediaItems = messagesWithSection.map( (messageWithSection) => messageWithSection.mediaItem ); switch (firstMediaItemWithSection.type) { case "today": case "yesterday": case "thisWeek": case "thisMonth": return { type: firstMediaItemWithSection.type, mediaItems }; case "yearMonth": return { type: firstMediaItemWithSection.type, year: firstMediaItemWithSection.year, month: firstMediaItemWithSection.month, mediaItems }; default: throw (0, import_missingCaseError_std.missingCaseError)(firstMediaItemWithSection); } }, "toSection"); const withSection = /* @__PURE__ */ __name((referenceDateTime) => { const today = (0, import_moment.default)(referenceDateTime).startOf("day"); const yesterday = (0, import_moment.default)(referenceDateTime).subtract(1, "day").startOf("day"); const thisWeek = (0, import_moment.default)(referenceDateTime).subtract(7, "day").startOf("day"); const thisMonth = (0, import_moment.default)(referenceDateTime).startOf("month"); return (mediaItem) => { const { message } = mediaItem; const messageTimestamp = (0, import_moment.default)(message.receivedAtMs || message.receivedAt); if (messageTimestamp.isAfter(today)) { return { order: 0, type: "today", mediaItem }; } if (messageTimestamp.isAfter(yesterday)) { return { order: 1, type: "yesterday", mediaItem }; } if (messageTimestamp.isAfter(thisWeek)) { return { order: 2, type: "thisWeek", mediaItem }; } if (messageTimestamp.isAfter(thisMonth)) { return { order: 3, type: "thisMonth", mediaItem }; } const month = messageTimestamp.month(); const year = messageTimestamp.year(); return { order: year * 100 + month, type: "yearMonth", month, year, mediaItem }; }; }, "withSection"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { groupMediaItemsByDate }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var ItemClickEvent_std_exports = {}; module.exports = __toCommonJS(ItemClickEvent_std_exports); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var mocks_std_exports = {}; __export(mocks_std_exports, { createPreparedMediaItems: () => createPreparedMediaItems, createRandomAudio: () => createRandomAudio, createRandomContacts: () => createRandomContacts, createRandomDocuments: () => createRandomDocuments, createRandomLinks: () => createRandomLinks, createRandomMedia: () => createRandomMedia, days: () => days }); module.exports = __toCommonJS(mocks_std_exports); var import_lodash = __toESM(require("lodash")); var import_MIME_std = require("../../../../types/MIME.std.js"); var import_randomBlurHash_std = require("../../../../util/randomBlurHash.std.js"); var import_index_std = require("../../../../protobuf/index.std.js"); const { random, range, sample, sortBy } = import_lodash.default; const DAY_MS = 24 * 60 * 60 * 1e3; const days = /* @__PURE__ */ __name((n) => n * DAY_MS, "days"); const tokens = ["foo", "bar", "baz", "qux", "quux"]; const contentTypes = { gif: "image/gif", jpg: "image/jpeg", png: "image/png", mp4: "video/mp4", docx: "application/text", pdf: "application/pdf", exe: "application/exe", txt: "application/text" }; function createRandomAttachment(fileExtension) { const contentType = contentTypes[fileExtension]; const fileName = `${sample(tokens)}${sample(tokens)}.${fileExtension}`; const isDownloaded = Math.random() > 0.4; const isPending = !isDownloaded && Math.random() > 0.5; let file; if (fileExtension === "mp3") { file = "/fixtures/incompetech-com-Agnus-Dei-X.mp3"; } else if (fileExtension === "mp4") { file = "/fixtures/cat-gif.mp4"; } else { file = "/fixtures/cat-screenshot-3x4.png"; } let flags = 0; if (fileExtension === "mp4" && Math.random() > 0.5) { flags = import_index_std.SignalService.AttachmentPointer.Flags.GIF; } return { url: isDownloaded ? file : void 0, path: isDownloaded ? "abc" : void 0, pending: isPending, screenshot: fileExtension === "mp4" ? { url: isDownloaded ? file : void 0, contentType: import_MIME_std.IMAGE_JPEG } : void 0, flags, width: 400, height: 300, fileName, size: random(1e3, 1e3 * 1e3 * 50), contentType, blurHash: (0, import_randomBlurHash_std.randomBlurHash)(), isPermanentlyUndownloadable: false }; } __name(createRandomAttachment, "createRandomAttachment"); function createRandomMessage(startTime, timeWindow) { return { conversationId: "123", type: "incoming", id: random(Date.now()).toString(), receivedAt: Math.floor(Math.random() * 10), receivedAtMs: random(startTime, startTime + timeWindow), sentAt: Date.now(), // Unused for now source: void 0, sourceServiceId: void 0, isErased: false, readStatus: void 0, sendStateByConversationId: void 0, errors: void 0 }; } __name(createRandomMessage, "createRandomMessage"); function createRandomFile(type, startTime, timeWindow, fileExtension) { return { type, message: createRandomMessage(startTime, timeWindow), attachment: createRandomAttachment(fileExtension), index: 0 }; } __name(createRandomFile, "createRandomFile"); function createRandomLink(startTime, timeWindow) { return { type: "link", message: createRandomMessage(startTime, timeWindow), preview: { url: "https://signal.org/", domain: "signal.org", title: "Signal", description: "description", image: Math.random() > 0.7 ? createRandomAttachment("png") : void 0 } }; } __name(createRandomLink, "createRandomLink"); function createRandomContact(startTime, timeWindow) { return { type: "contact", message: createRandomMessage(startTime, timeWindow), contact: { name: { givenName: "Bob" }, avatar: Math.random() > 0.3 ? { isProfile: true, avatar: createRandomAttachment("png") } : void 0 } }; } __name(createRandomContact, "createRandomContact"); function createRandomFiles(type, startTime, timeWindow, fileExtensions) { return range(random(5, 20)).map( () => createRandomFile( type, startTime, timeWindow, sample(fileExtensions) ) ); } __name(createRandomFiles, "createRandomFiles"); function createRandomDocuments(startTime, timeWindow) { return createRandomFiles("document", startTime, timeWindow, [ "docx", "pdf", "exe", "txt" ]); } __name(createRandomDocuments, "createRandomDocuments"); function createRandomContacts(startTime, timeWindow) { return range(random(5, 10)).map( () => createRandomContact(startTime, timeWindow) ); } __name(createRandomContacts, "createRandomContacts"); function createRandomLinks(startTime, timeWindow) { return range(random(5, 10)).map( () => createRandomLink(startTime, timeWindow) ); } __name(createRandomLinks, "createRandomLinks"); function createRandomAudio(startTime, timeWindow) { return createRandomFiles("audio", startTime, timeWindow, ["mp3"]); } __name(createRandomAudio, "createRandomAudio"); function createRandomMedia(startTime, timeWindow) { return createRandomFiles("media", startTime, timeWindow, [ "mp4", "jpg", "png", "gif" ]); } __name(createRandomMedia, "createRandomMedia"); function createPreparedMediaItems(fn) { const now = Date.now(); return sortBy( [ ...fn(now, days(1)), ...fn(now - days(1), days(1)), ...fn(now - days(3), days(3)), ...fn(now - days(30), days(15)), ...fn(now - days(365), days(300)) ], (item) => -item.message.receivedAt ); } __name(createPreparedMediaItems, "createPreparedMediaItems"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { createPreparedMediaItems, createRandomAudio, createRandomContacts, createRandomDocuments, createRandomLinks, createRandomMedia, days }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var emojis_std_exports = {}; __export(emojis_std_exports, { EMOJI_PARENT_KEY_CONSTANTS: () => EMOJI_PARENT_KEY_CONSTANTS, EMOJI_SKIN_TONE_ORDER: () => EMOJI_SKIN_TONE_ORDER, EMOJI_SKIN_TONE_TO_KEY: () => EMOJI_SKIN_TONE_TO_KEY, EMOJI_SKIN_TONE_TO_NUMBER: () => EMOJI_SKIN_TONE_TO_NUMBER, EMOJI_VARIANT_KEY_CONSTANTS: () => EMOJI_VARIANT_KEY_CONSTANTS, EmojiPickerCategory: () => EmojiPickerCategory, EmojiSkinTone: () => EmojiSkinTone, EmojiUnicodeCategory: () => EmojiUnicodeCategory, KEY_TO_EMOJI_SKIN_TONE: () => KEY_TO_EMOJI_SKIN_TONE, _getAllEmojiVariantKeys: () => _getAllEmojiVariantKeys, getEmojiDebugLabel: () => getEmojiDebugLabel, getEmojiDefaultEnglishLocalizerIndex: () => getEmojiDefaultEnglishLocalizerIndex, getEmojiDefaultEnglishSearchIndex: () => getEmojiDefaultEnglishSearchIndex, getEmojiParentByKey: () => getEmojiParentByKey, getEmojiParentKeyByEnglishShortName: () => getEmojiParentKeyByEnglishShortName, getEmojiParentKeyByValue: () => getEmojiParentKeyByValue, getEmojiParentKeyByVariantKey: () => getEmojiParentKeyByVariantKey, getEmojiPickerCategoryParentKeys: () => getEmojiPickerCategoryParentKeys, getEmojiSkinToneByVariantKey: () => getEmojiSkinToneByVariantKey, getEmojiUnicodeCategoryParentKeys: () => getEmojiUnicodeCategoryParentKeys, getEmojiVariantByKey: () => getEmojiVariantByKey, getEmojiVariantByParentKeyAndSkinTone: () => getEmojiVariantByParentKeyAndSkinTone, getEmojiVariantKeyByParentKeyAndSkinTone: () => getEmojiVariantKeyByParentKeyAndSkinTone, getEmojiVariantKeyByValue: () => getEmojiVariantKeyByValue, getEmojifyData: () => getEmojifyData, isEmojiEnglishShortName: () => isEmojiEnglishShortName, isEmojiParentKey: () => isEmojiParentKey, isEmojiParentValue: () => isEmojiParentValue, isEmojiParentValueDeprecated: () => isEmojiParentValueDeprecated, isEmojiVariantKey: () => isEmojiVariantKey, isEmojiVariantValue: () => isEmojiVariantValue, isEmojiVariantValueNonQualified: () => isEmojiVariantValueNonQualified, isSafeEmojifyEmoji: () => isSafeEmojifyEmoji, isValidEmojiSkinTone: () => isValidEmojiSkinTone, normalizeShortNameCompletionDisplay: () => normalizeShortNameCompletionDisplay, normalizeShortNameCompletionQuery: () => normalizeShortNameCompletionQuery }); module.exports = __toCommonJS(emojis_std_exports); var import_zod = require("zod"); var import_emoji_regex = __toESM(require("emoji-regex")); var import_assert_std = require("../../../util/assert.std.js"); var import_schemas_std = require("../../../util/schemas.std.js"); var import_removeDiacritics_std = require("../../../util/removeDiacritics.std.js"); var import_log_std = require("../../../logging/log.std.js"); const log = (0, import_log_std.createLogger)("fun/data/emojis"); const RAW_UNTYPED_DATA = require("emoji-datasource"); var EmojiUnicodeCategory = /* @__PURE__ */ ((EmojiUnicodeCategory2) => { EmojiUnicodeCategory2["SmileysAndEmotion"] = "EmojiUnicodeCategory.SmileysAndEmotion"; EmojiUnicodeCategory2["PeopleAndBody"] = "EmojiUnicodeCategory.PeopleAndBody"; EmojiUnicodeCategory2["Component"] = "EmojiUnicodeCategory.Component"; EmojiUnicodeCategory2["AnimalsAndNature"] = "EmojiUnicodeCategory.AnimalsAndNature"; EmojiUnicodeCategory2["FoodAndDrink"] = "EmojiUnicodeCategory.FoodAndDrink"; EmojiUnicodeCategory2["TravelAndPlaces"] = "EmojiUnicodeCategory.TravelAndPlaces"; EmojiUnicodeCategory2["Activities"] = "EmojiUnicodeCategory.Activities"; EmojiUnicodeCategory2["Objects"] = "EmojiUnicodeCategory.Objects"; EmojiUnicodeCategory2["Symbols"] = "EmojiUnicodeCategory.Symbols"; EmojiUnicodeCategory2["Flags"] = "EmojiUnicodeCategory.Flags"; return EmojiUnicodeCategory2; })(EmojiUnicodeCategory || {}); var EmojiPickerCategory = /* @__PURE__ */ ((EmojiPickerCategory2) => { EmojiPickerCategory2["SmileysAndPeople"] = "EmojiPickerCategory.SmileysAndPeople"; EmojiPickerCategory2["AnimalsAndNature"] = "EmojiPickerCategory.AnimalsAndNature"; EmojiPickerCategory2["FoodAndDrink"] = "EmojiPickerCategory.FoodAndDrink"; EmojiPickerCategory2["TravelAndPlaces"] = "EmojiPickerCategory.TravelAndPlaces"; EmojiPickerCategory2["Activities"] = "EmojiPickerCategory.Activities"; EmojiPickerCategory2["Objects"] = "EmojiPickerCategory.Objects"; EmojiPickerCategory2["Symbols"] = "EmojiPickerCategory.Symbols"; EmojiPickerCategory2["Flags"] = "EmojiPickerCategory.Flags"; return EmojiPickerCategory2; })(EmojiPickerCategory || {}); var EmojiSkinTone = /* @__PURE__ */ ((EmojiSkinTone2) => { EmojiSkinTone2["None"] = "EmojiSkinTone.None"; EmojiSkinTone2["Type1"] = "EmojiSkinTone.Type1"; EmojiSkinTone2["Type2"] = "EmojiSkinTone.Type2"; EmojiSkinTone2["Type3"] = "EmojiSkinTone.Type3"; EmojiSkinTone2["Type4"] = "EmojiSkinTone.Type4"; EmojiSkinTone2["Type5"] = "EmojiSkinTone.Type5"; return EmojiSkinTone2; })(EmojiSkinTone || {}); function isValidEmojiSkinTone(value) { return typeof value === "string" && EMOJI_SKIN_TONE_ORDER.includes(value); } __name(isValidEmojiSkinTone, "isValidEmojiSkinTone"); const EMOJI_SKIN_TONE_ORDER = [ "EmojiSkinTone.None" /* None */, "EmojiSkinTone.Type1" /* Type1 */, "EmojiSkinTone.Type2" /* Type2 */, "EmojiSkinTone.Type3" /* Type3 */, "EmojiSkinTone.Type4" /* Type4 */, "EmojiSkinTone.Type5" /* Type5 */ ]; const EMOJI_SKIN_TONE_TO_NUMBER = /* @__PURE__ */ new Map([ ["EmojiSkinTone.None" /* None */, 0], ["EmojiSkinTone.Type1" /* Type1 */, 1], ["EmojiSkinTone.Type2" /* Type2 */, 2], ["EmojiSkinTone.Type3" /* Type3 */, 3], ["EmojiSkinTone.Type4" /* Type4 */, 4], ["EmojiSkinTone.Type5" /* Type5 */, 5] ]); const KEY_TO_EMOJI_SKIN_TONE = /* @__PURE__ */ new Map([ ["1F3FB", "EmojiSkinTone.Type1" /* Type1 */], ["1F3FC", "EmojiSkinTone.Type2" /* Type2 */], ["1F3FD", "EmojiSkinTone.Type3" /* Type3 */], ["1F3FE", "EmojiSkinTone.Type4" /* Type4 */], ["1F3FF", "EmojiSkinTone.Type5" /* Type5 */] ]); const EMOJI_SKIN_TONE_TO_KEY = /* @__PURE__ */ new Map([ ["EmojiSkinTone.Type1" /* Type1 */, "1F3FB"], ["EmojiSkinTone.Type2" /* Type2 */, "1F3FC"], ["EmojiSkinTone.Type3" /* Type3 */, "1F3FD"], ["EmojiSkinTone.Type4" /* Type4 */, "1F3FE"], ["EmojiSkinTone.Type5" /* Type5 */, "1F3FF"] ]); const RawEmojiSkinToneSchema = import_zod.z.object({ unified: import_zod.z.string(), non_qualified: import_zod.z.union([import_zod.z.string(), import_zod.z.null()]), sheet_x: import_zod.z.number(), sheet_y: import_zod.z.number(), has_img_apple: import_zod.z.boolean() }); const RawEmojiSkinToneMapSchema = import_zod.z.record(import_zod.z.string(), RawEmojiSkinToneSchema); const RawEmojiSchema = import_zod.z.object({ unified: import_zod.z.string(), non_qualified: import_zod.z.union([import_zod.z.string(), import_zod.z.null()]), category: import_zod.z.string(), sort_order: import_zod.z.number(), sheet_x: import_zod.z.number(), sheet_y: import_zod.z.number(), has_img_apple: import_zod.z.boolean(), short_name: import_zod.z.string(), short_names: import_zod.z.array(import_zod.z.string()), text: import_zod.z.nullable(import_zod.z.string()), texts: import_zod.z.nullable(import_zod.z.array(import_zod.z.string())), skin_variations: RawEmojiSkinToneMapSchema.optional() }); const RAW_UNICODE_CATEGORY_MAP = { "Smileys & Emotion": "EmojiUnicodeCategory.SmileysAndEmotion" /* SmileysAndEmotion */, "People & Body": "EmojiUnicodeCategory.PeopleAndBody" /* PeopleAndBody */, Component: "EmojiUnicodeCategory.Component" /* Component */, "Animals & Nature": "EmojiUnicodeCategory.AnimalsAndNature" /* AnimalsAndNature */, "Food & Drink": "EmojiUnicodeCategory.FoodAndDrink" /* FoodAndDrink */, "Travel & Places": "EmojiUnicodeCategory.TravelAndPlaces" /* TravelAndPlaces */, Activities: "EmojiUnicodeCategory.Activities" /* Activities */, Objects: "EmojiUnicodeCategory.Objects" /* Objects */, Symbols: "EmojiUnicodeCategory.Symbols" /* Symbols */, Flags: "EmojiUnicodeCategory.Flags" /* Flags */ }; const RAW_PICKER_CATEGORY_MAP = { "Smileys & Emotion": "EmojiPickerCategory.SmileysAndPeople" /* SmileysAndPeople */, // merged "People & Body": "EmojiPickerCategory.SmileysAndPeople" /* SmileysAndPeople */, // merged Component: null, // dropped "Animals & Nature": "EmojiPickerCategory.AnimalsAndNature" /* AnimalsAndNature */, "Food & Drink": "EmojiPickerCategory.FoodAndDrink" /* FoodAndDrink */, "Travel & Places": "EmojiPickerCategory.TravelAndPlaces" /* TravelAndPlaces */, Activities: "EmojiPickerCategory.Activities" /* Activities */, Objects: "EmojiPickerCategory.Objects" /* Objects */, Symbols: "EmojiPickerCategory.Symbols" /* Symbols */, Flags: "EmojiPickerCategory.Flags" /* Flags */ }; function toEmojiUnicodeCategory(category) { const result = RAW_UNICODE_CATEGORY_MAP[category]; (0, import_assert_std.strictAssert)(result != null, `Unknown category: ${category}`); return result; } __name(toEmojiUnicodeCategory, "toEmojiUnicodeCategory"); function toEmojiPickerCategory(category) { const result = RAW_PICKER_CATEGORY_MAP[category]; (0, import_assert_std.strictAssert)( typeof result !== "undefined", `Unknown picker category: ${category}` ); return result; } __name(toEmojiPickerCategory, "toEmojiPickerCategory"); function toEmojiParentKey(unified) { return unified; } __name(toEmojiParentKey, "toEmojiParentKey"); function toEmojiVariantKey(unified) { return unified; } __name(toEmojiVariantKey, "toEmojiVariantKey"); function encodeUnified(unified) { return unified.split("-").map((char) => String.fromCodePoint(Number.parseInt(char, 16))).join(""); } __name(encodeUnified, "encodeUnified"); function toEmojiParentValue(unified) { return encodeUnified(unified); } __name(toEmojiParentValue, "toEmojiParentValue"); function toEmojiVariantValue(unified) { return encodeUnified(unified); } __name(toEmojiVariantValue, "toEmojiVariantValue"); const WOMAN = "\u{1F469}"; const MAN = "\u{1F468}"; const GIRL = "\u{1F467}"; const BOY = "\u{1F466}"; const ZWJ = "\u200D"; const UNICODE_DEPRECATED_EMOJI = /* @__PURE__ */ new Set([ /** * 2022 - Family Emoji Redesign: Gender Inclusive Variants * https://www.unicode.org/L2/L2023/23029-family-emoji.pdf * https://www.unicode.org/L2/L2022/22276-family-emoji-guidelines.pdf */ // 1 ADULT, 1 CHILD `${WOMAN}${ZWJ}${GIRL}`, `${WOMAN}${ZWJ}${BOY}`, `${MAN}${ZWJ}${GIRL}`, `${MAN}${ZWJ}${BOY}`, // 1 ADULT, 2 CHILDREN `${WOMAN}${ZWJ}${GIRL}${ZWJ}${GIRL}`, `${WOMAN}${ZWJ}${GIRL}${ZWJ}${BOY}`, `${WOMAN}${ZWJ}${BOY}${ZWJ}${BOY}`, `${MAN}${ZWJ}${GIRL}${ZWJ}${GIRL}`, `${MAN}${ZWJ}${GIRL}${ZWJ}${BOY}`, `${MAN}${ZWJ}${BOY}${ZWJ}${BOY}`, // 2 ADULTS, 1 CHILD `${WOMAN}${ZWJ}${WOMAN}${ZWJ}${GIRL}`, `${WOMAN}${ZWJ}${WOMAN}${ZWJ}${BOY}`, `${MAN}${ZWJ}${WOMAN}${ZWJ}${GIRL}`, `${MAN}${ZWJ}${WOMAN}${ZWJ}${BOY}`, `${MAN}${ZWJ}${MAN}${ZWJ}${GIRL}`, `${MAN}${ZWJ}${MAN}${ZWJ}${BOY}`, // 2 ADULTS, 2 CHILDREN `${WOMAN}${ZWJ}${WOMAN}${ZWJ}${GIRL}${ZWJ}${GIRL}`, `${WOMAN}${ZWJ}${WOMAN}${ZWJ}${GIRL}${ZWJ}${BOY}`, `${WOMAN}${ZWJ}${WOMAN}${ZWJ}${BOY}${ZWJ}${BOY}`, `${MAN}${ZWJ}${WOMAN}${ZWJ}${GIRL}${ZWJ}${GIRL}`, `${MAN}${ZWJ}${WOMAN}${ZWJ}${GIRL}${ZWJ}${BOY}`, `${MAN}${ZWJ}${WOMAN}${ZWJ}${BOY}${ZWJ}${BOY}`, `${MAN}${ZWJ}${MAN}${ZWJ}${GIRL}${ZWJ}${GIRL}`, `${MAN}${ZWJ}${MAN}${ZWJ}${GIRL}${ZWJ}${BOY}`, `${MAN}${ZWJ}${MAN}${ZWJ}${BOY}${ZWJ}${BOY}` ]); const RAW_EMOJI_DATA = (0, import_schemas_std.parseUnknown)( import_zod.z.array(RawEmojiSchema), RAW_UNTYPED_DATA ).sort((a, b) => { return a.sort_order - b.sort_order; }); const EMOJI_INDEX = { parentByKey: /* @__PURE__ */ new Map(), parentKeysByValue: /* @__PURE__ */ new Map(), parentKeysByValueNonQualified: /* @__PURE__ */ new Map(), parentKeysByName: /* @__PURE__ */ new Map(), parentKeysByVariantKeys: /* @__PURE__ */ new Map(), variantByKey: /* @__PURE__ */ new Map(), variantKeysByValue: /* @__PURE__ */ new Map(), variantKeysByValueNonQualified: /* @__PURE__ */ new Map(), variantKeyToSkinTone: /* @__PURE__ */ new Map(), unicodeCategories: { ["EmojiUnicodeCategory.SmileysAndEmotion" /* SmileysAndEmotion */]: [], ["EmojiUnicodeCategory.PeopleAndBody" /* PeopleAndBody */]: [], ["EmojiUnicodeCategory.Component" /* Component */]: [], ["EmojiUnicodeCategory.AnimalsAndNature" /* AnimalsAndNature */]: [], ["EmojiUnicodeCategory.FoodAndDrink" /* FoodAndDrink */]: [], ["EmojiUnicodeCategory.TravelAndPlaces" /* TravelAndPlaces */]: [], ["EmojiUnicodeCategory.Activities" /* Activities */]: [], ["EmojiUnicodeCategory.Objects" /* Objects */]: [], ["EmojiUnicodeCategory.Symbols" /* Symbols */]: [], ["EmojiUnicodeCategory.Flags" /* Flags */]: [] }, pickerCategories: { ["EmojiPickerCategory.SmileysAndPeople" /* SmileysAndPeople */]: [], ["EmojiPickerCategory.AnimalsAndNature" /* AnimalsAndNature */]: [], ["EmojiPickerCategory.FoodAndDrink" /* FoodAndDrink */]: [], ["EmojiPickerCategory.TravelAndPlaces" /* TravelAndPlaces */]: [], ["EmojiPickerCategory.Activities" /* Activities */]: [], ["EmojiPickerCategory.Objects" /* Objects */]: [], ["EmojiPickerCategory.Symbols" /* Symbols */]: [], ["EmojiPickerCategory.Flags" /* Flags */]: [] }, defaultEnglishSearchIndex: [], defaultEnglishLocalizerIndex: { parentKeyToLocaleShortName: /* @__PURE__ */ new Map(), localeShortNameToParentKey: /* @__PURE__ */ new Map() } }; function addParent(parent, rank) { const isDeprecated = UNICODE_DEPRECATED_EMOJI.has(parent.value); EMOJI_INDEX.parentByKey.set(parent.key, parent); EMOJI_INDEX.parentKeysByValue.set(parent.value, parent.key); if (parent.valueNonqualified != null) { EMOJI_INDEX.parentKeysByValue.set(parent.valueNonqualified, parent.key); EMOJI_INDEX.parentKeysByValueNonQualified.set( parent.valueNonqualified, parent.key ); } EMOJI_INDEX.parentKeysByName.set(parent.englishShortNameDefault, parent.key); EMOJI_INDEX.unicodeCategories[parent.unicodeCategory].push(parent.key); if (parent.pickerCategory != null && !isDeprecated) { EMOJI_INDEX.pickerCategories[parent.pickerCategory].push(parent.key); } for (const englishShortName of parent.englishShortNames) { EMOJI_INDEX.parentKeysByName.set(englishShortName, parent.key); } if (!isDeprecated) { EMOJI_INDEX.defaultEnglishSearchIndex.push({ key: parent.key, rank, shortName: parent.englishShortNameDefault, shortNames: parent.englishShortNames, emoticon: parent.emoticonDefault, emoticons: parent.emoticons }); } EMOJI_INDEX.defaultEnglishLocalizerIndex.parentKeyToLocaleShortName.set( parent.key, parent.englishShortNameDefault ); EMOJI_INDEX.defaultEnglishLocalizerIndex.localeShortNameToParentKey.set( parent.englishShortNameDefault, parent.key ); } __name(addParent, "addParent"); function addVariant(parentKey, variant) { EMOJI_INDEX.parentKeysByVariantKeys.set(variant.key, parentKey); EMOJI_INDEX.variantByKey.set(variant.key, variant); EMOJI_INDEX.variantKeysByValue.set(variant.value, variant.key); if (variant.valueNonqualified) { EMOJI_INDEX.variantKeysByValue.set(variant.valueNonqualified, variant.key); EMOJI_INDEX.variantKeysByValueNonQualified.set( variant.valueNonqualified, variant.key ); } } __name(addVariant, "addVariant"); for (const rawEmoji of RAW_EMOJI_DATA) { if (!rawEmoji.has_img_apple) { continue; } const parentKey = toEmojiParentKey(rawEmoji.unified); const defaultVariant = { key: toEmojiVariantKey(rawEmoji.unified), value: toEmojiVariantValue(rawEmoji.unified), valueNonqualified: rawEmoji.non_qualified != null ? toEmojiVariantValue(rawEmoji.non_qualified) : null, sheetX: rawEmoji.sheet_x, sheetY: rawEmoji.sheet_y }; addVariant(parentKey, defaultVariant); let defaultSkinToneVariants = null; if (rawEmoji.skin_variations != null) { const map = /* @__PURE__ */ new Map(); for (const [key, value] of Object.entries(rawEmoji.skin_variations)) { if (!value.has_img_apple) { continue; } const variantKey = toEmojiVariantKey(value.unified); map.set(key, variantKey); const skinToneVariant = { key: variantKey, value: toEmojiVariantValue(value.unified), valueNonqualified: rawEmoji.non_qualified != null ? toEmojiVariantValue(rawEmoji.non_qualified) : null, sheetX: value.sheet_x, sheetY: value.sheet_y }; addVariant(parentKey, skinToneVariant); } const result = {}; for (const [key, skinTone] of KEY_TO_EMOJI_SKIN_TONE) { const one = map.get(key) ?? null; const two = map.get(`${key}-${key}`) ?? null; const variantKey = one ?? two; if (variantKey == null) { const keys = Object.keys(rawEmoji.skin_variations); throw new Error(`Missing variant key ${parentKey} -> ${key} (${keys})`); } result[skinTone] = variantKey; EMOJI_INDEX.variantKeyToSkinTone.set(variantKey, skinTone); } defaultSkinToneVariants = result; } const parent = { key: toEmojiParentKey(rawEmoji.unified), value: toEmojiParentValue(rawEmoji.unified), valueNonqualified: rawEmoji.non_qualified != null ? toEmojiParentValue(rawEmoji.non_qualified) : null, unicodeCategory: toEmojiUnicodeCategory(rawEmoji.category), pickerCategory: toEmojiPickerCategory(rawEmoji.category), defaultVariant: defaultVariant.key, defaultSkinToneVariants, englishShortNameDefault: rawEmoji.short_name, englishShortNames: rawEmoji.short_names, emoticonDefault: rawEmoji.text ?? null, emoticons: rawEmoji.texts ?? [] }; addParent(parent, rawEmoji.sort_order); } function getEmojiDebugLabel(input) { return Array.from(input.slice(0, 12), (char) => { const num = char.codePointAt(0) ?? 0; const hex = num.toString(16).toUpperCase().padStart(4, "0"); return `U+${hex}`; }).join(" "); } __name(getEmojiDebugLabel, "getEmojiDebugLabel"); function isEmojiParentKey(input) { return EMOJI_INDEX.parentByKey.has(input); } __name(isEmojiParentKey, "isEmojiParentKey"); function isEmojiParentValueDeprecated(input) { return UNICODE_DEPRECATED_EMOJI.has(input); } __name(isEmojiParentValueDeprecated, "isEmojiParentValueDeprecated"); function isEmojiVariantKey(input) { return EMOJI_INDEX.variantByKey.has(input); } __name(isEmojiVariantKey, "isEmojiVariantKey"); function isEmojiParentValue(input) { return EMOJI_INDEX.parentKeysByValue.has(input); } __name(isEmojiParentValue, "isEmojiParentValue"); function isEmojiVariantValue(input) { return EMOJI_INDEX.variantKeysByValue.has(input); } __name(isEmojiVariantValue, "isEmojiVariantValue"); function isEmojiVariantValueNonQualified(input) { return EMOJI_INDEX.variantKeysByValueNonQualified.has(input); } __name(isEmojiVariantValueNonQualified, "isEmojiVariantValueNonQualified"); function isEmojiEnglishShortName(input) { return EMOJI_INDEX.parentKeysByName.has(input); } __name(isEmojiEnglishShortName, "isEmojiEnglishShortName"); function getEmojiParentByKey(key) { const data = EMOJI_INDEX.parentByKey.get(key); (0, import_assert_std.strictAssert)(data, `Missing emoji parent data for key "${key}"`); return data; } __name(getEmojiParentByKey, "getEmojiParentByKey"); function getEmojiVariantByKey(key) { const data = EMOJI_INDEX.variantByKey.get(key); (0, import_assert_std.strictAssert)(data, `Missing emoji variant data for key "${key}"`); return data; } __name(getEmojiVariantByKey, "getEmojiVariantByKey"); function getEmojiParentKeyByValue(value) { const key = EMOJI_INDEX.parentKeysByValue.get(value); (0, import_assert_std.strictAssert)(key, `Missing emoji parent key for value "${value}"`); return key; } __name(getEmojiParentKeyByValue, "getEmojiParentKeyByValue"); function getEmojiVariantKeyByValue(value) { const key = EMOJI_INDEX.variantKeysByValue.get(value); (0, import_assert_std.strictAssert)(key, `Missing emoji variant key for value "${value}"`); return key; } __name(getEmojiVariantKeyByValue, "getEmojiVariantKeyByValue"); function getEmojiParentKeyByVariantKey(key) { const parentKey = EMOJI_INDEX.parentKeysByVariantKeys.get(key); (0, import_assert_std.strictAssert)(parentKey, `Missing parent key for variant key "${key}"`); return parentKey; } __name(getEmojiParentKeyByVariantKey, "getEmojiParentKeyByVariantKey"); function getEmojiUnicodeCategoryParentKeys(category) { const parents = EMOJI_INDEX.unicodeCategories[category]; (0, import_assert_std.strictAssert)(parents, `Missing category emojis for ${category}`); return parents; } __name(getEmojiUnicodeCategoryParentKeys, "getEmojiUnicodeCategoryParentKeys"); function getEmojiPickerCategoryParentKeys(category) { const parents = EMOJI_INDEX.pickerCategories[category]; (0, import_assert_std.strictAssert)(parents, `Missing category emojis for ${category}`); return parents; } __name(getEmojiPickerCategoryParentKeys, "getEmojiPickerCategoryParentKeys"); function getEmojiVariantKeyByParentKeyAndSkinTone(key, skinTone) { const parent = getEmojiParentByKey(key); const skinToneVariants = parent.defaultSkinToneVariants; if (skinTone === "EmojiSkinTone.None" /* None */ || skinToneVariants == null) { return parent.defaultVariant; } const variantKey = skinToneVariants[skinTone]; (0, import_assert_std.strictAssert)(variantKey, `Missing skin tone variant for ${skinTone}`); return variantKey; } __name(getEmojiVariantKeyByParentKeyAndSkinTone, "getEmojiVariantKeyByParentKeyAndSkinTone"); function getEmojiVariantByParentKeyAndSkinTone(key, skinTone) { return getEmojiVariantByKey( getEmojiVariantKeyByParentKeyAndSkinTone(key, skinTone) ); } __name(getEmojiVariantByParentKeyAndSkinTone, "getEmojiVariantByParentKeyAndSkinTone"); function getEmojiSkinToneByVariantKey(variantKey) { return EMOJI_INDEX.variantKeyToSkinTone.get(variantKey) ?? "EmojiSkinTone.None" /* None */; } __name(getEmojiSkinToneByVariantKey, "getEmojiSkinToneByVariantKey"); function getEmojiParentKeyByEnglishShortName(englishShortName) { const emojiKey = EMOJI_INDEX.parentKeysByName.get(englishShortName); (0, import_assert_std.strictAssert)(emojiKey, `Missing emoji info for ${englishShortName}`); return emojiKey; } __name(getEmojiParentKeyByEnglishShortName, "getEmojiParentKeyByEnglishShortName"); function getEmojiDefaultEnglishSearchIndex() { return EMOJI_INDEX.defaultEnglishSearchIndex; } __name(getEmojiDefaultEnglishSearchIndex, "getEmojiDefaultEnglishSearchIndex"); function getEmojiDefaultEnglishLocalizerIndex() { return EMOJI_INDEX.defaultEnglishLocalizerIndex; } __name(getEmojiDefaultEnglishLocalizerIndex, "getEmojiDefaultEnglishLocalizerIndex"); function _getAllEmojiVariantKeys() { return EMOJI_INDEX.variantByKey.keys(); } __name(_getAllEmojiVariantKeys, "_getAllEmojiVariantKeys"); function emojiParentKeyConstant(input) { (0, import_assert_std.strictAssert)( isEmojiParentValue(input), `Missing emoji parent for value "${input}"` ); return getEmojiParentKeyByValue(input); } __name(emojiParentKeyConstant, "emojiParentKeyConstant"); function emojiVariantKeyConstant(input) { (0, import_assert_std.strictAssert)( isEmojiVariantValue(input), `Missing emoji variant for value "${input}"` ); return getEmojiVariantKeyByValue(input); } __name(emojiVariantKeyConstant, "emojiVariantKeyConstant"); const EMOJI_PARENT_KEY_CONSTANTS = { RED_HEART: emojiParentKeyConstant("\u2764\uFE0F"), CRYING_FACE: emojiParentKeyConstant("\u{1F622}"), FACE_WITH_TEARS_OF_JOY: emojiParentKeyConstant("\u{1F602}"), FACE_WITH_OPEN_MOUTH: emojiParentKeyConstant("\u{1F62E}"), ENRAGED_FACE: emojiParentKeyConstant("\u{1F621}"), SLIGHTLY_SMILING_FACE: emojiParentKeyConstant("\u{1F642}"), SLIGHTLY_FROWNING_FACE: emojiParentKeyConstant("\u{1F641}"), GRINNING_FACE: emojiParentKeyConstant("\u{1F600}"), FACE_BLOWING_A_KISS: emojiParentKeyConstant("\u{1F618}"), FACE_WITH_STUCK_OUT_TONGUE: emojiParentKeyConstant("\u{1F61B}"), CONFUSED_FACE: emojiParentKeyConstant("\u{1F615}"), NEUTRAL_FACE: emojiParentKeyConstant("\u{1F610}"), WINKING_FACE: emojiParentKeyConstant("\u{1F609}"), ZIPPER_MOUTH_FACE: emojiParentKeyConstant("\u{1F910}"), THUMBS_UP: emojiParentKeyConstant("\u{1F44D}"), THUMBS_DOWN: emojiParentKeyConstant("\u{1F44E}"), RAISED_HAND: emojiParentKeyConstant("\u270B"), WAVING_HAND: emojiParentKeyConstant("\u{1F44B}"), HOT_BEVERAGE: emojiParentKeyConstant("\u2615"), MOBILE_PHONE_OFF: emojiParentKeyConstant("\u{1F4F4}") }; const EMOJI_VARIANT_KEY_CONSTANTS = { SLIGHTLY_FROWNING_FACE: emojiVariantKeyConstant("\u{1F641}"), GRINNING_FACE_WITH_SMILING_EYES: emojiVariantKeyConstant("\u{1F604}"), GRINNING_CAT_WITH_SMILING_EYES: emojiVariantKeyConstant("\u{1F638}"), FRIED_SHRIMP: emojiVariantKeyConstant("\u{1F364}") }; function normalizeShortNameCompletionDisplay(shortName) { return shortName.normalize("NFD").replaceAll(/[\s,]+/gi, "_").toLowerCase(); } __name(normalizeShortNameCompletionDisplay, "normalizeShortNameCompletionDisplay"); function normalizeShortNameCompletionQuery(query) { return (0, import_removeDiacritics_std.removeDiacritics)(query).normalize("NFD").replaceAll(/(? lastIndex) { hasNonEmojis = true; lastIndex += index; } emojiCount += 1; lastIndex = index + value.length; } match = regex.exec(input); } if (lastIndex === 0 || lastIndex < input.length) { hasNonEmojis = true; } return { text: input, emojiCount, isEmojiOnlyText: hasEmojis && !hasNonEmojis }; } __name(getEmojifyData, "getEmojifyData"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { EMOJI_PARENT_KEY_CONSTANTS, EMOJI_SKIN_TONE_ORDER, EMOJI_SKIN_TONE_TO_KEY, EMOJI_SKIN_TONE_TO_NUMBER, EMOJI_VARIANT_KEY_CONSTANTS, EmojiPickerCategory, EmojiSkinTone, EmojiUnicodeCategory, KEY_TO_EMOJI_SKIN_TONE, _getAllEmojiVariantKeys, getEmojiDebugLabel, getEmojiDefaultEnglishLocalizerIndex, getEmojiDefaultEnglishSearchIndex, getEmojiParentByKey, getEmojiParentKeyByEnglishShortName, getEmojiParentKeyByValue, getEmojiParentKeyByVariantKey, getEmojiPickerCategoryParentKeys, getEmojiSkinToneByVariantKey, getEmojiUnicodeCategoryParentKeys, getEmojiVariantByKey, getEmojiVariantByParentKeyAndSkinTone, getEmojiVariantKeyByParentKeyAndSkinTone, getEmojiVariantKeyByValue, getEmojifyData, isEmojiEnglishShortName, isEmojiParentKey, isEmojiParentValue, isEmojiParentValueDeprecated, isEmojiVariantKey, isEmojiVariantValue, isEmojiVariantValueNonQualified, isSafeEmojifyEmoji, isValidEmojiSkinTone, normalizeShortNameCompletionDisplay, normalizeShortNameCompletionQuery }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var infinite_std_exports = {}; __export(infinite_std_exports, { useInfiniteQuery: () => useInfiniteQuery }); module.exports = __toCommonJS(infinite_std_exports); var import_react = require("react"); var import_drop_std = require("../../../util/drop.std.js"); var import_log_std = require("../../../logging/log.std.js"); var Errors = __toESM(require("../../../types/errors.std.js")); var import_assert_std = require("../../../util/assert.std.js"); const log = (0, import_log_std.createLogger)("infinite"); function useInfiniteQuery(options) { const loaderRef = (0, import_react.useRef)(options.loader); const hasNextPageRef = (0, import_react.useRef)(options.hasNextPage); (0, import_react.useEffect)(() => { loaderRef.current = options.loader; hasNextPageRef.current = options.hasNextPage; }, [options.loader, options.hasNextPage]); const querySignalRef = (0, import_react.useRef)(null); const [edition, setEdition] = (0, import_react.useState)(0); const [state, setState] = (0, import_react.useState)({ query: options.query, pending: true, rejected: false, pages: [], hasNextPage: false }); const stateRef = (0, import_react.useRef)(state); const update = (0, import_react.useCallback)((next) => { stateRef.current = next; setState(next); }, []); (0, import_react.useEffect)(() => { const controller = new AbortController(); const { signal } = controller; querySignalRef.current = signal; let pendingStatusTimer; async function firstPageFetcher() { const isEmpty = stateRef.current.pages.length === 0; const showPendingStateDelay = isEmpty ? 50 : 300; pendingStatusTimer = setTimeout(() => { update({ query: options.query, pending: true, rejected: false, pages: [], hasNextPage: false }); }, showPendingStateDelay); try { const firstPage = await loaderRef.current(options.query, null, signal); if (!signal.aborted) { update({ query: options.query, pending: false, rejected: false, pages: [firstPage], hasNextPage: hasNextPageRef.current(options.query, firstPage) }); } } catch (error) { if (signal.aborted) { update({ ...stateRef.current, pending: false }); } else { log.error("Error fetching first page", Errors.toLogFormat(error)); update({ query: options.query, pending: false, rejected: true, pages: [], hasNextPage: false }); } } finally { clearTimeout(pendingStatusTimer); } } __name(firstPageFetcher, "firstPageFetcher"); (0, import_drop_std.drop)(firstPageFetcher()); return () => { clearTimeout(pendingStatusTimer); controller.abort(); }; }, [options.query, edition, update]); const fetchNextPage = (0, import_react.useCallback)(() => { (0, import_assert_std.strictAssert)( querySignalRef.current, "Should have abort controller from first page fetcher" ); if (querySignalRef.current.aborted) { return; } const signal = querySignalRef.current; async function nextPageFetcher() { update({ ...stateRef.current, pending: true }); const { query, pages } = stateRef.current; try { const prevPage = pages.at(-1); (0, import_assert_std.strictAssert)(prevPage, "Expected previous resolved page"); const nextPage = await loaderRef.current(query, prevPage, signal); if (!signal.aborted) { update({ query, pending: false, rejected: false, pages: [...pages, nextPage], hasNextPage: hasNextPageRef.current(query, nextPage) }); } } catch (error) { if (signal.aborted) { update({ ...stateRef.current, pending: false }); } else { log.error("Error fetching next page", Errors.toLogFormat(error)); update({ query, pending: false, rejected: true, pages, hasNextPage: false }); } } } __name(nextPageFetcher, "nextPageFetcher"); (0, import_drop_std.drop)(nextPageFetcher()); }, [update]); const revalidate = (0, import_react.useCallback)(() => { setEdition((prevEdition) => prevEdition + 1); }, []); return { queryState: state, fetchNextPage, revalidate }; } __name(useInfiniteQuery, "useInfiniteQuery"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { useInfiniteQuery }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var segments_std_exports = {}; __export(segments_std_exports, { _SEGMENT_SIZE_BUCKETS: () => _SEGMENT_SIZE_BUCKETS, _getSegmentRanges: () => _getSegmentRanges, _getSegmentSize: () => _getSegmentSize, fetchInSegments: () => fetchInSegments }); module.exports = __toCommonJS(segments_std_exports); var import_assert_std = require("../../../util/assert.std.js"); const _SEGMENT_SIZE_BUCKETS = [ // highest to lowest 1024 * 1024, // 1MiB 1024 * 500, // 500 KiB 1024 * 100, // 100 KiB 1024 * 50, // 50 KiB 1024 * 10, // 10 KiB 1024 * 1 // 1 KiB ]; async function fetchContentLength(url, doFetchBytesViaProxy, signal) { const { response } = await doFetchBytesViaProxy({ url, method: "HEAD", signal }); const contentLength = Number(response.headers.get("Content-Length")); (0, import_assert_std.strictAssert)( Number.isInteger(contentLength), "Content-Length must be integer" ); return contentLength; } __name(fetchContentLength, "fetchContentLength"); function _getSegmentSize(contentLength) { const nextLargestSegmentSize = _SEGMENT_SIZE_BUCKETS.find((segmentSize) => { return contentLength >= segmentSize; }); return nextLargestSegmentSize ?? contentLength; } __name(_getSegmentSize, "_getSegmentSize"); function _getSegmentRanges(contentLength, segmentSize) { const segmentRanges = []; const segmentCount = Math.ceil(contentLength / segmentSize); for (let index = 0; index < segmentCount; index += 1) { let startIndex = segmentSize * index; let endIndexInclusive = startIndex + segmentSize - 1; let sliceSize = segmentSize; let sliceStart = 0; if (endIndexInclusive > contentLength) { endIndexInclusive = contentLength - 1; startIndex = contentLength - segmentSize; sliceSize = contentLength % segmentSize; sliceStart = segmentSize - sliceSize; } segmentRanges.push({ startIndex, endIndexInclusive, sliceStart, segmentSize, sliceSize }); } return segmentRanges; } __name(_getSegmentRanges, "_getSegmentRanges"); function assertExpected(actual, expected, message) { (0, import_assert_std.strictAssert)( Object.is(actual, expected), `${message}: ${actual} (expected: ${expected})` ); } __name(assertExpected, "assertExpected"); async function fetchSegment(url, segmentRange, contentLength, doFetchBytesViaProxy, signal) { const { data, response } = await doFetchBytesViaProxy({ method: "GET", url, signal, headers: { Range: `bytes=${segmentRange.startIndex}-${segmentRange.endIndexInclusive}` } }); assertExpected( response.headers.get("Content-Length"), `${segmentRange.segmentSize}`, "Unexpected Content-Length header" ); assertExpected( response.headers.get("Content-Range"), `bytes ${segmentRange.startIndex}-${segmentRange.endIndexInclusive}/${contentLength}`, "Unexpected Content-Range header" ); assertExpected( data.byteLength, segmentRange.segmentSize, "Unexpected response buffer byte length" ); let slice; if (segmentRange.sliceStart > 0) { slice = data.subarray(segmentRange.sliceStart); } else { slice = data; } assertExpected( slice.byteLength, segmentRange.sliceSize, "Unexpected slice byte length" ); return slice; } __name(fetchSegment, "fetchSegment"); async function fetchInSegments(url, doFetchBytesViaProxy, signal) { const contentLength = await fetchContentLength( url, doFetchBytesViaProxy, signal ); const segmentSize = _getSegmentSize(contentLength); const segmentRanges = _getSegmentRanges(contentLength, segmentSize); const segmentBuffers = await Promise.all( segmentRanges.map((segmentRange) => { return fetchSegment( url, segmentRange, contentLength, doFetchBytesViaProxy, signal ); }) ); return new Blob(segmentBuffers); } __name(fetchInSegments, "fetchInSegments"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { _SEGMENT_SIZE_BUCKETS, _getSegmentRanges, _getSegmentSize, fetchInSegments }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var mocks_std_exports = {}; __export(mocks_std_exports, { abeSticker: () => abeSticker, createPack: () => createPack, packs: () => packs, recentStickers: () => recentStickers, sticker1: () => sticker1, sticker2: () => sticker2, sticker3: () => sticker3, tallSticker: () => tallSticker, wideSticker: () => wideSticker }); module.exports = __toCommonJS(mocks_std_exports); var import_lodash = __toESM(require("lodash")); const { sample } = import_lodash.default; const sticker1 = { id: 1, url: "/fixtures/kitten-1-64-64.jpg", packId: "foo", emoji: "" }; const sticker2 = { id: 2, url: "/fixtures/kitten-2-64-64.jpg", packId: "bar", emoji: "" }; const sticker3 = { id: 3, url: "/fixtures/kitten-3-64-64.jpg", packId: "baz", emoji: "" }; const abeSticker = { id: 4, url: "/fixtures/512x515-thumbs-up-lincoln.webp", packId: "abe", emoji: "" }; const wideSticker = { id: 5, url: "/fixtures/1000x50-green.jpeg", packId: "wide", emoji: "" }; const tallSticker = { id: 6, url: "/fixtures/50x1000-teal.jpeg", packId: "tall", emoji: "" }; const choosableStickers = [sticker1, sticker2, sticker3, abeSticker]; const createPack = /* @__PURE__ */ __name((props, sticker) => ({ id: "", title: props.id ? `${props.id} title` : "title", key: "", author: "", isBlessed: false, lastUsed: 0, status: "known", cover: sticker, stickerCount: 101, stickers: sticker ? Array(101).fill(0).map((_, id) => ({ ...sticker, id })) : [], ...props }), "createPack"); const packs = [ createPack({ id: "tall" }, tallSticker), createPack({ id: "wide" }, wideSticker), ...Array(20).fill(0).map( (_, n) => createPack({ id: `pack-${n}` }, sample(choosableStickers)) ) ]; const recentStickers = [ abeSticker, sticker1, sticker2, sticker3, tallSticker, wideSticker, { ...sticker2, id: 9999 } ]; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { abeSticker, createPack, packs, recentStickers, sticker1, sticker2, sticker3, tallSticker, wideSticker }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var Bytes_std_exports = {}; __export(Bytes_std_exports, { Bytes: () => Bytes }); module.exports = __toCommonJS(Bytes_std_exports); var import_buffer = require("buffer"); class Bytes { static { __name(this, "Bytes"); } fromBase64(value) { return import_buffer.Buffer.from(value, "base64"); } fromBase64url(value) { return import_buffer.Buffer.from(value, "base64url"); } fromHex(value) { return import_buffer.Buffer.from(value, "hex"); } // TODO(indutny): deprecate it fromBinary(value) { return import_buffer.Buffer.from(value, "binary"); } fromString(value) { return import_buffer.Buffer.from(value); } toBase64(data) { return import_buffer.Buffer.from(data).toString("base64"); } toBase64url(data) { return import_buffer.Buffer.from(data).toString("base64url"); } toHex(data) { return import_buffer.Buffer.from(data).toString("hex"); } // TODO(indutny): deprecate it toBinary(data) { return import_buffer.Buffer.from(data).toString("binary"); } toString(data) { return import_buffer.Buffer.from(data).toString(); } byteLength(value) { return import_buffer.Buffer.byteLength(value); } concatenate(list) { return import_buffer.Buffer.concat(list); } isEmpty(data) { if (!data) { return true; } return data.length === 0; } isNotEmpty(data) { return !this.isEmpty(data); } areEqual(a, b) { if (!a || !b) { return !a && !b; } return import_buffer.Buffer.compare(a, b) === 0; } readBigUint64BE(value) { const buffer = import_buffer.Buffer.from(value); return buffer.readBigUint64BE(); } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { Bytes }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var Crypto_node_exports = {}; __export(Crypto_node_exports, { Crypto: () => Crypto }); module.exports = __toCommonJS(Crypto_node_exports); var import_node_buffer = require("node:buffer"); var import_node_crypto = __toESM(require("node:crypto")); var import_assert_std = require("../util/assert.std.js"); var import_Crypto_std = require("../types/Crypto.std.js"); const AUTH_TAG_SIZE = 16; class Crypto { static { __name(this, "Crypto"); } sign(key, data) { return import_node_crypto.default.createHmac("sha256", import_node_buffer.Buffer.from(key)).update(import_node_buffer.Buffer.from(data)).digest(); } hash(type, data) { return import_node_crypto.default.createHash(type).update(import_node_buffer.Buffer.from(data)).digest(); } encrypt(cipherType, { key, plaintext, iv, aad }) { if (cipherType === import_Crypto_std.CipherType.AES256GCM) { const gcm = import_node_crypto.default.createCipheriv( cipherType, import_node_buffer.Buffer.from(key), import_node_buffer.Buffer.from(iv) ); if (aad) { gcm.setAAD(aad); } const first = gcm.update(import_node_buffer.Buffer.from(plaintext)); const last = gcm.final(); const tag = gcm.getAuthTag(); (0, import_assert_std.strictAssert)(tag.length === AUTH_TAG_SIZE, "Invalid auth tag size"); return import_node_buffer.Buffer.concat([first, last, tag]); } (0, import_assert_std.strictAssert)(aad === void 0, `AAD is not supported for: ${cipherType}`); const cipher = import_node_crypto.default.createCipheriv( cipherType, import_node_buffer.Buffer.from(key), import_node_buffer.Buffer.from(iv) ); return import_node_buffer.Buffer.concat([ cipher.update(import_node_buffer.Buffer.from(plaintext)), cipher.final() ]); } decrypt(cipherType, { key, ciphertext, iv, aad }) { let decipher; let input = import_node_buffer.Buffer.from(ciphertext); if (cipherType === import_Crypto_std.CipherType.AES256GCM) { const gcm = import_node_crypto.default.createDecipheriv( cipherType, import_node_buffer.Buffer.from(key), import_node_buffer.Buffer.from(iv) ); if (input.length < AUTH_TAG_SIZE) { throw new Error("Invalid GCM ciphertext"); } const tag = input.subarray(input.length - AUTH_TAG_SIZE); input = input.subarray(0, input.length - AUTH_TAG_SIZE); gcm.setAuthTag(tag); if (aad) { gcm.setAAD(aad); } decipher = gcm; } else { (0, import_assert_std.strictAssert)( aad === void 0, `AAD is not supported for: ${cipherType}` ); decipher = import_node_crypto.default.createDecipheriv( cipherType, import_node_buffer.Buffer.from(key), import_node_buffer.Buffer.from(iv) ); } return import_node_buffer.Buffer.concat([decipher.update(input), decipher.final()]); } randomInt(min, max) { return import_node_crypto.default.randomInt(min, max); } getRandomBytes(size) { return import_node_crypto.default.randomBytes(size); } constantTimeEqual(left, right) { return import_node_crypto.default.timingSafeEqual(import_node_buffer.Buffer.from(left), import_node_buffer.Buffer.from(right)); } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { Crypto }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var Timers_node_exports = {}; __export(Timers_node_exports, { Timers: () => Timers }); module.exports = __toCommonJS(Timers_node_exports); var import_node_timers = require("node:timers"); class Timers { static { __name(this, "Timers"); } #counter = 0; #timers = /* @__PURE__ */ new Map(); setTimeout(callback, delay) { let id; do { id = this.#counter; this.#counter = this.#counter + 1 >>> 0; } while (this.#timers.has(id)); const timer = (0, import_node_timers.setTimeout)(() => { this.#timers.delete(id); callback(); }, delay); this.#timers.set(id, timer); return { id }; } clearTimeout({ id }) { const timer = this.#timers.get(id); if (timer === void 0) { return; } this.#timers.delete(id); return (0, import_node_timers.clearTimeout)(timer); } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { Timers }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var createNativeThemeListener_std_exports = {}; __export(createNativeThemeListener_std_exports, { createNativeThemeListener: () => createNativeThemeListener }); module.exports = __toCommonJS(createNativeThemeListener_std_exports); var import_Util_std = require("../types/Util.std.js"); function createNativeThemeListener(ipc, holder) { const subscribers = new Array(); let theme = ipc.sendSync("native-theme:init"); let systemTheme; function update() { const nextSystemTheme = theme.shouldUseDarkColors ? import_Util_std.SystemThemeType.dark : import_Util_std.SystemThemeType.light; holder.systemTheme = nextSystemTheme; return nextSystemTheme; } __name(update, "update"); function subscribe(fn) { subscribers.push(fn); } __name(subscribe, "subscribe"); function unsubscribe(fn) { const index = subscribers.indexOf(fn); if (index !== -1) { subscribers.splice(index, 1); } } __name(unsubscribe, "unsubscribe"); ipc.on( "native-theme:changed", (_event, change) => { theme = change; systemTheme = update(); for (const fn of subscribers) { fn(change); } } ); systemTheme = update(); return { getSystemTheme: /* @__PURE__ */ __name(() => systemTheme, "getSystemTheme"), subscribe, unsubscribe, update }; } __name(createNativeThemeListener, "createNativeThemeListener"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { createNativeThemeListener }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var environment_std_exports = {}; __export(environment_std_exports, { Environment: () => Environment, getEnvironment: () => getEnvironment, isMockEnvironment: () => isMockEnvironment, isTestEnvironment: () => isTestEnvironment, isTestOrMockEnvironment: () => isTestOrMockEnvironment, parseEnvironment: () => parseEnvironment, setEnvironment: () => setEnvironment }); module.exports = __toCommonJS(environment_std_exports); var import_enum_std = require("./util/enum.std.js"); var import_log_std = require("./logging/log.std.js"); var Environment = /* @__PURE__ */ ((Environment2) => { Environment2["Development"] = "development"; Environment2["PackagedApp"] = "production"; Environment2["Staging"] = "staging"; Environment2["Test"] = "test"; return Environment2; })(Environment || {}); let environment; let isMockTestEnvironment; function getEnvironment() { if (environment === void 0) { return "production" /* PackagedApp */; } return environment; } __name(getEnvironment, "getEnvironment"); function setEnvironment(env, isMockTestEnv) { if (environment !== void 0) { throw new Error("Environment has already been set"); } environment = env; isMockTestEnvironment = isMockTestEnv; } __name(setEnvironment, "setEnvironment"); const parseEnvironment = (0, import_enum_std.makeEnumParser)( Environment, "production" /* PackagedApp */ ); const isTestEnvironment = /* @__PURE__ */ __name((env) => env === "test" /* Test */, "isTestEnvironment"); const isMockEnvironment = /* @__PURE__ */ __name(() => { if (isMockTestEnvironment == null) { import_log_std.log.error("Mock test environment not set"); } return isMockTestEnvironment === true; }, "isMockEnvironment"); const isTestOrMockEnvironment = /* @__PURE__ */ __name(() => { return isTestEnvironment(getEnvironment()) || isMockEnvironment(); }, "isTestOrMockEnvironment"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { Environment, getEnvironment, isMockEnvironment, isTestEnvironment, isTestOrMockEnvironment, parseEnvironment, setEnvironment }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var groupChange_std_exports = {}; __export(groupChange_std_exports, { renderChange: () => renderChange }); module.exports = __toCommonJS(groupChange_std_exports); var import_missingCaseError_std = require("./util/missingCaseError.std.js"); var import_index_std = require("./protobuf/index.std.js"); var import_log_std = require("./logging/log.std.js"); const log = (0, import_log_std.createLogger)("groupChange"); const AccessControlEnum = import_index_std.SignalService.AccessControl.AccessRequired; const RoleEnum = import_index_std.SignalService.Member.Role; function renderChange(change, options) { const { details, from } = change; return details.flatMap((detail) => { const texts = renderChangeDetail(detail, { ...options, from }); if (!Array.isArray(texts)) { return { detail, isLastText: true, text: texts }; } return texts.map((text, index) => { const isLastText = index === texts.length - 1; return { detail, isLastText, text }; }); }); } __name(renderChange, "renderChange"); function renderChangeDetail(detail, options) { const { from, i18n: localizer, ourAci, ourPni, renderContact, renderIntl } = options; const i18n = /* @__PURE__ */ __name(((id, components) => { return renderIntl(id, localizer, components); }), "i18n"); const isOurServiceId = /* @__PURE__ */ __name((serviceId) => { if (!serviceId) { return false; } return Boolean( ourAci && serviceId === ourAci || ourPni && serviceId === ourPni ); }, "isOurServiceId"); const fromYou = isOurServiceId(from); if (detail.type === "create") { if (fromYou) { return i18n("icu:GroupV2--create--you"); } if (from) { return i18n("icu:GroupV2--create--other", { memberName: renderContact(from) }); } return i18n("icu:GroupV2--create--unknown"); } if (detail.type === "title") { const { newTitle } = detail; if (newTitle) { if (fromYou) { return i18n("icu:GroupV2--title--change--you", { newTitle }); } if (from) { return i18n("icu:GroupV2--title--change--other", { memberName: renderContact(from), newTitle }); } return i18n("icu:GroupV2--title--change--unknown", { newTitle }); } if (fromYou) { return i18n("icu:GroupV2--title--remove--you"); } if (from) { return i18n("icu:GroupV2--title--remove--other", { memberName: renderContact(from) }); } return i18n("icu:GroupV2--title--remove--unknown"); } if (detail.type === "avatar") { if (detail.removed) { if (fromYou) { return i18n("icu:GroupV2--avatar--remove--you"); } if (from) { return i18n("icu:GroupV2--avatar--remove--other", { memberName: renderContact(from) }); } return i18n("icu:GroupV2--avatar--remove--unknown"); } if (fromYou) { return i18n("icu:GroupV2--avatar--change--you"); } if (from) { return i18n("icu:GroupV2--avatar--change--other", { memberName: renderContact(from) }); } return i18n("icu:GroupV2--avatar--change--unknown"); } if (detail.type === "access-attributes") { const { newPrivilege } = detail; if (newPrivilege === AccessControlEnum.ADMINISTRATOR) { if (fromYou) { return i18n("icu:GroupV2--access-attributes--admins--you"); } if (from) { return i18n("icu:GroupV2--access-attributes--admins--other", { adminName: renderContact(from) }); } return i18n("icu:GroupV2--access-attributes--admins--unknown"); } if (newPrivilege === AccessControlEnum.MEMBER) { if (fromYou) { return i18n("icu:GroupV2--access-attributes--all--you"); } if (from) { return i18n("icu:GroupV2--access-attributes--all--other", { adminName: renderContact(from) }); } return i18n("icu:GroupV2--access-attributes--all--unknown"); } log.warn( `access-attributes change type, privilege ${newPrivilege} is unknown` ); return ""; } if (detail.type === "access-members") { const { newPrivilege } = detail; if (newPrivilege === AccessControlEnum.ADMINISTRATOR) { if (fromYou) { return i18n("icu:GroupV2--access-members--admins--you"); } if (from) { return i18n("icu:GroupV2--access-members--admins--other", { adminName: renderContact(from) }); } return i18n("icu:GroupV2--access-members--admins--unknown"); } if (newPrivilege === AccessControlEnum.MEMBER) { if (fromYou) { return i18n("icu:GroupV2--access-members--all--you"); } if (from) { return i18n("icu:GroupV2--access-members--all--other", { adminName: renderContact(from) }); } return i18n("icu:GroupV2--access-members--all--unknown"); } log.warn( `access-members change type, privilege ${newPrivilege} is unknown` ); return ""; } if (detail.type === "access-invite-link") { const { newPrivilege } = detail; if (newPrivilege === AccessControlEnum.ADMINISTRATOR) { if (fromYou) { return i18n("icu:GroupV2--access-invite-link--enabled--you"); } if (from) { return i18n("icu:GroupV2--access-invite-link--enabled--other", { adminName: renderContact(from) }); } return i18n("icu:GroupV2--access-invite-link--enabled--unknown"); } if (newPrivilege === AccessControlEnum.ANY) { if (fromYou) { return i18n("icu:GroupV2--access-invite-link--disabled--you"); } if (from) { return i18n("icu:GroupV2--access-invite-link--disabled--other", { adminName: renderContact(from) }); } return i18n("icu:GroupV2--access-invite-link--disabled--unknown"); } log.warn( `access-invite-link change type, privilege ${newPrivilege} is unknown` ); return ""; } if (detail.type === "member-add") { const { aci } = detail; const weAreJoiner = isOurServiceId(aci); if (weAreJoiner) { if (fromYou) { return i18n("icu:GroupV2--member-add--you--you"); } if (from) { return i18n("icu:GroupV2--member-add--you--other", { memberName: renderContact(from) }); } return i18n("icu:GroupV2--member-add--you--unknown"); } if (fromYou) { return i18n("icu:GroupV2--member-add--other--you", { memberName: renderContact(aci) }); } if (from) { return i18n("icu:GroupV2--member-add--other--other", { adderName: renderContact(from), addeeName: renderContact(aci) }); } return i18n("icu:GroupV2--member-add--other--unknown", { memberName: renderContact(aci) }); } if (detail.type === "member-add-from-invite") { const { aci, inviter, pni } = detail; const weAreJoiner = isOurServiceId(aci); const weAreInviter = isOurServiceId(inviter); const fromPni = pni && from === pni; const fromAci = from === aci; if (!from || !fromPni && !fromAci) { if (weAreJoiner) { if (from) { return i18n("icu:GroupV2--member-add--you--other", { memberName: renderContact(from) }); } return i18n("icu:GroupV2--member-add--you--unknown"); } if (fromYou) { return i18n("icu:GroupV2--member-add--invited--you", { inviteeName: renderContact(aci) }); } if (from) { return i18n("icu:GroupV2--member-add--invited--other", { memberName: renderContact(from), inviteeName: renderContact(aci) }); } return i18n("icu:GroupV2--member-add--invited--unknown", { inviteeName: renderContact(aci) }); } if (weAreJoiner) { if (inviter) { return i18n("icu:GroupV2--member-add--from-invite--you", { inviterName: renderContact(inviter) }); } return i18n("icu:GroupV2--member-add--from-invite--you-no-from"); } if (weAreInviter) { return i18n("icu:GroupV2--member-add--from-invite--from-you", { inviteeName: renderContact(aci) }); } if (inviter) { return i18n("icu:GroupV2--member-add--from-invite--other", { inviteeName: renderContact(aci), inviterName: renderContact(inviter) }); } return i18n("icu:GroupV2--member-add--from-invite--other-no-from", { inviteeName: renderContact(aci) }); } if (detail.type === "member-add-from-link") { const { aci } = detail; if (fromYou && isOurServiceId(aci)) { return i18n("icu:GroupV2--member-add-from-link--you--you"); } if (from && aci === from) { return i18n("icu:GroupV2--member-add-from-link--other", { memberName: renderContact(from) }); } log.warn("member-add-from-link change type; we have no from!"); return i18n("icu:GroupV2--member-add--other--unknown", { memberName: renderContact(aci) }); } if (detail.type === "member-add-from-admin-approval") { const { aci } = detail; const weAreJoiner = isOurServiceId(aci); if (weAreJoiner) { if (from) { return i18n("icu:GroupV2--member-add-from-admin-approval--you--other", { adminName: renderContact(from) }); } log.warn( "member-add-from-admin-approval change type; we have no from, and we are joiner!" ); return i18n("icu:GroupV2--member-add-from-admin-approval--you--unknown"); } if (fromYou) { return i18n("icu:GroupV2--member-add-from-admin-approval--other--you", { joinerName: renderContact(aci) }); } if (from) { return i18n("icu:GroupV2--member-add-from-admin-approval--other--other", { adminName: renderContact(from), joinerName: renderContact(aci) }); } log.warn("member-add-from-admin-approval change type; we have no from"); return i18n("icu:GroupV2--member-add-from-admin-approval--other--unknown", { joinerName: renderContact(aci) }); } if (detail.type === "member-remove") { const { aci } = detail; const weAreLeaver = isOurServiceId(aci); if (weAreLeaver) { if (fromYou) { return i18n("icu:GroupV2--member-remove--you--you"); } if (from) { return i18n("icu:GroupV2--member-remove--you--other", { adminName: renderContact(from) }); } return i18n("icu:GroupV2--member-remove--you--unknown"); } if (fromYou) { return i18n("icu:GroupV2--member-remove--other--you", { memberName: renderContact(aci) }); } if (from && from === aci) { return i18n("icu:GroupV2--member-remove--other--self", { memberName: renderContact(from) }); } if (from) { return i18n("icu:GroupV2--member-remove--other--other", { adminName: renderContact(from), memberName: renderContact(aci) }); } return i18n("icu:GroupV2--member-remove--other--unknown", { memberName: renderContact(aci) }); } if (detail.type === "member-privilege") { const { aci, newPrivilege } = detail; const weAreMember = isOurServiceId(aci); if (newPrivilege === RoleEnum.ADMINISTRATOR) { if (weAreMember) { if (from) { return i18n("icu:GroupV2--member-privilege--promote--you--other", { adminName: renderContact(from) }); } return i18n("icu:GroupV2--member-privilege--promote--you--unknown"); } if (fromYou) { return i18n("icu:GroupV2--member-privilege--promote--other--you", { memberName: renderContact(aci) }); } if (from) { return i18n("icu:GroupV2--member-privilege--promote--other--other", { adminName: renderContact(from), memberName: renderContact(aci) }); } return i18n("icu:GroupV2--member-privilege--promote--other--unknown", { memberName: renderContact(aci) }); } if (newPrivilege === RoleEnum.DEFAULT) { if (weAreMember) { if (from) { return i18n("icu:GroupV2--member-privilege--demote--you--other", { adminName: renderContact(from) }); } return i18n("icu:GroupV2--member-privilege--demote--you--unknown"); } if (fromYou) { return i18n("icu:GroupV2--member-privilege--demote--other--you", { memberName: renderContact(aci) }); } if (from) { return i18n("icu:GroupV2--member-privilege--demote--other--other", { adminName: renderContact(from), memberName: renderContact(aci) }); } return i18n("icu:GroupV2--member-privilege--demote--other--unknown", { memberName: renderContact(aci) }); } log.warn( `member-privilege change type, privilege ${newPrivilege} is unknown` ); return ""; } if (detail.type === "pending-add-one") { const { serviceId } = detail; const weAreInvited = isOurServiceId(serviceId); if (weAreInvited) { if (from) { return i18n("icu:GroupV2--pending-add--one--you--other", { memberName: renderContact(from) }); } return i18n("icu:GroupV2--pending-add--one--you--unknown"); } if (fromYou) { return i18n("icu:GroupV2--pending-add--one--other--you", { inviteeName: renderContact(serviceId) }); } if (from) { return i18n("icu:GroupV2--pending-add--one--other--other", { memberName: renderContact(from) }); } return i18n("icu:GroupV2--pending-add--one--other--unknown"); } if (detail.type === "pending-add-many") { const { count } = detail; if (fromYou) { return i18n("icu:GroupV2--pending-add--many--you", { count }); } if (from) { return i18n("icu:GroupV2--pending-add--many--other", { memberName: renderContact(from), count }); } return i18n("icu:GroupV2--pending-add--many--unknown", { count }); } if (detail.type === "pending-remove-one") { const { inviter, serviceId } = detail; const weAreInviter = isOurServiceId(inviter); const weAreInvited = isOurServiceId(serviceId); const sentByInvited = Boolean(from && from === serviceId); const sentByInviter = Boolean(from && inviter && from === inviter); if (!serviceId) { return i18n("icu:GroupV2--pending-remove--decline--unknown"); } if (weAreInviter) { if (sentByInvited) { return i18n("icu:GroupV2--pending-remove--decline--you", { inviteeName: renderContact(serviceId) }); } if (fromYou) { return i18n( "icu:GroupV2--pending-remove--revoke-invite-from-you--one--you", { inviteeName: renderContact(serviceId) } ); } if (from) { return i18n( "icu:GroupV2--pending-remove--revoke-invite-from-you--one--other", { adminName: renderContact(from), inviteeName: renderContact(serviceId) } ); } return i18n( "icu:GroupV2--pending-remove--revoke-invite-from-you--one--unknown", { inviteeName: renderContact(serviceId) } ); } if (sentByInvited) { if (fromYou) { return i18n("icu:GroupV2--pending-remove--decline--from-you"); } if (inviter) { return i18n("icu:GroupV2--pending-remove--decline--other", { memberName: renderContact(inviter) }); } return i18n("icu:GroupV2--pending-remove--decline--unknown"); } if (inviter && sentByInviter) { if (weAreInvited) { return i18n("icu:GroupV2--pending-remove--revoke-own--to-you", { inviterName: renderContact(inviter) }); } return i18n("icu:GroupV2--pending-remove--revoke-own--unknown", { inviterName: renderContact(inviter) }); } if (inviter) { if (fromYou) { return i18n( "icu:GroupV2--pending-remove--revoke-invite-from--one--you", { memberName: renderContact(inviter) } ); } if (from) { return i18n( "icu:GroupV2--pending-remove--revoke-invite-from--one--other", { adminName: renderContact(from), memberName: renderContact(inviter) } ); } return i18n( "icu:GroupV2--pending-remove--revoke-invite-from--one--unknown", { memberName: renderContact(inviter) } ); } if (fromYou) { return i18n("icu:GroupV2--pending-remove--revoke--one--you"); } if (from) { return i18n("icu:GroupV2--pending-remove--revoke--one--other", { memberName: renderContact(from) }); } return i18n("icu:GroupV2--pending-remove--revoke--one--unknown"); } if (detail.type === "pending-remove-many") { const { count, inviter } = detail; const weAreInviter = isOurServiceId(inviter); if (weAreInviter) { if (fromYou) { return i18n( "icu:GroupV2--pending-remove--revoke-invite-from-you--many--you", { count } ); } if (from) { return i18n( "icu:GroupV2--pending-remove--revoke-invite-from-you--many--other", { adminName: renderContact(from), count } ); } return i18n( "icu:GroupV2--pending-remove--revoke-invite-from-you--many--unknown", { count } ); } if (inviter) { if (fromYou) { return i18n( "icu:GroupV2--pending-remove--revoke-invite-from--many--you", { count, memberName: renderContact(inviter) } ); } if (from) { return i18n( "icu:GroupV2--pending-remove--revoke-invite-from--many--other", { adminName: renderContact(from), count, memberName: renderContact(inviter) } ); } return i18n( "icu:GroupV2--pending-remove--revoke-invite-from--many--unknown", { count, memberName: renderContact(inviter) } ); } if (fromYou) { return i18n("icu:GroupV2--pending-remove--revoke--many--you", { count }); } if (from) { return i18n("icu:GroupV2--pending-remove--revoke--many--other", { memberName: renderContact(from), count }); } return i18n("icu:GroupV2--pending-remove--revoke--many--unknown", { count }); } if (detail.type === "admin-approval-add-one") { const { aci } = detail; const weAreJoiner = isOurServiceId(aci); if (weAreJoiner) { return i18n("icu:GroupV2--admin-approval-add-one--you"); } return i18n("icu:GroupV2--admin-approval-add-one--other", { joinerName: renderContact(aci) }); } if (detail.type === "admin-approval-remove-one") { const { aci } = detail; const weAreJoiner = isOurServiceId(aci); if (weAreJoiner) { if (fromYou) { return i18n("icu:GroupV2--admin-approval-remove-one--you--you"); } return i18n("icu:GroupV2--admin-approval-remove-one--you--unknown"); } if (fromYou) { return i18n("icu:GroupV2--admin-approval-remove-one--other--you", { joinerName: renderContact(aci) }); } if (from && fromYou) { return i18n("icu:GroupV2--admin-approval-remove-one--other--own", { joinerName: renderContact(aci) }); } if (from) { return i18n("icu:GroupV2--admin-approval-remove-one--other--other", { adminName: renderContact(from), joinerName: renderContact(aci) }); } return i18n("icu:GroupV2--admin-approval-remove-one--other--unknown", { joinerName: renderContact(aci) }); } if (detail.type === "admin-approval-bounce") { const { aci, times, isApprovalPending } = detail; const firstMessage = i18n( "icu:GroupV2--admin-approval-bounce--pluralized", { joinerName: renderContact(aci), numberOfRequests: times } ); if (!isApprovalPending) { return firstMessage; } const secondMessage = renderChangeDetail( { type: "admin-approval-add-one", aci }, options ); return [ firstMessage, ...Array.isArray(secondMessage) ? secondMessage : [secondMessage] ]; } if (detail.type === "group-link-add") { const { privilege } = detail; if (privilege === AccessControlEnum.ADMINISTRATOR) { if (fromYou) { return i18n("icu:GroupV2--group-link-add--enabled--you"); } if (from) { return i18n("icu:GroupV2--group-link-add--enabled--other", { adminName: renderContact(from) }); } return i18n("icu:GroupV2--group-link-add--enabled--unknown"); } if (privilege === AccessControlEnum.ANY) { if (fromYou) { return i18n("icu:GroupV2--group-link-add--disabled--you"); } if (from) { return i18n("icu:GroupV2--group-link-add--disabled--other", { adminName: renderContact(from) }); } return i18n("icu:GroupV2--group-link-add--disabled--unknown"); } log.warn(`group-link-add change type, privilege ${privilege} is unknown`); return ""; } if (detail.type === "group-link-reset") { if (fromYou) { return i18n("icu:GroupV2--group-link-reset--you"); } if (from) { return i18n("icu:GroupV2--group-link-reset--other", { adminName: renderContact(from) }); } return i18n("icu:GroupV2--group-link-reset--unknown"); } if (detail.type === "group-link-remove") { if (fromYou) { return i18n("icu:GroupV2--group-link-remove--you"); } if (from) { return i18n("icu:GroupV2--group-link-remove--other", { adminName: renderContact(from) }); } return i18n("icu:GroupV2--group-link-remove--unknown"); } if (detail.type === "description") { if (detail.removed) { if (fromYou) { return i18n("icu:GroupV2--description--remove--you"); } if (from) { return i18n("icu:GroupV2--description--remove--other", { memberName: renderContact(from) }); } return i18n("icu:GroupV2--description--remove--unknown"); } if (fromYou) { return i18n("icu:GroupV2--description--change--you"); } if (from) { return i18n("icu:GroupV2--description--change--other", { memberName: renderContact(from) }); } return i18n("icu:GroupV2--description--change--unknown"); } if (detail.type === "announcements-only") { if (detail.announcementsOnly) { if (fromYou) { return i18n("icu:GroupV2--announcements--admin--you"); } if (from) { return i18n("icu:GroupV2--announcements--admin--other", { memberName: renderContact(from) }); } return i18n("icu:GroupV2--announcements--admin--unknown"); } if (fromYou) { return i18n("icu:GroupV2--announcements--member--you"); } if (from) { return i18n("icu:GroupV2--announcements--member--other", { memberName: renderContact(from) }); } return i18n("icu:GroupV2--announcements--member--unknown"); } if (detail.type === "summary") { return i18n("icu:GroupV2--summary"); } throw (0, import_missingCaseError_std.missingCaseError)(detail); } __name(renderChangeDetail, "renderChangeDetail"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { renderChange }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var toggleSelectedContactForGroupAddition_std_exports = {}; __export(toggleSelectedContactForGroupAddition_std_exports, { OneTimeModalState: () => OneTimeModalState, toggleSelectedContactForGroupAddition: () => toggleSelectedContactForGroupAddition }); module.exports = __toCommonJS(toggleSelectedContactForGroupAddition_std_exports); var import_lodash = __toESM(require("lodash")); const { without } = import_lodash.default; var OneTimeModalState = /* @__PURE__ */ ((OneTimeModalState2) => { OneTimeModalState2[OneTimeModalState2["NeverShown"] = 0] = "NeverShown"; OneTimeModalState2[OneTimeModalState2["Showing"] = 1] = "Showing"; OneTimeModalState2[OneTimeModalState2["Shown"] = 2] = "Shown"; return OneTimeModalState2; })(OneTimeModalState || {}); function toggleSelectedContactForGroupAddition(conversationId, currentState) { const { maxGroupSize, maxRecommendedGroupSize, numberOfContactsAlreadyInGroup, selectedConversationIds: oldSelectedConversationIds } = currentState; let { maximumGroupSizeModalState, recommendedGroupSizeModalState } = currentState; const selectedConversationIds = without( oldSelectedConversationIds, conversationId ); const shouldAdd = selectedConversationIds.length === oldSelectedConversationIds.length; if (shouldAdd) { const newExpectedMemberCount = selectedConversationIds.length + numberOfContactsAlreadyInGroup + 1; if (newExpectedMemberCount <= maxGroupSize) { if (newExpectedMemberCount === maxGroupSize && maximumGroupSizeModalState === 0 /* NeverShown */) { maximumGroupSizeModalState = 1 /* Showing */; } else if (newExpectedMemberCount >= maxRecommendedGroupSize && recommendedGroupSizeModalState === 0 /* NeverShown */) { recommendedGroupSizeModalState = 1 /* Showing */; } selectedConversationIds.push(conversationId); } } return { selectedConversationIds, maximumGroupSizeModalState, recommendedGroupSizeModalState }; } __name(toggleSelectedContactForGroupAddition, "toggleSelectedContactForGroupAddition"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { OneTimeModalState, toggleSelectedContactForGroupAddition }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var util_std_exports = {}; __export(util_std_exports, { isAccessControlEnabled: () => isAccessControlEnabled }); module.exports = __toCommonJS(util_std_exports); var import_index_std = require("../protobuf/index.std.js"); const ACCESS_ENUM = import_index_std.SignalService.AccessControl.AccessRequired; function isAccessControlEnabled(accessControl) { return accessControl === ACCESS_ENUM.ANY || accessControl === ACCESS_ENUM.ADMINISTRATOR; } __name(isAccessControlEnabled, "isAccessControlEnabled"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { isAccessControlEnabled }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var useActivateSpeakerViewOnPresenting_std_exports = {}; __export(useActivateSpeakerViewOnPresenting_std_exports, { useActivateSpeakerViewOnPresenting: () => useActivateSpeakerViewOnPresenting, usePresenter: () => usePresenter }); module.exports = __toCommonJS(useActivateSpeakerViewOnPresenting_std_exports); var import_react = require("react"); var import_usePrevious_std = require("./usePrevious.std.js"); function usePresenter(remoteParticipants) { return (0, import_react.useMemo)( () => remoteParticipants.find((participant) => participant.presenting)?.aci, [remoteParticipants] ); } __name(usePresenter, "usePresenter"); function useActivateSpeakerViewOnPresenting({ remoteParticipants, switchToPresentationView, switchFromPresentationView }) { const presenterAci = usePresenter(remoteParticipants); const prevPresenterAci = (0, import_usePrevious_std.usePrevious)(presenterAci, presenterAci); (0, import_react.useEffect)(() => { if (prevPresenterAci !== presenterAci && presenterAci) { switchToPresentationView(); } else if (prevPresenterAci && !presenterAci) { switchFromPresentationView(); } }, [ presenterAci, prevPresenterAci, switchToPresentationView, switchFromPresentationView ]); } __name(useActivateSpeakerViewOnPresenting, "useActivateSpeakerViewOnPresenting"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { useActivateSpeakerViewOnPresenting, usePresenter }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var useAttachmentStatus_std_exports = {}; __export(useAttachmentStatus_std_exports, { useAttachmentStatus: () => useAttachmentStatus }); module.exports = __toCommonJS(useAttachmentStatus_std_exports); var import_Attachment_std = require("../util/Attachment.std.js"); var import_AttachmentDownload_std = require("../types/AttachmentDownload.std.js"); var import_missingCaseError_std = require("../util/missingCaseError.std.js"); var import_AttachmentCrypto_std = require("../util/AttachmentCrypto.std.js"); var import_useDelayedValue_std = require("./useDelayedValue.std.js"); const TRANSITION_DELAY = 200; function useAttachmentStatus(attachment) { const isAttachmentNotAvailable = attachment == null || attachment.isPermanentlyUndownloadable && !attachment.wasTooBig; const url = attachment == null ? void 0 : (0, import_Attachment_std.getUrl)(attachment); let nextState = "ReadyToShow"; if (attachment && isAttachmentNotAvailable) { nextState = "ReadyToShow"; } else if (attachment && url == null && !attachment.pending) { nextState = "NeedsDownload"; } else if (attachment && url == null && attachment.pending) { nextState = "Downloading"; } const state = (0, import_useDelayedValue_std.useDelayedValue)(nextState, TRANSITION_DELAY); if (attachment == null) { return void 0; } if (state === "NeedsDownload" && nextState === state) { return { state: "NeedsDownload" }; } const { size: unpaddedPlaintextSize, totalDownloaded } = attachment; const size = (0, import_AttachmentCrypto_std.getAttachmentCiphertextSize)({ unpaddedPlaintextSize, mediaTier: import_AttachmentDownload_std.MediaTier.STANDARD }); if (state !== nextState) { if (nextState === "NeedsDownload") { return { state: "NeedsDownload" }; } if (nextState === "Downloading") { return { state: "Downloading", size, totalDownloaded }; } if (nextState === "ReadyToShow") { return { state: "Downloading", size, totalDownloaded: size }; } throw (0, import_missingCaseError_std.missingCaseError)(nextState); } if (state === "NeedsDownload") { return { state: "NeedsDownload" }; } if (state === "Downloading") { return { state: "Downloading", size, totalDownloaded }; } if (state === "ReadyToShow") { return { state: "ReadyToShow" }; } throw (0, import_missingCaseError_std.missingCaseError)(state); } __name(useAttachmentStatus, "useAttachmentStatus"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { useAttachmentStatus }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var useBoundActions_std_exports = {}; __export(useBoundActions_std_exports, { useBoundActions: () => useBoundActions }); module.exports = __toCommonJS(useBoundActions_std_exports); var import_redux = require("redux"); var import_react_redux = require("react-redux"); var import_react = require("react"); const useBoundActions = /* @__PURE__ */ __name((actions) => { const dispatch = (0, import_react_redux.useDispatch)(); return (0, import_react.useMemo)(() => { return (0, import_redux.bindActionCreators)( actions, dispatch ); }, [actions, dispatch]); }, "useBoundActions"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { useBoundActions }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var useDelayedValue_std_exports = {}; __export(useDelayedValue_std_exports, { useDelayedValue: () => useDelayedValue }); module.exports = __toCommonJS(useDelayedValue_std_exports); var import_react = require("react"); var import_lodash = require("lodash"); function useDelayedValue(newValue, delay) { const [state, setState] = (0, import_react.useState)({ type: "idle", value: newValue }); const currentValue = state.type === "idle" ? state.value : state.from; (0, import_react.useEffect)(() => { if (state.type === "idle") { return import_lodash.noop; } const timer = setTimeout(() => { setState({ type: "idle", value: state.to }); }, delay); return () => { clearTimeout(timer); }; }, [state, delay]); (0, import_react.useEffect)(() => { setState((prevState) => { if (prevState.type === "transition") { return { type: "transition", from: prevState.from, to: newValue }; } return { type: "transition", from: prevState.value, to: newValue }; }); }, [newValue]); return currentValue; } __name(useDelayedValue, "useDelayedValue"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { useDelayedValue }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var useHasWrapped_std_exports = {}; __export(useHasWrapped_std_exports, { useHasWrapped: () => useHasWrapped }); module.exports = __toCommonJS(useHasWrapped_std_exports); var import_react = require("react"); var import_lodash = __toESM(require("lodash")); const { first, last, noop } = import_lodash.default; function getBottom(element) { return element.getBoundingClientRect().bottom; } __name(getBottom, "getBottom"); function getTop(element) { return element.getBoundingClientRect().top; } __name(getTop, "getTop"); function isWrapped(element) { if (!element) { return false; } const { children } = element; const firstChild = first(children); const lastChild = last(children); return Boolean( firstChild && lastChild && firstChild !== lastChild && getBottom(firstChild) <= getTop(lastChild) ); } __name(isWrapped, "isWrapped"); function useHasWrapped() { const [element, setElement] = (0, import_react.useState)(null); const [hasWrapped, setHasWrapped] = (0, import_react.useState)(isWrapped(element)); (0, import_react.useEffect)(() => { if (!element) { return noop; } const observer = new ResizeObserver(() => { setHasWrapped(isWrapped(element)); }); observer.observe(element); return () => { observer.disconnect(); }; }, [element]); return [setElement, hasWrapped]; } __name(useHasWrapped, "useHasWrapped"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { useHasWrapped }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var useIntersectionObserver_std_exports = {}; __export(useIntersectionObserver_std_exports, { useIntersectionObserver: () => useIntersectionObserver }); module.exports = __toCommonJS(useIntersectionObserver_std_exports); var import_react = require("react"); var import_log_std = require("../logging/log.std.js"); const log = (0, import_log_std.createLogger)("useIntersectionObserver"); function useIntersectionObserver() { const [intersectionObserverEntry, setIntersectionObserverEntry] = (0, import_react.useState)(null); const unobserveRef = (0, import_react.useRef)(null); const setRef = (0, import_react.useCallback)((el) => { if (unobserveRef.current) { unobserveRef.current(); unobserveRef.current = null; } if (!el) { return; } const observer = new IntersectionObserver((entries) => { if (entries.length !== 1) { log.error( "IntersectionObserverWrapper was observing the wrong number of elements" ); return; } entries.forEach((entry) => { setIntersectionObserverEntry(entry); }); }); unobserveRef.current = observer.unobserve.bind(observer, el); observer.observe(el); }, []); return [setRef, intersectionObserverEntry]; } __name(useIntersectionObserver, "useIntersectionObserver"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { useIntersectionObserver }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var useIsMounted_std_exports = {}; __export(useIsMounted_std_exports, { useIsMounted: () => useIsMounted }); module.exports = __toCommonJS(useIsMounted_std_exports); var import_react = require("react"); function useIsMounted() { const isMounted = (0, import_react.useRef)(false); (0, import_react.useEffect)(() => { isMounted.current = true; return () => { isMounted.current = false; }; }, []); return (0, import_react.useCallback)(() => isMounted.current === true, []); } __name(useIsMounted, "useIsMounted"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { useIsMounted }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var useMinimalConversation_std_exports = {}; __export(useMinimalConversation_std_exports, { useMinimalConversation: () => useMinimalConversation }); module.exports = __toCommonJS(useMinimalConversation_std_exports); var import_react = require("react"); function useMinimalConversation(conversation) { const { acceptedMessageRequest, announcementsOnly, areWeAdmin, avatarUrl, canChangeTimer, color, expireTimer, groupVersion, hasAvatar, id, isArchived, isBlocked, isMe, isPinned, isReported, isVerified, left, markedUnread, muteExpiresAt, name, phoneNumber, profileName, title, type } = conversation; const gradientStart = conversation.avatarPlaceholderGradient?.[0]; const gradientEnd = conversation.avatarPlaceholderGradient?.[1]; return (0, import_react.useMemo)(() => { return { gradientStart, gradientEnd, acceptedMessageRequest, announcementsOnly, areWeAdmin, avatarUrl, canChangeTimer, color, expireTimer, groupVersion, hasAvatar, id, isArchived, isBlocked, isMe, isPinned, isReported, isVerified, left, markedUnread, muteExpiresAt, name, phoneNumber, profileName, title, type }; }, [ gradientStart, gradientEnd, acceptedMessageRequest, announcementsOnly, areWeAdmin, avatarUrl, canChangeTimer, color, expireTimer, groupVersion, hasAvatar, id, isArchived, isBlocked, isMe, isPinned, isReported, isVerified, left, markedUnread, muteExpiresAt, name, phoneNumber, profileName, title, type ]); } __name(useMinimalConversation, "useMinimalConversation"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { useMinimalConversation }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var useNavBlocker_std_exports = {}; __export(useNavBlocker_std_exports, { useNavBlocker: () => useNavBlocker }); module.exports = __toCommonJS(useNavBlocker_std_exports); var import_react = require("react"); var import_BeforeNavigate_std = require("../services/BeforeNavigate.std.js"); function checkShouldBlock(shouldBlock, details) { if (typeof shouldBlock === "function") { return shouldBlock(details); } return shouldBlock; } __name(checkShouldBlock, "checkShouldBlock"); function useNavBlocker(name, shouldBlock) { const nameRef = (0, import_react.useRef)(name); (0, import_react.useEffect)(() => { nameRef.current = name; }, [name]); const shouldBlockRef = (0, import_react.useRef)(shouldBlock); (0, import_react.useEffect)(() => { shouldBlockRef.current = shouldBlock; }, [shouldBlock]); const [blocker, setBlocker] = (0, import_react.useState)(() => { return { state: "unblocked" }; }); (0, import_react.useEffect)(() => { const nameValue = nameRef.current; const callback = /* @__PURE__ */ __name(async (details) => { const shouldBlockNav = checkShouldBlock(shouldBlockRef.current, details); if (!shouldBlockNav) { return import_BeforeNavigate_std.BeforeNavigateResponse.Noop; } const { promise, resolve } = Promise.withResolvers(); function respond(response) { setBlocker({ state: "unblocked" }); resolve(response); } __name(respond, "respond"); setBlocker({ state: "blocked", respond }); return promise; }, "callback"); import_BeforeNavigate_std.beforeNavigateService.registerCallback({ callback, name: nameValue }); return () => { import_BeforeNavigate_std.beforeNavigateService.unregisterCallback({ callback, name: nameValue }); }; }, []); return blocker; } __name(useNavBlocker, "useNavBlocker"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { useNavBlocker }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var useNowThatUpdatesEveryMinute_std_exports = {}; __export(useNowThatUpdatesEveryMinute_std_exports, { useNowThatUpdatesEveryMinute: () => useNowThatUpdatesEveryMinute }); module.exports = __toCommonJS(useNowThatUpdatesEveryMinute_std_exports); var import_react = require("react"); var import_index_std = require("../util/durations/index.std.js"); const listeners = /* @__PURE__ */ new Set(); let timer; function useNowThatUpdatesEveryMinute() { const [now, setNow] = (0, import_react.useState)(Date.now()); (0, import_react.useEffect)(() => { const updateNow = /* @__PURE__ */ __name(() => setNow(Date.now()), "updateNow"); updateNow(); if (listeners.size === 0 && timer == null) { timer = setInterval(() => { for (const fn of listeners) { fn(); } }, import_index_std.MINUTE); } listeners.add(updateNow); return () => { listeners.delete(updateNow); if (listeners.size === 0 && timer != null) { clearInterval(timer); timer = void 0; } }; }, []); return now; } __name(useNowThatUpdatesEveryMinute, "useNowThatUpdatesEveryMinute"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { useNowThatUpdatesEveryMinute }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var usePrevious_std_exports = {}; __export(usePrevious_std_exports, { usePrevious: () => usePrevious }); module.exports = __toCommonJS(usePrevious_std_exports); var import_react = require("react"); function usePrevious(initialValue, currentValue) { const previousValueRef = (0, import_react.useRef)(initialValue); const result = previousValueRef.current; previousValueRef.current = currentValue; return result; } __name(usePrevious, "usePrevious"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { usePrevious }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var useProxySelector_std_exports = {}; __export(useProxySelector_std_exports, { useProxySelector: () => useProxySelector }); module.exports = __toCommonJS(useProxySelector_std_exports); var import_react = require("react"); var import_react_redux = require("react-redux"); var import_sneequals = require("@indutny/sneequals"); function useProxySelector(selector, ...params) { const memoized = (0, import_react.useMemo)(() => (0, import_sneequals.memoize)(selector), [selector]); return (0, import_react_redux.useSelector)( (0, import_react.useCallback)( (state) => memoized(state, ...params), // eslint-disable-next-line react-hooks/exhaustive-deps [memoized, ...params] ) ); } __name(useProxySelector, "useProxySelector"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { useProxySelector }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var useRefMerger_std_exports = {}; __export(useRefMerger_std_exports, { useRefMerger: () => useRefMerger }); module.exports = __toCommonJS(useRefMerger_std_exports); var import_react = require("react"); var import_refMerger_std = require("../util/refMerger.std.js"); const useRefMerger = /* @__PURE__ */ __name(() => (0, import_react.useMemo)(import_refMerger_std.createRefMerger, []), "useRefMerger"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { useRefMerger }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var useValueAtFixedRate_std_exports = {}; __export(useValueAtFixedRate_std_exports, { useValueAtFixedRate: () => useValueAtFixedRate }); module.exports = __toCommonJS(useValueAtFixedRate_std_exports); var import_react = require("react"); function useValueAtFixedRate(value, rate) { const [currentValue, setCurrentValue] = (0, import_react.useState)(value); (0, import_react.useEffect)(() => { const timeout = setTimeout(() => { setCurrentValue(value); }, rate); return () => { clearTimeout(timeout); }; }, [value, rate]); return currentValue; } __name(useValueAtFixedRate, "useValueAtFixedRate"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { useValueAtFixedRate }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var Job_std_exports = {}; __export(Job_std_exports, { Job: () => Job }); module.exports = __toCommonJS(Job_std_exports); class Job { constructor(id, timestamp, queueType, data, completion) { this.id = id; this.timestamp = timestamp; this.queueType = queueType; this.data = data; this.completion = completion; } static { __name(this, "Job"); } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { Job }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var JobError_std_exports = {}; __export(JobError_std_exports, { JobError: () => JobError }); module.exports = __toCommonJS(JobError_std_exports); var import_reallyJsonStringify_std = require("../util/reallyJsonStringify.std.js"); class JobError extends Error { constructor(lastErrorThrownByJob) { super(`Job failed. Last error: ${formatError(lastErrorThrownByJob)}`); this.lastErrorThrownByJob = lastErrorThrownByJob; } static { __name(this, "JobError"); } } function formatError(err) { if (err instanceof Error) { return err.message; } return (0, import_reallyJsonStringify_std.reallyJsonStringify)(err); } __name(formatError, "formatError"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { JobError }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var JobLogger_std_exports = {}; __export(JobLogger_std_exports, { JobLogger: () => JobLogger }); module.exports = __toCommonJS(JobLogger_std_exports); class JobLogger { constructor(job, logger) { this.logger = logger; this.#id = job.id; this.#queueType = job.queueType; } static { __name(this, "JobLogger"); } #id; #queueType; attempt = -1; fatal(...args) { this.logger.fatal(this.#prefix(), ...args); } error(...args) { this.logger.error(this.#prefix(), ...args); } warn(...args) { this.logger.warn(this.#prefix(), ...args); } info(...args) { this.logger.info(this.#prefix(), ...args); } debug(...args) { this.logger.debug(this.#prefix(), ...args); } trace(...args) { this.logger.trace(this.#prefix(), ...args); } child(name) { return new JobLogger( { id: this.#id, queueType: this.#queueType }, this.logger.child(name) ); } #prefix() { return `${this.#queueType} job queue, job ID ${this.#id}, attempt ${this.attempt}:`; } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { JobLogger }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var JobManager_std_exports = {}; __export(JobManager_std_exports, { JobManager: () => JobManager, jobManagerJobSchema: () => jobManagerJobSchema }); module.exports = __toCommonJS(JobManager_std_exports); var z = __toESM(require("zod")); var import_index_std = require("../util/durations/index.std.js"); var import_explodePromise_std = require("../util/explodePromise.std.js"); var import_clearTimeoutIfNecessary_std = require("../util/clearTimeoutIfNecessary.std.js"); var import_drop_std = require("../util/drop.std.js"); var import_log_std = require("../logging/log.std.js"); var import_missingCaseError_std = require("../util/missingCaseError.std.js"); var import_exponentialBackoff_std = require("../util/exponentialBackoff.std.js"); var Errors = __toESM(require("../types/errors.std.js")); var import_sleep_std = require("../util/sleep.std.js"); const log = (0, import_log_std.createLogger)("JobManager"); const jobManagerJobSchema = z.object({ attempts: z.number(), active: z.boolean(), retryAfter: z.number().nullable(), lastAttemptTimestamp: z.number().nullable() }); const DEFAULT_TICK_INTERVAL = import_index_std.MINUTE; class JobManager { constructor(params) { this.params = params; } static { __name(this, "JobManager"); } #enabled = false; #activeJobs = /* @__PURE__ */ new Map(); #jobStartPromises = /* @__PURE__ */ new Map(); #jobCompletePromises = /* @__PURE__ */ new Map(); #tickTimeout = null; #idleCallbacks = new Array(); logPrefix = "JobManager"; tickInterval = DEFAULT_TICK_INTERVAL; async start() { log.info(`${this.logPrefix}: starting`); if (!this.#enabled) { this.#enabled = true; await this.params.markAllJobsInactive(); } await this.maybeStartJobs(); this.#tick(); } async stop() { const activeJobs = [...this.#activeJobs.values()]; log.info( `${this.logPrefix}: stopping. There are ${activeJobs.length} active job(s)` ); this.#enabled = false; (0, import_clearTimeoutIfNecessary_std.clearTimeoutIfNecessary)(this.#tickTimeout); this.#tickTimeout = null; await Promise.all( activeJobs.map(async ({ abortController, completionPromise }) => { abortController.abort(); await completionPromise.promise; }) ); } async waitForIdle() { const idledPromise = new Promise( (resolve) => this.#idleCallbacks.push(resolve) ); this.#tick(); return idledPromise; } #tick() { (0, import_clearTimeoutIfNecessary_std.clearTimeoutIfNecessary)(this.#tickTimeout); this.#tickTimeout = null; (0, import_drop_std.drop)(this.maybeStartJobs()); this.#tickTimeout = setTimeout(() => this.#tick(), this.tickInterval); } #pauseForDuration(durationMs) { this.#enabled = false; (0, import_clearTimeoutIfNecessary_std.clearTimeoutIfNecessary)(this.#tickTimeout); this.#tickTimeout = setTimeout(() => { this.#enabled = true; this.#tick(); }, durationMs); } // used in testing waitForJobToBeStarted(job) { const id = this.#getJobIdIncludingAttempts(job); const existingPromise = this.#jobStartPromises.get(id)?.promise; if (existingPromise) { return existingPromise; } const { promise, resolve, reject } = (0, import_explodePromise_std.explodePromise)(); this.#jobStartPromises.set(id, { promise, resolve, reject }); return promise; } waitForJobToBeCompleted(job) { const id = this.#getJobIdIncludingAttempts(job); const existingPromise = this.#jobCompletePromises.get(id)?.promise; if (existingPromise) { return existingPromise; } const { promise, resolve, reject } = (0, import_explodePromise_std.explodePromise)(); this.#jobCompletePromises.set(id, { promise, resolve, reject }); return promise; } async addJob(newJob) { await this._addJob(newJob); } // Protected methods async _addJob(newJob, options) { const job = { ...newJob, attempts: 0, retryAfter: null, lastAttemptTimestamp: null, active: false }; const logId = this.params.getJobIdForLogging(job); try { const runningJob = this.#getRunningJob(job); if (runningJob) { log.info(`${logId}: already running; resetting attempts`); runningJob.attempts = 0; return { isAlreadyRunning: true }; } await this.params.saveJob(job, { allowBatching: !options?.forceStart }); if (options?.forceStart) { if (!this.#enabled) { log.warn( `${logId}: added but jobManager not enabled, can't start immediately` ); } else { log.info(`${logId}: starting job immediately`); (0, import_drop_std.drop)(this.startJob(job)); } } else if (this.#enabled) { (0, import_drop_std.drop)(this.maybeStartJobs()); } return { isAlreadyRunning: false }; } catch (e) { log.error(`${logId}: error saving job`, Errors.toLogFormat(e)); throw e; } } // maybeStartJobs is called: // 1. every minute (via tick) // 2. after a job is added (via addJob) // 3. after a job finishes (via startJob) // preventing re-entrancy allow us to simplify some logic and ensure we don't try to // start too many jobs #_inMaybeStartJobs = false; async maybeStartJobs() { if (this.#_inMaybeStartJobs) { return; } try { this.#_inMaybeStartJobs = true; if (!this.#enabled) { log.info(`${this.logPrefix}/_maybeStartJobs: not enabled, returning`); return; } const numJobsToStart = this.#getMaximumNumberOfJobsToStart(); if (numJobsToStart <= 0) { return; } const nextJobs = await this.params.getNextJobs({ limit: numJobsToStart, timestamp: Date.now() }); if (nextJobs.length === 0 && this.#activeJobs.size === 0) { if (this.#idleCallbacks.length > 0) { const callbacks = this.#idleCallbacks; this.#idleCallbacks = []; for (const callback of callbacks) { callback(); } } return; } if (this.params.shouldHoldOffOnStartingQueuedJobs?.()) { log.info( `${this.logPrefix}/_maybeStartJobs: holding off on starting ${nextJobs.length} new job(s)` ); return; } for (const job of nextJobs) { (0, import_drop_std.drop)(this.startJob(job)); } } finally { this.#_inMaybeStartJobs = false; } } async startJob(job) { const logId = `${this.logPrefix}/startJob(${this.params.getJobIdForLogging( job )})`; if (this.#isJobRunning(job)) { log.info(`${logId}: job is already running`); return; } const isFirstAttempt = job.attempts === 0; const isLastAttempt = job.attempts + 1 >= (this.params.getRetryConfig(job).maxAttempts ?? Infinity); let jobRunResult; try { log.info(`${logId}: starting job`); const { abortController } = this.#addRunningJob(job); await this.params.saveJob({ ...job, active: true }); const runJobPromise = this.params.runJob(job, { abortSignal: abortController.signal, isLastAttempt }); this.#handleJobStartPromises(job); jobRunResult = await runJobPromise; const { status } = jobRunResult; log.info( `${logId}: job completed with status: ${status}${status === "retry" && jobRunResult.updatedJob ? " with updated job" : ""}` ); switch (status) { case "finished": await this.params.removeJob(job); return; case "retry": if (isLastAttempt) { throw new Error("Cannot retry on last attempt"); } if (isFirstAttempt && jobRunResult.updatedJob) { await this.#retryJobWithoutDelay(jobRunResult.updatedJob); } else { await this.#retryJobLater(jobRunResult.updatedJob ?? job); } return; case "rate-limited": log.info( `${logId}: rate-limited; retrying in ${jobRunResult.pauseDurationMs}` ); this.#pauseForDuration(jobRunResult.pauseDurationMs); await this.#retryJobLater(job); return; default: throw (0, import_missingCaseError_std.missingCaseError)(status); } } catch (e) { log.error(`${logId}: error when running job`, e); if (isLastAttempt) { await this.params.removeJob(job); } else { await this.#retryJobLater(job); } } finally { this.#removeRunningJob(job); (0, import_drop_std.drop)(this.maybeStartJobs()); } } async #retryJobWithoutDelay(job) { const now = Date.now(); await this.params.saveJob({ ...job, active: false, attempts: job.attempts + 1, retryAfter: now, lastAttemptTimestamp: now }); } async #retryJobLater(job) { const now = Date.now(); await this.params.saveJob({ ...job, active: false, attempts: job.attempts + 1, retryAfter: now + (0, import_exponentialBackoff_std.exponentialBackoffSleepTime)( job.attempts + 1, this.params.getRetryConfig(job).backoffConfig ), lastAttemptTimestamp: now }); } #getActiveJobCount() { return this.#activeJobs.size; } #getMaximumNumberOfJobsToStart() { return Math.max( 0, this.params.maxConcurrentJobs - this.#getActiveJobCount() ); } #getRunningJob(job) { const id = this.params.getJobId(job); return this.#activeJobs.get(id)?.job; } #isJobRunning(job) { return Boolean(this.#getRunningJob(job)); } #removeRunningJob(job) { const idWithAttempts = this.#getJobIdIncludingAttempts(job); this.#jobCompletePromises.get(idWithAttempts)?.resolve(); this.#jobCompletePromises.delete(idWithAttempts); const id = this.params.getJobId(job); this.#activeJobs.get(id)?.completionPromise.resolve(); this.#activeJobs.delete(id); } async cancelJobs(reason, predicate) { const logId = `${this.logPrefix}/cancelJobs/${reason}`; const jobs = Array.from(this.#activeJobs.values()).filter( (data) => predicate(data.job) ); if (jobs.length === 0) { log.warn(`${logId}: found no target jobs`); return; } await Promise.all( jobs.map(async (jobData) => { const { abortController, completionPromise, job } = jobData; abortController.abort(reason); const rejectionError = new Error( `Canceled at JobManager.cancelJobs, reason: ${reason}` ); const idWithAttempts = this.#getJobIdIncludingAttempts(job); this.#jobCompletePromises.get(idWithAttempts)?.reject(rejectionError); this.#jobCompletePromises.delete(idWithAttempts); await Promise.race([completionPromise.promise, (0, import_sleep_std.sleep)(import_index_std.SECOND)]); const jobId = this.params.getJobId(job); const hasCompleted = Boolean(this.#activeJobs.get(jobId)); if (!hasCompleted) { const jobIdForLogging = this.params.getJobIdForLogging(job); log.warn( `${logId}: job ${jobIdForLogging} didn't complete; rejecting promises` ); completionPromise.reject(rejectionError); this.#activeJobs.delete(jobId); } await this.params.removeJob(job); }) ); log.warn(`${logId}: Successfully canceled ${jobs.length} jobs`); } #addRunningJob(job) { if (this.#isJobRunning(job)) { const jobIdForLogging = this.params.getJobIdForLogging(job); log.warn( `${this.logPrefix}/addRunningJob: job ${jobIdForLogging} is already running` ); } const activeJob = { completionPromise: (0, import_explodePromise_std.explodePromise)(), abortController: new AbortController(), job }; this.#activeJobs.set(this.params.getJobId(job), activeJob); return activeJob; } #handleJobStartPromises(job) { const id = this.#getJobIdIncludingAttempts(job); this.#jobStartPromises.get(id)?.resolve(); this.#jobStartPromises.delete(id); } #getJobIdIncludingAttempts(job) { return `${this.params.getJobId(job)}.${job.attempts}`; } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { JobManager, jobManagerJobSchema }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var JobQueue_std_exports = {}; __export(JobQueue_std_exports, { JOB_STATUS: () => JOB_STATUS, JobQueue: () => JobQueue }); module.exports = __toCommonJS(JobQueue_std_exports); var import_p_queue = __toESM(require("p-queue")); var import_uuid = require("uuid"); var import_lodash = __toESM(require("lodash")); var import_Job_std = require("./Job.std.js"); var import_JobError_std = require("./JobError.std.js"); var import_assert_std = require("../util/assert.std.js"); var import_log_std = require("../logging/log.std.js"); var import_JobLogger_std = require("./JobLogger.std.js"); var Errors = __toESM(require("../types/errors.std.js")); var import_drop_std = require("../util/drop.std.js"); var import_sleep_std = require("../util/sleep.std.js"); var import_index_std = require("../util/durations/index.std.js"); const { noop } = import_lodash.default; const log = (0, import_log_std.createLogger)("JobQueue"); const noopOnCompleteCallbacks = { resolve: noop, reject: noop }; var JOB_STATUS = /* @__PURE__ */ ((JOB_STATUS2) => { JOB_STATUS2["SUCCESS"] = "SUCCESS"; JOB_STATUS2["NEEDS_RETRY"] = "NEEDS_RETRY"; JOB_STATUS2["ERROR"] = "ERROR"; return JOB_STATUS2; })(JOB_STATUS || {}); class JobQueue { static { __name(this, "JobQueue"); } #maxAttempts; #queueType; #store; #logger; #logPrefix; #shuttingDown = false; #paused = false; #onCompleteCallbacks = /* @__PURE__ */ new Map(); #defaultInMemoryQueue = new import_p_queue.default({ concurrency: 1 }); #started = false; get isShuttingDown() { return this.#shuttingDown; } get isPaused() { return this.#paused; } constructor(options) { (0, import_assert_std.assertDev)( Number.isInteger(options.maxAttempts) && options.maxAttempts >= 1, "maxAttempts should be a positive integer" ); (0, import_assert_std.assertDev)( options.maxAttempts <= Number.MAX_SAFE_INTEGER, "maxAttempts is too large" ); (0, import_assert_std.assertDev)( options.queueType.trim().length, "queueType should be a non-blank string" ); this.#maxAttempts = options.maxAttempts; this.#queueType = options.queueType; this.#store = options.store; this.#logger = options.logger ?? log; this.#logPrefix = `${this.#queueType} job queue:`; } getQueues() { return /* @__PURE__ */ new Set([this.#defaultInMemoryQueue]); } /** * Start streaming jobs from the store. */ async streamJobs() { if (this.#started) { throw new Error( `${this.#logPrefix} should not start streaming more than once` ); } this.#started = true; log.info(`${this.#logPrefix} starting to stream jobs`); const stream = this.#store.stream(this.#queueType); for await (const storedJob of stream) { if (this.#shuttingDown) { log.info( `${this.#logPrefix} is shutting down. Can't accept more work.` ); break; } if (this.#paused) { log.info(`${this.#logPrefix} is paused. Waiting until resume.`); while (this.#paused) { await (0, import_sleep_std.sleep)(import_index_std.SECOND); } log.info(`${this.#logPrefix} has been resumed. Queuing job.`); } (0, import_drop_std.drop)(this.enqueueStoredJob(storedJob)); } } /** * Add a job, which should cause it to be enqueued and run. * * If `streamJobs` has not been called yet, this will throw an error. * * You can override `insert` to change the way the job is added to the database. This is * useful if you're trying to save a message and a job in the same database transaction. */ async add(data, insert) { const job = this.createJob(data); if (!this.#started) { log.warn( `${this.#logPrefix} This queue has not started streaming, adding job ${job.id} to database only.` ); } if (insert) { await insert(job); } await this.#store.insert(job, { shouldPersist: !insert }); log.info(`${this.#logPrefix} added new job ${job.id}`); return job; } createJob(data) { const id = (0, import_uuid.v7)(); const timestamp = Date.now(); const completionPromise = new Promise((resolve, reject) => { this.#onCompleteCallbacks.set(id, { resolve, reject }); }); const completion = (async () => { try { await completionPromise; } catch (err) { throw new import_JobError_std.JobError(err); } finally { this.#onCompleteCallbacks.delete(id); } })(); return new import_Job_std.Job(id, timestamp, this.#queueType, data, completion); } getInMemoryQueue(_parsedJob) { return this.#defaultInMemoryQueue; } async enqueueStoredJob(storedJob) { (0, import_assert_std.assertDev)( storedJob.queueType === this.#queueType, "Received a mis-matched queue type" ); log.info(`${this.#logPrefix} enqueuing job ${storedJob.id}`); const { resolve, reject } = this.#onCompleteCallbacks.get(storedJob.id) || noopOnCompleteCallbacks; let parsedData; try { parsedData = this.parseData(storedJob.data); } catch (err) { log.error( `${this.#logPrefix} failed to parse data for job ${storedJob.id}, created ${storedJob.timestamp}. Deleting job. Parse error:`, Errors.toLogFormat(err) ); await this.#store.delete(storedJob.id); reject( new Error( "Failed to parse job data. Was unexpected data loaded from the database?" ) ); return; } const parsedJob = { ...storedJob, data: parsedData }; const queue = this.getInMemoryQueue(parsedJob); const logger = new import_JobLogger_std.JobLogger(parsedJob, this.#logger); const result = await queue.add( async () => { for (let attempt = 1; attempt <= this.#maxAttempts; attempt += 1) { const isFinalAttempt = attempt === this.#maxAttempts; logger.attempt = attempt; log.info( `${this.#logPrefix} running job ${storedJob.id}, attempt ${attempt} of ${this.#maxAttempts}` ); if (this.isShuttingDown) { log.warn( `${this.#logPrefix} returning early for job ${storedJob.id}; shutting down` ); return { status: "ERROR" /* ERROR */, err: new Error("Shutting down") }; } try { const jobStatus = await this.run(parsedJob, { attempt, log: logger }); if (!jobStatus) { log.info( `${this.#logPrefix} job ${storedJob.id} succeeded on attempt ${attempt}` ); return { status: "SUCCESS" /* SUCCESS */ }; } log.info( `${this.#logPrefix} job ${storedJob.id} returned status ${jobStatus} on attempt ${attempt}` ); return { status: jobStatus }; } catch (err) { log.error( `${this.#logPrefix} job ${storedJob.id} failed on attempt ${attempt}. ${Errors.toLogFormat(err)}` ); if (isFinalAttempt) { return { status: "ERROR" /* ERROR */, err }; } } } return void 0; } ); if (result?.status === "NEEDS_RETRY" /* NEEDS_RETRY */) { const addJobSuccess = await this.retryJobOnQueueIdle({ storedJob, job: parsedJob, logger }); if (!addJobSuccess) { await this.#store.delete(storedJob.id); } } if (result?.status === "SUCCESS" /* SUCCESS */ || result?.status === "ERROR" /* ERROR */ && !this.isShuttingDown) { await this.#store.delete(storedJob.id); } (0, import_assert_std.assertDev)( result, "The job never ran. This indicates a developer error in the job queue" ); if (result.status === "ERROR" /* ERROR */) { reject(result.err); } else { resolve(); } } async retryJobOnQueueIdle({ logger }) { logger.error( `retryJobOnQueueIdle: not implemented for queue ${this.#queueType}; dropping job` ); return false; } async shutdown() { const queues = this.getQueues(); log.info( `${this.#logPrefix} shutdown: stop accepting new work and drain ${queues.size} promise queues` ); this.#shuttingDown = true; await Promise.all([...queues].map((q) => q.onIdle())); log.info(`${this.#logPrefix} shutdown: complete`); } pause() { log.info(`${this.#logPrefix}: pausing queue`); this.#paused = true; } resume() { log.info(`${this.#logPrefix}: resuming queue`); this.#paused = false; } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { JOB_STATUS, JobQueue }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var formatJobForInsert_std_exports = {}; __export(formatJobForInsert_std_exports, { formatJobForInsert: () => formatJobForInsert }); module.exports = __toCommonJS(formatJobForInsert_std_exports); const formatJobForInsert = /* @__PURE__ */ __name((job) => ({ id: job.id, timestamp: job.timestamp, queueType: job.queueType, data: job.data }), "formatJobForInsert"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { formatJobForInsert }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var InMemoryQueues_std_exports = {}; __export(InMemoryQueues_std_exports, { InMemoryQueues: () => InMemoryQueues }); module.exports = __toCommonJS(InMemoryQueues_std_exports); var import_p_queue = __toESM(require("p-queue")); class InMemoryQueues { static { __name(this, "InMemoryQueues"); } #queues = /* @__PURE__ */ new Map(); get(key) { const existingQueue = this.#queues.get(key); if (existingQueue) { return existingQueue; } const newQueue = new import_p_queue.default({ concurrency: 1 }); newQueue.once("idle", () => { this.#queues.delete(key); }); this.#queues.set(key, newQueue); return newQueue; } get allQueues() { return new Set(this.#queues.values()); } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { InMemoryQueues }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var findRetryAfterTimeFromError_std_exports = {}; __export(findRetryAfterTimeFromError_std_exports, { findRetryAfterTimeFromError: () => findRetryAfterTimeFromError }); module.exports = __toCommonJS(findRetryAfterTimeFromError_std_exports); var import_isRecord_std = require("../../util/isRecord.std.js"); var import_HTTPError_std = require("../../types/HTTPError.std.js"); var import_parseRetryAfter_std = require("../../util/parseRetryAfter.std.js"); function findRetryAfterTimeFromError(err, defaultValue) { let rawValue; if ((0, import_isRecord_std.isRecord)(err)) { if ((0, import_isRecord_std.isRecord)(err.responseHeaders)) { rawValue = err.responseHeaders["retry-after"]; } else if (err.httpError instanceof import_HTTPError_std.HTTPError) { rawValue = err.httpError.responseHeaders?.["retry-after"]; } } if (Array.isArray(rawValue)) { return (0, import_parseRetryAfter_std.parseRetryAfterWithDefault)(rawValue[0], defaultValue); } return (0, import_parseRetryAfter_std.parseRetryAfterWithDefault)(rawValue, defaultValue); } __name(findRetryAfterTimeFromError, "findRetryAfterTimeFromError"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { findRetryAfterTimeFromError }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var getHttpErrorCode_std_exports = {}; __export(getHttpErrorCode_std_exports, { getHttpErrorCode: () => getHttpErrorCode }); module.exports = __toCommonJS(getHttpErrorCode_std_exports); var import_isRecord_std = require("../../util/isRecord.std.js"); var import_parseIntWithFallback_std = require("../../util/parseIntWithFallback.std.js"); function getHttpErrorCode(maybeError) { if (!(0, import_isRecord_std.isRecord)(maybeError)) { return -1; } const maybeTopLevelCode = (0, import_parseIntWithFallback_std.parseIntWithFallback)(maybeError.code, -1); if (maybeTopLevelCode !== -1) { return maybeTopLevelCode; } const { httpError } = maybeError; if (!(0, import_isRecord_std.isRecord)(httpError)) { return -1; } return (0, import_parseIntWithFallback_std.parseIntWithFallback)(httpError.code, -1); } __name(getHttpErrorCode, "getHttpErrorCode"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getHttpErrorCode }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var handleCommonJobRequestError_std_exports = {}; __export(handleCommonJobRequestError_std_exports, { handleCommonJobRequestError: () => handleCommonJobRequestError }); module.exports = __toCommonJS(handleCommonJobRequestError_std_exports); var import_sleepForRateLimitRetryAfterTime_std = require("./sleepForRateLimitRetryAfterTime.std.js"); var import_getHttpErrorCode_std = require("./getHttpErrorCode.std.js"); async function handleCommonJobRequestError({ err, log, timeRemaining }) { switch ((0, import_getHttpErrorCode_std.getHttpErrorCode)(err)) { case 413: case 429: await (0, import_sleepForRateLimitRetryAfterTime_std.sleepForRateLimitRetryAfterTime)({ err, log, timeRemaining }); return; case 508: log.info("server responded with 508. Giving up on this job"); return; default: throw err; } } __name(handleCommonJobRequestError, "handleCommonJobRequestError"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { handleCommonJobRequestError }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var handleMultipleSendErrors_std_exports = {}; __export(handleMultipleSendErrors_std_exports, { handleMultipleSendErrors: () => handleMultipleSendErrors, maybeExpandErrors: () => maybeExpandErrors }); module.exports = __toCommonJS(handleMultipleSendErrors_std_exports); var Errors = __toESM(require("../../types/errors.std.js")); var import_sleepForRateLimitRetryAfterTime_std = require("./sleepForRateLimitRetryAfterTime.std.js"); var import_getHttpErrorCode_std = require("./getHttpErrorCode.std.js"); var import_assert_std = require("../../util/assert.std.js"); var import_findRetryAfterTimeFromError_std = require("./findRetryAfterTimeFromError.std.js"); var import_Errors_std = require("../../textsecure/Errors.std.js"); function maybeExpandErrors(error) { if (error instanceof import_Errors_std.SendMessageProtoError) { return error.errors || [error]; } return [error]; } __name(maybeExpandErrors, "maybeExpandErrors"); async function handleMultipleSendErrors({ errors, isFinalAttempt, log, markFailed, timeRemaining, toThrow }) { (0, import_assert_std.strictAssert)(errors.length, "Expected at least one error"); const formattedErrors = []; let retryAfterError; let longestRetryAfterTime = -Infinity; let serverAskedUsToStop = false; errors.forEach((error) => { formattedErrors.push(Errors.toLogFormat(error)); const errorCode = (0, import_getHttpErrorCode_std.getHttpErrorCode)(error); if (errorCode === 413 || errorCode === 429) { const retryAfterTime = (0, import_findRetryAfterTimeFromError_std.findRetryAfterTimeFromError)(error); if (retryAfterTime > longestRetryAfterTime) { retryAfterError = error; longestRetryAfterTime = retryAfterTime; } } else if (errorCode === 508 || errorCode === 400) { serverAskedUsToStop = true; } }); log.info( `${formattedErrors.length} send error(s): ${formattedErrors.join(",")}` ); if (isFinalAttempt || serverAskedUsToStop) { await markFailed?.(); } if (serverAskedUsToStop) { log.info("server responded with 508 or 400. Giving up on this job"); return; } if (retryAfterError && !isFinalAttempt) { await (0, import_sleepForRateLimitRetryAfterTime_std.sleepForRateLimitRetryAfterTime)({ err: retryAfterError, log, timeRemaining }); } throw toThrow; } __name(handleMultipleSendErrors, "handleMultipleSendErrors"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { handleMultipleSendErrors, maybeExpandErrors }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var sleepForRateLimitRetryAfterTime_std_exports = {}; __export(sleepForRateLimitRetryAfterTime_std_exports, { sleepForRateLimitRetryAfterTime: () => sleepForRateLimitRetryAfterTime }); module.exports = __toCommonJS(sleepForRateLimitRetryAfterTime_std_exports); var import_sleeper_std = require("../../util/sleeper.std.js"); var import_findRetryAfterTimeFromError_std = require("./findRetryAfterTimeFromError.std.js"); async function sleepForRateLimitRetryAfterTime({ err, log, timeRemaining }) { if (timeRemaining <= 0) { return; } const retryAfter = Math.min((0, import_findRetryAfterTimeFromError_std.findRetryAfterTimeFromError)(err), timeRemaining); log.info( `Got a 413 or 429 response code. Sleeping for ${retryAfter} millisecond(s)` ); await import_sleeper_std.sleeper.sleep( retryAfter, "sleepForRateLimitRetryAfterTime: Got a 413 or 429 response code", { resolveOnShutdown: false } ); } __name(sleepForRateLimitRetryAfterTime, "sleepForRateLimitRetryAfterTime"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { sleepForRateLimitRetryAfterTime }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var types_std_exports = {}; __export(types_std_exports, { JobCancelReason: () => JobCancelReason }); module.exports = __toCommonJS(types_std_exports); var JobCancelReason = /* @__PURE__ */ ((JobCancelReason2) => { JobCancelReason2["UserInitiated"] = "UserInitiated"; JobCancelReason2["Shutdown"] = "Shutdown"; JobCancelReason2["JobManagerStopped"] = "JobManagerStopped"; JobCancelReason2["PowerMonitorSuspend"] = "PowerMonitorSuspend"; JobCancelReason2["PowerMonitorResume"] = "PowerMonitorResume"; return JobCancelReason2; })(JobCancelReason || {}); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { JobCancelReason }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var isLinkPreviewDateValid_std_exports = {}; __export(isLinkPreviewDateValid_std_exports, { isLinkPreviewDateValid: () => isLinkPreviewDateValid }); module.exports = __toCommonJS(isLinkPreviewDateValid_std_exports); const ONE_DAY = 24 * 60 * 60 * 1e3; function isLinkPreviewDateValid(value) { const maximumLinkPreviewDate = Date.now() + ONE_DAY; return typeof value === "number" && value !== 0 && Number.isFinite(value) && value < maximumLinkPreviewDate; } __name(isLinkPreviewDateValid, "isLinkPreviewDateValid"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { isLinkPreviewDateValid }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var shouldUseFullSizeLinkPreviewImage_std_exports = {}; __export(shouldUseFullSizeLinkPreviewImage_std_exports, { shouldUseFullSizeLinkPreviewImage: () => shouldUseFullSizeLinkPreviewImage }); module.exports = __toCommonJS(shouldUseFullSizeLinkPreviewImage_std_exports); var import_Attachment_std = require("../util/Attachment.std.js"); const MINIMUM_FULL_SIZE_DIMENSION = 200; function shouldUseFullSizeLinkPreviewImage({ isStickerPack, image }) { if (isStickerPack || !image || !(0, import_Attachment_std.isImageAttachment)(image)) { return false; } const { width, height } = image; return isDimensionFullSize(width) && isDimensionFullSize(height) && !isRoughlySquare(width, height); } __name(shouldUseFullSizeLinkPreviewImage, "shouldUseFullSizeLinkPreviewImage"); function isDimensionFullSize(dimension) { return typeof dimension === "number" && dimension >= MINIMUM_FULL_SIZE_DIMENSION; } __name(isDimensionFullSize, "isDimensionFullSize"); function isRoughlySquare(width, height) { return Math.abs(1 - width / height) < 0.05; } __name(isRoughlySquare, "isRoughlySquare"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { shouldUseFullSizeLinkPreviewImage }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var debuglogs_node_exports = {}; __export(debuglogs_node_exports, { getLog: () => getLog }); module.exports = __toCommonJS(debuglogs_node_exports); var import_lodash = __toESM(require("lodash")); var import_reallyJsonStringify_std = require("../util/reallyJsonStringify.std.js"); var import_shared_std = require("./shared.std.js"); var import_privacy_node = require("../util/privacy.node.js"); var import_environment_std = require("../environment.std.js"); const { memoize, sortBy } = import_lodash.default; const headerSectionTitle = /* @__PURE__ */ __name((title) => `========= ${title} =========`, "headerSectionTitle"); const headerSection = /* @__PURE__ */ __name((title, data) => { const sortedEntries = sortBy(Object.entries(data), ([key]) => key); return [ headerSectionTitle(title), ...sortedEntries.map( ([key, value]) => `${key}: ${(0, import_privacy_node.redactAll)(String(value))}` ), "" ].join("\n"); }, "headerSection"); const getHeader = /* @__PURE__ */ __name(({ capabilities, remoteConfig, statistics, user }, nodeVersion, appVersion, osVersion, userAgent, arch, runningUnderARM64Translation, linuxVersion) => [ headerSection("System info", { Time: Date.now(), "User agent": userAgent, "Node version": nodeVersion, Environment: (0, import_environment_std.getEnvironment)(), "App version": appVersion, "OS version": osVersion, Arch: `${arch}${runningUnderARM64Translation ? " (ARM64 Translation)" : ""}`, ...linuxVersion && { "Linux version": linuxVersion } }), headerSection("User info", user), headerSection("Capabilities", capabilities), headerSection("Remote config", remoteConfig), headerSection("Statistics", statistics), headerSectionTitle("Logs") ].join("\n"), "getHeader"); const getLevel = memoize((level) => { const text = (0, import_shared_std.getLogLevelString)(level); return text.toUpperCase().padEnd(import_shared_std.levelMaxLength, " "); }); function formatLine(mightBeEntry) { const entry = (0, import_shared_std.isLogEntry)(mightBeEntry) ? mightBeEntry : { level: import_shared_std.LogLevel.Error, msg: `Invalid IPC data when fetching logs. Here's what we could recover: ${(0, import_reallyJsonStringify_std.reallyJsonStringify)( mightBeEntry )}`, time: (/* @__PURE__ */ new Date()).toISOString() }; return `${getLevel(entry.level)} ${entry.time} ${entry.msg}`; } __name(formatLine, "formatLine"); function getLog(data, nodeVersion, appVersion, osVersion, userAgent, arch, runningUnderARM64Translation, linuxVersion) { let header; let body; if ((0, import_shared_std.isFetchLogIpcData)(data)) { const { logEntries } = data; header = getHeader( data, nodeVersion, appVersion, osVersion, userAgent, arch, runningUnderARM64Translation, linuxVersion ); body = logEntries.map(formatLine).join("\n"); } else { header = headerSectionTitle("Partial logs"); const entry = { level: import_shared_std.LogLevel.Error, msg: "Invalid IPC data when fetching logs; dropping all logs", time: (/* @__PURE__ */ new Date()).toISOString() }; body = formatLine(entry); } return `${header} ${body}`; } __name(getLog, "getLog"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getLog }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var formatCountForLogging_std_exports = {}; __export(formatCountForLogging_std_exports, { formatCountForLogging: () => formatCountForLogging }); module.exports = __toCommonJS(formatCountForLogging_std_exports); const formatCountForLogging = /* @__PURE__ */ __name((count) => { if (count === 0 || Number.isNaN(count)) { return String(count); } return `at least ${10 ** Math.floor(Math.log10(count))}`; }, "formatCountForLogging"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { formatCountForLogging }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var log_std_exports = {}; __export(log_std_exports, { createLogger: () => createLogger, log: () => log, setOnLogCallback: () => setOnLogCallback, setPinoDestination: () => setPinoDestination }); module.exports = __toCommonJS(log_std_exports); var import_pino = __toESM(require("pino")); var import_lru_cache = require("lru-cache"); var import_environment_std = require("../environment.std.js"); var import_reallyJsonStringify_std = require("../util/reallyJsonStringify.std.js"); var import_shared_std = require("./shared.std.js"); let redactAll = /* @__PURE__ */ __name((value) => value, "redactAll"); let destination; let buffer = new Array(); const COLORS = [ "#2c6bed", "#cf163e", "#c73f0a", "#6f6a58", "#3b7845", "#1d8663", "#077d92", "#336ba3", "#6058ca", "#9932c8", "#aa377a", "#8f616a", "#71717f", "#ebeae8", "#506ecd", "#ff9500" ]; const SUBSYSTEM_COLORS = new import_lru_cache.LRUCache({ max: 500 }); let onLogCallback; function setOnLogCallback(cb) { onLogCallback = cb; } __name(setOnLogCallback, "setOnLogCallback"); function getSubsystemColor(name) { const cached = SUBSYSTEM_COLORS.get(name); if (cached != null) { return cached; } let hash = 0; for (let i = 0; i < name.length; i += 1) { hash += name.charCodeAt(i) & 255; hash += hash << 10; hash ^= hash >>> 6; } hash += hash << 3; hash ^= hash >>> 11; hash += hash << 15; hash >>>= 0; const result = COLORS[hash % COLORS.length]; SUBSYSTEM_COLORS.set(name, result); return result; } __name(getSubsystemColor, "getSubsystemColor"); let cachedPattern; if (typeof window !== "undefined" && window.localStorage) { window.addEventListener("storage", (event) => { if (event.key === "debug") { cachedPattern = void 0; } }); } function getPattern() { if (cachedPattern != null) { return cachedPattern; } let value = ""; if (typeof window !== "undefined" && window.localStorage) { value = window.localStorage.getItem("debug") || ""; } if (typeof process !== "undefined" && process.env) { value = value || process.env.DEBUG || ""; } const parts = value.trim().replace(/\s+/g, ",").split(",").filter((part) => part).map((part) => { const result2 = part.replace(/([^a-zA-Z0-9_\s*])/g, "\\$1").replace("*", ".*"); if (!/^\[.*\]/.test(part)) { return `\\[${result2}\\]`; } return result2; }); if (parts.length === 0) { return /^.*$/; } const result = new RegExp(`^(${parts.join("|")})\\s+$`); cachedPattern = result; return result; } __name(getPattern, "getPattern"); function debugLog(logger, args, level) { if ((0, import_environment_std.getEnvironment)() === import_environment_std.Environment.PackagedApp) { return; } const consoleMethod = (0, import_shared_std.getLogLevelString)(level); const { msgPrefix } = logger; const pattern = getPattern(); if (!pattern.test(msgPrefix ?? "")) { return; } const [message, ...extra] = args; const color = getSubsystemColor(msgPrefix ?? ""); console[consoleMethod === "fatal" ? "error" : consoleMethod]( `%c${msgPrefix ?? ""}%c${message}`, `color: ${color}; font-weight: bold`, "color: inherit; font-weight: inherit", ...extra ); } __name(debugLog, "debugLog"); const pinoInstance = (0, import_pino.default)( { formatters: { // No point in saving pid or hostname bindings: /* @__PURE__ */ __name(() => ({}), "bindings") }, hooks: { logMethod(args, method, level) { debugLog(this, args, level); const line = args.map( (item) => typeof item === "string" ? item : (0, import_reallyJsonStringify_std.reallyJsonStringify)(item) ).join(" "); onLogCallback?.(level, line, this.msgPrefix); return method.call(this, line); } }, timestamp: import_pino.default.stdTimeFunctions.isoTime, redact: { paths: ["*"], censor: /* @__PURE__ */ __name((item) => redactAll(item), "censor") } }, { write(msg) { if (destination == null) { buffer.push(msg); } else { destination.write(msg); } } } ); const log = { fatal: pinoInstance.fatal.bind(pinoInstance), error: pinoInstance.error.bind(pinoInstance), warn: pinoInstance.error.bind(pinoInstance), info: pinoInstance.info.bind(pinoInstance), debug: pinoInstance.debug.bind(pinoInstance), trace: pinoInstance.trace.bind(pinoInstance), child: child.bind(pinoInstance) }; function child(name) { const instance = this.child({}, { msgPrefix: `[${name}] ` }); return { fatal: instance.fatal.bind(instance), error: instance.error.bind(instance), warn: instance.warn.bind(instance), info: instance.info.bind(instance), debug: instance.debug.bind(instance), trace: instance.trace.bind(instance), child: child.bind(instance) }; } __name(child, "child"); const createLogger = log.child; function setPinoDestination(newDestination, newRedactAll) { destination = newDestination; redactAll = newRedactAll; const queued = buffer; buffer = []; for (const msg of queued) { destination.write(msg); } } __name(setPinoDestination, "setPinoDestination"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { createLogger, log, setOnLogCallback, setPinoDestination }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var main_process_logging_main_exports = {}; __export(main_process_logging_main_exports, { eliminateOldEntries: () => eliminateOldEntries, eliminateOutOfDateFiles: () => eliminateOutOfDateFiles, fetchAdditionalLogData: () => fetchAdditionalLogData, fetchLog: () => fetchLog, fetchLogs: () => fetchLogs, initialize: () => initialize, isLineAfterDate: () => isLineAfterDate }); module.exports = __toCommonJS(main_process_logging_main_exports); var import_cirbuf = require("cirbuf"); var import_electron = require("electron"); var import_firstline = __toESM(require("firstline")); var import_lodash = __toESM(require("lodash")); var import_node_fs = require("node:fs"); var import_promises = require("node:fs/promises"); var import_node_path = require("node:path"); var import_read_last_lines = require("read-last-lines"); var import_split2 = __toESM(require("split2")); var Errors = __toESM(require("../types/errors.std.js")); var import_rotatingPinoDest_node = require("../util/rotatingPinoDest.node.js"); var import_privacy_node = require("../util/privacy.node.js"); var import_log_std = require("./log.std.js"); var import_shared_std = require("./shared.std.js"); var import_version_std = require("../util/version.std.js"); const { filter, flatten, map, pick, sortBy } = import_lodash.default; const MAX_LOG_LINES = 1e7; let isInitialized = false; let shouldRestart = false; async function initialize(getMainWindow) { if (isInitialized) { throw new Error("Already called initialize!"); } isInitialized = true; if (!(0, import_version_std.isProduction)(import_electron.app.getVersion())) { (0, import_log_std.setOnLogCallback)((level, logLine, msgPrefix) => { if (level >= import_shared_std.LogLevel.Error) { getMainWindow()?.webContents.send( "logging-error", `${msgPrefix ? `${msgPrefix}` : ""}${logLine}` ); } }); } const basePath = import_electron.app.getPath("userData"); const logPath = (0, import_node_path.join)(basePath, "logs"); (0, import_node_fs.mkdirSync)(logPath, { recursive: true }); try { await cleanupLogs(logPath); } catch (error) { const errorString = `Failed to clean logs; deleting all. Error: ${Errors.toLogFormat(error)}`; console.error(errorString); await deleteAllLogs(logPath); (0, import_node_fs.mkdirSync)(logPath, { recursive: true }); setTimeout(() => { console.error(errorString); }, 500); } const logFile = (0, import_node_path.join)(logPath, "main.log"); const rotatingStream = (0, import_rotatingPinoDest_node.createRotatingPinoDest)({ logFile }); const onClose = /* @__PURE__ */ __name(() => { isInitialized = false; if (shouldRestart) { void initialize(getMainWindow); } }, "onClose"); rotatingStream.on("close", onClose); rotatingStream.on("error", onClose); (0, import_log_std.setPinoDestination)(rotatingStream, import_privacy_node.redactAll); import_electron.ipcMain.removeHandler("fetch-log"); import_electron.ipcMain.handle("fetch-log", async () => { const mainWindow = getMainWindow(); if (!mainWindow) { import_log_std.log.info("Logs were requested, but the main window is missing"); return; } let data; try { const [logEntries, rest] = await Promise.all([ fetchLogs(logPath), fetchAdditionalLogData(mainWindow) ]); data = { logEntries, ...rest }; } catch (error) { import_log_std.log.error(`Problem loading log data: ${Errors.toLogFormat(error)}`); return; } return data; }); import_electron.ipcMain.removeHandler("delete-all-logs"); import_electron.ipcMain.handle("delete-all-logs", async () => { shouldRestart = true; try { await deleteAllLogs(logPath); } catch (error) { import_log_std.log.error(`Problem deleting all logs: ${Errors.toLogFormat(error)}`); } }); return import_log_std.log; } __name(initialize, "initialize"); async function deleteAllLogs(logPath) { await (0, import_promises.rm)(logPath, { recursive: true, force: true }); } __name(deleteAllLogs, "deleteAllLogs"); async function cleanupLogs(logPath) { const now = /* @__PURE__ */ new Date(); const earliestDate = new Date( Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate() - 3) ); try { const remaining = await eliminateOutOfDateFiles(logPath, earliestDate); const files = filter(remaining, (file) => !file.start && file.end); if (!files.length) { return; } await eliminateOldEntries(files, earliestDate); } catch (error) { console.error( "Error cleaning logs; deleting and starting over from scratch.", Errors.toLogFormat(error) ); await deleteAllLogs(logPath); (0, import_node_fs.mkdirSync)(logPath, { recursive: true }); } } __name(cleanupLogs, "cleanupLogs"); function isLineAfterDate(line, date) { if (!line) { return false; } try { const data = JSON.parse(line); return new Date(data.time).getTime() > date.getTime(); } catch (e) { console.log("error parsing log line", Errors.toLogFormat(e), line); return false; } } __name(isLineAfterDate, "isLineAfterDate"); function eliminateOutOfDateFiles(logPath, date) { const files = (0, import_node_fs.readdirSync)(logPath); const paths = files.map((file) => (0, import_node_path.join)(logPath, file)); return Promise.all( map( paths, (target) => Promise.all([(0, import_firstline.default)(target), (0, import_read_last_lines.read)(target, 2)]).then( (results) => { const start = results[0]; const end = results[1].split("\n"); const file = { path: target, start: isLineAfterDate(start, date), end: isLineAfterDate(end[end.length - 1], date) || isLineAfterDate(end[end.length - 2], date) }; if (!file.start && !file.end) { (0, import_node_fs.unlinkSync)(file.path); } return file; } ) ) ); } __name(eliminateOutOfDateFiles, "eliminateOutOfDateFiles"); async function eliminateOldEntries(files, date) { await Promise.all( map( files, (file) => fetchLog(file.path).then((lines) => { const recent = filter(lines, (line) => new Date(line.time) >= date); const text = map(recent, (line) => JSON.stringify(line)).join("\n"); return (0, import_node_fs.writeFileSync)(file.path, `${text} `); }) ) ); } __name(eliminateOldEntries, "eliminateOldEntries"); async function fetchLog(logFile) { const results = new import_cirbuf.CircularBuffer(MAX_LOG_LINES); const rawStream = (0, import_node_fs.createReadStream)(logFile); const jsonStream = rawStream.pipe( (0, import_split2.default)((line) => { try { return JSON.parse(line); } catch (e) { return void 0; } }) ); rawStream.on("error", (error) => jsonStream.emit("error", error)); for await (const line of jsonStream) { const result = line && pick(line, ["level", "time", "msg"]); if (!(0, import_shared_std.isLogEntry)(result)) { continue; } results.push(result); } return results.toArray(); } __name(fetchLog, "fetchLog"); function fetchLogs(logPath) { const files = (0, import_node_fs.readdirSync)(logPath); const paths = files.map((file) => (0, import_node_path.join)(logPath, file)); const fileListEntry = { level: import_shared_std.LogLevel.Info, time: (/* @__PURE__ */ new Date()).toISOString(), msg: `Loaded this list of log files from logPath: ${files.join(", ")}` }; return Promise.all(paths.map(fetchLog)).then((results) => { const data = flatten(results); data.push(fileListEntry); return sortBy(data, (logEntry) => logEntry.time); }); } __name(fetchLogs, "fetchLogs"); const fetchAdditionalLogData = /* @__PURE__ */ __name((mainWindow) => new Promise((resolve) => { mainWindow.webContents.send("additional-log-data-request"); import_electron.ipcMain.once("additional-log-data-response", (_event, data) => { resolve(data); }); }), "fetchAdditionalLogData"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { eliminateOldEntries, eliminateOutOfDateFiles, fetchAdditionalLogData, fetchLog, fetchLogs, initialize, isLineAfterDate }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var shared_std_exports = {}; __export(shared_std_exports, { LogLevel: () => import_Logging_std.LogLevel, getLogLevelString: () => getLogLevelString, isFetchLogIpcData: () => isFetchLogIpcData, isLogEntry: () => isLogEntry, levelMaxLength: () => levelMaxLength }); module.exports = __toCommonJS(shared_std_exports); var import_pino = __toESM(require("pino")); var import_isRecord_std = require("../util/isRecord.std.js"); var import_missingCaseError_std = require("../util/missingCaseError.std.js"); var import_Logging_std = require("../types/Logging.std.js"); const isFetchLogIpcData = /* @__PURE__ */ __name((data) => (0, import_isRecord_std.isRecord)(data) && (0, import_isRecord_std.isRecord)(data.capabilities) && (0, import_isRecord_std.isRecord)(data.remoteConfig) && (0, import_isRecord_std.isRecord)(data.statistics) && (0, import_isRecord_std.isRecord)(data.user) && Array.isArray(data.logEntries), "isFetchLogIpcData"); const isLogEntry = /* @__PURE__ */ __name((data) => { if (!(0, import_isRecord_std.isRecord)(data)) { return false; } const { level, msg, time } = data; if (typeof level !== "number") { return false; } if (!import_Logging_std.LogLevel[level]) { return false; } if (typeof msg !== "string") { return false; } if (typeof time !== "string") { return false; } return !Number.isNaN(new Date(time).getTime()); }, "isLogEntry"); function getLogLevelString(value) { switch (value) { case import_Logging_std.LogLevel.Fatal: return "fatal"; case import_Logging_std.LogLevel.Error: return "error"; case import_Logging_std.LogLevel.Warn: return "warn"; case import_Logging_std.LogLevel.Info: return "info"; case import_Logging_std.LogLevel.Debug: return "debug"; case import_Logging_std.LogLevel.Trace: return "trace"; default: throw (0, import_missingCaseError_std.missingCaseError)(value); } } __name(getLogLevelString, "getLogLevelString"); const levelFromName = (0, import_pino.default)().levels.values; const levelMaxLength = Object.keys(levelFromName).reduce( (maxLength, level) => Math.max(maxLength, level.length), 0 ); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { LogLevel, getLogLevelString, isFetchLogIpcData, isLogEntry, levelMaxLength }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var uploadDebugLog_node_exports = {}; __export(uploadDebugLog_node_exports, { upload: () => upload }); module.exports = __toCommonJS(uploadDebugLog_node_exports); var import_zod = require("zod"); var import_form_data = __toESM(require("form-data")); var import_got = __toESM(require("got")); var import_node_zlib = require("node:zlib"); var import_pify = __toESM(require("pify")); var import_getUserAgent_node = require("../util/getUserAgent.node.js"); var import_url_std = require("../util/url.std.js"); var durations = __toESM(require("../util/durations/index.std.js")); var import_schemas_std = require("../util/schemas.std.js"); const BASE_URL = "https://debuglogs.org"; const UPLOAD_TIMEOUT = { request: durations.MINUTE }; const tokenBodySchema = import_zod.z.object({ fields: import_zod.z.record(import_zod.z.unknown()), url: import_zod.z.string() }).nonstrict(); const parseTokenBody = /* @__PURE__ */ __name((rawBody) => { const body = (0, import_schemas_std.parseUnknown)(tokenBodySchema, rawBody); const parsedUrl = (0, import_url_std.maybeParseUrl)(body.url); if (!parsedUrl) { throw new Error("Token body's URL was not a valid URL"); } if (parsedUrl.protocol !== "https:") { throw new Error("Token body's URL was not HTTPS"); } return body; }, "parseTokenBody"); const upload = /* @__PURE__ */ __name(async ({ content, appVersion, logger, extension = "gz", contentType = "application/gzip", compress = true, prefix }) => { const headers = { "User-Agent": (0, import_getUserAgent_node.getUserAgent)(appVersion) }; const formUrl = new URL(BASE_URL); if (prefix !== void 0) { formUrl.searchParams.set("prefix", prefix); } const signedForm = await import_got.default.get(formUrl.toString(), { responseType: "json", headers, timeout: UPLOAD_TIMEOUT }); const { fields, url } = parseTokenBody(signedForm.body); const uploadKey = `${fields.key}.${extension}`; const form = new import_form_data.default(); form.append("key", uploadKey); Object.entries(fields).filter(([key]) => key !== "key").forEach(([key, value]) => { form.append(key, value); }); const contentBuffer = compress ? await (0, import_pify.default)(import_node_zlib.gzip)(Buffer.from(content)) : Buffer.from(content); form.append("Content-Type", contentType); form.append("file", contentBuffer, { contentType, filename: `signal-desktop-debug-log-${appVersion}.txt.gz` }); logger.info("Debug log upload starting..."); try { const { statusCode, body } = await import_got.default.post(url, { headers, body: form, timeout: UPLOAD_TIMEOUT }); if (statusCode !== 204) { throw new Error( `Failed to upload to S3, got status ${statusCode}, body '${body}'` ); } } catch (error) { const response = error.response; throw new Error( `Got threw on upload to S3: "${error.message}", got status ${response?.statusCode}, body '${response?.body}' ` ); } logger.info("Debug log upload complete."); return `${BASE_URL}/${uploadKey}`; }, "upload"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { upload }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var NativeThemeNotifier_main_exports = {}; __export(NativeThemeNotifier_main_exports, { NativeThemeNotifier: () => NativeThemeNotifier }); module.exports = __toCommonJS(NativeThemeNotifier_main_exports); var import_electron = require("electron"); function getState() { return { shouldUseDarkColors: import_electron.nativeTheme.shouldUseDarkColors }; } __name(getState, "getState"); class NativeThemeNotifier { static { __name(this, "NativeThemeNotifier"); } #listeners = /* @__PURE__ */ new Set(); initialize() { import_electron.nativeTheme.on("updated", () => { this.#notifyListeners(); }); import_electron.ipcMain.on("native-theme:init", (event) => { event.returnValue = getState(); }); } addWindow(window) { if (this.#listeners.has(window)) { return; } this.#listeners.add(window); window.once("closed", () => { this.#listeners.delete(window); }); } #notifyListeners() { for (const window of this.#listeners) { window.webContents.send("native-theme:changed", getState()); } } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { NativeThemeNotifier }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var challengeMain_main_exports = {}; __export(challengeMain_main_exports, { ChallengeMainHandler: () => ChallengeMainHandler }); module.exports = __toCommonJS(challengeMain_main_exports); var import_electron = require("electron"); var import_log_std = require("../logging/log.std.js"); var import_environment_std = require("../environment.std.js"); const log = (0, import_log_std.createLogger)("challengeMain"); class ChallengeMainHandler { static { __name(this, "ChallengeMainHandler"); } #handlers = []; #hardcodedResult; constructor(hardcodedResult) { if (hardcodedResult && (0, import_environment_std.getEnvironment)() === import_environment_std.Environment.Development) { this.#hardcodedResult = { captcha: hardcodedResult }; } this.#initialize(); } handleCaptcha(captcha) { const response = { captcha }; const handlers = this.#handlers; this.#handlers = []; log.info( `handleCaptcha: sending captcha response to ${handlers.length} handlers` ); for (const resolve of handlers) { resolve(response); } } async #onRequest(event, request) { const logId = `challengeMain.onRequest(${request.reason})`; log.info(`${logId}: received challenge request, waiting for response`); const start = Date.now(); const data = this.#hardcodedResult || await new Promise((resolve) => { this.#handlers.push(resolve); }); const duration = Date.now() - start; log.info(`${logId}: got response after ${duration}ms`); const ipcResponse = { seq: request.seq, data }; event.sender.send("challenge:response", ipcResponse); } #initialize() { import_electron.ipcMain.on("challenge:request", (event, request) => { void this.#onRequest(event, request); }); } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { ChallengeMainHandler }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var powerChannel_main_exports = {}; __export(powerChannel_main_exports, { PowerChannel: () => PowerChannel }); module.exports = __toCommonJS(powerChannel_main_exports); var import_electron = require("electron"); class PowerChannel { static { __name(this, "PowerChannel"); } static isInitialized = false; static initialize({ send }) { if (PowerChannel.isInitialized) { throw new Error("PowerChannel already initialized"); } PowerChannel.isInitialized = true; import_electron.powerMonitor.on("suspend", () => { send("power-channel:suspend"); }); import_electron.powerMonitor.on("resume", () => { send("power-channel:resume"); }); import_electron.powerMonitor.on("lock-screen", () => { send("power-channel:lock-screen"); }); } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { PowerChannel }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var settingsChannel_main_exports = {}; __export(settingsChannel_main_exports, { SettingsChannel: () => SettingsChannel }); module.exports = __toCommonJS(settingsChannel_main_exports); var import_electron = require("electron"); var import_node_events = require("node:events"); var import_log_std = require("../logging/log.std.js"); var import_user_config_main = require("../../app/user_config.main.js"); var import_ephemeral_config_main = require("../../app/ephemeral_config.main.js"); var import_permissions_std = require("../../app/permissions.std.js"); var import_assert_std = require("../util/assert.std.js"); const log = (0, import_log_std.createLogger)("settingsChannel"); const EPHEMERAL_NAME_MAP = /* @__PURE__ */ new Map([ ["spellCheck", "spell-check"], ["systemTraySetting", "system-tray-setting"], ["themeSetting", "theme-setting"], ["localeOverride", "localeOverride"], ["contentProtection", "contentProtection"] ]); class SettingsChannel extends import_node_events.EventEmitter { static { __name(this, "SettingsChannel"); } #mainWindow; setMainWindow(mainWindow) { this.#mainWindow = mainWindow; } getMainWindow() { return this.#mainWindow; } openSettingsTab() { if (!this.#mainWindow) { log.warn("openSettingsTab: No mainWindow, cannot open settings tab"); return; } this.#mainWindow.webContents.send("open-settings-tab"); this.#mainWindow.show(); } install() { this.#installEphemeralSetting("themeSetting"); this.#installEphemeralSetting("systemTraySetting"); this.#installEphemeralSetting("localeOverride"); this.#installEphemeralSetting("spellCheck"); this.#installEphemeralSetting("contentProtection"); (0, import_permissions_std.installPermissionsHandler)({ session: import_electron.session.defaultSession, userConfig: import_user_config_main.userConfig }); import_electron.ipcMain.handle("settings:get:mediaPermissions", () => { return import_user_config_main.userConfig.get("mediaPermissions") || false; }); import_electron.ipcMain.handle("settings:get:mediaCameraPermissions", () => { return import_user_config_main.userConfig.get("mediaCameraPermissions"); }); import_electron.ipcMain.handle("settings:set:mediaPermissions", (_event, value) => { import_user_config_main.userConfig.set("mediaPermissions", value); (0, import_permissions_std.installPermissionsHandler)({ session: import_electron.session.defaultSession, userConfig: import_user_config_main.userConfig }); }); import_electron.ipcMain.handle("settings:set:mediaCameraPermissions", (_event, value) => { import_user_config_main.userConfig.set("mediaCameraPermissions", value); (0, import_permissions_std.installPermissionsHandler)({ session: import_electron.session.defaultSession, userConfig: import_user_config_main.userConfig }); }); } #installEphemeralSetting(name) { import_electron.ipcMain.handle(`settings:get:${name}`, async () => { const ephemeralName = EPHEMERAL_NAME_MAP.get(name); (0, import_assert_std.strictAssert)( ephemeralName !== void 0, `${name} is not an ephemeral setting` ); return import_ephemeral_config_main.ephemeralConfig.get(ephemeralName); }); import_electron.ipcMain.handle(`settings:set:${name}`, async (_event, value) => { const ephemeralName = EPHEMERAL_NAME_MAP.get(name); (0, import_assert_std.strictAssert)( ephemeralName !== void 0, `${name} is not an ephemeral setting` ); import_ephemeral_config_main.ephemeralConfig.set(ephemeralName, value); this.emit("ephemeral-setting-changed", name); const mainWindow = this.#mainWindow; if (!mainWindow || !mainWindow.webContents) { return; } mainWindow.webContents.send(`settings:update:${name}`, value); }); } on(type, listener) { return super.on(type, listener); } // eslint-disable-next-line @typescript-eslint/no-explicit-any emit(type, ...args) { return super.emit(type, ...args); } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { SettingsChannel }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var ImageStateType_std_exports = {}; module.exports = __toCommonJS(ImageStateType_std_exports); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var fabricEffectListener_std_exports = {}; __export(fabricEffectListener_std_exports, { fabricEffectListener: () => fabricEffectListener }); module.exports = __toCommonJS(fabricEffectListener_std_exports); function fabricEffectListener(target, eventNames, handler) { for (const eventName of eventNames) { target.on(eventName, handler); } return () => { for (const eventName of eventNames) { target.off(eventName, handler); } }; } __name(fabricEffectListener, "fabricEffectListener"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { fabricEffectListener }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var color_std_exports = {}; __export(color_std_exports, { getHSL: () => getHSL, getRGBA: () => getRGBA, getRGBANumber: () => getRGBANumber }); module.exports = __toCommonJS(color_std_exports); var import_hslToRGB_std = require("../../util/hslToRGB.std.js"); function getRatio(min, max, value) { return (value - min) / (max - min); } __name(getRatio, "getRatio"); const MAX_BLACK = 7; const MIN_WHITE = 95; function getHSLValues(percentage) { if (percentage <= MAX_BLACK) { return [0, 0.5, 0.5 * getRatio(0, MAX_BLACK, percentage)]; } if (percentage >= MIN_WHITE) { return [0, 0, Math.min(1, 0.5 + getRatio(MIN_WHITE, 100, percentage))]; } const ratio = getRatio(MAX_BLACK, MIN_WHITE, percentage); return [338 * ratio, 1, 0.5]; } __name(getHSLValues, "getHSLValues"); function getHSL(percentage) { const [h, s, l] = getHSLValues(percentage); return `hsl(${h}, ${s * 100}%, ${l * 100}%)`; } __name(getHSL, "getHSL"); function getRGBANumber(percentage) { const [h, s, l] = getHSLValues(percentage); const { r, g, b } = (0, import_hslToRGB_std.hslToRGB)(h, s, l); return 4294967296 + (255 << 24 | (255 & r) << 16 | (255 & g) << 8 | b); } __name(getRGBANumber, "getRGBANumber"); function getRGBA(percentage, alpha = 1) { const [h, s, l] = getHSLValues(percentage); const { r, g, b } = (0, import_hslToRGB_std.hslToRGB)(h, s, l); const rgbValue = [r, g, b].map(String).join(","); return `rgba(${rgbValue},${alpha})`; } __name(getRGBA, "getRGBA"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getHSL, getRGBA, getRGBANumber }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var getTextStyleAttributes_std_exports = {}; __export(getTextStyleAttributes_std_exports, { TextStyle: () => TextStyle, getTextStyleAttributes: () => getTextStyleAttributes }); module.exports = __toCommonJS(getTextStyleAttributes_std_exports); var import_log_std = require("../../logging/log.std.js"); var import_color_std = require("./color.std.js"); var import_missingCaseError_std = require("../../util/missingCaseError.std.js"); var import_errors_std = require("../../types/errors.std.js"); const log = (0, import_log_std.createLogger)("getTextStyleAttributes"); var TextStyle = /* @__PURE__ */ ((TextStyle2) => { TextStyle2["Regular"] = "Regular"; TextStyle2["Highlight"] = "Highlight"; TextStyle2["Outline"] = "Outline"; return TextStyle2; })(TextStyle || {}); function getTextStyleAttributes(textStyle, hueSliderValue) { const color = (0, import_color_std.getHSL)(hueSliderValue); switch (textStyle) { case "Regular" /* Regular */: return { fill: color, strokeWidth: 0, textBackgroundColor: "" }; case "Highlight" /* Highlight */: return { fill: hueSliderValue >= 95 ? "#000" : "#fff", strokeWidth: 0, textBackgroundColor: color }; case "Outline" /* Outline */: return { fill: hueSliderValue >= 95 ? "#000" : "#fff", stroke: color, strokeWidth: 2, textBackgroundColor: "" }; default: log.error((0, import_errors_std.toLogFormat)((0, import_missingCaseError_std.missingCaseError)(textStyle))); return getTextStyleAttributes("Regular" /* Regular */, hueSliderValue); } } __name(getTextStyleAttributes, "getTextStyleAttributes"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { TextStyle, getTextStyleAttributes }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var MessageReadStatus_std_exports = {}; __export(MessageReadStatus_std_exports, { ReadStatus: () => ReadStatus, maxReadStatus: () => maxReadStatus }); module.exports = __toCommonJS(MessageReadStatus_std_exports); var ReadStatus = /* @__PURE__ */ ((ReadStatus2) => { ReadStatus2[ReadStatus2["Unread"] = 1] = "Unread"; ReadStatus2[ReadStatus2["Read"] = 0] = "Read"; ReadStatus2[ReadStatus2["Viewed"] = 2] = "Viewed"; return ReadStatus2; })(ReadStatus || {}); const STATUS_NUMBERS = { [1 /* Unread */]: 0, [0 /* Read */]: 1, [2 /* Viewed */]: 2 }; const maxReadStatus = /* @__PURE__ */ __name((a, b) => STATUS_NUMBERS[a] > STATUS_NUMBERS[b] ? a : b, "maxReadStatus"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { ReadStatus, maxReadStatus }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var MessageSendState_std_exports = {}; __export(MessageSendState_std_exports, { SendActionType: () => SendActionType, SendStatus: () => SendStatus, UNDELIVERED_SEND_STATUSES: () => UNDELIVERED_SEND_STATUSES, getHighestSuccessfulRecipientStatus: () => getHighestSuccessfulRecipientStatus, isDelivered: () => isDelivered, isFailed: () => isFailed, isMessageJustForMe: () => isMessageJustForMe, isPending: () => isPending, isRead: () => isRead, isSent: () => isSent, isSkipped: () => isSkipped, isViewed: () => isViewed, maxStatus: () => maxStatus, parseMessageSendStatus: () => parseMessageSendStatus, sendStateReducer: () => sendStateReducer, someRecipientSendStatus: () => someRecipientSendStatus, someSendStatus: () => someSendStatus }); module.exports = __toCommonJS(MessageSendState_std_exports); var import_memoizee = __toESM(require("memoizee")); var import_enum_std = require("../util/enum.std.js"); var SendStatus = /* @__PURE__ */ ((SendStatus2) => { SendStatus2["Failed"] = "Failed"; SendStatus2["Pending"] = "Pending"; SendStatus2["Sent"] = "Sent"; SendStatus2["Delivered"] = "Delivered"; SendStatus2["Read"] = "Read"; SendStatus2["Viewed"] = "Viewed"; SendStatus2["Skipped"] = "Skipped"; return SendStatus2; })(SendStatus || {}); const parseMessageSendStatus = (0, import_enum_std.makeEnumParser)( SendStatus, "Pending" /* Pending */ ); const UNDELIVERED_SEND_STATUSES = [ "Pending" /* Pending */, "Failed" /* Failed */ ]; const STATUS_NUMBERS = { ["Failed" /* Failed */]: 0, ["Pending" /* Pending */]: 1, ["Sent" /* Sent */]: 2, ["Delivered" /* Delivered */]: 3, ["Read" /* Read */]: 4, ["Viewed" /* Viewed */]: 5, ["Skipped" /* Skipped */]: 6 }; const maxStatus = /* @__PURE__ */ __name((a, b) => STATUS_NUMBERS[a] > STATUS_NUMBERS[b] ? a : b, "maxStatus"); const isPending = /* @__PURE__ */ __name((status) => status === "Pending" /* Pending */, "isPending"); const isViewed = /* @__PURE__ */ __name((status) => status === "Viewed" /* Viewed */, "isViewed"); const isRead = /* @__PURE__ */ __name((status) => STATUS_NUMBERS[status] >= STATUS_NUMBERS["Read" /* Read */], "isRead"); const isDelivered = /* @__PURE__ */ __name((status) => STATUS_NUMBERS[status] >= STATUS_NUMBERS["Delivered" /* Delivered */], "isDelivered"); const isSent = /* @__PURE__ */ __name((status) => STATUS_NUMBERS[status] >= STATUS_NUMBERS["Sent" /* Sent */], "isSent"); const isFailed = /* @__PURE__ */ __name((status) => status === "Failed" /* Failed */, "isFailed"); const isSkipped = /* @__PURE__ */ __name((status) => status === "Skipped" /* Skipped */, "isSkipped"); function sendStateReducer(state, action) { const oldStatus = state.status; let newStatus; if (oldStatus === "Pending" /* Pending */ && action.type === 0 /* Failed */) { newStatus = "Failed" /* Failed */; } else { newStatus = maxStatus(oldStatus, STATE_TRANSITIONS[action.type]); } return newStatus === oldStatus ? state : { ...state, status: newStatus, updatedAt: action.updatedAt }; } __name(sendStateReducer, "sendStateReducer"); var SendActionType = /* @__PURE__ */ ((SendActionType2) => { SendActionType2[SendActionType2["Failed"] = 0] = "Failed"; SendActionType2[SendActionType2["ManuallyRetried"] = 1] = "ManuallyRetried"; SendActionType2[SendActionType2["Sent"] = 2] = "Sent"; SendActionType2[SendActionType2["GotDeliveryReceipt"] = 3] = "GotDeliveryReceipt"; SendActionType2[SendActionType2["GotReadReceipt"] = 4] = "GotReadReceipt"; SendActionType2[SendActionType2["GotViewedReceipt"] = 5] = "GotViewedReceipt"; return SendActionType2; })(SendActionType || {}); const STATE_TRANSITIONS = { [0 /* Failed */]: "Failed" /* Failed */, [1 /* ManuallyRetried */]: "Pending" /* Pending */, [2 /* Sent */]: "Sent" /* Sent */, [3 /* GotDeliveryReceipt */]: "Delivered" /* Delivered */, [4 /* GotReadReceipt */]: "Read" /* Read */, [5 /* GotViewedReceipt */]: "Viewed" /* Viewed */ }; const someSendStatus = /* @__PURE__ */ __name((sendStateByConversationId, predicate) => { return [ ...summarizeMessageSendStatuses(sendStateByConversationId).statuses ].some(predicate); }, "someSendStatus"); const someRecipientSendStatus = /* @__PURE__ */ __name((sendStateByConversationId, ourConversationId, predicate) => { return getStatusesIgnoringOurConversationId( sendStateByConversationId, ourConversationId ).some(predicate); }, "someRecipientSendStatus"); const isMessageJustForMe = /* @__PURE__ */ __name((sendStateByConversationId, ourConversationId) => { const { length } = summarizeMessageSendStatuses(sendStateByConversationId); return ourConversationId !== void 0 && length === 1 && Object.hasOwn(sendStateByConversationId, ourConversationId); }, "isMessageJustForMe"); const getHighestSuccessfulRecipientStatus = /* @__PURE__ */ __name((sendStateByConversationId, ourConversationId) => { return getStatusesIgnoringOurConversationId( sendStateByConversationId, ourConversationId ).reduce( (result, status) => maxStatus(result, status), "Pending" /* Pending */ ); }, "getHighestSuccessfulRecipientStatus"); const getStatusesIgnoringOurConversationId = /* @__PURE__ */ __name((sendStateByConversationId, ourConversationId) => { const { statuses, statusesWithOnlyOneConversationId } = summarizeMessageSendStatuses(sendStateByConversationId); const statusesIgnoringOurConversationId = []; for (const status of statuses) { if (ourConversationId && statusesWithOnlyOneConversationId.get(status) === ourConversationId) { } else { statusesIgnoringOurConversationId.push(status); } } return statusesIgnoringOurConversationId; }, "getStatusesIgnoringOurConversationId"); const summarizeMessageSendStatuses = (0, import_memoizee.default)( (sendStateByConversationId) => { const statuses = /* @__PURE__ */ new Set(); const statusesWithOnlyOneConversationId = /* @__PURE__ */ new Map(); const entries = Object.entries(sendStateByConversationId); for (const [conversationId, { status }] of entries) { if (!statuses.has(status)) { statuses.add(status); statusesWithOnlyOneConversationId.set(status, conversationId); } else { statusesWithOnlyOneConversationId.delete(status); } } return { statuses, statusesWithOnlyOneConversationId, length: entries.length }; }, { max: 100 } ); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { SendActionType, SendStatus, UNDELIVERED_SEND_STATUSES, getHighestSuccessfulRecipientStatus, isDelivered, isFailed, isMessageJustForMe, isPending, isRead, isSent, isSkipped, isViewed, maxStatus, parseMessageSendStatus, sendStateReducer, someRecipientSendStatus, someSendStatus }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var helpers_std_exports = {}; __export(helpers_std_exports, { isCustomError: () => isCustomError, isIncoming: () => isIncoming, isIncomingStory: () => isIncomingStory, isOutgoing: () => isOutgoing, isOutgoingStory: () => isOutgoingStory, isPoll: () => isPoll, isStory: () => isStory, shouldTryToCopyFromQuotedMessage: () => shouldTryToCopyFromQuotedMessage }); module.exports = __toCommonJS(helpers_std_exports); function isIncoming(message) { return message.type === "incoming"; } __name(isIncoming, "isIncoming"); function isOutgoing(message) { return message.type === "outgoing"; } __name(isOutgoing, "isOutgoing"); function isStory(message) { return message.type === "story"; } __name(isStory, "isStory"); function isFromUs(message, ourAci) { return message.sourceServiceId === ourAci; } __name(isFromUs, "isFromUs"); function isOutgoingStory(message, ourAci) { return isStory(message) && isFromUs(message, ourAci); } __name(isOutgoingStory, "isOutgoingStory"); function isIncomingStory(message, ourAci) { return isStory(message) && !isFromUs(message, ourAci); } __name(isIncomingStory, "isIncomingStory"); const isCustomError = /* @__PURE__ */ __name((e) => e instanceof Error, "isCustomError"); const shouldTryToCopyFromQuotedMessage = /* @__PURE__ */ __name(({ referencedMessageNotFound, quoteAttachment }) => { if (referencedMessageNotFound === true) { return true; } if (!quoteAttachment?.thumbnail) { return false; } if (quoteAttachment.thumbnail.path) { return false; } return true; }, "shouldTryToCopyFromQuotedMessage"); function isPoll(message) { return Boolean(message.poll); } __name(isPoll, "isPoll"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { isCustomError, isIncoming, isIncomingStory, isOutgoing, isOutgoingStory, isPoll, isStory, shouldTryToCopyFromQuotedMessage }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var migrateLegacyReadStatus_std_exports = {}; __export(migrateLegacyReadStatus_std_exports, { migrateLegacyReadStatus: () => migrateLegacyReadStatus }); module.exports = __toCommonJS(migrateLegacyReadStatus_std_exports); var import_MessageReadStatus_std = require("./MessageReadStatus.std.js"); function migrateLegacyReadStatus(message) { const shouldMigrate = message.readStatus == null; if (!shouldMigrate) { return; } const legacyUnread = message.unread; return legacyUnread ? import_MessageReadStatus_std.ReadStatus.Unread : import_MessageReadStatus_std.ReadStatus.Read; } __name(migrateLegacyReadStatus, "migrateLegacyReadStatus"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { migrateLegacyReadStatus }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var payments_std_exports = {}; __export(payments_std_exports, { getPaymentEventDescription: () => getPaymentEventDescription, getPaymentEventNotificationText: () => getPaymentEventNotificationText, messageHasPaymentEvent: () => messageHasPaymentEvent }); module.exports = __toCommonJS(payments_std_exports); var import_Payment_std = require("../types/Payment.std.js"); var import_missingCaseError_std = require("../util/missingCaseError.std.js"); function messageHasPaymentEvent(message) { return message.payment != null; } __name(messageHasPaymentEvent, "messageHasPaymentEvent"); function getPaymentEventNotificationText(payment, senderTitle, conversationTitle, senderIsMe, i18n) { if (payment.kind === import_Payment_std.PaymentEventKind.Notification) { return i18n("icu:payment-event-notification-label"); } return getPaymentEventDescription( payment, senderTitle, conversationTitle, senderIsMe, i18n ); } __name(getPaymentEventNotificationText, "getPaymentEventNotificationText"); function getPaymentEventDescription(payment, senderTitle, conversationTitle, senderIsMe, i18n) { const { kind } = payment; if (kind === import_Payment_std.PaymentEventKind.Notification) { if (senderIsMe) { if (conversationTitle != null) { return i18n("icu:payment-event-notification-message-you-label", { receiver: conversationTitle }); } return i18n( "icu:payment-event-notification-message-you-label-without-receiver" ); } return i18n("icu:payment-event-notification-message-label", { sender: senderTitle }); } if (kind === import_Payment_std.PaymentEventKind.ActivationRequest) { if (senderIsMe) { if (conversationTitle != null) { return i18n("icu:payment-event-activation-request-you-label", { receiver: conversationTitle }); } return i18n( "icu:payment-event-activation-request-you-label-without-receiver" ); } return i18n("icu:payment-event-activation-request-label", { sender: senderTitle }); } if (kind === import_Payment_std.PaymentEventKind.Activation) { if (senderIsMe) { return i18n("icu:payment-event-activated-you-label"); } return i18n("icu:payment-event-activated-label", { sender: senderTitle }); } throw (0, import_missingCaseError_std.missingCaseError)(kind); } __name(getPaymentEventDescription, "getPaymentEventDescription"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getPaymentEventDescription, getPaymentEventNotificationText, messageHasPaymentEvent }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var util_std_exports = {}; __export(util_std_exports, { getUnsentConversationIds: () => getUnsentConversationIds, isOutgoingPollVoteCompletelyUnsent: () => isOutgoingPollVoteCompletelyUnsent, markOutgoingPollVoteFailed: () => markOutgoingPollVoteFailed, markOutgoingPollVoteSent: () => markOutgoingPollVoteSent }); module.exports = __toCommonJS(util_std_exports); var import_lodash = require("lodash"); var import_MessageSendState_std = require("../messages/MessageSendState.std.js"); function* getUnsentConversationIds(pollVote) { const { sendStateByConversationId = {} } = pollVote; for (const [id, sendState] of Object.entries(sendStateByConversationId)) { if (!(0, import_MessageSendState_std.isSent)(sendState.status)) { yield id; } } } __name(getUnsentConversationIds, "getUnsentConversationIds"); function isOutgoingPollVoteCompletelyUnsent(pollVote) { if (!pollVote.sendStateByConversationId) { return false; } return Object.values(pollVote.sendStateByConversationId).every( (sendState) => !(0, import_MessageSendState_std.isSent)(sendState.status) ); } __name(isOutgoingPollVoteCompletelyUnsent, "isOutgoingPollVoteCompletelyUnsent"); function markOutgoingPollVoteSent(allVotes, targetVote, ephemeralSendStateByConversationId) { const result = []; const mergedSendStateByConversationId = { ...targetVote.sendStateByConversationId || {}, ...ephemeralSendStateByConversationId }; const isFullySent = Object.values(mergedSendStateByConversationId).every( (sendState) => (0, import_MessageSendState_std.isSent)(sendState.status) ); for (const vote of allVotes) { const isTargetVote = vote.fromConversationId === targetVote.fromConversationId && vote.voteCount === targetVote.voteCount; if (isTargetVote) { if (isFullySent) { result.push((0, import_lodash.omit)(vote, ["sendStateByConversationId"])); } else { result.push({ ...vote, sendStateByConversationId: mergedSendStateByConversationId }); } } else { const shouldKeep = !(isFullySent && vote.fromConversationId === targetVote.fromConversationId && !vote.sendStateByConversationId && // finished sending so no send state vote.voteCount < targetVote.voteCount); if (shouldKeep) { result.push(vote); } } } return result; } __name(markOutgoingPollVoteSent, "markOutgoingPollVoteSent"); function markOutgoingPollVoteFailed(allVotes, targetVote) { if (isOutgoingPollVoteCompletelyUnsent(targetVote)) { return allVotes.filter( (candidateVote) => candidateVote.fromConversationId !== targetVote.fromConversationId || candidateVote.voteCount !== targetVote.voteCount ); } return allVotes.map( (candidateVote) => candidateVote.fromConversationId === targetVote.fromConversationId && candidateVote.voteCount === targetVote.voteCount ? (0, import_lodash.omit)(candidateVote, ["sendStateByConversationId"]) : candidateVote ); } __name(markOutgoingPollVoteFailed, "markOutgoingPollVoteFailed"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getUnsentConversationIds, isOutgoingPollVoteCompletelyUnsent, markOutgoingPollVoteFailed, markOutgoingPollVoteSent }); /*eslint-disable block-scoped-var, id-length, no-control-regex, no-magic-numbers, no-prototype-builtins, no-redeclare, no-shadow, no-var, sort-vars*/ "use strict"; var $protobuf = require("protobufjs/minimal"); // Common aliases var $Reader = $protobuf.Reader, $Writer = $protobuf.Writer, $util = $protobuf.util; // Exported root namespace var $root = $protobuf.roots["signal-desktop"] || ($protobuf.roots["signal-desktop"] = {}); $root.signalservice = (function() { /** * Namespace signalservice. * @exports signalservice * @namespace */ var signalservice = {}; signalservice.ArtProvisioningEnvelope = (function() { /** * Properties of an ArtProvisioningEnvelope. * @memberof signalservice * @interface IArtProvisioningEnvelope * @property {Uint8Array|null} [publicKey] ArtProvisioningEnvelope publicKey * @property {Uint8Array|null} [ciphertext] ArtProvisioningEnvelope ciphertext */ /** * Constructs a new ArtProvisioningEnvelope. * @memberof signalservice * @classdesc Represents an ArtProvisioningEnvelope. * @implements IArtProvisioningEnvelope * @constructor * @param {signalservice.IArtProvisioningEnvelope=} [properties] Properties to set */ function ArtProvisioningEnvelope(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * ArtProvisioningEnvelope publicKey. * @member {Uint8Array} publicKey * @memberof signalservice.ArtProvisioningEnvelope * @instance */ ArtProvisioningEnvelope.prototype.publicKey = $util.newBuffer([]); /** * ArtProvisioningEnvelope ciphertext. * @member {Uint8Array} ciphertext * @memberof signalservice.ArtProvisioningEnvelope * @instance */ ArtProvisioningEnvelope.prototype.ciphertext = $util.newBuffer([]); /** * Encodes the specified ArtProvisioningEnvelope message. Does not implicitly {@link signalservice.ArtProvisioningEnvelope.verify|verify} messages. * @function encode * @memberof signalservice.ArtProvisioningEnvelope * @static * @param {signalservice.IArtProvisioningEnvelope} message ArtProvisioningEnvelope message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ArtProvisioningEnvelope.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.ArtProvisioningEnvelope.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.ArtProvisioningEnvelope.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.publicKey != null && Object.hasOwnProperty.call(message, "publicKey")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.publicKey); if (message.ciphertext != null && Object.hasOwnProperty.call(message, "ciphertext")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.ciphertext); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified ArtProvisioningEnvelope message, length delimited. Does not implicitly {@link signalservice.ArtProvisioningEnvelope.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.ArtProvisioningEnvelope * @static * @param {signalservice.IArtProvisioningEnvelope} message ArtProvisioningEnvelope message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ArtProvisioningEnvelope.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an ArtProvisioningEnvelope message from the specified reader or buffer. * @function decode * @memberof signalservice.ArtProvisioningEnvelope * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.ArtProvisioningEnvelope} ArtProvisioningEnvelope * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ArtProvisioningEnvelope.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.ArtProvisioningEnvelope(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.publicKey = reader.bytes(); break; } case 2: { message.ciphertext = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an ArtProvisioningEnvelope message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.ArtProvisioningEnvelope * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.ArtProvisioningEnvelope} ArtProvisioningEnvelope * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ArtProvisioningEnvelope.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return ArtProvisioningEnvelope; })(); signalservice.ArtProvisioningMessage = (function() { /** * Properties of an ArtProvisioningMessage. * @memberof signalservice * @interface IArtProvisioningMessage * @property {string|null} [username] ArtProvisioningMessage username * @property {string|null} [password] ArtProvisioningMessage password */ /** * Constructs a new ArtProvisioningMessage. * @memberof signalservice * @classdesc Represents an ArtProvisioningMessage. * @implements IArtProvisioningMessage * @constructor * @param {signalservice.IArtProvisioningMessage=} [properties] Properties to set */ function ArtProvisioningMessage(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * ArtProvisioningMessage username. * @member {string} username * @memberof signalservice.ArtProvisioningMessage * @instance */ ArtProvisioningMessage.prototype.username = ""; /** * ArtProvisioningMessage password. * @member {string} password * @memberof signalservice.ArtProvisioningMessage * @instance */ ArtProvisioningMessage.prototype.password = ""; /** * Encodes the specified ArtProvisioningMessage message. Does not implicitly {@link signalservice.ArtProvisioningMessage.verify|verify} messages. * @function encode * @memberof signalservice.ArtProvisioningMessage * @static * @param {signalservice.IArtProvisioningMessage} message ArtProvisioningMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ArtProvisioningMessage.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.ArtProvisioningMessage.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.ArtProvisioningMessage.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.username != null && Object.hasOwnProperty.call(message, "username")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.username); if (message.password != null && Object.hasOwnProperty.call(message, "password")) writer.uint32(/* id 2, wireType 2 =*/18).string(message.password); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified ArtProvisioningMessage message, length delimited. Does not implicitly {@link signalservice.ArtProvisioningMessage.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.ArtProvisioningMessage * @static * @param {signalservice.IArtProvisioningMessage} message ArtProvisioningMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ArtProvisioningMessage.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an ArtProvisioningMessage message from the specified reader or buffer. * @function decode * @memberof signalservice.ArtProvisioningMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.ArtProvisioningMessage} ArtProvisioningMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ArtProvisioningMessage.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.ArtProvisioningMessage(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.username = reader.string(); break; } case 2: { message.password = reader.string(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an ArtProvisioningMessage message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.ArtProvisioningMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.ArtProvisioningMessage} ArtProvisioningMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ArtProvisioningMessage.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return ArtProvisioningMessage; })(); signalservice.SubmitCallQualitySurveyRequest = (function() { /** * Properties of a SubmitCallQualitySurveyRequest. * @memberof signalservice * @interface ISubmitCallQualitySurveyRequest * @property {boolean|null} [userSatisfied] SubmitCallQualitySurveyRequest userSatisfied * @property {Array.|null} [callQualityIssues] SubmitCallQualitySurveyRequest callQualityIssues * @property {string|null} [additionalIssuesDescription] SubmitCallQualitySurveyRequest additionalIssuesDescription * @property {string|null} [debugLogUrl] SubmitCallQualitySurveyRequest debugLogUrl * @property {Long|null} [startTimestamp] SubmitCallQualitySurveyRequest startTimestamp * @property {Long|null} [endTimestamp] SubmitCallQualitySurveyRequest endTimestamp * @property {string|null} [callType] SubmitCallQualitySurveyRequest callType * @property {boolean|null} [success] SubmitCallQualitySurveyRequest success * @property {string|null} [callEndReason] SubmitCallQualitySurveyRequest callEndReason * @property {number|null} [connectionRttMedian] SubmitCallQualitySurveyRequest connectionRttMedian * @property {number|null} [audioRttMedian] SubmitCallQualitySurveyRequest audioRttMedian * @property {number|null} [videoRttMedian] SubmitCallQualitySurveyRequest videoRttMedian * @property {number|null} [audioRecvJitterMedian] SubmitCallQualitySurveyRequest audioRecvJitterMedian * @property {number|null} [videoRecvJitterMedian] SubmitCallQualitySurveyRequest videoRecvJitterMedian * @property {number|null} [audioSendJitterMedian] SubmitCallQualitySurveyRequest audioSendJitterMedian * @property {number|null} [videoSendJitterMedian] SubmitCallQualitySurveyRequest videoSendJitterMedian * @property {number|null} [audioRecvPacketLossFraction] SubmitCallQualitySurveyRequest audioRecvPacketLossFraction * @property {number|null} [videoRecvPacketLossFraction] SubmitCallQualitySurveyRequest videoRecvPacketLossFraction * @property {number|null} [audioSendPacketLossFraction] SubmitCallQualitySurveyRequest audioSendPacketLossFraction * @property {number|null} [videoSendPacketLossFraction] SubmitCallQualitySurveyRequest videoSendPacketLossFraction * @property {Uint8Array|null} [callTelemetry] SubmitCallQualitySurveyRequest callTelemetry */ /** * Constructs a new SubmitCallQualitySurveyRequest. * @memberof signalservice * @classdesc Represents a SubmitCallQualitySurveyRequest. * @implements ISubmitCallQualitySurveyRequest * @constructor * @param {signalservice.ISubmitCallQualitySurveyRequest=} [properties] Properties to set */ function SubmitCallQualitySurveyRequest(properties) { this.callQualityIssues = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * SubmitCallQualitySurveyRequest userSatisfied. * @member {boolean} userSatisfied * @memberof signalservice.SubmitCallQualitySurveyRequest * @instance */ SubmitCallQualitySurveyRequest.prototype.userSatisfied = false; /** * SubmitCallQualitySurveyRequest callQualityIssues. * @member {Array.} callQualityIssues * @memberof signalservice.SubmitCallQualitySurveyRequest * @instance */ SubmitCallQualitySurveyRequest.prototype.callQualityIssues = $util.emptyArray; /** * SubmitCallQualitySurveyRequest additionalIssuesDescription. * @member {string|null|undefined} additionalIssuesDescription * @memberof signalservice.SubmitCallQualitySurveyRequest * @instance */ SubmitCallQualitySurveyRequest.prototype.additionalIssuesDescription = null; /** * SubmitCallQualitySurveyRequest debugLogUrl. * @member {string|null|undefined} debugLogUrl * @memberof signalservice.SubmitCallQualitySurveyRequest * @instance */ SubmitCallQualitySurveyRequest.prototype.debugLogUrl = null; /** * SubmitCallQualitySurveyRequest startTimestamp. * @member {Long} startTimestamp * @memberof signalservice.SubmitCallQualitySurveyRequest * @instance */ SubmitCallQualitySurveyRequest.prototype.startTimestamp = $util.Long ? $util.Long.fromBits(0,0,false) : 0; /** * SubmitCallQualitySurveyRequest endTimestamp. * @member {Long} endTimestamp * @memberof signalservice.SubmitCallQualitySurveyRequest * @instance */ SubmitCallQualitySurveyRequest.prototype.endTimestamp = $util.Long ? $util.Long.fromBits(0,0,false) : 0; /** * SubmitCallQualitySurveyRequest callType. * @member {string} callType * @memberof signalservice.SubmitCallQualitySurveyRequest * @instance */ SubmitCallQualitySurveyRequest.prototype.callType = ""; /** * SubmitCallQualitySurveyRequest success. * @member {boolean} success * @memberof signalservice.SubmitCallQualitySurveyRequest * @instance */ SubmitCallQualitySurveyRequest.prototype.success = false; /** * SubmitCallQualitySurveyRequest callEndReason. * @member {string} callEndReason * @memberof signalservice.SubmitCallQualitySurveyRequest * @instance */ SubmitCallQualitySurveyRequest.prototype.callEndReason = ""; /** * SubmitCallQualitySurveyRequest connectionRttMedian. * @member {number|null|undefined} connectionRttMedian * @memberof signalservice.SubmitCallQualitySurveyRequest * @instance */ SubmitCallQualitySurveyRequest.prototype.connectionRttMedian = null; /** * SubmitCallQualitySurveyRequest audioRttMedian. * @member {number|null|undefined} audioRttMedian * @memberof signalservice.SubmitCallQualitySurveyRequest * @instance */ SubmitCallQualitySurveyRequest.prototype.audioRttMedian = null; /** * SubmitCallQualitySurveyRequest videoRttMedian. * @member {number|null|undefined} videoRttMedian * @memberof signalservice.SubmitCallQualitySurveyRequest * @instance */ SubmitCallQualitySurveyRequest.prototype.videoRttMedian = null; /** * SubmitCallQualitySurveyRequest audioRecvJitterMedian. * @member {number|null|undefined} audioRecvJitterMedian * @memberof signalservice.SubmitCallQualitySurveyRequest * @instance */ SubmitCallQualitySurveyRequest.prototype.audioRecvJitterMedian = null; /** * SubmitCallQualitySurveyRequest videoRecvJitterMedian. * @member {number|null|undefined} videoRecvJitterMedian * @memberof signalservice.SubmitCallQualitySurveyRequest * @instance */ SubmitCallQualitySurveyRequest.prototype.videoRecvJitterMedian = null; /** * SubmitCallQualitySurveyRequest audioSendJitterMedian. * @member {number|null|undefined} audioSendJitterMedian * @memberof signalservice.SubmitCallQualitySurveyRequest * @instance */ SubmitCallQualitySurveyRequest.prototype.audioSendJitterMedian = null; /** * SubmitCallQualitySurveyRequest videoSendJitterMedian. * @member {number|null|undefined} videoSendJitterMedian * @memberof signalservice.SubmitCallQualitySurveyRequest * @instance */ SubmitCallQualitySurveyRequest.prototype.videoSendJitterMedian = null; /** * SubmitCallQualitySurveyRequest audioRecvPacketLossFraction. * @member {number|null|undefined} audioRecvPacketLossFraction * @memberof signalservice.SubmitCallQualitySurveyRequest * @instance */ SubmitCallQualitySurveyRequest.prototype.audioRecvPacketLossFraction = null; /** * SubmitCallQualitySurveyRequest videoRecvPacketLossFraction. * @member {number|null|undefined} videoRecvPacketLossFraction * @memberof signalservice.SubmitCallQualitySurveyRequest * @instance */ SubmitCallQualitySurveyRequest.prototype.videoRecvPacketLossFraction = null; /** * SubmitCallQualitySurveyRequest audioSendPacketLossFraction. * @member {number|null|undefined} audioSendPacketLossFraction * @memberof signalservice.SubmitCallQualitySurveyRequest * @instance */ SubmitCallQualitySurveyRequest.prototype.audioSendPacketLossFraction = null; /** * SubmitCallQualitySurveyRequest videoSendPacketLossFraction. * @member {number|null|undefined} videoSendPacketLossFraction * @memberof signalservice.SubmitCallQualitySurveyRequest * @instance */ SubmitCallQualitySurveyRequest.prototype.videoSendPacketLossFraction = null; /** * SubmitCallQualitySurveyRequest callTelemetry. * @member {Uint8Array|null|undefined} callTelemetry * @memberof signalservice.SubmitCallQualitySurveyRequest * @instance */ SubmitCallQualitySurveyRequest.prototype.callTelemetry = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * SubmitCallQualitySurveyRequest _additionalIssuesDescription. * @member {"additionalIssuesDescription"|undefined} _additionalIssuesDescription * @memberof signalservice.SubmitCallQualitySurveyRequest * @instance */ Object.defineProperty(SubmitCallQualitySurveyRequest.prototype, "_additionalIssuesDescription", { get: $util.oneOfGetter($oneOfFields = ["additionalIssuesDescription"]), set: $util.oneOfSetter($oneOfFields) }); /** * SubmitCallQualitySurveyRequest _debugLogUrl. * @member {"debugLogUrl"|undefined} _debugLogUrl * @memberof signalservice.SubmitCallQualitySurveyRequest * @instance */ Object.defineProperty(SubmitCallQualitySurveyRequest.prototype, "_debugLogUrl", { get: $util.oneOfGetter($oneOfFields = ["debugLogUrl"]), set: $util.oneOfSetter($oneOfFields) }); /** * SubmitCallQualitySurveyRequest _connectionRttMedian. * @member {"connectionRttMedian"|undefined} _connectionRttMedian * @memberof signalservice.SubmitCallQualitySurveyRequest * @instance */ Object.defineProperty(SubmitCallQualitySurveyRequest.prototype, "_connectionRttMedian", { get: $util.oneOfGetter($oneOfFields = ["connectionRttMedian"]), set: $util.oneOfSetter($oneOfFields) }); /** * SubmitCallQualitySurveyRequest _audioRttMedian. * @member {"audioRttMedian"|undefined} _audioRttMedian * @memberof signalservice.SubmitCallQualitySurveyRequest * @instance */ Object.defineProperty(SubmitCallQualitySurveyRequest.prototype, "_audioRttMedian", { get: $util.oneOfGetter($oneOfFields = ["audioRttMedian"]), set: $util.oneOfSetter($oneOfFields) }); /** * SubmitCallQualitySurveyRequest _videoRttMedian. * @member {"videoRttMedian"|undefined} _videoRttMedian * @memberof signalservice.SubmitCallQualitySurveyRequest * @instance */ Object.defineProperty(SubmitCallQualitySurveyRequest.prototype, "_videoRttMedian", { get: $util.oneOfGetter($oneOfFields = ["videoRttMedian"]), set: $util.oneOfSetter($oneOfFields) }); /** * SubmitCallQualitySurveyRequest _audioRecvJitterMedian. * @member {"audioRecvJitterMedian"|undefined} _audioRecvJitterMedian * @memberof signalservice.SubmitCallQualitySurveyRequest * @instance */ Object.defineProperty(SubmitCallQualitySurveyRequest.prototype, "_audioRecvJitterMedian", { get: $util.oneOfGetter($oneOfFields = ["audioRecvJitterMedian"]), set: $util.oneOfSetter($oneOfFields) }); /** * SubmitCallQualitySurveyRequest _videoRecvJitterMedian. * @member {"videoRecvJitterMedian"|undefined} _videoRecvJitterMedian * @memberof signalservice.SubmitCallQualitySurveyRequest * @instance */ Object.defineProperty(SubmitCallQualitySurveyRequest.prototype, "_videoRecvJitterMedian", { get: $util.oneOfGetter($oneOfFields = ["videoRecvJitterMedian"]), set: $util.oneOfSetter($oneOfFields) }); /** * SubmitCallQualitySurveyRequest _audioSendJitterMedian. * @member {"audioSendJitterMedian"|undefined} _audioSendJitterMedian * @memberof signalservice.SubmitCallQualitySurveyRequest * @instance */ Object.defineProperty(SubmitCallQualitySurveyRequest.prototype, "_audioSendJitterMedian", { get: $util.oneOfGetter($oneOfFields = ["audioSendJitterMedian"]), set: $util.oneOfSetter($oneOfFields) }); /** * SubmitCallQualitySurveyRequest _videoSendJitterMedian. * @member {"videoSendJitterMedian"|undefined} _videoSendJitterMedian * @memberof signalservice.SubmitCallQualitySurveyRequest * @instance */ Object.defineProperty(SubmitCallQualitySurveyRequest.prototype, "_videoSendJitterMedian", { get: $util.oneOfGetter($oneOfFields = ["videoSendJitterMedian"]), set: $util.oneOfSetter($oneOfFields) }); /** * SubmitCallQualitySurveyRequest _audioRecvPacketLossFraction. * @member {"audioRecvPacketLossFraction"|undefined} _audioRecvPacketLossFraction * @memberof signalservice.SubmitCallQualitySurveyRequest * @instance */ Object.defineProperty(SubmitCallQualitySurveyRequest.prototype, "_audioRecvPacketLossFraction", { get: $util.oneOfGetter($oneOfFields = ["audioRecvPacketLossFraction"]), set: $util.oneOfSetter($oneOfFields) }); /** * SubmitCallQualitySurveyRequest _videoRecvPacketLossFraction. * @member {"videoRecvPacketLossFraction"|undefined} _videoRecvPacketLossFraction * @memberof signalservice.SubmitCallQualitySurveyRequest * @instance */ Object.defineProperty(SubmitCallQualitySurveyRequest.prototype, "_videoRecvPacketLossFraction", { get: $util.oneOfGetter($oneOfFields = ["videoRecvPacketLossFraction"]), set: $util.oneOfSetter($oneOfFields) }); /** * SubmitCallQualitySurveyRequest _audioSendPacketLossFraction. * @member {"audioSendPacketLossFraction"|undefined} _audioSendPacketLossFraction * @memberof signalservice.SubmitCallQualitySurveyRequest * @instance */ Object.defineProperty(SubmitCallQualitySurveyRequest.prototype, "_audioSendPacketLossFraction", { get: $util.oneOfGetter($oneOfFields = ["audioSendPacketLossFraction"]), set: $util.oneOfSetter($oneOfFields) }); /** * SubmitCallQualitySurveyRequest _videoSendPacketLossFraction. * @member {"videoSendPacketLossFraction"|undefined} _videoSendPacketLossFraction * @memberof signalservice.SubmitCallQualitySurveyRequest * @instance */ Object.defineProperty(SubmitCallQualitySurveyRequest.prototype, "_videoSendPacketLossFraction", { get: $util.oneOfGetter($oneOfFields = ["videoSendPacketLossFraction"]), set: $util.oneOfSetter($oneOfFields) }); /** * SubmitCallQualitySurveyRequest _callTelemetry. * @member {"callTelemetry"|undefined} _callTelemetry * @memberof signalservice.SubmitCallQualitySurveyRequest * @instance */ Object.defineProperty(SubmitCallQualitySurveyRequest.prototype, "_callTelemetry", { get: $util.oneOfGetter($oneOfFields = ["callTelemetry"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified SubmitCallQualitySurveyRequest message. Does not implicitly {@link signalservice.SubmitCallQualitySurveyRequest.verify|verify} messages. * @function encode * @memberof signalservice.SubmitCallQualitySurveyRequest * @static * @param {signalservice.ISubmitCallQualitySurveyRequest} message SubmitCallQualitySurveyRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ SubmitCallQualitySurveyRequest.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.SubmitCallQualitySurveyRequest.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.SubmitCallQualitySurveyRequest.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.userSatisfied != null && Object.hasOwnProperty.call(message, "userSatisfied")) writer.uint32(/* id 1, wireType 0 =*/8).bool(message.userSatisfied); if (message.callQualityIssues != null && message.callQualityIssues.length) for (var i = 0; i < message.callQualityIssues.length; ++i) writer.uint32(/* id 2, wireType 2 =*/18).string(message.callQualityIssues[i]); if (message.additionalIssuesDescription != null && Object.hasOwnProperty.call(message, "additionalIssuesDescription")) writer.uint32(/* id 3, wireType 2 =*/26).string(message.additionalIssuesDescription); if (message.debugLogUrl != null && Object.hasOwnProperty.call(message, "debugLogUrl")) writer.uint32(/* id 4, wireType 2 =*/34).string(message.debugLogUrl); if (message.startTimestamp != null && Object.hasOwnProperty.call(message, "startTimestamp")) writer.uint32(/* id 5, wireType 0 =*/40).int64(message.startTimestamp); if (message.endTimestamp != null && Object.hasOwnProperty.call(message, "endTimestamp")) writer.uint32(/* id 6, wireType 0 =*/48).int64(message.endTimestamp); if (message.callType != null && Object.hasOwnProperty.call(message, "callType")) writer.uint32(/* id 7, wireType 2 =*/58).string(message.callType); if (message.success != null && Object.hasOwnProperty.call(message, "success")) writer.uint32(/* id 8, wireType 0 =*/64).bool(message.success); if (message.callEndReason != null && Object.hasOwnProperty.call(message, "callEndReason")) writer.uint32(/* id 9, wireType 2 =*/74).string(message.callEndReason); if (message.connectionRttMedian != null && Object.hasOwnProperty.call(message, "connectionRttMedian")) writer.uint32(/* id 10, wireType 5 =*/85).float(message.connectionRttMedian); if (message.audioRttMedian != null && Object.hasOwnProperty.call(message, "audioRttMedian")) writer.uint32(/* id 11, wireType 5 =*/93).float(message.audioRttMedian); if (message.videoRttMedian != null && Object.hasOwnProperty.call(message, "videoRttMedian")) writer.uint32(/* id 12, wireType 5 =*/101).float(message.videoRttMedian); if (message.audioRecvJitterMedian != null && Object.hasOwnProperty.call(message, "audioRecvJitterMedian")) writer.uint32(/* id 13, wireType 5 =*/109).float(message.audioRecvJitterMedian); if (message.videoRecvJitterMedian != null && Object.hasOwnProperty.call(message, "videoRecvJitterMedian")) writer.uint32(/* id 14, wireType 5 =*/117).float(message.videoRecvJitterMedian); if (message.audioSendJitterMedian != null && Object.hasOwnProperty.call(message, "audioSendJitterMedian")) writer.uint32(/* id 15, wireType 5 =*/125).float(message.audioSendJitterMedian); if (message.videoSendJitterMedian != null && Object.hasOwnProperty.call(message, "videoSendJitterMedian")) writer.uint32(/* id 16, wireType 5 =*/133).float(message.videoSendJitterMedian); if (message.audioRecvPacketLossFraction != null && Object.hasOwnProperty.call(message, "audioRecvPacketLossFraction")) writer.uint32(/* id 17, wireType 5 =*/141).float(message.audioRecvPacketLossFraction); if (message.videoRecvPacketLossFraction != null && Object.hasOwnProperty.call(message, "videoRecvPacketLossFraction")) writer.uint32(/* id 18, wireType 5 =*/149).float(message.videoRecvPacketLossFraction); if (message.audioSendPacketLossFraction != null && Object.hasOwnProperty.call(message, "audioSendPacketLossFraction")) writer.uint32(/* id 19, wireType 5 =*/157).float(message.audioSendPacketLossFraction); if (message.videoSendPacketLossFraction != null && Object.hasOwnProperty.call(message, "videoSendPacketLossFraction")) writer.uint32(/* id 20, wireType 5 =*/165).float(message.videoSendPacketLossFraction); if (message.callTelemetry != null && Object.hasOwnProperty.call(message, "callTelemetry")) writer.uint32(/* id 21, wireType 2 =*/170).bytes(message.callTelemetry); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified SubmitCallQualitySurveyRequest message, length delimited. Does not implicitly {@link signalservice.SubmitCallQualitySurveyRequest.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.SubmitCallQualitySurveyRequest * @static * @param {signalservice.ISubmitCallQualitySurveyRequest} message SubmitCallQualitySurveyRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ SubmitCallQualitySurveyRequest.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a SubmitCallQualitySurveyRequest message from the specified reader or buffer. * @function decode * @memberof signalservice.SubmitCallQualitySurveyRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.SubmitCallQualitySurveyRequest} SubmitCallQualitySurveyRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ SubmitCallQualitySurveyRequest.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.SubmitCallQualitySurveyRequest(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.userSatisfied = reader.bool(); break; } case 2: { if (!(message.callQualityIssues && message.callQualityIssues.length)) message.callQualityIssues = []; message.callQualityIssues.push(reader.string()); break; } case 3: { message.additionalIssuesDescription = reader.string(); break; } case 4: { message.debugLogUrl = reader.string(); break; } case 5: { message.startTimestamp = reader.int64(); break; } case 6: { message.endTimestamp = reader.int64(); break; } case 7: { message.callType = reader.string(); break; } case 8: { message.success = reader.bool(); break; } case 9: { message.callEndReason = reader.string(); break; } case 10: { message.connectionRttMedian = reader.float(); break; } case 11: { message.audioRttMedian = reader.float(); break; } case 12: { message.videoRttMedian = reader.float(); break; } case 13: { message.audioRecvJitterMedian = reader.float(); break; } case 14: { message.videoRecvJitterMedian = reader.float(); break; } case 15: { message.audioSendJitterMedian = reader.float(); break; } case 16: { message.videoSendJitterMedian = reader.float(); break; } case 17: { message.audioRecvPacketLossFraction = reader.float(); break; } case 18: { message.videoRecvPacketLossFraction = reader.float(); break; } case 19: { message.audioSendPacketLossFraction = reader.float(); break; } case 20: { message.videoSendPacketLossFraction = reader.float(); break; } case 21: { message.callTelemetry = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a SubmitCallQualitySurveyRequest message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.SubmitCallQualitySurveyRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.SubmitCallQualitySurveyRequest} SubmitCallQualitySurveyRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ SubmitCallQualitySurveyRequest.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return SubmitCallQualitySurveyRequest; })(); signalservice.CDSClientRequest = (function() { /** * Properties of a CDSClientRequest. * @memberof signalservice * @interface ICDSClientRequest * @property {Uint8Array|null} [aciUakPairs] CDSClientRequest aciUakPairs * @property {Uint8Array|null} [prevE164s] CDSClientRequest prevE164s * @property {Uint8Array|null} [newE164s] CDSClientRequest newE164s * @property {Uint8Array|null} [discardE164s] CDSClientRequest discardE164s * @property {boolean|null} [hasMore] CDSClientRequest hasMore * @property {Uint8Array|null} [token] CDSClientRequest token * @property {boolean|null} [tokenAck] CDSClientRequest tokenAck * @property {boolean|null} [returnAcisWithoutUaks] CDSClientRequest returnAcisWithoutUaks */ /** * Constructs a new CDSClientRequest. * @memberof signalservice * @classdesc Represents a CDSClientRequest. * @implements ICDSClientRequest * @constructor * @param {signalservice.ICDSClientRequest=} [properties] Properties to set */ function CDSClientRequest(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * CDSClientRequest aciUakPairs. * @member {Uint8Array} aciUakPairs * @memberof signalservice.CDSClientRequest * @instance */ CDSClientRequest.prototype.aciUakPairs = $util.newBuffer([]); /** * CDSClientRequest prevE164s. * @member {Uint8Array} prevE164s * @memberof signalservice.CDSClientRequest * @instance */ CDSClientRequest.prototype.prevE164s = $util.newBuffer([]); /** * CDSClientRequest newE164s. * @member {Uint8Array} newE164s * @memberof signalservice.CDSClientRequest * @instance */ CDSClientRequest.prototype.newE164s = $util.newBuffer([]); /** * CDSClientRequest discardE164s. * @member {Uint8Array} discardE164s * @memberof signalservice.CDSClientRequest * @instance */ CDSClientRequest.prototype.discardE164s = $util.newBuffer([]); /** * CDSClientRequest hasMore. * @member {boolean} hasMore * @memberof signalservice.CDSClientRequest * @instance */ CDSClientRequest.prototype.hasMore = false; /** * CDSClientRequest token. * @member {Uint8Array} token * @memberof signalservice.CDSClientRequest * @instance */ CDSClientRequest.prototype.token = $util.newBuffer([]); /** * CDSClientRequest tokenAck. * @member {boolean} tokenAck * @memberof signalservice.CDSClientRequest * @instance */ CDSClientRequest.prototype.tokenAck = false; /** * CDSClientRequest returnAcisWithoutUaks. * @member {boolean} returnAcisWithoutUaks * @memberof signalservice.CDSClientRequest * @instance */ CDSClientRequest.prototype.returnAcisWithoutUaks = false; /** * Encodes the specified CDSClientRequest message. Does not implicitly {@link signalservice.CDSClientRequest.verify|verify} messages. * @function encode * @memberof signalservice.CDSClientRequest * @static * @param {signalservice.ICDSClientRequest} message CDSClientRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ CDSClientRequest.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.CDSClientRequest.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.CDSClientRequest.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.aciUakPairs != null && Object.hasOwnProperty.call(message, "aciUakPairs")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.aciUakPairs); if (message.prevE164s != null && Object.hasOwnProperty.call(message, "prevE164s")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.prevE164s); if (message.newE164s != null && Object.hasOwnProperty.call(message, "newE164s")) writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.newE164s); if (message.discardE164s != null && Object.hasOwnProperty.call(message, "discardE164s")) writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.discardE164s); if (message.hasMore != null && Object.hasOwnProperty.call(message, "hasMore")) writer.uint32(/* id 5, wireType 0 =*/40).bool(message.hasMore); if (message.token != null && Object.hasOwnProperty.call(message, "token")) writer.uint32(/* id 6, wireType 2 =*/50).bytes(message.token); if (message.tokenAck != null && Object.hasOwnProperty.call(message, "tokenAck")) writer.uint32(/* id 7, wireType 0 =*/56).bool(message.tokenAck); if (message.returnAcisWithoutUaks != null && Object.hasOwnProperty.call(message, "returnAcisWithoutUaks")) writer.uint32(/* id 8, wireType 0 =*/64).bool(message.returnAcisWithoutUaks); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified CDSClientRequest message, length delimited. Does not implicitly {@link signalservice.CDSClientRequest.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.CDSClientRequest * @static * @param {signalservice.ICDSClientRequest} message CDSClientRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ CDSClientRequest.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a CDSClientRequest message from the specified reader or buffer. * @function decode * @memberof signalservice.CDSClientRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.CDSClientRequest} CDSClientRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ CDSClientRequest.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.CDSClientRequest(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.aciUakPairs = reader.bytes(); break; } case 2: { message.prevE164s = reader.bytes(); break; } case 3: { message.newE164s = reader.bytes(); break; } case 4: { message.discardE164s = reader.bytes(); break; } case 5: { message.hasMore = reader.bool(); break; } case 6: { message.token = reader.bytes(); break; } case 7: { message.tokenAck = reader.bool(); break; } case 8: { message.returnAcisWithoutUaks = reader.bool(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a CDSClientRequest message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.CDSClientRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.CDSClientRequest} CDSClientRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ CDSClientRequest.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return CDSClientRequest; })(); signalservice.CDSClientResponse = (function() { /** * Properties of a CDSClientResponse. * @memberof signalservice * @interface ICDSClientResponse * @property {Uint8Array|null} [e164PniAciTriples] CDSClientResponse e164PniAciTriples * @property {Uint8Array|null} [token] CDSClientResponse token */ /** * Constructs a new CDSClientResponse. * @memberof signalservice * @classdesc Represents a CDSClientResponse. * @implements ICDSClientResponse * @constructor * @param {signalservice.ICDSClientResponse=} [properties] Properties to set */ function CDSClientResponse(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * CDSClientResponse e164PniAciTriples. * @member {Uint8Array} e164PniAciTriples * @memberof signalservice.CDSClientResponse * @instance */ CDSClientResponse.prototype.e164PniAciTriples = $util.newBuffer([]); /** * CDSClientResponse token. * @member {Uint8Array} token * @memberof signalservice.CDSClientResponse * @instance */ CDSClientResponse.prototype.token = $util.newBuffer([]); /** * Encodes the specified CDSClientResponse message. Does not implicitly {@link signalservice.CDSClientResponse.verify|verify} messages. * @function encode * @memberof signalservice.CDSClientResponse * @static * @param {signalservice.ICDSClientResponse} message CDSClientResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ CDSClientResponse.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.CDSClientResponse.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.CDSClientResponse.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.e164PniAciTriples != null && Object.hasOwnProperty.call(message, "e164PniAciTriples")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.e164PniAciTriples); if (message.token != null && Object.hasOwnProperty.call(message, "token")) writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.token); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified CDSClientResponse message, length delimited. Does not implicitly {@link signalservice.CDSClientResponse.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.CDSClientResponse * @static * @param {signalservice.ICDSClientResponse} message CDSClientResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ CDSClientResponse.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a CDSClientResponse message from the specified reader or buffer. * @function decode * @memberof signalservice.CDSClientResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.CDSClientResponse} CDSClientResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ CDSClientResponse.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.CDSClientResponse(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.e164PniAciTriples = reader.bytes(); break; } case 3: { message.token = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a CDSClientResponse message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.CDSClientResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.CDSClientResponse} CDSClientResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ CDSClientResponse.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return CDSClientResponse; })(); signalservice.ProvisioningAddress = (function() { /** * Properties of a ProvisioningAddress. * @memberof signalservice * @interface IProvisioningAddress * @property {string|null} [address] ProvisioningAddress address */ /** * Constructs a new ProvisioningAddress. * @memberof signalservice * @classdesc Represents a ProvisioningAddress. * @implements IProvisioningAddress * @constructor * @param {signalservice.IProvisioningAddress=} [properties] Properties to set */ function ProvisioningAddress(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * ProvisioningAddress address. * @member {string} address * @memberof signalservice.ProvisioningAddress * @instance */ ProvisioningAddress.prototype.address = ""; /** * Encodes the specified ProvisioningAddress message. Does not implicitly {@link signalservice.ProvisioningAddress.verify|verify} messages. * @function encode * @memberof signalservice.ProvisioningAddress * @static * @param {signalservice.IProvisioningAddress} message ProvisioningAddress message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ProvisioningAddress.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.ProvisioningAddress.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.ProvisioningAddress.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.address != null && Object.hasOwnProperty.call(message, "address")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.address); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified ProvisioningAddress message, length delimited. Does not implicitly {@link signalservice.ProvisioningAddress.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.ProvisioningAddress * @static * @param {signalservice.IProvisioningAddress} message ProvisioningAddress message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ProvisioningAddress.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a ProvisioningAddress message from the specified reader or buffer. * @function decode * @memberof signalservice.ProvisioningAddress * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.ProvisioningAddress} ProvisioningAddress * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ProvisioningAddress.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.ProvisioningAddress(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.address = reader.string(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a ProvisioningAddress message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.ProvisioningAddress * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.ProvisioningAddress} ProvisioningAddress * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ProvisioningAddress.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return ProvisioningAddress; })(); signalservice.ProvisionEnvelope = (function() { /** * Properties of a ProvisionEnvelope. * @memberof signalservice * @interface IProvisionEnvelope * @property {Uint8Array|null} [publicKey] ProvisionEnvelope publicKey * @property {Uint8Array|null} [body] ProvisionEnvelope body */ /** * Constructs a new ProvisionEnvelope. * @memberof signalservice * @classdesc Represents a ProvisionEnvelope. * @implements IProvisionEnvelope * @constructor * @param {signalservice.IProvisionEnvelope=} [properties] Properties to set */ function ProvisionEnvelope(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * ProvisionEnvelope publicKey. * @member {Uint8Array} publicKey * @memberof signalservice.ProvisionEnvelope * @instance */ ProvisionEnvelope.prototype.publicKey = $util.newBuffer([]); /** * ProvisionEnvelope body. * @member {Uint8Array} body * @memberof signalservice.ProvisionEnvelope * @instance */ ProvisionEnvelope.prototype.body = $util.newBuffer([]); /** * Encodes the specified ProvisionEnvelope message. Does not implicitly {@link signalservice.ProvisionEnvelope.verify|verify} messages. * @function encode * @memberof signalservice.ProvisionEnvelope * @static * @param {signalservice.IProvisionEnvelope} message ProvisionEnvelope message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ProvisionEnvelope.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.ProvisionEnvelope.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.ProvisionEnvelope.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.publicKey != null && Object.hasOwnProperty.call(message, "publicKey")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.publicKey); if (message.body != null && Object.hasOwnProperty.call(message, "body")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.body); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified ProvisionEnvelope message, length delimited. Does not implicitly {@link signalservice.ProvisionEnvelope.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.ProvisionEnvelope * @static * @param {signalservice.IProvisionEnvelope} message ProvisionEnvelope message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ProvisionEnvelope.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a ProvisionEnvelope message from the specified reader or buffer. * @function decode * @memberof signalservice.ProvisionEnvelope * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.ProvisionEnvelope} ProvisionEnvelope * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ProvisionEnvelope.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.ProvisionEnvelope(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.publicKey = reader.bytes(); break; } case 2: { message.body = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a ProvisionEnvelope message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.ProvisionEnvelope * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.ProvisionEnvelope} ProvisionEnvelope * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ProvisionEnvelope.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return ProvisionEnvelope; })(); signalservice.ProvisionMessage = (function() { /** * Properties of a ProvisionMessage. * @memberof signalservice * @interface IProvisionMessage * @property {Uint8Array|null} [aciIdentityKeyPublic] ProvisionMessage aciIdentityKeyPublic * @property {Uint8Array|null} [aciIdentityKeyPrivate] ProvisionMessage aciIdentityKeyPrivate * @property {Uint8Array|null} [pniIdentityKeyPublic] ProvisionMessage pniIdentityKeyPublic * @property {Uint8Array|null} [pniIdentityKeyPrivate] ProvisionMessage pniIdentityKeyPrivate * @property {string|null} [aci] ProvisionMessage aci * @property {string|null} [pni] ProvisionMessage pni * @property {string|null} [number] ProvisionMessage number * @property {string|null} [provisioningCode] ProvisionMessage provisioningCode * @property {string|null} [userAgent] ProvisionMessage userAgent * @property {Uint8Array|null} [profileKey] ProvisionMessage profileKey * @property {boolean|null} [readReceipts] ProvisionMessage readReceipts * @property {number|null} [provisioningVersion] ProvisionMessage provisioningVersion * @property {Uint8Array|null} [masterKey] ProvisionMessage masterKey * @property {Uint8Array|null} [ephemeralBackupKey] ProvisionMessage ephemeralBackupKey * @property {string|null} [accountEntropyPool] ProvisionMessage accountEntropyPool * @property {Uint8Array|null} [mediaRootBackupKey] ProvisionMessage mediaRootBackupKey * @property {Uint8Array|null} [aciBinary] ProvisionMessage aciBinary * @property {Uint8Array|null} [pniBinary] ProvisionMessage pniBinary */ /** * Constructs a new ProvisionMessage. * @memberof signalservice * @classdesc Represents a ProvisionMessage. * @implements IProvisionMessage * @constructor * @param {signalservice.IProvisionMessage=} [properties] Properties to set */ function ProvisionMessage(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * ProvisionMessage aciIdentityKeyPublic. * @member {Uint8Array} aciIdentityKeyPublic * @memberof signalservice.ProvisionMessage * @instance */ ProvisionMessage.prototype.aciIdentityKeyPublic = $util.newBuffer([]); /** * ProvisionMessage aciIdentityKeyPrivate. * @member {Uint8Array} aciIdentityKeyPrivate * @memberof signalservice.ProvisionMessage * @instance */ ProvisionMessage.prototype.aciIdentityKeyPrivate = $util.newBuffer([]); /** * ProvisionMessage pniIdentityKeyPublic. * @member {Uint8Array} pniIdentityKeyPublic * @memberof signalservice.ProvisionMessage * @instance */ ProvisionMessage.prototype.pniIdentityKeyPublic = $util.newBuffer([]); /** * ProvisionMessage pniIdentityKeyPrivate. * @member {Uint8Array} pniIdentityKeyPrivate * @memberof signalservice.ProvisionMessage * @instance */ ProvisionMessage.prototype.pniIdentityKeyPrivate = $util.newBuffer([]); /** * ProvisionMessage aci. * @member {string} aci * @memberof signalservice.ProvisionMessage * @instance */ ProvisionMessage.prototype.aci = ""; /** * ProvisionMessage pni. * @member {string} pni * @memberof signalservice.ProvisionMessage * @instance */ ProvisionMessage.prototype.pni = ""; /** * ProvisionMessage number. * @member {string} number * @memberof signalservice.ProvisionMessage * @instance */ ProvisionMessage.prototype.number = ""; /** * ProvisionMessage provisioningCode. * @member {string} provisioningCode * @memberof signalservice.ProvisionMessage * @instance */ ProvisionMessage.prototype.provisioningCode = ""; /** * ProvisionMessage userAgent. * @member {string} userAgent * @memberof signalservice.ProvisionMessage * @instance */ ProvisionMessage.prototype.userAgent = ""; /** * ProvisionMessage profileKey. * @member {Uint8Array} profileKey * @memberof signalservice.ProvisionMessage * @instance */ ProvisionMessage.prototype.profileKey = $util.newBuffer([]); /** * ProvisionMessage readReceipts. * @member {boolean} readReceipts * @memberof signalservice.ProvisionMessage * @instance */ ProvisionMessage.prototype.readReceipts = false; /** * ProvisionMessage provisioningVersion. * @member {number} provisioningVersion * @memberof signalservice.ProvisionMessage * @instance */ ProvisionMessage.prototype.provisioningVersion = 0; /** * ProvisionMessage masterKey. * @member {Uint8Array} masterKey * @memberof signalservice.ProvisionMessage * @instance */ ProvisionMessage.prototype.masterKey = $util.newBuffer([]); /** * ProvisionMessage ephemeralBackupKey. * @member {Uint8Array} ephemeralBackupKey * @memberof signalservice.ProvisionMessage * @instance */ ProvisionMessage.prototype.ephemeralBackupKey = $util.newBuffer([]); /** * ProvisionMessage accountEntropyPool. * @member {string} accountEntropyPool * @memberof signalservice.ProvisionMessage * @instance */ ProvisionMessage.prototype.accountEntropyPool = ""; /** * ProvisionMessage mediaRootBackupKey. * @member {Uint8Array} mediaRootBackupKey * @memberof signalservice.ProvisionMessage * @instance */ ProvisionMessage.prototype.mediaRootBackupKey = $util.newBuffer([]); /** * ProvisionMessage aciBinary. * @member {Uint8Array} aciBinary * @memberof signalservice.ProvisionMessage * @instance */ ProvisionMessage.prototype.aciBinary = $util.newBuffer([]); /** * ProvisionMessage pniBinary. * @member {Uint8Array} pniBinary * @memberof signalservice.ProvisionMessage * @instance */ ProvisionMessage.prototype.pniBinary = $util.newBuffer([]); /** * Encodes the specified ProvisionMessage message. Does not implicitly {@link signalservice.ProvisionMessage.verify|verify} messages. * @function encode * @memberof signalservice.ProvisionMessage * @static * @param {signalservice.IProvisionMessage} message ProvisionMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ProvisionMessage.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.ProvisionMessage.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.ProvisionMessage.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.aciIdentityKeyPublic != null && Object.hasOwnProperty.call(message, "aciIdentityKeyPublic")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.aciIdentityKeyPublic); if (message.aciIdentityKeyPrivate != null && Object.hasOwnProperty.call(message, "aciIdentityKeyPrivate")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.aciIdentityKeyPrivate); if (message.number != null && Object.hasOwnProperty.call(message, "number")) writer.uint32(/* id 3, wireType 2 =*/26).string(message.number); if (message.provisioningCode != null && Object.hasOwnProperty.call(message, "provisioningCode")) writer.uint32(/* id 4, wireType 2 =*/34).string(message.provisioningCode); if (message.userAgent != null && Object.hasOwnProperty.call(message, "userAgent")) writer.uint32(/* id 5, wireType 2 =*/42).string(message.userAgent); if (message.profileKey != null && Object.hasOwnProperty.call(message, "profileKey")) writer.uint32(/* id 6, wireType 2 =*/50).bytes(message.profileKey); if (message.readReceipts != null && Object.hasOwnProperty.call(message, "readReceipts")) writer.uint32(/* id 7, wireType 0 =*/56).bool(message.readReceipts); if (message.aci != null && Object.hasOwnProperty.call(message, "aci")) writer.uint32(/* id 8, wireType 2 =*/66).string(message.aci); if (message.provisioningVersion != null && Object.hasOwnProperty.call(message, "provisioningVersion")) writer.uint32(/* id 9, wireType 0 =*/72).uint32(message.provisioningVersion); if (message.pni != null && Object.hasOwnProperty.call(message, "pni")) writer.uint32(/* id 10, wireType 2 =*/82).string(message.pni); if (message.pniIdentityKeyPublic != null && Object.hasOwnProperty.call(message, "pniIdentityKeyPublic")) writer.uint32(/* id 11, wireType 2 =*/90).bytes(message.pniIdentityKeyPublic); if (message.pniIdentityKeyPrivate != null && Object.hasOwnProperty.call(message, "pniIdentityKeyPrivate")) writer.uint32(/* id 12, wireType 2 =*/98).bytes(message.pniIdentityKeyPrivate); if (message.masterKey != null && Object.hasOwnProperty.call(message, "masterKey")) writer.uint32(/* id 13, wireType 2 =*/106).bytes(message.masterKey); if (message.ephemeralBackupKey != null && Object.hasOwnProperty.call(message, "ephemeralBackupKey")) writer.uint32(/* id 14, wireType 2 =*/114).bytes(message.ephemeralBackupKey); if (message.accountEntropyPool != null && Object.hasOwnProperty.call(message, "accountEntropyPool")) writer.uint32(/* id 15, wireType 2 =*/122).string(message.accountEntropyPool); if (message.mediaRootBackupKey != null && Object.hasOwnProperty.call(message, "mediaRootBackupKey")) writer.uint32(/* id 16, wireType 2 =*/130).bytes(message.mediaRootBackupKey); if (message.aciBinary != null && Object.hasOwnProperty.call(message, "aciBinary")) writer.uint32(/* id 17, wireType 2 =*/138).bytes(message.aciBinary); if (message.pniBinary != null && Object.hasOwnProperty.call(message, "pniBinary")) writer.uint32(/* id 18, wireType 2 =*/146).bytes(message.pniBinary); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified ProvisionMessage message, length delimited. Does not implicitly {@link signalservice.ProvisionMessage.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.ProvisionMessage * @static * @param {signalservice.IProvisionMessage} message ProvisionMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ProvisionMessage.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a ProvisionMessage message from the specified reader or buffer. * @function decode * @memberof signalservice.ProvisionMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.ProvisionMessage} ProvisionMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ProvisionMessage.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.ProvisionMessage(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.aciIdentityKeyPublic = reader.bytes(); break; } case 2: { message.aciIdentityKeyPrivate = reader.bytes(); break; } case 11: { message.pniIdentityKeyPublic = reader.bytes(); break; } case 12: { message.pniIdentityKeyPrivate = reader.bytes(); break; } case 8: { message.aci = reader.string(); break; } case 10: { message.pni = reader.string(); break; } case 3: { message.number = reader.string(); break; } case 4: { message.provisioningCode = reader.string(); break; } case 5: { message.userAgent = reader.string(); break; } case 6: { message.profileKey = reader.bytes(); break; } case 7: { message.readReceipts = reader.bool(); break; } case 9: { message.provisioningVersion = reader.uint32(); break; } case 13: { message.masterKey = reader.bytes(); break; } case 14: { message.ephemeralBackupKey = reader.bytes(); break; } case 15: { message.accountEntropyPool = reader.string(); break; } case 16: { message.mediaRootBackupKey = reader.bytes(); break; } case 17: { message.aciBinary = reader.bytes(); break; } case 18: { message.pniBinary = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a ProvisionMessage message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.ProvisionMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.ProvisionMessage} ProvisionMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ProvisionMessage.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return ProvisionMessage; })(); /** * ProvisioningVersion enum. * @name signalservice.ProvisioningVersion * @enum {number} * @property {number} INITIAL=0 INITIAL value * @property {number} TABLET_SUPPORT=1 TABLET_SUPPORT value * @property {number} CURRENT=1 CURRENT value */ signalservice.ProvisioningVersion = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "INITIAL"] = 0; values[valuesById[1] = "TABLET_SUPPORT"] = 1; values["CURRENT"] = 1; return values; })(); signalservice.DeviceName = (function() { /** * Properties of a DeviceName. * @memberof signalservice * @interface IDeviceName * @property {Uint8Array|null} [ephemeralPublic] DeviceName ephemeralPublic * @property {Uint8Array|null} [syntheticIv] DeviceName syntheticIv * @property {Uint8Array|null} [ciphertext] DeviceName ciphertext */ /** * Constructs a new DeviceName. * @memberof signalservice * @classdesc Represents a DeviceName. * @implements IDeviceName * @constructor * @param {signalservice.IDeviceName=} [properties] Properties to set */ function DeviceName(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * DeviceName ephemeralPublic. * @member {Uint8Array} ephemeralPublic * @memberof signalservice.DeviceName * @instance */ DeviceName.prototype.ephemeralPublic = $util.newBuffer([]); /** * DeviceName syntheticIv. * @member {Uint8Array} syntheticIv * @memberof signalservice.DeviceName * @instance */ DeviceName.prototype.syntheticIv = $util.newBuffer([]); /** * DeviceName ciphertext. * @member {Uint8Array} ciphertext * @memberof signalservice.DeviceName * @instance */ DeviceName.prototype.ciphertext = $util.newBuffer([]); /** * Encodes the specified DeviceName message. Does not implicitly {@link signalservice.DeviceName.verify|verify} messages. * @function encode * @memberof signalservice.DeviceName * @static * @param {signalservice.IDeviceName} message DeviceName message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ DeviceName.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.DeviceName.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.DeviceName.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.ephemeralPublic != null && Object.hasOwnProperty.call(message, "ephemeralPublic")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.ephemeralPublic); if (message.syntheticIv != null && Object.hasOwnProperty.call(message, "syntheticIv")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.syntheticIv); if (message.ciphertext != null && Object.hasOwnProperty.call(message, "ciphertext")) writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.ciphertext); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified DeviceName message, length delimited. Does not implicitly {@link signalservice.DeviceName.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.DeviceName * @static * @param {signalservice.IDeviceName} message DeviceName message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ DeviceName.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a DeviceName message from the specified reader or buffer. * @function decode * @memberof signalservice.DeviceName * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.DeviceName} DeviceName * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ DeviceName.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.DeviceName(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.ephemeralPublic = reader.bytes(); break; } case 2: { message.syntheticIv = reader.bytes(); break; } case 3: { message.ciphertext = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a DeviceName message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.DeviceName * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.DeviceName} DeviceName * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ DeviceName.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return DeviceName; })(); signalservice.AvatarUploadAttributes = (function() { /** * Properties of an AvatarUploadAttributes. * @memberof signalservice * @interface IAvatarUploadAttributes * @property {string|null} [key] AvatarUploadAttributes key * @property {string|null} [credential] AvatarUploadAttributes credential * @property {string|null} [acl] AvatarUploadAttributes acl * @property {string|null} [algorithm] AvatarUploadAttributes algorithm * @property {string|null} [date] AvatarUploadAttributes date * @property {string|null} [policy] AvatarUploadAttributes policy * @property {string|null} [signature] AvatarUploadAttributes signature */ /** * Constructs a new AvatarUploadAttributes. * @memberof signalservice * @classdesc Represents an AvatarUploadAttributes. * @implements IAvatarUploadAttributes * @constructor * @param {signalservice.IAvatarUploadAttributes=} [properties] Properties to set */ function AvatarUploadAttributes(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * AvatarUploadAttributes key. * @member {string} key * @memberof signalservice.AvatarUploadAttributes * @instance */ AvatarUploadAttributes.prototype.key = ""; /** * AvatarUploadAttributes credential. * @member {string} credential * @memberof signalservice.AvatarUploadAttributes * @instance */ AvatarUploadAttributes.prototype.credential = ""; /** * AvatarUploadAttributes acl. * @member {string} acl * @memberof signalservice.AvatarUploadAttributes * @instance */ AvatarUploadAttributes.prototype.acl = ""; /** * AvatarUploadAttributes algorithm. * @member {string} algorithm * @memberof signalservice.AvatarUploadAttributes * @instance */ AvatarUploadAttributes.prototype.algorithm = ""; /** * AvatarUploadAttributes date. * @member {string} date * @memberof signalservice.AvatarUploadAttributes * @instance */ AvatarUploadAttributes.prototype.date = ""; /** * AvatarUploadAttributes policy. * @member {string} policy * @memberof signalservice.AvatarUploadAttributes * @instance */ AvatarUploadAttributes.prototype.policy = ""; /** * AvatarUploadAttributes signature. * @member {string} signature * @memberof signalservice.AvatarUploadAttributes * @instance */ AvatarUploadAttributes.prototype.signature = ""; /** * Encodes the specified AvatarUploadAttributes message. Does not implicitly {@link signalservice.AvatarUploadAttributes.verify|verify} messages. * @function encode * @memberof signalservice.AvatarUploadAttributes * @static * @param {signalservice.IAvatarUploadAttributes} message AvatarUploadAttributes message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ AvatarUploadAttributes.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.AvatarUploadAttributes.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.AvatarUploadAttributes.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.key != null && Object.hasOwnProperty.call(message, "key")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.key); if (message.credential != null && Object.hasOwnProperty.call(message, "credential")) writer.uint32(/* id 2, wireType 2 =*/18).string(message.credential); if (message.acl != null && Object.hasOwnProperty.call(message, "acl")) writer.uint32(/* id 3, wireType 2 =*/26).string(message.acl); if (message.algorithm != null && Object.hasOwnProperty.call(message, "algorithm")) writer.uint32(/* id 4, wireType 2 =*/34).string(message.algorithm); if (message.date != null && Object.hasOwnProperty.call(message, "date")) writer.uint32(/* id 5, wireType 2 =*/42).string(message.date); if (message.policy != null && Object.hasOwnProperty.call(message, "policy")) writer.uint32(/* id 6, wireType 2 =*/50).string(message.policy); if (message.signature != null && Object.hasOwnProperty.call(message, "signature")) writer.uint32(/* id 7, wireType 2 =*/58).string(message.signature); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified AvatarUploadAttributes message, length delimited. Does not implicitly {@link signalservice.AvatarUploadAttributes.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.AvatarUploadAttributes * @static * @param {signalservice.IAvatarUploadAttributes} message AvatarUploadAttributes message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ AvatarUploadAttributes.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an AvatarUploadAttributes message from the specified reader or buffer. * @function decode * @memberof signalservice.AvatarUploadAttributes * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.AvatarUploadAttributes} AvatarUploadAttributes * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ AvatarUploadAttributes.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.AvatarUploadAttributes(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.key = reader.string(); break; } case 2: { message.credential = reader.string(); break; } case 3: { message.acl = reader.string(); break; } case 4: { message.algorithm = reader.string(); break; } case 5: { message.date = reader.string(); break; } case 6: { message.policy = reader.string(); break; } case 7: { message.signature = reader.string(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an AvatarUploadAttributes message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.AvatarUploadAttributes * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.AvatarUploadAttributes} AvatarUploadAttributes * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ AvatarUploadAttributes.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return AvatarUploadAttributes; })(); signalservice.Member = (function() { /** * Properties of a Member. * @memberof signalservice * @interface IMember * @property {Uint8Array|null} [userId] Member userId * @property {signalservice.Member.Role|null} [role] Member role * @property {Uint8Array|null} [profileKey] Member profileKey * @property {Uint8Array|null} [presentation] Member presentation * @property {number|null} [joinedAtVersion] Member joinedAtVersion * @property {Uint8Array|null} [labelEmoji] Member labelEmoji * @property {Uint8Array|null} [labelString] Member labelString */ /** * Constructs a new Member. * @memberof signalservice * @classdesc Represents a Member. * @implements IMember * @constructor * @param {signalservice.IMember=} [properties] Properties to set */ function Member(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Member userId. * @member {Uint8Array} userId * @memberof signalservice.Member * @instance */ Member.prototype.userId = $util.newBuffer([]); /** * Member role. * @member {signalservice.Member.Role} role * @memberof signalservice.Member * @instance */ Member.prototype.role = 0; /** * Member profileKey. * @member {Uint8Array} profileKey * @memberof signalservice.Member * @instance */ Member.prototype.profileKey = $util.newBuffer([]); /** * Member presentation. * @member {Uint8Array} presentation * @memberof signalservice.Member * @instance */ Member.prototype.presentation = $util.newBuffer([]); /** * Member joinedAtVersion. * @member {number} joinedAtVersion * @memberof signalservice.Member * @instance */ Member.prototype.joinedAtVersion = 0; /** * Member labelEmoji. * @member {Uint8Array} labelEmoji * @memberof signalservice.Member * @instance */ Member.prototype.labelEmoji = $util.newBuffer([]); /** * Member labelString. * @member {Uint8Array} labelString * @memberof signalservice.Member * @instance */ Member.prototype.labelString = $util.newBuffer([]); /** * Encodes the specified Member message. Does not implicitly {@link signalservice.Member.verify|verify} messages. * @function encode * @memberof signalservice.Member * @static * @param {signalservice.IMember} message Member message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Member.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.Member.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.Member.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.userId != null && Object.hasOwnProperty.call(message, "userId")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.userId); if (message.role != null && Object.hasOwnProperty.call(message, "role")) writer.uint32(/* id 2, wireType 0 =*/16).int32(message.role); if (message.profileKey != null && Object.hasOwnProperty.call(message, "profileKey")) writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.profileKey); if (message.presentation != null && Object.hasOwnProperty.call(message, "presentation")) writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.presentation); if (message.joinedAtVersion != null && Object.hasOwnProperty.call(message, "joinedAtVersion")) writer.uint32(/* id 5, wireType 0 =*/40).uint32(message.joinedAtVersion); if (message.labelEmoji != null && Object.hasOwnProperty.call(message, "labelEmoji")) writer.uint32(/* id 6, wireType 2 =*/50).bytes(message.labelEmoji); if (message.labelString != null && Object.hasOwnProperty.call(message, "labelString")) writer.uint32(/* id 7, wireType 2 =*/58).bytes(message.labelString); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Member message, length delimited. Does not implicitly {@link signalservice.Member.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.Member * @static * @param {signalservice.IMember} message Member message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Member.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Member message from the specified reader or buffer. * @function decode * @memberof signalservice.Member * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.Member} Member * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Member.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.Member(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.userId = reader.bytes(); break; } case 2: { message.role = reader.int32(); break; } case 3: { message.profileKey = reader.bytes(); break; } case 4: { message.presentation = reader.bytes(); break; } case 5: { message.joinedAtVersion = reader.uint32(); break; } case 6: { message.labelEmoji = reader.bytes(); break; } case 7: { message.labelString = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Member message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.Member * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.Member} Member * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Member.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * Role enum. * @name signalservice.Member.Role * @enum {number} * @property {number} UNKNOWN=0 UNKNOWN value * @property {number} DEFAULT=1 DEFAULT value * @property {number} ADMINISTRATOR=2 ADMINISTRATOR value */ Member.Role = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "UNKNOWN"] = 0; values[valuesById[1] = "DEFAULT"] = 1; values[valuesById[2] = "ADMINISTRATOR"] = 2; return values; })(); return Member; })(); signalservice.MemberPendingProfileKey = (function() { /** * Properties of a MemberPendingProfileKey. * @memberof signalservice * @interface IMemberPendingProfileKey * @property {signalservice.IMember|null} [member] MemberPendingProfileKey member * @property {Uint8Array|null} [addedByUserId] MemberPendingProfileKey addedByUserId * @property {Long|null} [timestamp] MemberPendingProfileKey timestamp */ /** * Constructs a new MemberPendingProfileKey. * @memberof signalservice * @classdesc Represents a MemberPendingProfileKey. * @implements IMemberPendingProfileKey * @constructor * @param {signalservice.IMemberPendingProfileKey=} [properties] Properties to set */ function MemberPendingProfileKey(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * MemberPendingProfileKey member. * @member {signalservice.IMember|null|undefined} member * @memberof signalservice.MemberPendingProfileKey * @instance */ MemberPendingProfileKey.prototype.member = null; /** * MemberPendingProfileKey addedByUserId. * @member {Uint8Array} addedByUserId * @memberof signalservice.MemberPendingProfileKey * @instance */ MemberPendingProfileKey.prototype.addedByUserId = $util.newBuffer([]); /** * MemberPendingProfileKey timestamp. * @member {Long} timestamp * @memberof signalservice.MemberPendingProfileKey * @instance */ MemberPendingProfileKey.prototype.timestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * Encodes the specified MemberPendingProfileKey message. Does not implicitly {@link signalservice.MemberPendingProfileKey.verify|verify} messages. * @function encode * @memberof signalservice.MemberPendingProfileKey * @static * @param {signalservice.IMemberPendingProfileKey} message MemberPendingProfileKey message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ MemberPendingProfileKey.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.MemberPendingProfileKey.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.MemberPendingProfileKey.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.member != null && Object.hasOwnProperty.call(message, "member")) $root.signalservice.Member.encode(message.member, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.addedByUserId != null && Object.hasOwnProperty.call(message, "addedByUserId")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.addedByUserId); if (message.timestamp != null && Object.hasOwnProperty.call(message, "timestamp")) writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.timestamp); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified MemberPendingProfileKey message, length delimited. Does not implicitly {@link signalservice.MemberPendingProfileKey.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.MemberPendingProfileKey * @static * @param {signalservice.IMemberPendingProfileKey} message MemberPendingProfileKey message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ MemberPendingProfileKey.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a MemberPendingProfileKey message from the specified reader or buffer. * @function decode * @memberof signalservice.MemberPendingProfileKey * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.MemberPendingProfileKey} MemberPendingProfileKey * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ MemberPendingProfileKey.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.MemberPendingProfileKey(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.member = $root.signalservice.Member.decode(reader, reader.uint32()); break; } case 2: { message.addedByUserId = reader.bytes(); break; } case 3: { message.timestamp = reader.uint64(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a MemberPendingProfileKey message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.MemberPendingProfileKey * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.MemberPendingProfileKey} MemberPendingProfileKey * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ MemberPendingProfileKey.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return MemberPendingProfileKey; })(); signalservice.MemberPendingAdminApproval = (function() { /** * Properties of a MemberPendingAdminApproval. * @memberof signalservice * @interface IMemberPendingAdminApproval * @property {Uint8Array|null} [userId] MemberPendingAdminApproval userId * @property {Uint8Array|null} [profileKey] MemberPendingAdminApproval profileKey * @property {Uint8Array|null} [presentation] MemberPendingAdminApproval presentation * @property {Long|null} [timestamp] MemberPendingAdminApproval timestamp */ /** * Constructs a new MemberPendingAdminApproval. * @memberof signalservice * @classdesc Represents a MemberPendingAdminApproval. * @implements IMemberPendingAdminApproval * @constructor * @param {signalservice.IMemberPendingAdminApproval=} [properties] Properties to set */ function MemberPendingAdminApproval(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * MemberPendingAdminApproval userId. * @member {Uint8Array} userId * @memberof signalservice.MemberPendingAdminApproval * @instance */ MemberPendingAdminApproval.prototype.userId = $util.newBuffer([]); /** * MemberPendingAdminApproval profileKey. * @member {Uint8Array} profileKey * @memberof signalservice.MemberPendingAdminApproval * @instance */ MemberPendingAdminApproval.prototype.profileKey = $util.newBuffer([]); /** * MemberPendingAdminApproval presentation. * @member {Uint8Array} presentation * @memberof signalservice.MemberPendingAdminApproval * @instance */ MemberPendingAdminApproval.prototype.presentation = $util.newBuffer([]); /** * MemberPendingAdminApproval timestamp. * @member {Long} timestamp * @memberof signalservice.MemberPendingAdminApproval * @instance */ MemberPendingAdminApproval.prototype.timestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * Encodes the specified MemberPendingAdminApproval message. Does not implicitly {@link signalservice.MemberPendingAdminApproval.verify|verify} messages. * @function encode * @memberof signalservice.MemberPendingAdminApproval * @static * @param {signalservice.IMemberPendingAdminApproval} message MemberPendingAdminApproval message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ MemberPendingAdminApproval.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.MemberPendingAdminApproval.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.MemberPendingAdminApproval.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.userId != null && Object.hasOwnProperty.call(message, "userId")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.userId); if (message.profileKey != null && Object.hasOwnProperty.call(message, "profileKey")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.profileKey); if (message.presentation != null && Object.hasOwnProperty.call(message, "presentation")) writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.presentation); if (message.timestamp != null && Object.hasOwnProperty.call(message, "timestamp")) writer.uint32(/* id 4, wireType 0 =*/32).uint64(message.timestamp); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified MemberPendingAdminApproval message, length delimited. Does not implicitly {@link signalservice.MemberPendingAdminApproval.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.MemberPendingAdminApproval * @static * @param {signalservice.IMemberPendingAdminApproval} message MemberPendingAdminApproval message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ MemberPendingAdminApproval.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a MemberPendingAdminApproval message from the specified reader or buffer. * @function decode * @memberof signalservice.MemberPendingAdminApproval * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.MemberPendingAdminApproval} MemberPendingAdminApproval * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ MemberPendingAdminApproval.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.MemberPendingAdminApproval(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.userId = reader.bytes(); break; } case 2: { message.profileKey = reader.bytes(); break; } case 3: { message.presentation = reader.bytes(); break; } case 4: { message.timestamp = reader.uint64(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a MemberPendingAdminApproval message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.MemberPendingAdminApproval * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.MemberPendingAdminApproval} MemberPendingAdminApproval * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ MemberPendingAdminApproval.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return MemberPendingAdminApproval; })(); signalservice.MemberBanned = (function() { /** * Properties of a MemberBanned. * @memberof signalservice * @interface IMemberBanned * @property {Uint8Array|null} [userId] MemberBanned userId * @property {Long|null} [timestamp] MemberBanned timestamp */ /** * Constructs a new MemberBanned. * @memberof signalservice * @classdesc Represents a MemberBanned. * @implements IMemberBanned * @constructor * @param {signalservice.IMemberBanned=} [properties] Properties to set */ function MemberBanned(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * MemberBanned userId. * @member {Uint8Array} userId * @memberof signalservice.MemberBanned * @instance */ MemberBanned.prototype.userId = $util.newBuffer([]); /** * MemberBanned timestamp. * @member {Long} timestamp * @memberof signalservice.MemberBanned * @instance */ MemberBanned.prototype.timestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * Encodes the specified MemberBanned message. Does not implicitly {@link signalservice.MemberBanned.verify|verify} messages. * @function encode * @memberof signalservice.MemberBanned * @static * @param {signalservice.IMemberBanned} message MemberBanned message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ MemberBanned.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.MemberBanned.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.MemberBanned.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.userId != null && Object.hasOwnProperty.call(message, "userId")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.userId); if (message.timestamp != null && Object.hasOwnProperty.call(message, "timestamp")) writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.timestamp); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified MemberBanned message, length delimited. Does not implicitly {@link signalservice.MemberBanned.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.MemberBanned * @static * @param {signalservice.IMemberBanned} message MemberBanned message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ MemberBanned.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a MemberBanned message from the specified reader or buffer. * @function decode * @memberof signalservice.MemberBanned * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.MemberBanned} MemberBanned * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ MemberBanned.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.MemberBanned(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.userId = reader.bytes(); break; } case 2: { message.timestamp = reader.uint64(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a MemberBanned message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.MemberBanned * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.MemberBanned} MemberBanned * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ MemberBanned.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return MemberBanned; })(); signalservice.AccessControl = (function() { /** * Properties of an AccessControl. * @memberof signalservice * @interface IAccessControl * @property {signalservice.AccessControl.AccessRequired|null} [attributes] AccessControl attributes * @property {signalservice.AccessControl.AccessRequired|null} [members] AccessControl members * @property {signalservice.AccessControl.AccessRequired|null} [addFromInviteLink] AccessControl addFromInviteLink */ /** * Constructs a new AccessControl. * @memberof signalservice * @classdesc Represents an AccessControl. * @implements IAccessControl * @constructor * @param {signalservice.IAccessControl=} [properties] Properties to set */ function AccessControl(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * AccessControl attributes. * @member {signalservice.AccessControl.AccessRequired} attributes * @memberof signalservice.AccessControl * @instance */ AccessControl.prototype.attributes = 0; /** * AccessControl members. * @member {signalservice.AccessControl.AccessRequired} members * @memberof signalservice.AccessControl * @instance */ AccessControl.prototype.members = 0; /** * AccessControl addFromInviteLink. * @member {signalservice.AccessControl.AccessRequired} addFromInviteLink * @memberof signalservice.AccessControl * @instance */ AccessControl.prototype.addFromInviteLink = 0; /** * Encodes the specified AccessControl message. Does not implicitly {@link signalservice.AccessControl.verify|verify} messages. * @function encode * @memberof signalservice.AccessControl * @static * @param {signalservice.IAccessControl} message AccessControl message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ AccessControl.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.AccessControl.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.AccessControl.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.attributes != null && Object.hasOwnProperty.call(message, "attributes")) writer.uint32(/* id 1, wireType 0 =*/8).int32(message.attributes); if (message.members != null && Object.hasOwnProperty.call(message, "members")) writer.uint32(/* id 2, wireType 0 =*/16).int32(message.members); if (message.addFromInviteLink != null && Object.hasOwnProperty.call(message, "addFromInviteLink")) writer.uint32(/* id 3, wireType 0 =*/24).int32(message.addFromInviteLink); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified AccessControl message, length delimited. Does not implicitly {@link signalservice.AccessControl.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.AccessControl * @static * @param {signalservice.IAccessControl} message AccessControl message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ AccessControl.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an AccessControl message from the specified reader or buffer. * @function decode * @memberof signalservice.AccessControl * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.AccessControl} AccessControl * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ AccessControl.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.AccessControl(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.attributes = reader.int32(); break; } case 2: { message.members = reader.int32(); break; } case 3: { message.addFromInviteLink = reader.int32(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an AccessControl message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.AccessControl * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.AccessControl} AccessControl * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ AccessControl.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * AccessRequired enum. * @name signalservice.AccessControl.AccessRequired * @enum {number} * @property {number} UNKNOWN=0 UNKNOWN value * @property {number} ANY=1 ANY value * @property {number} MEMBER=2 MEMBER value * @property {number} ADMINISTRATOR=3 ADMINISTRATOR value * @property {number} UNSATISFIABLE=4 UNSATISFIABLE value */ AccessControl.AccessRequired = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "UNKNOWN"] = 0; values[valuesById[1] = "ANY"] = 1; values[valuesById[2] = "MEMBER"] = 2; values[valuesById[3] = "ADMINISTRATOR"] = 3; values[valuesById[4] = "UNSATISFIABLE"] = 4; return values; })(); return AccessControl; })(); signalservice.Group = (function() { /** * Properties of a Group. * @memberof signalservice * @interface IGroup * @property {Uint8Array|null} [publicKey] Group publicKey * @property {Uint8Array|null} [title] Group title * @property {Uint8Array|null} [description] Group description * @property {string|null} [avatarUrl] Group avatarUrl * @property {Uint8Array|null} [disappearingMessagesTimer] Group disappearingMessagesTimer * @property {signalservice.IAccessControl|null} [accessControl] Group accessControl * @property {number|null} [version] Group version * @property {Array.|null} [members] Group members * @property {Array.|null} [membersPendingProfileKey] Group membersPendingProfileKey * @property {Array.|null} [membersPendingAdminApproval] Group membersPendingAdminApproval * @property {Uint8Array|null} [inviteLinkPassword] Group inviteLinkPassword * @property {boolean|null} [announcementsOnly] Group announcementsOnly * @property {Array.|null} [membersBanned] Group membersBanned */ /** * Constructs a new Group. * @memberof signalservice * @classdesc Represents a Group. * @implements IGroup * @constructor * @param {signalservice.IGroup=} [properties] Properties to set */ function Group(properties) { this.members = []; this.membersPendingProfileKey = []; this.membersPendingAdminApproval = []; this.membersBanned = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Group publicKey. * @member {Uint8Array} publicKey * @memberof signalservice.Group * @instance */ Group.prototype.publicKey = $util.newBuffer([]); /** * Group title. * @member {Uint8Array} title * @memberof signalservice.Group * @instance */ Group.prototype.title = $util.newBuffer([]); /** * Group description. * @member {Uint8Array} description * @memberof signalservice.Group * @instance */ Group.prototype.description = $util.newBuffer([]); /** * Group avatarUrl. * @member {string} avatarUrl * @memberof signalservice.Group * @instance */ Group.prototype.avatarUrl = ""; /** * Group disappearingMessagesTimer. * @member {Uint8Array} disappearingMessagesTimer * @memberof signalservice.Group * @instance */ Group.prototype.disappearingMessagesTimer = $util.newBuffer([]); /** * Group accessControl. * @member {signalservice.IAccessControl|null|undefined} accessControl * @memberof signalservice.Group * @instance */ Group.prototype.accessControl = null; /** * Group version. * @member {number} version * @memberof signalservice.Group * @instance */ Group.prototype.version = 0; /** * Group members. * @member {Array.} members * @memberof signalservice.Group * @instance */ Group.prototype.members = $util.emptyArray; /** * Group membersPendingProfileKey. * @member {Array.} membersPendingProfileKey * @memberof signalservice.Group * @instance */ Group.prototype.membersPendingProfileKey = $util.emptyArray; /** * Group membersPendingAdminApproval. * @member {Array.} membersPendingAdminApproval * @memberof signalservice.Group * @instance */ Group.prototype.membersPendingAdminApproval = $util.emptyArray; /** * Group inviteLinkPassword. * @member {Uint8Array} inviteLinkPassword * @memberof signalservice.Group * @instance */ Group.prototype.inviteLinkPassword = $util.newBuffer([]); /** * Group announcementsOnly. * @member {boolean} announcementsOnly * @memberof signalservice.Group * @instance */ Group.prototype.announcementsOnly = false; /** * Group membersBanned. * @member {Array.} membersBanned * @memberof signalservice.Group * @instance */ Group.prototype.membersBanned = $util.emptyArray; /** * Encodes the specified Group message. Does not implicitly {@link signalservice.Group.verify|verify} messages. * @function encode * @memberof signalservice.Group * @static * @param {signalservice.IGroup} message Group message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Group.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.Group.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.Group.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.publicKey != null && Object.hasOwnProperty.call(message, "publicKey")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.publicKey); if (message.title != null && Object.hasOwnProperty.call(message, "title")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.title); if (message.avatarUrl != null && Object.hasOwnProperty.call(message, "avatarUrl")) writer.uint32(/* id 3, wireType 2 =*/26).string(message.avatarUrl); if (message.disappearingMessagesTimer != null && Object.hasOwnProperty.call(message, "disappearingMessagesTimer")) writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.disappearingMessagesTimer); if (message.accessControl != null && Object.hasOwnProperty.call(message, "accessControl")) $root.signalservice.AccessControl.encode(message.accessControl, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); if (message.version != null && Object.hasOwnProperty.call(message, "version")) writer.uint32(/* id 6, wireType 0 =*/48).uint32(message.version); if (message.members != null && message.members.length) for (var i = 0; i < message.members.length; ++i) $root.signalservice.Member.encode(message.members[i], writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim(); if (message.membersPendingProfileKey != null && message.membersPendingProfileKey.length) for (var i = 0; i < message.membersPendingProfileKey.length; ++i) $root.signalservice.MemberPendingProfileKey.encode(message.membersPendingProfileKey[i], writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim(); if (message.membersPendingAdminApproval != null && message.membersPendingAdminApproval.length) for (var i = 0; i < message.membersPendingAdminApproval.length; ++i) $root.signalservice.MemberPendingAdminApproval.encode(message.membersPendingAdminApproval[i], writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim(); if (message.inviteLinkPassword != null && Object.hasOwnProperty.call(message, "inviteLinkPassword")) writer.uint32(/* id 10, wireType 2 =*/82).bytes(message.inviteLinkPassword); if (message.description != null && Object.hasOwnProperty.call(message, "description")) writer.uint32(/* id 11, wireType 2 =*/90).bytes(message.description); if (message.announcementsOnly != null && Object.hasOwnProperty.call(message, "announcementsOnly")) writer.uint32(/* id 12, wireType 0 =*/96).bool(message.announcementsOnly); if (message.membersBanned != null && message.membersBanned.length) for (var i = 0; i < message.membersBanned.length; ++i) $root.signalservice.MemberBanned.encode(message.membersBanned[i], writer.uint32(/* id 13, wireType 2 =*/106).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Group message, length delimited. Does not implicitly {@link signalservice.Group.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.Group * @static * @param {signalservice.IGroup} message Group message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Group.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Group message from the specified reader or buffer. * @function decode * @memberof signalservice.Group * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.Group} Group * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Group.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.Group(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.publicKey = reader.bytes(); break; } case 2: { message.title = reader.bytes(); break; } case 11: { message.description = reader.bytes(); break; } case 3: { message.avatarUrl = reader.string(); break; } case 4: { message.disappearingMessagesTimer = reader.bytes(); break; } case 5: { message.accessControl = $root.signalservice.AccessControl.decode(reader, reader.uint32()); break; } case 6: { message.version = reader.uint32(); break; } case 7: { if (!(message.members && message.members.length)) message.members = []; message.members.push($root.signalservice.Member.decode(reader, reader.uint32())); break; } case 8: { if (!(message.membersPendingProfileKey && message.membersPendingProfileKey.length)) message.membersPendingProfileKey = []; message.membersPendingProfileKey.push($root.signalservice.MemberPendingProfileKey.decode(reader, reader.uint32())); break; } case 9: { if (!(message.membersPendingAdminApproval && message.membersPendingAdminApproval.length)) message.membersPendingAdminApproval = []; message.membersPendingAdminApproval.push($root.signalservice.MemberPendingAdminApproval.decode(reader, reader.uint32())); break; } case 10: { message.inviteLinkPassword = reader.bytes(); break; } case 12: { message.announcementsOnly = reader.bool(); break; } case 13: { if (!(message.membersBanned && message.membersBanned.length)) message.membersBanned = []; message.membersBanned.push($root.signalservice.MemberBanned.decode(reader, reader.uint32())); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Group message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.Group * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.Group} Group * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Group.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return Group; })(); signalservice.GroupAttributeBlob = (function() { /** * Properties of a GroupAttributeBlob. * @memberof signalservice * @interface IGroupAttributeBlob * @property {string|null} [title] GroupAttributeBlob title * @property {Uint8Array|null} [avatar] GroupAttributeBlob avatar * @property {number|null} [disappearingMessagesDuration] GroupAttributeBlob disappearingMessagesDuration * @property {string|null} [descriptionText] GroupAttributeBlob descriptionText */ /** * Constructs a new GroupAttributeBlob. * @memberof signalservice * @classdesc Represents a GroupAttributeBlob. * @implements IGroupAttributeBlob * @constructor * @param {signalservice.IGroupAttributeBlob=} [properties] Properties to set */ function GroupAttributeBlob(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GroupAttributeBlob title. * @member {string|null|undefined} title * @memberof signalservice.GroupAttributeBlob * @instance */ GroupAttributeBlob.prototype.title = null; /** * GroupAttributeBlob avatar. * @member {Uint8Array|null|undefined} avatar * @memberof signalservice.GroupAttributeBlob * @instance */ GroupAttributeBlob.prototype.avatar = null; /** * GroupAttributeBlob disappearingMessagesDuration. * @member {number|null|undefined} disappearingMessagesDuration * @memberof signalservice.GroupAttributeBlob * @instance */ GroupAttributeBlob.prototype.disappearingMessagesDuration = null; /** * GroupAttributeBlob descriptionText. * @member {string|null|undefined} descriptionText * @memberof signalservice.GroupAttributeBlob * @instance */ GroupAttributeBlob.prototype.descriptionText = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * GroupAttributeBlob content. * @member {"title"|"avatar"|"disappearingMessagesDuration"|"descriptionText"|undefined} content * @memberof signalservice.GroupAttributeBlob * @instance */ Object.defineProperty(GroupAttributeBlob.prototype, "content", { get: $util.oneOfGetter($oneOfFields = ["title", "avatar", "disappearingMessagesDuration", "descriptionText"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified GroupAttributeBlob message. Does not implicitly {@link signalservice.GroupAttributeBlob.verify|verify} messages. * @function encode * @memberof signalservice.GroupAttributeBlob * @static * @param {signalservice.IGroupAttributeBlob} message GroupAttributeBlob message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupAttributeBlob.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.GroupAttributeBlob.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.GroupAttributeBlob.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.title != null && Object.hasOwnProperty.call(message, "title")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.title); if (message.avatar != null && Object.hasOwnProperty.call(message, "avatar")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.avatar); if (message.disappearingMessagesDuration != null && Object.hasOwnProperty.call(message, "disappearingMessagesDuration")) writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.disappearingMessagesDuration); if (message.descriptionText != null && Object.hasOwnProperty.call(message, "descriptionText")) writer.uint32(/* id 4, wireType 2 =*/34).string(message.descriptionText); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupAttributeBlob message, length delimited. Does not implicitly {@link signalservice.GroupAttributeBlob.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.GroupAttributeBlob * @static * @param {signalservice.IGroupAttributeBlob} message GroupAttributeBlob message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupAttributeBlob.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupAttributeBlob message from the specified reader or buffer. * @function decode * @memberof signalservice.GroupAttributeBlob * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.GroupAttributeBlob} GroupAttributeBlob * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupAttributeBlob.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.GroupAttributeBlob(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.title = reader.string(); break; } case 2: { message.avatar = reader.bytes(); break; } case 3: { message.disappearingMessagesDuration = reader.uint32(); break; } case 4: { message.descriptionText = reader.string(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupAttributeBlob message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.GroupAttributeBlob * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.GroupAttributeBlob} GroupAttributeBlob * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupAttributeBlob.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return GroupAttributeBlob; })(); signalservice.GroupInviteLink = (function() { /** * Properties of a GroupInviteLink. * @memberof signalservice * @interface IGroupInviteLink * @property {signalservice.GroupInviteLink.IGroupInviteLinkContentsV1|null} [contentsV1] GroupInviteLink contentsV1 */ /** * Constructs a new GroupInviteLink. * @memberof signalservice * @classdesc Represents a GroupInviteLink. * @implements IGroupInviteLink * @constructor * @param {signalservice.IGroupInviteLink=} [properties] Properties to set */ function GroupInviteLink(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GroupInviteLink contentsV1. * @member {signalservice.GroupInviteLink.IGroupInviteLinkContentsV1|null|undefined} contentsV1 * @memberof signalservice.GroupInviteLink * @instance */ GroupInviteLink.prototype.contentsV1 = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * GroupInviteLink contents. * @member {"contentsV1"|undefined} contents * @memberof signalservice.GroupInviteLink * @instance */ Object.defineProperty(GroupInviteLink.prototype, "contents", { get: $util.oneOfGetter($oneOfFields = ["contentsV1"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified GroupInviteLink message. Does not implicitly {@link signalservice.GroupInviteLink.verify|verify} messages. * @function encode * @memberof signalservice.GroupInviteLink * @static * @param {signalservice.IGroupInviteLink} message GroupInviteLink message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupInviteLink.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.GroupInviteLink.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.GroupInviteLink.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.contentsV1 != null && Object.hasOwnProperty.call(message, "contentsV1")) $root.signalservice.GroupInviteLink.GroupInviteLinkContentsV1.encode(message.contentsV1, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupInviteLink message, length delimited. Does not implicitly {@link signalservice.GroupInviteLink.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.GroupInviteLink * @static * @param {signalservice.IGroupInviteLink} message GroupInviteLink message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupInviteLink.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupInviteLink message from the specified reader or buffer. * @function decode * @memberof signalservice.GroupInviteLink * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.GroupInviteLink} GroupInviteLink * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupInviteLink.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.GroupInviteLink(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.contentsV1 = $root.signalservice.GroupInviteLink.GroupInviteLinkContentsV1.decode(reader, reader.uint32()); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupInviteLink message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.GroupInviteLink * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.GroupInviteLink} GroupInviteLink * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupInviteLink.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; GroupInviteLink.GroupInviteLinkContentsV1 = (function() { /** * Properties of a GroupInviteLinkContentsV1. * @memberof signalservice.GroupInviteLink * @interface IGroupInviteLinkContentsV1 * @property {Uint8Array|null} [groupMasterKey] GroupInviteLinkContentsV1 groupMasterKey * @property {Uint8Array|null} [inviteLinkPassword] GroupInviteLinkContentsV1 inviteLinkPassword */ /** * Constructs a new GroupInviteLinkContentsV1. * @memberof signalservice.GroupInviteLink * @classdesc Represents a GroupInviteLinkContentsV1. * @implements IGroupInviteLinkContentsV1 * @constructor * @param {signalservice.GroupInviteLink.IGroupInviteLinkContentsV1=} [properties] Properties to set */ function GroupInviteLinkContentsV1(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GroupInviteLinkContentsV1 groupMasterKey. * @member {Uint8Array} groupMasterKey * @memberof signalservice.GroupInviteLink.GroupInviteLinkContentsV1 * @instance */ GroupInviteLinkContentsV1.prototype.groupMasterKey = $util.newBuffer([]); /** * GroupInviteLinkContentsV1 inviteLinkPassword. * @member {Uint8Array} inviteLinkPassword * @memberof signalservice.GroupInviteLink.GroupInviteLinkContentsV1 * @instance */ GroupInviteLinkContentsV1.prototype.inviteLinkPassword = $util.newBuffer([]); /** * Encodes the specified GroupInviteLinkContentsV1 message. Does not implicitly {@link signalservice.GroupInviteLink.GroupInviteLinkContentsV1.verify|verify} messages. * @function encode * @memberof signalservice.GroupInviteLink.GroupInviteLinkContentsV1 * @static * @param {signalservice.GroupInviteLink.IGroupInviteLinkContentsV1} message GroupInviteLinkContentsV1 message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupInviteLinkContentsV1.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.GroupInviteLink.GroupInviteLinkContentsV1.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.GroupInviteLink.GroupInviteLinkContentsV1.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.groupMasterKey != null && Object.hasOwnProperty.call(message, "groupMasterKey")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.groupMasterKey); if (message.inviteLinkPassword != null && Object.hasOwnProperty.call(message, "inviteLinkPassword")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.inviteLinkPassword); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupInviteLinkContentsV1 message, length delimited. Does not implicitly {@link signalservice.GroupInviteLink.GroupInviteLinkContentsV1.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.GroupInviteLink.GroupInviteLinkContentsV1 * @static * @param {signalservice.GroupInviteLink.IGroupInviteLinkContentsV1} message GroupInviteLinkContentsV1 message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupInviteLinkContentsV1.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupInviteLinkContentsV1 message from the specified reader or buffer. * @function decode * @memberof signalservice.GroupInviteLink.GroupInviteLinkContentsV1 * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.GroupInviteLink.GroupInviteLinkContentsV1} GroupInviteLinkContentsV1 * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupInviteLinkContentsV1.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.GroupInviteLink.GroupInviteLinkContentsV1(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.groupMasterKey = reader.bytes(); break; } case 2: { message.inviteLinkPassword = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupInviteLinkContentsV1 message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.GroupInviteLink.GroupInviteLinkContentsV1 * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.GroupInviteLink.GroupInviteLinkContentsV1} GroupInviteLinkContentsV1 * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupInviteLinkContentsV1.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return GroupInviteLinkContentsV1; })(); return GroupInviteLink; })(); signalservice.GroupJoinInfo = (function() { /** * Properties of a GroupJoinInfo. * @memberof signalservice * @interface IGroupJoinInfo * @property {Uint8Array|null} [publicKey] GroupJoinInfo publicKey * @property {Uint8Array|null} [title] GroupJoinInfo title * @property {Uint8Array|null} [description] GroupJoinInfo description * @property {string|null} [avatar] GroupJoinInfo avatar * @property {number|null} [memberCount] GroupJoinInfo memberCount * @property {signalservice.AccessControl.AccessRequired|null} [addFromInviteLink] GroupJoinInfo addFromInviteLink * @property {number|null} [version] GroupJoinInfo version * @property {boolean|null} [pendingAdminApproval] GroupJoinInfo pendingAdminApproval * @property {boolean|null} [pendingAdminApprovalFull] GroupJoinInfo pendingAdminApprovalFull */ /** * Constructs a new GroupJoinInfo. * @memberof signalservice * @classdesc Represents a GroupJoinInfo. * @implements IGroupJoinInfo * @constructor * @param {signalservice.IGroupJoinInfo=} [properties] Properties to set */ function GroupJoinInfo(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GroupJoinInfo publicKey. * @member {Uint8Array} publicKey * @memberof signalservice.GroupJoinInfo * @instance */ GroupJoinInfo.prototype.publicKey = $util.newBuffer([]); /** * GroupJoinInfo title. * @member {Uint8Array} title * @memberof signalservice.GroupJoinInfo * @instance */ GroupJoinInfo.prototype.title = $util.newBuffer([]); /** * GroupJoinInfo description. * @member {Uint8Array} description * @memberof signalservice.GroupJoinInfo * @instance */ GroupJoinInfo.prototype.description = $util.newBuffer([]); /** * GroupJoinInfo avatar. * @member {string} avatar * @memberof signalservice.GroupJoinInfo * @instance */ GroupJoinInfo.prototype.avatar = ""; /** * GroupJoinInfo memberCount. * @member {number} memberCount * @memberof signalservice.GroupJoinInfo * @instance */ GroupJoinInfo.prototype.memberCount = 0; /** * GroupJoinInfo addFromInviteLink. * @member {signalservice.AccessControl.AccessRequired} addFromInviteLink * @memberof signalservice.GroupJoinInfo * @instance */ GroupJoinInfo.prototype.addFromInviteLink = 0; /** * GroupJoinInfo version. * @member {number} version * @memberof signalservice.GroupJoinInfo * @instance */ GroupJoinInfo.prototype.version = 0; /** * GroupJoinInfo pendingAdminApproval. * @member {boolean} pendingAdminApproval * @memberof signalservice.GroupJoinInfo * @instance */ GroupJoinInfo.prototype.pendingAdminApproval = false; /** * GroupJoinInfo pendingAdminApprovalFull. * @member {boolean} pendingAdminApprovalFull * @memberof signalservice.GroupJoinInfo * @instance */ GroupJoinInfo.prototype.pendingAdminApprovalFull = false; /** * Encodes the specified GroupJoinInfo message. Does not implicitly {@link signalservice.GroupJoinInfo.verify|verify} messages. * @function encode * @memberof signalservice.GroupJoinInfo * @static * @param {signalservice.IGroupJoinInfo} message GroupJoinInfo message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupJoinInfo.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.GroupJoinInfo.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.GroupJoinInfo.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.publicKey != null && Object.hasOwnProperty.call(message, "publicKey")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.publicKey); if (message.title != null && Object.hasOwnProperty.call(message, "title")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.title); if (message.avatar != null && Object.hasOwnProperty.call(message, "avatar")) writer.uint32(/* id 3, wireType 2 =*/26).string(message.avatar); if (message.memberCount != null && Object.hasOwnProperty.call(message, "memberCount")) writer.uint32(/* id 4, wireType 0 =*/32).uint32(message.memberCount); if (message.addFromInviteLink != null && Object.hasOwnProperty.call(message, "addFromInviteLink")) writer.uint32(/* id 5, wireType 0 =*/40).int32(message.addFromInviteLink); if (message.version != null && Object.hasOwnProperty.call(message, "version")) writer.uint32(/* id 6, wireType 0 =*/48).uint32(message.version); if (message.pendingAdminApproval != null && Object.hasOwnProperty.call(message, "pendingAdminApproval")) writer.uint32(/* id 7, wireType 0 =*/56).bool(message.pendingAdminApproval); if (message.description != null && Object.hasOwnProperty.call(message, "description")) writer.uint32(/* id 8, wireType 2 =*/66).bytes(message.description); if (message.pendingAdminApprovalFull != null && Object.hasOwnProperty.call(message, "pendingAdminApprovalFull")) writer.uint32(/* id 9, wireType 0 =*/72).bool(message.pendingAdminApprovalFull); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupJoinInfo message, length delimited. Does not implicitly {@link signalservice.GroupJoinInfo.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.GroupJoinInfo * @static * @param {signalservice.IGroupJoinInfo} message GroupJoinInfo message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupJoinInfo.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupJoinInfo message from the specified reader or buffer. * @function decode * @memberof signalservice.GroupJoinInfo * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.GroupJoinInfo} GroupJoinInfo * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupJoinInfo.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.GroupJoinInfo(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.publicKey = reader.bytes(); break; } case 2: { message.title = reader.bytes(); break; } case 8: { message.description = reader.bytes(); break; } case 3: { message.avatar = reader.string(); break; } case 4: { message.memberCount = reader.uint32(); break; } case 5: { message.addFromInviteLink = reader.int32(); break; } case 6: { message.version = reader.uint32(); break; } case 7: { message.pendingAdminApproval = reader.bool(); break; } case 9: { message.pendingAdminApprovalFull = reader.bool(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupJoinInfo message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.GroupJoinInfo * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.GroupJoinInfo} GroupJoinInfo * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupJoinInfo.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return GroupJoinInfo; })(); signalservice.GroupChange = (function() { /** * Properties of a GroupChange. * @memberof signalservice * @interface IGroupChange * @property {Uint8Array|null} [actions] GroupChange actions * @property {Uint8Array|null} [serverSignature] GroupChange serverSignature * @property {number|null} [changeEpoch] GroupChange changeEpoch */ /** * Constructs a new GroupChange. * @memberof signalservice * @classdesc Represents a GroupChange. * @implements IGroupChange * @constructor * @param {signalservice.IGroupChange=} [properties] Properties to set */ function GroupChange(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GroupChange actions. * @member {Uint8Array} actions * @memberof signalservice.GroupChange * @instance */ GroupChange.prototype.actions = $util.newBuffer([]); /** * GroupChange serverSignature. * @member {Uint8Array} serverSignature * @memberof signalservice.GroupChange * @instance */ GroupChange.prototype.serverSignature = $util.newBuffer([]); /** * GroupChange changeEpoch. * @member {number} changeEpoch * @memberof signalservice.GroupChange * @instance */ GroupChange.prototype.changeEpoch = 0; /** * Encodes the specified GroupChange message. Does not implicitly {@link signalservice.GroupChange.verify|verify} messages. * @function encode * @memberof signalservice.GroupChange * @static * @param {signalservice.IGroupChange} message GroupChange message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupChange.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.GroupChange.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.GroupChange.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.actions != null && Object.hasOwnProperty.call(message, "actions")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.actions); if (message.serverSignature != null && Object.hasOwnProperty.call(message, "serverSignature")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.serverSignature); if (message.changeEpoch != null && Object.hasOwnProperty.call(message, "changeEpoch")) writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.changeEpoch); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupChange message, length delimited. Does not implicitly {@link signalservice.GroupChange.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.GroupChange * @static * @param {signalservice.IGroupChange} message GroupChange message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupChange.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupChange message from the specified reader or buffer. * @function decode * @memberof signalservice.GroupChange * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.GroupChange} GroupChange * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupChange.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.GroupChange(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.actions = reader.bytes(); break; } case 2: { message.serverSignature = reader.bytes(); break; } case 3: { message.changeEpoch = reader.uint32(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupChange message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.GroupChange * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.GroupChange} GroupChange * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupChange.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; GroupChange.Actions = (function() { /** * Properties of an Actions. * @memberof signalservice.GroupChange * @interface IActions * @property {Uint8Array|null} [sourceUserId] Actions sourceUserId * @property {Uint8Array|null} [groupId] Actions groupId * @property {number|null} [version] Actions version * @property {Array.|null} [addMembers] Actions addMembers * @property {Array.|null} [deleteMembers] Actions deleteMembers * @property {Array.|null} [modifyMemberRoles] Actions modifyMemberRoles * @property {Array.|null} [modifyMemberLabels] Actions modifyMemberLabels * @property {Array.|null} [modifyMemberProfileKeys] Actions modifyMemberProfileKeys * @property {Array.|null} [addMembersPendingProfileKey] Actions addMembersPendingProfileKey * @property {Array.|null} [deleteMembersPendingProfileKey] Actions deleteMembersPendingProfileKey * @property {Array.|null} [promoteMembersPendingProfileKey] Actions promoteMembersPendingProfileKey * @property {signalservice.GroupChange.Actions.IModifyTitleAction|null} [modifyTitle] Actions modifyTitle * @property {signalservice.GroupChange.Actions.IModifyAvatarAction|null} [modifyAvatar] Actions modifyAvatar * @property {signalservice.GroupChange.Actions.IModifyDisappearingMessageTimerAction|null} [modifyDisappearingMessageTimer] Actions modifyDisappearingMessageTimer * @property {signalservice.GroupChange.Actions.IModifyAttributesAccessControlAction|null} [modifyAttributesAccess] Actions modifyAttributesAccess * @property {signalservice.GroupChange.Actions.IModifyMembersAccessControlAction|null} [modifyMemberAccess] Actions modifyMemberAccess * @property {signalservice.GroupChange.Actions.IModifyAddFromInviteLinkAccessControlAction|null} [modifyAddFromInviteLinkAccess] Actions modifyAddFromInviteLinkAccess * @property {Array.|null} [addMembersPendingAdminApproval] Actions addMembersPendingAdminApproval * @property {Array.|null} [deleteMembersPendingAdminApproval] Actions deleteMembersPendingAdminApproval * @property {Array.|null} [promoteMembersPendingAdminApproval] Actions promoteMembersPendingAdminApproval * @property {signalservice.GroupChange.Actions.IModifyInviteLinkPasswordAction|null} [modifyInviteLinkPassword] Actions modifyInviteLinkPassword * @property {signalservice.GroupChange.Actions.IModifyDescriptionAction|null} [modifyDescription] Actions modifyDescription * @property {signalservice.GroupChange.Actions.IModifyAnnouncementsOnlyAction|null} [modifyAnnouncementsOnly] Actions modifyAnnouncementsOnly * @property {Array.|null} [addMembersBanned] Actions addMembersBanned * @property {Array.|null} [deleteMembersBanned] Actions deleteMembersBanned * @property {Array.|null} [promoteMembersPendingPniAciProfileKey] Actions promoteMembersPendingPniAciProfileKey */ /** * Constructs a new Actions. * @memberof signalservice.GroupChange * @classdesc Represents an Actions. * @implements IActions * @constructor * @param {signalservice.GroupChange.IActions=} [properties] Properties to set */ function Actions(properties) { this.addMembers = []; this.deleteMembers = []; this.modifyMemberRoles = []; this.modifyMemberLabels = []; this.modifyMemberProfileKeys = []; this.addMembersPendingProfileKey = []; this.deleteMembersPendingProfileKey = []; this.promoteMembersPendingProfileKey = []; this.addMembersPendingAdminApproval = []; this.deleteMembersPendingAdminApproval = []; this.promoteMembersPendingAdminApproval = []; this.addMembersBanned = []; this.deleteMembersBanned = []; this.promoteMembersPendingPniAciProfileKey = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Actions sourceUserId. * @member {Uint8Array} sourceUserId * @memberof signalservice.GroupChange.Actions * @instance */ Actions.prototype.sourceUserId = $util.newBuffer([]); /** * Actions groupId. * @member {Uint8Array} groupId * @memberof signalservice.GroupChange.Actions * @instance */ Actions.prototype.groupId = $util.newBuffer([]); /** * Actions version. * @member {number} version * @memberof signalservice.GroupChange.Actions * @instance */ Actions.prototype.version = 0; /** * Actions addMembers. * @member {Array.} addMembers * @memberof signalservice.GroupChange.Actions * @instance */ Actions.prototype.addMembers = $util.emptyArray; /** * Actions deleteMembers. * @member {Array.} deleteMembers * @memberof signalservice.GroupChange.Actions * @instance */ Actions.prototype.deleteMembers = $util.emptyArray; /** * Actions modifyMemberRoles. * @member {Array.} modifyMemberRoles * @memberof signalservice.GroupChange.Actions * @instance */ Actions.prototype.modifyMemberRoles = $util.emptyArray; /** * Actions modifyMemberLabels. * @member {Array.} modifyMemberLabels * @memberof signalservice.GroupChange.Actions * @instance */ Actions.prototype.modifyMemberLabels = $util.emptyArray; /** * Actions modifyMemberProfileKeys. * @member {Array.} modifyMemberProfileKeys * @memberof signalservice.GroupChange.Actions * @instance */ Actions.prototype.modifyMemberProfileKeys = $util.emptyArray; /** * Actions addMembersPendingProfileKey. * @member {Array.} addMembersPendingProfileKey * @memberof signalservice.GroupChange.Actions * @instance */ Actions.prototype.addMembersPendingProfileKey = $util.emptyArray; /** * Actions deleteMembersPendingProfileKey. * @member {Array.} deleteMembersPendingProfileKey * @memberof signalservice.GroupChange.Actions * @instance */ Actions.prototype.deleteMembersPendingProfileKey = $util.emptyArray; /** * Actions promoteMembersPendingProfileKey. * @member {Array.} promoteMembersPendingProfileKey * @memberof signalservice.GroupChange.Actions * @instance */ Actions.prototype.promoteMembersPendingProfileKey = $util.emptyArray; /** * Actions modifyTitle. * @member {signalservice.GroupChange.Actions.IModifyTitleAction|null|undefined} modifyTitle * @memberof signalservice.GroupChange.Actions * @instance */ Actions.prototype.modifyTitle = null; /** * Actions modifyAvatar. * @member {signalservice.GroupChange.Actions.IModifyAvatarAction|null|undefined} modifyAvatar * @memberof signalservice.GroupChange.Actions * @instance */ Actions.prototype.modifyAvatar = null; /** * Actions modifyDisappearingMessageTimer. * @member {signalservice.GroupChange.Actions.IModifyDisappearingMessageTimerAction|null|undefined} modifyDisappearingMessageTimer * @memberof signalservice.GroupChange.Actions * @instance */ Actions.prototype.modifyDisappearingMessageTimer = null; /** * Actions modifyAttributesAccess. * @member {signalservice.GroupChange.Actions.IModifyAttributesAccessControlAction|null|undefined} modifyAttributesAccess * @memberof signalservice.GroupChange.Actions * @instance */ Actions.prototype.modifyAttributesAccess = null; /** * Actions modifyMemberAccess. * @member {signalservice.GroupChange.Actions.IModifyMembersAccessControlAction|null|undefined} modifyMemberAccess * @memberof signalservice.GroupChange.Actions * @instance */ Actions.prototype.modifyMemberAccess = null; /** * Actions modifyAddFromInviteLinkAccess. * @member {signalservice.GroupChange.Actions.IModifyAddFromInviteLinkAccessControlAction|null|undefined} modifyAddFromInviteLinkAccess * @memberof signalservice.GroupChange.Actions * @instance */ Actions.prototype.modifyAddFromInviteLinkAccess = null; /** * Actions addMembersPendingAdminApproval. * @member {Array.} addMembersPendingAdminApproval * @memberof signalservice.GroupChange.Actions * @instance */ Actions.prototype.addMembersPendingAdminApproval = $util.emptyArray; /** * Actions deleteMembersPendingAdminApproval. * @member {Array.} deleteMembersPendingAdminApproval * @memberof signalservice.GroupChange.Actions * @instance */ Actions.prototype.deleteMembersPendingAdminApproval = $util.emptyArray; /** * Actions promoteMembersPendingAdminApproval. * @member {Array.} promoteMembersPendingAdminApproval * @memberof signalservice.GroupChange.Actions * @instance */ Actions.prototype.promoteMembersPendingAdminApproval = $util.emptyArray; /** * Actions modifyInviteLinkPassword. * @member {signalservice.GroupChange.Actions.IModifyInviteLinkPasswordAction|null|undefined} modifyInviteLinkPassword * @memberof signalservice.GroupChange.Actions * @instance */ Actions.prototype.modifyInviteLinkPassword = null; /** * Actions modifyDescription. * @member {signalservice.GroupChange.Actions.IModifyDescriptionAction|null|undefined} modifyDescription * @memberof signalservice.GroupChange.Actions * @instance */ Actions.prototype.modifyDescription = null; /** * Actions modifyAnnouncementsOnly. * @member {signalservice.GroupChange.Actions.IModifyAnnouncementsOnlyAction|null|undefined} modifyAnnouncementsOnly * @memberof signalservice.GroupChange.Actions * @instance */ Actions.prototype.modifyAnnouncementsOnly = null; /** * Actions addMembersBanned. * @member {Array.} addMembersBanned * @memberof signalservice.GroupChange.Actions * @instance */ Actions.prototype.addMembersBanned = $util.emptyArray; /** * Actions deleteMembersBanned. * @member {Array.} deleteMembersBanned * @memberof signalservice.GroupChange.Actions * @instance */ Actions.prototype.deleteMembersBanned = $util.emptyArray; /** * Actions promoteMembersPendingPniAciProfileKey. * @member {Array.} promoteMembersPendingPniAciProfileKey * @memberof signalservice.GroupChange.Actions * @instance */ Actions.prototype.promoteMembersPendingPniAciProfileKey = $util.emptyArray; /** * Encodes the specified Actions message. Does not implicitly {@link signalservice.GroupChange.Actions.verify|verify} messages. * @function encode * @memberof signalservice.GroupChange.Actions * @static * @param {signalservice.GroupChange.IActions} message Actions message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Actions.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.GroupChange.Actions.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.GroupChange.Actions.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.sourceUserId != null && Object.hasOwnProperty.call(message, "sourceUserId")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.sourceUserId); if (message.version != null && Object.hasOwnProperty.call(message, "version")) writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.version); if (message.addMembers != null && message.addMembers.length) for (var i = 0; i < message.addMembers.length; ++i) $root.signalservice.GroupChange.Actions.AddMemberAction.encode(message.addMembers[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); if (message.deleteMembers != null && message.deleteMembers.length) for (var i = 0; i < message.deleteMembers.length; ++i) $root.signalservice.GroupChange.Actions.DeleteMemberAction.encode(message.deleteMembers[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); if (message.modifyMemberRoles != null && message.modifyMemberRoles.length) for (var i = 0; i < message.modifyMemberRoles.length; ++i) $root.signalservice.GroupChange.Actions.ModifyMemberRoleAction.encode(message.modifyMemberRoles[i], writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); if (message.modifyMemberProfileKeys != null && message.modifyMemberProfileKeys.length) for (var i = 0; i < message.modifyMemberProfileKeys.length; ++i) $root.signalservice.GroupChange.Actions.ModifyMemberProfileKeyAction.encode(message.modifyMemberProfileKeys[i], writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim(); if (message.addMembersPendingProfileKey != null && message.addMembersPendingProfileKey.length) for (var i = 0; i < message.addMembersPendingProfileKey.length; ++i) $root.signalservice.GroupChange.Actions.AddMemberPendingProfileKeyAction.encode(message.addMembersPendingProfileKey[i], writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim(); if (message.deleteMembersPendingProfileKey != null && message.deleteMembersPendingProfileKey.length) for (var i = 0; i < message.deleteMembersPendingProfileKey.length; ++i) $root.signalservice.GroupChange.Actions.DeleteMemberPendingProfileKeyAction.encode(message.deleteMembersPendingProfileKey[i], writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim(); if (message.promoteMembersPendingProfileKey != null && message.promoteMembersPendingProfileKey.length) for (var i = 0; i < message.promoteMembersPendingProfileKey.length; ++i) $root.signalservice.GroupChange.Actions.PromoteMemberPendingProfileKeyAction.encode(message.promoteMembersPendingProfileKey[i], writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim(); if (message.modifyTitle != null && Object.hasOwnProperty.call(message, "modifyTitle")) $root.signalservice.GroupChange.Actions.ModifyTitleAction.encode(message.modifyTitle, writer.uint32(/* id 10, wireType 2 =*/82).fork()).ldelim(); if (message.modifyAvatar != null && Object.hasOwnProperty.call(message, "modifyAvatar")) $root.signalservice.GroupChange.Actions.ModifyAvatarAction.encode(message.modifyAvatar, writer.uint32(/* id 11, wireType 2 =*/90).fork()).ldelim(); if (message.modifyDisappearingMessageTimer != null && Object.hasOwnProperty.call(message, "modifyDisappearingMessageTimer")) $root.signalservice.GroupChange.Actions.ModifyDisappearingMessageTimerAction.encode(message.modifyDisappearingMessageTimer, writer.uint32(/* id 12, wireType 2 =*/98).fork()).ldelim(); if (message.modifyAttributesAccess != null && Object.hasOwnProperty.call(message, "modifyAttributesAccess")) $root.signalservice.GroupChange.Actions.ModifyAttributesAccessControlAction.encode(message.modifyAttributesAccess, writer.uint32(/* id 13, wireType 2 =*/106).fork()).ldelim(); if (message.modifyMemberAccess != null && Object.hasOwnProperty.call(message, "modifyMemberAccess")) $root.signalservice.GroupChange.Actions.ModifyMembersAccessControlAction.encode(message.modifyMemberAccess, writer.uint32(/* id 14, wireType 2 =*/114).fork()).ldelim(); if (message.modifyAddFromInviteLinkAccess != null && Object.hasOwnProperty.call(message, "modifyAddFromInviteLinkAccess")) $root.signalservice.GroupChange.Actions.ModifyAddFromInviteLinkAccessControlAction.encode(message.modifyAddFromInviteLinkAccess, writer.uint32(/* id 15, wireType 2 =*/122).fork()).ldelim(); if (message.addMembersPendingAdminApproval != null && message.addMembersPendingAdminApproval.length) for (var i = 0; i < message.addMembersPendingAdminApproval.length; ++i) $root.signalservice.GroupChange.Actions.AddMemberPendingAdminApprovalAction.encode(message.addMembersPendingAdminApproval[i], writer.uint32(/* id 16, wireType 2 =*/130).fork()).ldelim(); if (message.deleteMembersPendingAdminApproval != null && message.deleteMembersPendingAdminApproval.length) for (var i = 0; i < message.deleteMembersPendingAdminApproval.length; ++i) $root.signalservice.GroupChange.Actions.DeleteMemberPendingAdminApprovalAction.encode(message.deleteMembersPendingAdminApproval[i], writer.uint32(/* id 17, wireType 2 =*/138).fork()).ldelim(); if (message.promoteMembersPendingAdminApproval != null && message.promoteMembersPendingAdminApproval.length) for (var i = 0; i < message.promoteMembersPendingAdminApproval.length; ++i) $root.signalservice.GroupChange.Actions.PromoteMemberPendingAdminApprovalAction.encode(message.promoteMembersPendingAdminApproval[i], writer.uint32(/* id 18, wireType 2 =*/146).fork()).ldelim(); if (message.modifyInviteLinkPassword != null && Object.hasOwnProperty.call(message, "modifyInviteLinkPassword")) $root.signalservice.GroupChange.Actions.ModifyInviteLinkPasswordAction.encode(message.modifyInviteLinkPassword, writer.uint32(/* id 19, wireType 2 =*/154).fork()).ldelim(); if (message.modifyDescription != null && Object.hasOwnProperty.call(message, "modifyDescription")) $root.signalservice.GroupChange.Actions.ModifyDescriptionAction.encode(message.modifyDescription, writer.uint32(/* id 20, wireType 2 =*/162).fork()).ldelim(); if (message.modifyAnnouncementsOnly != null && Object.hasOwnProperty.call(message, "modifyAnnouncementsOnly")) $root.signalservice.GroupChange.Actions.ModifyAnnouncementsOnlyAction.encode(message.modifyAnnouncementsOnly, writer.uint32(/* id 21, wireType 2 =*/170).fork()).ldelim(); if (message.addMembersBanned != null && message.addMembersBanned.length) for (var i = 0; i < message.addMembersBanned.length; ++i) $root.signalservice.GroupChange.Actions.AddMemberBannedAction.encode(message.addMembersBanned[i], writer.uint32(/* id 22, wireType 2 =*/178).fork()).ldelim(); if (message.deleteMembersBanned != null && message.deleteMembersBanned.length) for (var i = 0; i < message.deleteMembersBanned.length; ++i) $root.signalservice.GroupChange.Actions.DeleteMemberBannedAction.encode(message.deleteMembersBanned[i], writer.uint32(/* id 23, wireType 2 =*/186).fork()).ldelim(); if (message.promoteMembersPendingPniAciProfileKey != null && message.promoteMembersPendingPniAciProfileKey.length) for (var i = 0; i < message.promoteMembersPendingPniAciProfileKey.length; ++i) $root.signalservice.GroupChange.Actions.PromoteMemberPendingPniAciProfileKeyAction.encode(message.promoteMembersPendingPniAciProfileKey[i], writer.uint32(/* id 24, wireType 2 =*/194).fork()).ldelim(); if (message.groupId != null && Object.hasOwnProperty.call(message, "groupId")) writer.uint32(/* id 25, wireType 2 =*/202).bytes(message.groupId); if (message.modifyMemberLabels != null && message.modifyMemberLabels.length) for (var i = 0; i < message.modifyMemberLabels.length; ++i) $root.signalservice.GroupChange.Actions.ModifyMemberLabelAction.encode(message.modifyMemberLabels[i], writer.uint32(/* id 26, wireType 2 =*/210).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Actions message, length delimited. Does not implicitly {@link signalservice.GroupChange.Actions.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.GroupChange.Actions * @static * @param {signalservice.GroupChange.IActions} message Actions message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Actions.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an Actions message from the specified reader or buffer. * @function decode * @memberof signalservice.GroupChange.Actions * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.GroupChange.Actions} Actions * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Actions.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.GroupChange.Actions(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.sourceUserId = reader.bytes(); break; } case 25: { message.groupId = reader.bytes(); break; } case 2: { message.version = reader.uint32(); break; } case 3: { if (!(message.addMembers && message.addMembers.length)) message.addMembers = []; message.addMembers.push($root.signalservice.GroupChange.Actions.AddMemberAction.decode(reader, reader.uint32())); break; } case 4: { if (!(message.deleteMembers && message.deleteMembers.length)) message.deleteMembers = []; message.deleteMembers.push($root.signalservice.GroupChange.Actions.DeleteMemberAction.decode(reader, reader.uint32())); break; } case 5: { if (!(message.modifyMemberRoles && message.modifyMemberRoles.length)) message.modifyMemberRoles = []; message.modifyMemberRoles.push($root.signalservice.GroupChange.Actions.ModifyMemberRoleAction.decode(reader, reader.uint32())); break; } case 26: { if (!(message.modifyMemberLabels && message.modifyMemberLabels.length)) message.modifyMemberLabels = []; message.modifyMemberLabels.push($root.signalservice.GroupChange.Actions.ModifyMemberLabelAction.decode(reader, reader.uint32())); break; } case 6: { if (!(message.modifyMemberProfileKeys && message.modifyMemberProfileKeys.length)) message.modifyMemberProfileKeys = []; message.modifyMemberProfileKeys.push($root.signalservice.GroupChange.Actions.ModifyMemberProfileKeyAction.decode(reader, reader.uint32())); break; } case 7: { if (!(message.addMembersPendingProfileKey && message.addMembersPendingProfileKey.length)) message.addMembersPendingProfileKey = []; message.addMembersPendingProfileKey.push($root.signalservice.GroupChange.Actions.AddMemberPendingProfileKeyAction.decode(reader, reader.uint32())); break; } case 8: { if (!(message.deleteMembersPendingProfileKey && message.deleteMembersPendingProfileKey.length)) message.deleteMembersPendingProfileKey = []; message.deleteMembersPendingProfileKey.push($root.signalservice.GroupChange.Actions.DeleteMemberPendingProfileKeyAction.decode(reader, reader.uint32())); break; } case 9: { if (!(message.promoteMembersPendingProfileKey && message.promoteMembersPendingProfileKey.length)) message.promoteMembersPendingProfileKey = []; message.promoteMembersPendingProfileKey.push($root.signalservice.GroupChange.Actions.PromoteMemberPendingProfileKeyAction.decode(reader, reader.uint32())); break; } case 10: { message.modifyTitle = $root.signalservice.GroupChange.Actions.ModifyTitleAction.decode(reader, reader.uint32()); break; } case 11: { message.modifyAvatar = $root.signalservice.GroupChange.Actions.ModifyAvatarAction.decode(reader, reader.uint32()); break; } case 12: { message.modifyDisappearingMessageTimer = $root.signalservice.GroupChange.Actions.ModifyDisappearingMessageTimerAction.decode(reader, reader.uint32()); break; } case 13: { message.modifyAttributesAccess = $root.signalservice.GroupChange.Actions.ModifyAttributesAccessControlAction.decode(reader, reader.uint32()); break; } case 14: { message.modifyMemberAccess = $root.signalservice.GroupChange.Actions.ModifyMembersAccessControlAction.decode(reader, reader.uint32()); break; } case 15: { message.modifyAddFromInviteLinkAccess = $root.signalservice.GroupChange.Actions.ModifyAddFromInviteLinkAccessControlAction.decode(reader, reader.uint32()); break; } case 16: { if (!(message.addMembersPendingAdminApproval && message.addMembersPendingAdminApproval.length)) message.addMembersPendingAdminApproval = []; message.addMembersPendingAdminApproval.push($root.signalservice.GroupChange.Actions.AddMemberPendingAdminApprovalAction.decode(reader, reader.uint32())); break; } case 17: { if (!(message.deleteMembersPendingAdminApproval && message.deleteMembersPendingAdminApproval.length)) message.deleteMembersPendingAdminApproval = []; message.deleteMembersPendingAdminApproval.push($root.signalservice.GroupChange.Actions.DeleteMemberPendingAdminApprovalAction.decode(reader, reader.uint32())); break; } case 18: { if (!(message.promoteMembersPendingAdminApproval && message.promoteMembersPendingAdminApproval.length)) message.promoteMembersPendingAdminApproval = []; message.promoteMembersPendingAdminApproval.push($root.signalservice.GroupChange.Actions.PromoteMemberPendingAdminApprovalAction.decode(reader, reader.uint32())); break; } case 19: { message.modifyInviteLinkPassword = $root.signalservice.GroupChange.Actions.ModifyInviteLinkPasswordAction.decode(reader, reader.uint32()); break; } case 20: { message.modifyDescription = $root.signalservice.GroupChange.Actions.ModifyDescriptionAction.decode(reader, reader.uint32()); break; } case 21: { message.modifyAnnouncementsOnly = $root.signalservice.GroupChange.Actions.ModifyAnnouncementsOnlyAction.decode(reader, reader.uint32()); break; } case 22: { if (!(message.addMembersBanned && message.addMembersBanned.length)) message.addMembersBanned = []; message.addMembersBanned.push($root.signalservice.GroupChange.Actions.AddMemberBannedAction.decode(reader, reader.uint32())); break; } case 23: { if (!(message.deleteMembersBanned && message.deleteMembersBanned.length)) message.deleteMembersBanned = []; message.deleteMembersBanned.push($root.signalservice.GroupChange.Actions.DeleteMemberBannedAction.decode(reader, reader.uint32())); break; } case 24: { if (!(message.promoteMembersPendingPniAciProfileKey && message.promoteMembersPendingPniAciProfileKey.length)) message.promoteMembersPendingPniAciProfileKey = []; message.promoteMembersPendingPniAciProfileKey.push($root.signalservice.GroupChange.Actions.PromoteMemberPendingPniAciProfileKeyAction.decode(reader, reader.uint32())); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an Actions message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.GroupChange.Actions * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.GroupChange.Actions} Actions * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Actions.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; Actions.AddMemberAction = (function() { /** * Properties of an AddMemberAction. * @memberof signalservice.GroupChange.Actions * @interface IAddMemberAction * @property {signalservice.IMember|null} [added] AddMemberAction added * @property {boolean|null} [joinFromInviteLink] AddMemberAction joinFromInviteLink */ /** * Constructs a new AddMemberAction. * @memberof signalservice.GroupChange.Actions * @classdesc Represents an AddMemberAction. * @implements IAddMemberAction * @constructor * @param {signalservice.GroupChange.Actions.IAddMemberAction=} [properties] Properties to set */ function AddMemberAction(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * AddMemberAction added. * @member {signalservice.IMember|null|undefined} added * @memberof signalservice.GroupChange.Actions.AddMemberAction * @instance */ AddMemberAction.prototype.added = null; /** * AddMemberAction joinFromInviteLink. * @member {boolean} joinFromInviteLink * @memberof signalservice.GroupChange.Actions.AddMemberAction * @instance */ AddMemberAction.prototype.joinFromInviteLink = false; /** * Encodes the specified AddMemberAction message. Does not implicitly {@link signalservice.GroupChange.Actions.AddMemberAction.verify|verify} messages. * @function encode * @memberof signalservice.GroupChange.Actions.AddMemberAction * @static * @param {signalservice.GroupChange.Actions.IAddMemberAction} message AddMemberAction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ AddMemberAction.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.GroupChange.Actions.AddMemberAction.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.GroupChange.Actions.AddMemberAction.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.added != null && Object.hasOwnProperty.call(message, "added")) $root.signalservice.Member.encode(message.added, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.joinFromInviteLink != null && Object.hasOwnProperty.call(message, "joinFromInviteLink")) writer.uint32(/* id 2, wireType 0 =*/16).bool(message.joinFromInviteLink); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified AddMemberAction message, length delimited. Does not implicitly {@link signalservice.GroupChange.Actions.AddMemberAction.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.GroupChange.Actions.AddMemberAction * @static * @param {signalservice.GroupChange.Actions.IAddMemberAction} message AddMemberAction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ AddMemberAction.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an AddMemberAction message from the specified reader or buffer. * @function decode * @memberof signalservice.GroupChange.Actions.AddMemberAction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.GroupChange.Actions.AddMemberAction} AddMemberAction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ AddMemberAction.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.GroupChange.Actions.AddMemberAction(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.added = $root.signalservice.Member.decode(reader, reader.uint32()); break; } case 2: { message.joinFromInviteLink = reader.bool(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an AddMemberAction message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.GroupChange.Actions.AddMemberAction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.GroupChange.Actions.AddMemberAction} AddMemberAction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ AddMemberAction.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return AddMemberAction; })(); Actions.DeleteMemberAction = (function() { /** * Properties of a DeleteMemberAction. * @memberof signalservice.GroupChange.Actions * @interface IDeleteMemberAction * @property {Uint8Array|null} [deletedUserId] DeleteMemberAction deletedUserId */ /** * Constructs a new DeleteMemberAction. * @memberof signalservice.GroupChange.Actions * @classdesc Represents a DeleteMemberAction. * @implements IDeleteMemberAction * @constructor * @param {signalservice.GroupChange.Actions.IDeleteMemberAction=} [properties] Properties to set */ function DeleteMemberAction(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * DeleteMemberAction deletedUserId. * @member {Uint8Array} deletedUserId * @memberof signalservice.GroupChange.Actions.DeleteMemberAction * @instance */ DeleteMemberAction.prototype.deletedUserId = $util.newBuffer([]); /** * Encodes the specified DeleteMemberAction message. Does not implicitly {@link signalservice.GroupChange.Actions.DeleteMemberAction.verify|verify} messages. * @function encode * @memberof signalservice.GroupChange.Actions.DeleteMemberAction * @static * @param {signalservice.GroupChange.Actions.IDeleteMemberAction} message DeleteMemberAction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ DeleteMemberAction.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.GroupChange.Actions.DeleteMemberAction.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.GroupChange.Actions.DeleteMemberAction.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.deletedUserId != null && Object.hasOwnProperty.call(message, "deletedUserId")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.deletedUserId); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified DeleteMemberAction message, length delimited. Does not implicitly {@link signalservice.GroupChange.Actions.DeleteMemberAction.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.GroupChange.Actions.DeleteMemberAction * @static * @param {signalservice.GroupChange.Actions.IDeleteMemberAction} message DeleteMemberAction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ DeleteMemberAction.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a DeleteMemberAction message from the specified reader or buffer. * @function decode * @memberof signalservice.GroupChange.Actions.DeleteMemberAction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.GroupChange.Actions.DeleteMemberAction} DeleteMemberAction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ DeleteMemberAction.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.GroupChange.Actions.DeleteMemberAction(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.deletedUserId = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a DeleteMemberAction message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.GroupChange.Actions.DeleteMemberAction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.GroupChange.Actions.DeleteMemberAction} DeleteMemberAction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ DeleteMemberAction.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return DeleteMemberAction; })(); Actions.ModifyMemberRoleAction = (function() { /** * Properties of a ModifyMemberRoleAction. * @memberof signalservice.GroupChange.Actions * @interface IModifyMemberRoleAction * @property {Uint8Array|null} [userId] ModifyMemberRoleAction userId * @property {signalservice.Member.Role|null} [role] ModifyMemberRoleAction role */ /** * Constructs a new ModifyMemberRoleAction. * @memberof signalservice.GroupChange.Actions * @classdesc Represents a ModifyMemberRoleAction. * @implements IModifyMemberRoleAction * @constructor * @param {signalservice.GroupChange.Actions.IModifyMemberRoleAction=} [properties] Properties to set */ function ModifyMemberRoleAction(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * ModifyMemberRoleAction userId. * @member {Uint8Array} userId * @memberof signalservice.GroupChange.Actions.ModifyMemberRoleAction * @instance */ ModifyMemberRoleAction.prototype.userId = $util.newBuffer([]); /** * ModifyMemberRoleAction role. * @member {signalservice.Member.Role} role * @memberof signalservice.GroupChange.Actions.ModifyMemberRoleAction * @instance */ ModifyMemberRoleAction.prototype.role = 0; /** * Encodes the specified ModifyMemberRoleAction message. Does not implicitly {@link signalservice.GroupChange.Actions.ModifyMemberRoleAction.verify|verify} messages. * @function encode * @memberof signalservice.GroupChange.Actions.ModifyMemberRoleAction * @static * @param {signalservice.GroupChange.Actions.IModifyMemberRoleAction} message ModifyMemberRoleAction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ModifyMemberRoleAction.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.GroupChange.Actions.ModifyMemberRoleAction.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.GroupChange.Actions.ModifyMemberRoleAction.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.userId != null && Object.hasOwnProperty.call(message, "userId")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.userId); if (message.role != null && Object.hasOwnProperty.call(message, "role")) writer.uint32(/* id 2, wireType 0 =*/16).int32(message.role); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified ModifyMemberRoleAction message, length delimited. Does not implicitly {@link signalservice.GroupChange.Actions.ModifyMemberRoleAction.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.GroupChange.Actions.ModifyMemberRoleAction * @static * @param {signalservice.GroupChange.Actions.IModifyMemberRoleAction} message ModifyMemberRoleAction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ModifyMemberRoleAction.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a ModifyMemberRoleAction message from the specified reader or buffer. * @function decode * @memberof signalservice.GroupChange.Actions.ModifyMemberRoleAction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.GroupChange.Actions.ModifyMemberRoleAction} ModifyMemberRoleAction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ModifyMemberRoleAction.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.GroupChange.Actions.ModifyMemberRoleAction(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.userId = reader.bytes(); break; } case 2: { message.role = reader.int32(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a ModifyMemberRoleAction message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.GroupChange.Actions.ModifyMemberRoleAction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.GroupChange.Actions.ModifyMemberRoleAction} ModifyMemberRoleAction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ModifyMemberRoleAction.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return ModifyMemberRoleAction; })(); Actions.ModifyMemberLabelAction = (function() { /** * Properties of a ModifyMemberLabelAction. * @memberof signalservice.GroupChange.Actions * @interface IModifyMemberLabelAction * @property {Uint8Array|null} [userId] ModifyMemberLabelAction userId * @property {Uint8Array|null} [labelEmoji] ModifyMemberLabelAction labelEmoji * @property {Uint8Array|null} [labelString] ModifyMemberLabelAction labelString */ /** * Constructs a new ModifyMemberLabelAction. * @memberof signalservice.GroupChange.Actions * @classdesc Represents a ModifyMemberLabelAction. * @implements IModifyMemberLabelAction * @constructor * @param {signalservice.GroupChange.Actions.IModifyMemberLabelAction=} [properties] Properties to set */ function ModifyMemberLabelAction(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * ModifyMemberLabelAction userId. * @member {Uint8Array} userId * @memberof signalservice.GroupChange.Actions.ModifyMemberLabelAction * @instance */ ModifyMemberLabelAction.prototype.userId = $util.newBuffer([]); /** * ModifyMemberLabelAction labelEmoji. * @member {Uint8Array} labelEmoji * @memberof signalservice.GroupChange.Actions.ModifyMemberLabelAction * @instance */ ModifyMemberLabelAction.prototype.labelEmoji = $util.newBuffer([]); /** * ModifyMemberLabelAction labelString. * @member {Uint8Array} labelString * @memberof signalservice.GroupChange.Actions.ModifyMemberLabelAction * @instance */ ModifyMemberLabelAction.prototype.labelString = $util.newBuffer([]); /** * Encodes the specified ModifyMemberLabelAction message. Does not implicitly {@link signalservice.GroupChange.Actions.ModifyMemberLabelAction.verify|verify} messages. * @function encode * @memberof signalservice.GroupChange.Actions.ModifyMemberLabelAction * @static * @param {signalservice.GroupChange.Actions.IModifyMemberLabelAction} message ModifyMemberLabelAction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ModifyMemberLabelAction.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.GroupChange.Actions.ModifyMemberLabelAction.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.GroupChange.Actions.ModifyMemberLabelAction.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.userId != null && Object.hasOwnProperty.call(message, "userId")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.userId); if (message.labelEmoji != null && Object.hasOwnProperty.call(message, "labelEmoji")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.labelEmoji); if (message.labelString != null && Object.hasOwnProperty.call(message, "labelString")) writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.labelString); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified ModifyMemberLabelAction message, length delimited. Does not implicitly {@link signalservice.GroupChange.Actions.ModifyMemberLabelAction.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.GroupChange.Actions.ModifyMemberLabelAction * @static * @param {signalservice.GroupChange.Actions.IModifyMemberLabelAction} message ModifyMemberLabelAction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ModifyMemberLabelAction.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a ModifyMemberLabelAction message from the specified reader or buffer. * @function decode * @memberof signalservice.GroupChange.Actions.ModifyMemberLabelAction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.GroupChange.Actions.ModifyMemberLabelAction} ModifyMemberLabelAction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ModifyMemberLabelAction.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.GroupChange.Actions.ModifyMemberLabelAction(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.userId = reader.bytes(); break; } case 2: { message.labelEmoji = reader.bytes(); break; } case 3: { message.labelString = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a ModifyMemberLabelAction message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.GroupChange.Actions.ModifyMemberLabelAction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.GroupChange.Actions.ModifyMemberLabelAction} ModifyMemberLabelAction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ModifyMemberLabelAction.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return ModifyMemberLabelAction; })(); Actions.ModifyMemberProfileKeyAction = (function() { /** * Properties of a ModifyMemberProfileKeyAction. * @memberof signalservice.GroupChange.Actions * @interface IModifyMemberProfileKeyAction * @property {Uint8Array|null} [presentation] ModifyMemberProfileKeyAction presentation * @property {Uint8Array|null} [userId] ModifyMemberProfileKeyAction userId * @property {Uint8Array|null} [profileKey] ModifyMemberProfileKeyAction profileKey */ /** * Constructs a new ModifyMemberProfileKeyAction. * @memberof signalservice.GroupChange.Actions * @classdesc Represents a ModifyMemberProfileKeyAction. * @implements IModifyMemberProfileKeyAction * @constructor * @param {signalservice.GroupChange.Actions.IModifyMemberProfileKeyAction=} [properties] Properties to set */ function ModifyMemberProfileKeyAction(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * ModifyMemberProfileKeyAction presentation. * @member {Uint8Array} presentation * @memberof signalservice.GroupChange.Actions.ModifyMemberProfileKeyAction * @instance */ ModifyMemberProfileKeyAction.prototype.presentation = $util.newBuffer([]); /** * ModifyMemberProfileKeyAction userId. * @member {Uint8Array} userId * @memberof signalservice.GroupChange.Actions.ModifyMemberProfileKeyAction * @instance */ ModifyMemberProfileKeyAction.prototype.userId = $util.newBuffer([]); /** * ModifyMemberProfileKeyAction profileKey. * @member {Uint8Array} profileKey * @memberof signalservice.GroupChange.Actions.ModifyMemberProfileKeyAction * @instance */ ModifyMemberProfileKeyAction.prototype.profileKey = $util.newBuffer([]); /** * Encodes the specified ModifyMemberProfileKeyAction message. Does not implicitly {@link signalservice.GroupChange.Actions.ModifyMemberProfileKeyAction.verify|verify} messages. * @function encode * @memberof signalservice.GroupChange.Actions.ModifyMemberProfileKeyAction * @static * @param {signalservice.GroupChange.Actions.IModifyMemberProfileKeyAction} message ModifyMemberProfileKeyAction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ModifyMemberProfileKeyAction.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.GroupChange.Actions.ModifyMemberProfileKeyAction.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.GroupChange.Actions.ModifyMemberProfileKeyAction.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.presentation != null && Object.hasOwnProperty.call(message, "presentation")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.presentation); if (message.userId != null && Object.hasOwnProperty.call(message, "userId")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.userId); if (message.profileKey != null && Object.hasOwnProperty.call(message, "profileKey")) writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.profileKey); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified ModifyMemberProfileKeyAction message, length delimited. Does not implicitly {@link signalservice.GroupChange.Actions.ModifyMemberProfileKeyAction.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.GroupChange.Actions.ModifyMemberProfileKeyAction * @static * @param {signalservice.GroupChange.Actions.IModifyMemberProfileKeyAction} message ModifyMemberProfileKeyAction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ModifyMemberProfileKeyAction.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a ModifyMemberProfileKeyAction message from the specified reader or buffer. * @function decode * @memberof signalservice.GroupChange.Actions.ModifyMemberProfileKeyAction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.GroupChange.Actions.ModifyMemberProfileKeyAction} ModifyMemberProfileKeyAction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ModifyMemberProfileKeyAction.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.GroupChange.Actions.ModifyMemberProfileKeyAction(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.presentation = reader.bytes(); break; } case 2: { message.userId = reader.bytes(); break; } case 3: { message.profileKey = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a ModifyMemberProfileKeyAction message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.GroupChange.Actions.ModifyMemberProfileKeyAction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.GroupChange.Actions.ModifyMemberProfileKeyAction} ModifyMemberProfileKeyAction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ModifyMemberProfileKeyAction.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return ModifyMemberProfileKeyAction; })(); Actions.AddMemberPendingProfileKeyAction = (function() { /** * Properties of an AddMemberPendingProfileKeyAction. * @memberof signalservice.GroupChange.Actions * @interface IAddMemberPendingProfileKeyAction * @property {signalservice.IMemberPendingProfileKey|null} [added] AddMemberPendingProfileKeyAction added */ /** * Constructs a new AddMemberPendingProfileKeyAction. * @memberof signalservice.GroupChange.Actions * @classdesc Represents an AddMemberPendingProfileKeyAction. * @implements IAddMemberPendingProfileKeyAction * @constructor * @param {signalservice.GroupChange.Actions.IAddMemberPendingProfileKeyAction=} [properties] Properties to set */ function AddMemberPendingProfileKeyAction(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * AddMemberPendingProfileKeyAction added. * @member {signalservice.IMemberPendingProfileKey|null|undefined} added * @memberof signalservice.GroupChange.Actions.AddMemberPendingProfileKeyAction * @instance */ AddMemberPendingProfileKeyAction.prototype.added = null; /** * Encodes the specified AddMemberPendingProfileKeyAction message. Does not implicitly {@link signalservice.GroupChange.Actions.AddMemberPendingProfileKeyAction.verify|verify} messages. * @function encode * @memberof signalservice.GroupChange.Actions.AddMemberPendingProfileKeyAction * @static * @param {signalservice.GroupChange.Actions.IAddMemberPendingProfileKeyAction} message AddMemberPendingProfileKeyAction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ AddMemberPendingProfileKeyAction.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.GroupChange.Actions.AddMemberPendingProfileKeyAction.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.GroupChange.Actions.AddMemberPendingProfileKeyAction.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.added != null && Object.hasOwnProperty.call(message, "added")) $root.signalservice.MemberPendingProfileKey.encode(message.added, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified AddMemberPendingProfileKeyAction message, length delimited. Does not implicitly {@link signalservice.GroupChange.Actions.AddMemberPendingProfileKeyAction.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.GroupChange.Actions.AddMemberPendingProfileKeyAction * @static * @param {signalservice.GroupChange.Actions.IAddMemberPendingProfileKeyAction} message AddMemberPendingProfileKeyAction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ AddMemberPendingProfileKeyAction.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an AddMemberPendingProfileKeyAction message from the specified reader or buffer. * @function decode * @memberof signalservice.GroupChange.Actions.AddMemberPendingProfileKeyAction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.GroupChange.Actions.AddMemberPendingProfileKeyAction} AddMemberPendingProfileKeyAction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ AddMemberPendingProfileKeyAction.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.GroupChange.Actions.AddMemberPendingProfileKeyAction(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.added = $root.signalservice.MemberPendingProfileKey.decode(reader, reader.uint32()); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an AddMemberPendingProfileKeyAction message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.GroupChange.Actions.AddMemberPendingProfileKeyAction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.GroupChange.Actions.AddMemberPendingProfileKeyAction} AddMemberPendingProfileKeyAction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ AddMemberPendingProfileKeyAction.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return AddMemberPendingProfileKeyAction; })(); Actions.DeleteMemberPendingProfileKeyAction = (function() { /** * Properties of a DeleteMemberPendingProfileKeyAction. * @memberof signalservice.GroupChange.Actions * @interface IDeleteMemberPendingProfileKeyAction * @property {Uint8Array|null} [deletedUserId] DeleteMemberPendingProfileKeyAction deletedUserId */ /** * Constructs a new DeleteMemberPendingProfileKeyAction. * @memberof signalservice.GroupChange.Actions * @classdesc Represents a DeleteMemberPendingProfileKeyAction. * @implements IDeleteMemberPendingProfileKeyAction * @constructor * @param {signalservice.GroupChange.Actions.IDeleteMemberPendingProfileKeyAction=} [properties] Properties to set */ function DeleteMemberPendingProfileKeyAction(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * DeleteMemberPendingProfileKeyAction deletedUserId. * @member {Uint8Array} deletedUserId * @memberof signalservice.GroupChange.Actions.DeleteMemberPendingProfileKeyAction * @instance */ DeleteMemberPendingProfileKeyAction.prototype.deletedUserId = $util.newBuffer([]); /** * Encodes the specified DeleteMemberPendingProfileKeyAction message. Does not implicitly {@link signalservice.GroupChange.Actions.DeleteMemberPendingProfileKeyAction.verify|verify} messages. * @function encode * @memberof signalservice.GroupChange.Actions.DeleteMemberPendingProfileKeyAction * @static * @param {signalservice.GroupChange.Actions.IDeleteMemberPendingProfileKeyAction} message DeleteMemberPendingProfileKeyAction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ DeleteMemberPendingProfileKeyAction.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.GroupChange.Actions.DeleteMemberPendingProfileKeyAction.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.GroupChange.Actions.DeleteMemberPendingProfileKeyAction.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.deletedUserId != null && Object.hasOwnProperty.call(message, "deletedUserId")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.deletedUserId); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified DeleteMemberPendingProfileKeyAction message, length delimited. Does not implicitly {@link signalservice.GroupChange.Actions.DeleteMemberPendingProfileKeyAction.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.GroupChange.Actions.DeleteMemberPendingProfileKeyAction * @static * @param {signalservice.GroupChange.Actions.IDeleteMemberPendingProfileKeyAction} message DeleteMemberPendingProfileKeyAction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ DeleteMemberPendingProfileKeyAction.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a DeleteMemberPendingProfileKeyAction message from the specified reader or buffer. * @function decode * @memberof signalservice.GroupChange.Actions.DeleteMemberPendingProfileKeyAction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.GroupChange.Actions.DeleteMemberPendingProfileKeyAction} DeleteMemberPendingProfileKeyAction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ DeleteMemberPendingProfileKeyAction.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.GroupChange.Actions.DeleteMemberPendingProfileKeyAction(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.deletedUserId = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a DeleteMemberPendingProfileKeyAction message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.GroupChange.Actions.DeleteMemberPendingProfileKeyAction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.GroupChange.Actions.DeleteMemberPendingProfileKeyAction} DeleteMemberPendingProfileKeyAction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ DeleteMemberPendingProfileKeyAction.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return DeleteMemberPendingProfileKeyAction; })(); Actions.PromoteMemberPendingProfileKeyAction = (function() { /** * Properties of a PromoteMemberPendingProfileKeyAction. * @memberof signalservice.GroupChange.Actions * @interface IPromoteMemberPendingProfileKeyAction * @property {Uint8Array|null} [presentation] PromoteMemberPendingProfileKeyAction presentation * @property {Uint8Array|null} [userId] PromoteMemberPendingProfileKeyAction userId * @property {Uint8Array|null} [profileKey] PromoteMemberPendingProfileKeyAction profileKey */ /** * Constructs a new PromoteMemberPendingProfileKeyAction. * @memberof signalservice.GroupChange.Actions * @classdesc Represents a PromoteMemberPendingProfileKeyAction. * @implements IPromoteMemberPendingProfileKeyAction * @constructor * @param {signalservice.GroupChange.Actions.IPromoteMemberPendingProfileKeyAction=} [properties] Properties to set */ function PromoteMemberPendingProfileKeyAction(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * PromoteMemberPendingProfileKeyAction presentation. * @member {Uint8Array} presentation * @memberof signalservice.GroupChange.Actions.PromoteMemberPendingProfileKeyAction * @instance */ PromoteMemberPendingProfileKeyAction.prototype.presentation = $util.newBuffer([]); /** * PromoteMemberPendingProfileKeyAction userId. * @member {Uint8Array} userId * @memberof signalservice.GroupChange.Actions.PromoteMemberPendingProfileKeyAction * @instance */ PromoteMemberPendingProfileKeyAction.prototype.userId = $util.newBuffer([]); /** * PromoteMemberPendingProfileKeyAction profileKey. * @member {Uint8Array} profileKey * @memberof signalservice.GroupChange.Actions.PromoteMemberPendingProfileKeyAction * @instance */ PromoteMemberPendingProfileKeyAction.prototype.profileKey = $util.newBuffer([]); /** * Encodes the specified PromoteMemberPendingProfileKeyAction message. Does not implicitly {@link signalservice.GroupChange.Actions.PromoteMemberPendingProfileKeyAction.verify|verify} messages. * @function encode * @memberof signalservice.GroupChange.Actions.PromoteMemberPendingProfileKeyAction * @static * @param {signalservice.GroupChange.Actions.IPromoteMemberPendingProfileKeyAction} message PromoteMemberPendingProfileKeyAction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ PromoteMemberPendingProfileKeyAction.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.GroupChange.Actions.PromoteMemberPendingProfileKeyAction.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.GroupChange.Actions.PromoteMemberPendingProfileKeyAction.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.presentation != null && Object.hasOwnProperty.call(message, "presentation")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.presentation); if (message.userId != null && Object.hasOwnProperty.call(message, "userId")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.userId); if (message.profileKey != null && Object.hasOwnProperty.call(message, "profileKey")) writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.profileKey); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified PromoteMemberPendingProfileKeyAction message, length delimited. Does not implicitly {@link signalservice.GroupChange.Actions.PromoteMemberPendingProfileKeyAction.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.GroupChange.Actions.PromoteMemberPendingProfileKeyAction * @static * @param {signalservice.GroupChange.Actions.IPromoteMemberPendingProfileKeyAction} message PromoteMemberPendingProfileKeyAction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ PromoteMemberPendingProfileKeyAction.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a PromoteMemberPendingProfileKeyAction message from the specified reader or buffer. * @function decode * @memberof signalservice.GroupChange.Actions.PromoteMemberPendingProfileKeyAction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.GroupChange.Actions.PromoteMemberPendingProfileKeyAction} PromoteMemberPendingProfileKeyAction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ PromoteMemberPendingProfileKeyAction.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.GroupChange.Actions.PromoteMemberPendingProfileKeyAction(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.presentation = reader.bytes(); break; } case 2: { message.userId = reader.bytes(); break; } case 3: { message.profileKey = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a PromoteMemberPendingProfileKeyAction message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.GroupChange.Actions.PromoteMemberPendingProfileKeyAction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.GroupChange.Actions.PromoteMemberPendingProfileKeyAction} PromoteMemberPendingProfileKeyAction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ PromoteMemberPendingProfileKeyAction.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return PromoteMemberPendingProfileKeyAction; })(); Actions.PromoteMemberPendingPniAciProfileKeyAction = (function() { /** * Properties of a PromoteMemberPendingPniAciProfileKeyAction. * @memberof signalservice.GroupChange.Actions * @interface IPromoteMemberPendingPniAciProfileKeyAction * @property {Uint8Array|null} [presentation] PromoteMemberPendingPniAciProfileKeyAction presentation * @property {Uint8Array|null} [userId] PromoteMemberPendingPniAciProfileKeyAction userId * @property {Uint8Array|null} [pni] PromoteMemberPendingPniAciProfileKeyAction pni * @property {Uint8Array|null} [profileKey] PromoteMemberPendingPniAciProfileKeyAction profileKey */ /** * Constructs a new PromoteMemberPendingPniAciProfileKeyAction. * @memberof signalservice.GroupChange.Actions * @classdesc Represents a PromoteMemberPendingPniAciProfileKeyAction. * @implements IPromoteMemberPendingPniAciProfileKeyAction * @constructor * @param {signalservice.GroupChange.Actions.IPromoteMemberPendingPniAciProfileKeyAction=} [properties] Properties to set */ function PromoteMemberPendingPniAciProfileKeyAction(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * PromoteMemberPendingPniAciProfileKeyAction presentation. * @member {Uint8Array} presentation * @memberof signalservice.GroupChange.Actions.PromoteMemberPendingPniAciProfileKeyAction * @instance */ PromoteMemberPendingPniAciProfileKeyAction.prototype.presentation = $util.newBuffer([]); /** * PromoteMemberPendingPniAciProfileKeyAction userId. * @member {Uint8Array} userId * @memberof signalservice.GroupChange.Actions.PromoteMemberPendingPniAciProfileKeyAction * @instance */ PromoteMemberPendingPniAciProfileKeyAction.prototype.userId = $util.newBuffer([]); /** * PromoteMemberPendingPniAciProfileKeyAction pni. * @member {Uint8Array} pni * @memberof signalservice.GroupChange.Actions.PromoteMemberPendingPniAciProfileKeyAction * @instance */ PromoteMemberPendingPniAciProfileKeyAction.prototype.pni = $util.newBuffer([]); /** * PromoteMemberPendingPniAciProfileKeyAction profileKey. * @member {Uint8Array} profileKey * @memberof signalservice.GroupChange.Actions.PromoteMemberPendingPniAciProfileKeyAction * @instance */ PromoteMemberPendingPniAciProfileKeyAction.prototype.profileKey = $util.newBuffer([]); /** * Encodes the specified PromoteMemberPendingPniAciProfileKeyAction message. Does not implicitly {@link signalservice.GroupChange.Actions.PromoteMemberPendingPniAciProfileKeyAction.verify|verify} messages. * @function encode * @memberof signalservice.GroupChange.Actions.PromoteMemberPendingPniAciProfileKeyAction * @static * @param {signalservice.GroupChange.Actions.IPromoteMemberPendingPniAciProfileKeyAction} message PromoteMemberPendingPniAciProfileKeyAction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ PromoteMemberPendingPniAciProfileKeyAction.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.GroupChange.Actions.PromoteMemberPendingPniAciProfileKeyAction.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.GroupChange.Actions.PromoteMemberPendingPniAciProfileKeyAction.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.presentation != null && Object.hasOwnProperty.call(message, "presentation")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.presentation); if (message.userId != null && Object.hasOwnProperty.call(message, "userId")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.userId); if (message.pni != null && Object.hasOwnProperty.call(message, "pni")) writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.pni); if (message.profileKey != null && Object.hasOwnProperty.call(message, "profileKey")) writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.profileKey); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified PromoteMemberPendingPniAciProfileKeyAction message, length delimited. Does not implicitly {@link signalservice.GroupChange.Actions.PromoteMemberPendingPniAciProfileKeyAction.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.GroupChange.Actions.PromoteMemberPendingPniAciProfileKeyAction * @static * @param {signalservice.GroupChange.Actions.IPromoteMemberPendingPniAciProfileKeyAction} message PromoteMemberPendingPniAciProfileKeyAction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ PromoteMemberPendingPniAciProfileKeyAction.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a PromoteMemberPendingPniAciProfileKeyAction message from the specified reader or buffer. * @function decode * @memberof signalservice.GroupChange.Actions.PromoteMemberPendingPniAciProfileKeyAction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.GroupChange.Actions.PromoteMemberPendingPniAciProfileKeyAction} PromoteMemberPendingPniAciProfileKeyAction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ PromoteMemberPendingPniAciProfileKeyAction.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.GroupChange.Actions.PromoteMemberPendingPniAciProfileKeyAction(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.presentation = reader.bytes(); break; } case 2: { message.userId = reader.bytes(); break; } case 3: { message.pni = reader.bytes(); break; } case 4: { message.profileKey = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a PromoteMemberPendingPniAciProfileKeyAction message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.GroupChange.Actions.PromoteMemberPendingPniAciProfileKeyAction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.GroupChange.Actions.PromoteMemberPendingPniAciProfileKeyAction} PromoteMemberPendingPniAciProfileKeyAction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ PromoteMemberPendingPniAciProfileKeyAction.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return PromoteMemberPendingPniAciProfileKeyAction; })(); Actions.AddMemberPendingAdminApprovalAction = (function() { /** * Properties of an AddMemberPendingAdminApprovalAction. * @memberof signalservice.GroupChange.Actions * @interface IAddMemberPendingAdminApprovalAction * @property {signalservice.IMemberPendingAdminApproval|null} [added] AddMemberPendingAdminApprovalAction added */ /** * Constructs a new AddMemberPendingAdminApprovalAction. * @memberof signalservice.GroupChange.Actions * @classdesc Represents an AddMemberPendingAdminApprovalAction. * @implements IAddMemberPendingAdminApprovalAction * @constructor * @param {signalservice.GroupChange.Actions.IAddMemberPendingAdminApprovalAction=} [properties] Properties to set */ function AddMemberPendingAdminApprovalAction(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * AddMemberPendingAdminApprovalAction added. * @member {signalservice.IMemberPendingAdminApproval|null|undefined} added * @memberof signalservice.GroupChange.Actions.AddMemberPendingAdminApprovalAction * @instance */ AddMemberPendingAdminApprovalAction.prototype.added = null; /** * Encodes the specified AddMemberPendingAdminApprovalAction message. Does not implicitly {@link signalservice.GroupChange.Actions.AddMemberPendingAdminApprovalAction.verify|verify} messages. * @function encode * @memberof signalservice.GroupChange.Actions.AddMemberPendingAdminApprovalAction * @static * @param {signalservice.GroupChange.Actions.IAddMemberPendingAdminApprovalAction} message AddMemberPendingAdminApprovalAction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ AddMemberPendingAdminApprovalAction.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.GroupChange.Actions.AddMemberPendingAdminApprovalAction.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.GroupChange.Actions.AddMemberPendingAdminApprovalAction.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.added != null && Object.hasOwnProperty.call(message, "added")) $root.signalservice.MemberPendingAdminApproval.encode(message.added, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified AddMemberPendingAdminApprovalAction message, length delimited. Does not implicitly {@link signalservice.GroupChange.Actions.AddMemberPendingAdminApprovalAction.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.GroupChange.Actions.AddMemberPendingAdminApprovalAction * @static * @param {signalservice.GroupChange.Actions.IAddMemberPendingAdminApprovalAction} message AddMemberPendingAdminApprovalAction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ AddMemberPendingAdminApprovalAction.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an AddMemberPendingAdminApprovalAction message from the specified reader or buffer. * @function decode * @memberof signalservice.GroupChange.Actions.AddMemberPendingAdminApprovalAction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.GroupChange.Actions.AddMemberPendingAdminApprovalAction} AddMemberPendingAdminApprovalAction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ AddMemberPendingAdminApprovalAction.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.GroupChange.Actions.AddMemberPendingAdminApprovalAction(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.added = $root.signalservice.MemberPendingAdminApproval.decode(reader, reader.uint32()); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an AddMemberPendingAdminApprovalAction message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.GroupChange.Actions.AddMemberPendingAdminApprovalAction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.GroupChange.Actions.AddMemberPendingAdminApprovalAction} AddMemberPendingAdminApprovalAction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ AddMemberPendingAdminApprovalAction.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return AddMemberPendingAdminApprovalAction; })(); Actions.DeleteMemberPendingAdminApprovalAction = (function() { /** * Properties of a DeleteMemberPendingAdminApprovalAction. * @memberof signalservice.GroupChange.Actions * @interface IDeleteMemberPendingAdminApprovalAction * @property {Uint8Array|null} [deletedUserId] DeleteMemberPendingAdminApprovalAction deletedUserId */ /** * Constructs a new DeleteMemberPendingAdminApprovalAction. * @memberof signalservice.GroupChange.Actions * @classdesc Represents a DeleteMemberPendingAdminApprovalAction. * @implements IDeleteMemberPendingAdminApprovalAction * @constructor * @param {signalservice.GroupChange.Actions.IDeleteMemberPendingAdminApprovalAction=} [properties] Properties to set */ function DeleteMemberPendingAdminApprovalAction(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * DeleteMemberPendingAdminApprovalAction deletedUserId. * @member {Uint8Array} deletedUserId * @memberof signalservice.GroupChange.Actions.DeleteMemberPendingAdminApprovalAction * @instance */ DeleteMemberPendingAdminApprovalAction.prototype.deletedUserId = $util.newBuffer([]); /** * Encodes the specified DeleteMemberPendingAdminApprovalAction message. Does not implicitly {@link signalservice.GroupChange.Actions.DeleteMemberPendingAdminApprovalAction.verify|verify} messages. * @function encode * @memberof signalservice.GroupChange.Actions.DeleteMemberPendingAdminApprovalAction * @static * @param {signalservice.GroupChange.Actions.IDeleteMemberPendingAdminApprovalAction} message DeleteMemberPendingAdminApprovalAction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ DeleteMemberPendingAdminApprovalAction.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.GroupChange.Actions.DeleteMemberPendingAdminApprovalAction.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.GroupChange.Actions.DeleteMemberPendingAdminApprovalAction.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.deletedUserId != null && Object.hasOwnProperty.call(message, "deletedUserId")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.deletedUserId); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified DeleteMemberPendingAdminApprovalAction message, length delimited. Does not implicitly {@link signalservice.GroupChange.Actions.DeleteMemberPendingAdminApprovalAction.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.GroupChange.Actions.DeleteMemberPendingAdminApprovalAction * @static * @param {signalservice.GroupChange.Actions.IDeleteMemberPendingAdminApprovalAction} message DeleteMemberPendingAdminApprovalAction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ DeleteMemberPendingAdminApprovalAction.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a DeleteMemberPendingAdminApprovalAction message from the specified reader or buffer. * @function decode * @memberof signalservice.GroupChange.Actions.DeleteMemberPendingAdminApprovalAction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.GroupChange.Actions.DeleteMemberPendingAdminApprovalAction} DeleteMemberPendingAdminApprovalAction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ DeleteMemberPendingAdminApprovalAction.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.GroupChange.Actions.DeleteMemberPendingAdminApprovalAction(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.deletedUserId = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a DeleteMemberPendingAdminApprovalAction message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.GroupChange.Actions.DeleteMemberPendingAdminApprovalAction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.GroupChange.Actions.DeleteMemberPendingAdminApprovalAction} DeleteMemberPendingAdminApprovalAction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ DeleteMemberPendingAdminApprovalAction.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return DeleteMemberPendingAdminApprovalAction; })(); Actions.PromoteMemberPendingAdminApprovalAction = (function() { /** * Properties of a PromoteMemberPendingAdminApprovalAction. * @memberof signalservice.GroupChange.Actions * @interface IPromoteMemberPendingAdminApprovalAction * @property {Uint8Array|null} [userId] PromoteMemberPendingAdminApprovalAction userId * @property {signalservice.Member.Role|null} [role] PromoteMemberPendingAdminApprovalAction role */ /** * Constructs a new PromoteMemberPendingAdminApprovalAction. * @memberof signalservice.GroupChange.Actions * @classdesc Represents a PromoteMemberPendingAdminApprovalAction. * @implements IPromoteMemberPendingAdminApprovalAction * @constructor * @param {signalservice.GroupChange.Actions.IPromoteMemberPendingAdminApprovalAction=} [properties] Properties to set */ function PromoteMemberPendingAdminApprovalAction(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * PromoteMemberPendingAdminApprovalAction userId. * @member {Uint8Array} userId * @memberof signalservice.GroupChange.Actions.PromoteMemberPendingAdminApprovalAction * @instance */ PromoteMemberPendingAdminApprovalAction.prototype.userId = $util.newBuffer([]); /** * PromoteMemberPendingAdminApprovalAction role. * @member {signalservice.Member.Role} role * @memberof signalservice.GroupChange.Actions.PromoteMemberPendingAdminApprovalAction * @instance */ PromoteMemberPendingAdminApprovalAction.prototype.role = 0; /** * Encodes the specified PromoteMemberPendingAdminApprovalAction message. Does not implicitly {@link signalservice.GroupChange.Actions.PromoteMemberPendingAdminApprovalAction.verify|verify} messages. * @function encode * @memberof signalservice.GroupChange.Actions.PromoteMemberPendingAdminApprovalAction * @static * @param {signalservice.GroupChange.Actions.IPromoteMemberPendingAdminApprovalAction} message PromoteMemberPendingAdminApprovalAction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ PromoteMemberPendingAdminApprovalAction.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.GroupChange.Actions.PromoteMemberPendingAdminApprovalAction.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.GroupChange.Actions.PromoteMemberPendingAdminApprovalAction.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.userId != null && Object.hasOwnProperty.call(message, "userId")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.userId); if (message.role != null && Object.hasOwnProperty.call(message, "role")) writer.uint32(/* id 2, wireType 0 =*/16).int32(message.role); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified PromoteMemberPendingAdminApprovalAction message, length delimited. Does not implicitly {@link signalservice.GroupChange.Actions.PromoteMemberPendingAdminApprovalAction.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.GroupChange.Actions.PromoteMemberPendingAdminApprovalAction * @static * @param {signalservice.GroupChange.Actions.IPromoteMemberPendingAdminApprovalAction} message PromoteMemberPendingAdminApprovalAction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ PromoteMemberPendingAdminApprovalAction.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a PromoteMemberPendingAdminApprovalAction message from the specified reader or buffer. * @function decode * @memberof signalservice.GroupChange.Actions.PromoteMemberPendingAdminApprovalAction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.GroupChange.Actions.PromoteMemberPendingAdminApprovalAction} PromoteMemberPendingAdminApprovalAction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ PromoteMemberPendingAdminApprovalAction.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.GroupChange.Actions.PromoteMemberPendingAdminApprovalAction(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.userId = reader.bytes(); break; } case 2: { message.role = reader.int32(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a PromoteMemberPendingAdminApprovalAction message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.GroupChange.Actions.PromoteMemberPendingAdminApprovalAction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.GroupChange.Actions.PromoteMemberPendingAdminApprovalAction} PromoteMemberPendingAdminApprovalAction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ PromoteMemberPendingAdminApprovalAction.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return PromoteMemberPendingAdminApprovalAction; })(); Actions.AddMemberBannedAction = (function() { /** * Properties of an AddMemberBannedAction. * @memberof signalservice.GroupChange.Actions * @interface IAddMemberBannedAction * @property {signalservice.IMemberBanned|null} [added] AddMemberBannedAction added */ /** * Constructs a new AddMemberBannedAction. * @memberof signalservice.GroupChange.Actions * @classdesc Represents an AddMemberBannedAction. * @implements IAddMemberBannedAction * @constructor * @param {signalservice.GroupChange.Actions.IAddMemberBannedAction=} [properties] Properties to set */ function AddMemberBannedAction(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * AddMemberBannedAction added. * @member {signalservice.IMemberBanned|null|undefined} added * @memberof signalservice.GroupChange.Actions.AddMemberBannedAction * @instance */ AddMemberBannedAction.prototype.added = null; /** * Encodes the specified AddMemberBannedAction message. Does not implicitly {@link signalservice.GroupChange.Actions.AddMemberBannedAction.verify|verify} messages. * @function encode * @memberof signalservice.GroupChange.Actions.AddMemberBannedAction * @static * @param {signalservice.GroupChange.Actions.IAddMemberBannedAction} message AddMemberBannedAction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ AddMemberBannedAction.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.GroupChange.Actions.AddMemberBannedAction.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.GroupChange.Actions.AddMemberBannedAction.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.added != null && Object.hasOwnProperty.call(message, "added")) $root.signalservice.MemberBanned.encode(message.added, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified AddMemberBannedAction message, length delimited. Does not implicitly {@link signalservice.GroupChange.Actions.AddMemberBannedAction.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.GroupChange.Actions.AddMemberBannedAction * @static * @param {signalservice.GroupChange.Actions.IAddMemberBannedAction} message AddMemberBannedAction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ AddMemberBannedAction.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an AddMemberBannedAction message from the specified reader or buffer. * @function decode * @memberof signalservice.GroupChange.Actions.AddMemberBannedAction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.GroupChange.Actions.AddMemberBannedAction} AddMemberBannedAction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ AddMemberBannedAction.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.GroupChange.Actions.AddMemberBannedAction(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.added = $root.signalservice.MemberBanned.decode(reader, reader.uint32()); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an AddMemberBannedAction message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.GroupChange.Actions.AddMemberBannedAction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.GroupChange.Actions.AddMemberBannedAction} AddMemberBannedAction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ AddMemberBannedAction.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return AddMemberBannedAction; })(); Actions.DeleteMemberBannedAction = (function() { /** * Properties of a DeleteMemberBannedAction. * @memberof signalservice.GroupChange.Actions * @interface IDeleteMemberBannedAction * @property {Uint8Array|null} [deletedUserId] DeleteMemberBannedAction deletedUserId */ /** * Constructs a new DeleteMemberBannedAction. * @memberof signalservice.GroupChange.Actions * @classdesc Represents a DeleteMemberBannedAction. * @implements IDeleteMemberBannedAction * @constructor * @param {signalservice.GroupChange.Actions.IDeleteMemberBannedAction=} [properties] Properties to set */ function DeleteMemberBannedAction(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * DeleteMemberBannedAction deletedUserId. * @member {Uint8Array} deletedUserId * @memberof signalservice.GroupChange.Actions.DeleteMemberBannedAction * @instance */ DeleteMemberBannedAction.prototype.deletedUserId = $util.newBuffer([]); /** * Encodes the specified DeleteMemberBannedAction message. Does not implicitly {@link signalservice.GroupChange.Actions.DeleteMemberBannedAction.verify|verify} messages. * @function encode * @memberof signalservice.GroupChange.Actions.DeleteMemberBannedAction * @static * @param {signalservice.GroupChange.Actions.IDeleteMemberBannedAction} message DeleteMemberBannedAction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ DeleteMemberBannedAction.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.GroupChange.Actions.DeleteMemberBannedAction.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.GroupChange.Actions.DeleteMemberBannedAction.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.deletedUserId != null && Object.hasOwnProperty.call(message, "deletedUserId")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.deletedUserId); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified DeleteMemberBannedAction message, length delimited. Does not implicitly {@link signalservice.GroupChange.Actions.DeleteMemberBannedAction.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.GroupChange.Actions.DeleteMemberBannedAction * @static * @param {signalservice.GroupChange.Actions.IDeleteMemberBannedAction} message DeleteMemberBannedAction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ DeleteMemberBannedAction.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a DeleteMemberBannedAction message from the specified reader or buffer. * @function decode * @memberof signalservice.GroupChange.Actions.DeleteMemberBannedAction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.GroupChange.Actions.DeleteMemberBannedAction} DeleteMemberBannedAction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ DeleteMemberBannedAction.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.GroupChange.Actions.DeleteMemberBannedAction(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.deletedUserId = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a DeleteMemberBannedAction message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.GroupChange.Actions.DeleteMemberBannedAction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.GroupChange.Actions.DeleteMemberBannedAction} DeleteMemberBannedAction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ DeleteMemberBannedAction.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return DeleteMemberBannedAction; })(); Actions.ModifyTitleAction = (function() { /** * Properties of a ModifyTitleAction. * @memberof signalservice.GroupChange.Actions * @interface IModifyTitleAction * @property {Uint8Array|null} [title] ModifyTitleAction title */ /** * Constructs a new ModifyTitleAction. * @memberof signalservice.GroupChange.Actions * @classdesc Represents a ModifyTitleAction. * @implements IModifyTitleAction * @constructor * @param {signalservice.GroupChange.Actions.IModifyTitleAction=} [properties] Properties to set */ function ModifyTitleAction(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * ModifyTitleAction title. * @member {Uint8Array} title * @memberof signalservice.GroupChange.Actions.ModifyTitleAction * @instance */ ModifyTitleAction.prototype.title = $util.newBuffer([]); /** * Encodes the specified ModifyTitleAction message. Does not implicitly {@link signalservice.GroupChange.Actions.ModifyTitleAction.verify|verify} messages. * @function encode * @memberof signalservice.GroupChange.Actions.ModifyTitleAction * @static * @param {signalservice.GroupChange.Actions.IModifyTitleAction} message ModifyTitleAction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ModifyTitleAction.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.GroupChange.Actions.ModifyTitleAction.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.GroupChange.Actions.ModifyTitleAction.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.title != null && Object.hasOwnProperty.call(message, "title")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.title); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified ModifyTitleAction message, length delimited. Does not implicitly {@link signalservice.GroupChange.Actions.ModifyTitleAction.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.GroupChange.Actions.ModifyTitleAction * @static * @param {signalservice.GroupChange.Actions.IModifyTitleAction} message ModifyTitleAction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ModifyTitleAction.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a ModifyTitleAction message from the specified reader or buffer. * @function decode * @memberof signalservice.GroupChange.Actions.ModifyTitleAction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.GroupChange.Actions.ModifyTitleAction} ModifyTitleAction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ModifyTitleAction.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.GroupChange.Actions.ModifyTitleAction(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.title = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a ModifyTitleAction message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.GroupChange.Actions.ModifyTitleAction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.GroupChange.Actions.ModifyTitleAction} ModifyTitleAction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ModifyTitleAction.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return ModifyTitleAction; })(); Actions.ModifyDescriptionAction = (function() { /** * Properties of a ModifyDescriptionAction. * @memberof signalservice.GroupChange.Actions * @interface IModifyDescriptionAction * @property {Uint8Array|null} [description] ModifyDescriptionAction description */ /** * Constructs a new ModifyDescriptionAction. * @memberof signalservice.GroupChange.Actions * @classdesc Represents a ModifyDescriptionAction. * @implements IModifyDescriptionAction * @constructor * @param {signalservice.GroupChange.Actions.IModifyDescriptionAction=} [properties] Properties to set */ function ModifyDescriptionAction(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * ModifyDescriptionAction description. * @member {Uint8Array} description * @memberof signalservice.GroupChange.Actions.ModifyDescriptionAction * @instance */ ModifyDescriptionAction.prototype.description = $util.newBuffer([]); /** * Encodes the specified ModifyDescriptionAction message. Does not implicitly {@link signalservice.GroupChange.Actions.ModifyDescriptionAction.verify|verify} messages. * @function encode * @memberof signalservice.GroupChange.Actions.ModifyDescriptionAction * @static * @param {signalservice.GroupChange.Actions.IModifyDescriptionAction} message ModifyDescriptionAction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ModifyDescriptionAction.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.GroupChange.Actions.ModifyDescriptionAction.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.GroupChange.Actions.ModifyDescriptionAction.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.description != null && Object.hasOwnProperty.call(message, "description")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.description); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified ModifyDescriptionAction message, length delimited. Does not implicitly {@link signalservice.GroupChange.Actions.ModifyDescriptionAction.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.GroupChange.Actions.ModifyDescriptionAction * @static * @param {signalservice.GroupChange.Actions.IModifyDescriptionAction} message ModifyDescriptionAction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ModifyDescriptionAction.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a ModifyDescriptionAction message from the specified reader or buffer. * @function decode * @memberof signalservice.GroupChange.Actions.ModifyDescriptionAction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.GroupChange.Actions.ModifyDescriptionAction} ModifyDescriptionAction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ModifyDescriptionAction.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.GroupChange.Actions.ModifyDescriptionAction(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.description = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a ModifyDescriptionAction message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.GroupChange.Actions.ModifyDescriptionAction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.GroupChange.Actions.ModifyDescriptionAction} ModifyDescriptionAction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ModifyDescriptionAction.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return ModifyDescriptionAction; })(); Actions.ModifyAvatarAction = (function() { /** * Properties of a ModifyAvatarAction. * @memberof signalservice.GroupChange.Actions * @interface IModifyAvatarAction * @property {string|null} [avatar] ModifyAvatarAction avatar */ /** * Constructs a new ModifyAvatarAction. * @memberof signalservice.GroupChange.Actions * @classdesc Represents a ModifyAvatarAction. * @implements IModifyAvatarAction * @constructor * @param {signalservice.GroupChange.Actions.IModifyAvatarAction=} [properties] Properties to set */ function ModifyAvatarAction(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * ModifyAvatarAction avatar. * @member {string} avatar * @memberof signalservice.GroupChange.Actions.ModifyAvatarAction * @instance */ ModifyAvatarAction.prototype.avatar = ""; /** * Encodes the specified ModifyAvatarAction message. Does not implicitly {@link signalservice.GroupChange.Actions.ModifyAvatarAction.verify|verify} messages. * @function encode * @memberof signalservice.GroupChange.Actions.ModifyAvatarAction * @static * @param {signalservice.GroupChange.Actions.IModifyAvatarAction} message ModifyAvatarAction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ModifyAvatarAction.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.GroupChange.Actions.ModifyAvatarAction.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.GroupChange.Actions.ModifyAvatarAction.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.avatar != null && Object.hasOwnProperty.call(message, "avatar")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.avatar); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified ModifyAvatarAction message, length delimited. Does not implicitly {@link signalservice.GroupChange.Actions.ModifyAvatarAction.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.GroupChange.Actions.ModifyAvatarAction * @static * @param {signalservice.GroupChange.Actions.IModifyAvatarAction} message ModifyAvatarAction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ModifyAvatarAction.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a ModifyAvatarAction message from the specified reader or buffer. * @function decode * @memberof signalservice.GroupChange.Actions.ModifyAvatarAction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.GroupChange.Actions.ModifyAvatarAction} ModifyAvatarAction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ModifyAvatarAction.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.GroupChange.Actions.ModifyAvatarAction(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.avatar = reader.string(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a ModifyAvatarAction message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.GroupChange.Actions.ModifyAvatarAction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.GroupChange.Actions.ModifyAvatarAction} ModifyAvatarAction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ModifyAvatarAction.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return ModifyAvatarAction; })(); Actions.ModifyDisappearingMessageTimerAction = (function() { /** * Properties of a ModifyDisappearingMessageTimerAction. * @memberof signalservice.GroupChange.Actions * @interface IModifyDisappearingMessageTimerAction * @property {Uint8Array|null} [timer] ModifyDisappearingMessageTimerAction timer */ /** * Constructs a new ModifyDisappearingMessageTimerAction. * @memberof signalservice.GroupChange.Actions * @classdesc Represents a ModifyDisappearingMessageTimerAction. * @implements IModifyDisappearingMessageTimerAction * @constructor * @param {signalservice.GroupChange.Actions.IModifyDisappearingMessageTimerAction=} [properties] Properties to set */ function ModifyDisappearingMessageTimerAction(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * ModifyDisappearingMessageTimerAction timer. * @member {Uint8Array} timer * @memberof signalservice.GroupChange.Actions.ModifyDisappearingMessageTimerAction * @instance */ ModifyDisappearingMessageTimerAction.prototype.timer = $util.newBuffer([]); /** * Encodes the specified ModifyDisappearingMessageTimerAction message. Does not implicitly {@link signalservice.GroupChange.Actions.ModifyDisappearingMessageTimerAction.verify|verify} messages. * @function encode * @memberof signalservice.GroupChange.Actions.ModifyDisappearingMessageTimerAction * @static * @param {signalservice.GroupChange.Actions.IModifyDisappearingMessageTimerAction} message ModifyDisappearingMessageTimerAction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ModifyDisappearingMessageTimerAction.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.GroupChange.Actions.ModifyDisappearingMessageTimerAction.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.GroupChange.Actions.ModifyDisappearingMessageTimerAction.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.timer != null && Object.hasOwnProperty.call(message, "timer")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.timer); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified ModifyDisappearingMessageTimerAction message, length delimited. Does not implicitly {@link signalservice.GroupChange.Actions.ModifyDisappearingMessageTimerAction.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.GroupChange.Actions.ModifyDisappearingMessageTimerAction * @static * @param {signalservice.GroupChange.Actions.IModifyDisappearingMessageTimerAction} message ModifyDisappearingMessageTimerAction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ModifyDisappearingMessageTimerAction.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a ModifyDisappearingMessageTimerAction message from the specified reader or buffer. * @function decode * @memberof signalservice.GroupChange.Actions.ModifyDisappearingMessageTimerAction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.GroupChange.Actions.ModifyDisappearingMessageTimerAction} ModifyDisappearingMessageTimerAction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ModifyDisappearingMessageTimerAction.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.GroupChange.Actions.ModifyDisappearingMessageTimerAction(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.timer = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a ModifyDisappearingMessageTimerAction message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.GroupChange.Actions.ModifyDisappearingMessageTimerAction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.GroupChange.Actions.ModifyDisappearingMessageTimerAction} ModifyDisappearingMessageTimerAction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ModifyDisappearingMessageTimerAction.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return ModifyDisappearingMessageTimerAction; })(); Actions.ModifyAttributesAccessControlAction = (function() { /** * Properties of a ModifyAttributesAccessControlAction. * @memberof signalservice.GroupChange.Actions * @interface IModifyAttributesAccessControlAction * @property {signalservice.AccessControl.AccessRequired|null} [attributesAccess] ModifyAttributesAccessControlAction attributesAccess */ /** * Constructs a new ModifyAttributesAccessControlAction. * @memberof signalservice.GroupChange.Actions * @classdesc Represents a ModifyAttributesAccessControlAction. * @implements IModifyAttributesAccessControlAction * @constructor * @param {signalservice.GroupChange.Actions.IModifyAttributesAccessControlAction=} [properties] Properties to set */ function ModifyAttributesAccessControlAction(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * ModifyAttributesAccessControlAction attributesAccess. * @member {signalservice.AccessControl.AccessRequired} attributesAccess * @memberof signalservice.GroupChange.Actions.ModifyAttributesAccessControlAction * @instance */ ModifyAttributesAccessControlAction.prototype.attributesAccess = 0; /** * Encodes the specified ModifyAttributesAccessControlAction message. Does not implicitly {@link signalservice.GroupChange.Actions.ModifyAttributesAccessControlAction.verify|verify} messages. * @function encode * @memberof signalservice.GroupChange.Actions.ModifyAttributesAccessControlAction * @static * @param {signalservice.GroupChange.Actions.IModifyAttributesAccessControlAction} message ModifyAttributesAccessControlAction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ModifyAttributesAccessControlAction.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.GroupChange.Actions.ModifyAttributesAccessControlAction.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.GroupChange.Actions.ModifyAttributesAccessControlAction.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.attributesAccess != null && Object.hasOwnProperty.call(message, "attributesAccess")) writer.uint32(/* id 1, wireType 0 =*/8).int32(message.attributesAccess); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified ModifyAttributesAccessControlAction message, length delimited. Does not implicitly {@link signalservice.GroupChange.Actions.ModifyAttributesAccessControlAction.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.GroupChange.Actions.ModifyAttributesAccessControlAction * @static * @param {signalservice.GroupChange.Actions.IModifyAttributesAccessControlAction} message ModifyAttributesAccessControlAction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ModifyAttributesAccessControlAction.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a ModifyAttributesAccessControlAction message from the specified reader or buffer. * @function decode * @memberof signalservice.GroupChange.Actions.ModifyAttributesAccessControlAction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.GroupChange.Actions.ModifyAttributesAccessControlAction} ModifyAttributesAccessControlAction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ModifyAttributesAccessControlAction.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.GroupChange.Actions.ModifyAttributesAccessControlAction(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.attributesAccess = reader.int32(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a ModifyAttributesAccessControlAction message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.GroupChange.Actions.ModifyAttributesAccessControlAction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.GroupChange.Actions.ModifyAttributesAccessControlAction} ModifyAttributesAccessControlAction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ModifyAttributesAccessControlAction.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return ModifyAttributesAccessControlAction; })(); Actions.ModifyMembersAccessControlAction = (function() { /** * Properties of a ModifyMembersAccessControlAction. * @memberof signalservice.GroupChange.Actions * @interface IModifyMembersAccessControlAction * @property {signalservice.AccessControl.AccessRequired|null} [membersAccess] ModifyMembersAccessControlAction membersAccess */ /** * Constructs a new ModifyMembersAccessControlAction. * @memberof signalservice.GroupChange.Actions * @classdesc Represents a ModifyMembersAccessControlAction. * @implements IModifyMembersAccessControlAction * @constructor * @param {signalservice.GroupChange.Actions.IModifyMembersAccessControlAction=} [properties] Properties to set */ function ModifyMembersAccessControlAction(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * ModifyMembersAccessControlAction membersAccess. * @member {signalservice.AccessControl.AccessRequired} membersAccess * @memberof signalservice.GroupChange.Actions.ModifyMembersAccessControlAction * @instance */ ModifyMembersAccessControlAction.prototype.membersAccess = 0; /** * Encodes the specified ModifyMembersAccessControlAction message. Does not implicitly {@link signalservice.GroupChange.Actions.ModifyMembersAccessControlAction.verify|verify} messages. * @function encode * @memberof signalservice.GroupChange.Actions.ModifyMembersAccessControlAction * @static * @param {signalservice.GroupChange.Actions.IModifyMembersAccessControlAction} message ModifyMembersAccessControlAction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ModifyMembersAccessControlAction.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.GroupChange.Actions.ModifyMembersAccessControlAction.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.GroupChange.Actions.ModifyMembersAccessControlAction.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.membersAccess != null && Object.hasOwnProperty.call(message, "membersAccess")) writer.uint32(/* id 1, wireType 0 =*/8).int32(message.membersAccess); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified ModifyMembersAccessControlAction message, length delimited. Does not implicitly {@link signalservice.GroupChange.Actions.ModifyMembersAccessControlAction.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.GroupChange.Actions.ModifyMembersAccessControlAction * @static * @param {signalservice.GroupChange.Actions.IModifyMembersAccessControlAction} message ModifyMembersAccessControlAction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ModifyMembersAccessControlAction.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a ModifyMembersAccessControlAction message from the specified reader or buffer. * @function decode * @memberof signalservice.GroupChange.Actions.ModifyMembersAccessControlAction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.GroupChange.Actions.ModifyMembersAccessControlAction} ModifyMembersAccessControlAction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ModifyMembersAccessControlAction.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.GroupChange.Actions.ModifyMembersAccessControlAction(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.membersAccess = reader.int32(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a ModifyMembersAccessControlAction message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.GroupChange.Actions.ModifyMembersAccessControlAction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.GroupChange.Actions.ModifyMembersAccessControlAction} ModifyMembersAccessControlAction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ModifyMembersAccessControlAction.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return ModifyMembersAccessControlAction; })(); Actions.ModifyAddFromInviteLinkAccessControlAction = (function() { /** * Properties of a ModifyAddFromInviteLinkAccessControlAction. * @memberof signalservice.GroupChange.Actions * @interface IModifyAddFromInviteLinkAccessControlAction * @property {signalservice.AccessControl.AccessRequired|null} [addFromInviteLinkAccess] ModifyAddFromInviteLinkAccessControlAction addFromInviteLinkAccess */ /** * Constructs a new ModifyAddFromInviteLinkAccessControlAction. * @memberof signalservice.GroupChange.Actions * @classdesc Represents a ModifyAddFromInviteLinkAccessControlAction. * @implements IModifyAddFromInviteLinkAccessControlAction * @constructor * @param {signalservice.GroupChange.Actions.IModifyAddFromInviteLinkAccessControlAction=} [properties] Properties to set */ function ModifyAddFromInviteLinkAccessControlAction(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * ModifyAddFromInviteLinkAccessControlAction addFromInviteLinkAccess. * @member {signalservice.AccessControl.AccessRequired} addFromInviteLinkAccess * @memberof signalservice.GroupChange.Actions.ModifyAddFromInviteLinkAccessControlAction * @instance */ ModifyAddFromInviteLinkAccessControlAction.prototype.addFromInviteLinkAccess = 0; /** * Encodes the specified ModifyAddFromInviteLinkAccessControlAction message. Does not implicitly {@link signalservice.GroupChange.Actions.ModifyAddFromInviteLinkAccessControlAction.verify|verify} messages. * @function encode * @memberof signalservice.GroupChange.Actions.ModifyAddFromInviteLinkAccessControlAction * @static * @param {signalservice.GroupChange.Actions.IModifyAddFromInviteLinkAccessControlAction} message ModifyAddFromInviteLinkAccessControlAction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ModifyAddFromInviteLinkAccessControlAction.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.GroupChange.Actions.ModifyAddFromInviteLinkAccessControlAction.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.GroupChange.Actions.ModifyAddFromInviteLinkAccessControlAction.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.addFromInviteLinkAccess != null && Object.hasOwnProperty.call(message, "addFromInviteLinkAccess")) writer.uint32(/* id 1, wireType 0 =*/8).int32(message.addFromInviteLinkAccess); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified ModifyAddFromInviteLinkAccessControlAction message, length delimited. Does not implicitly {@link signalservice.GroupChange.Actions.ModifyAddFromInviteLinkAccessControlAction.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.GroupChange.Actions.ModifyAddFromInviteLinkAccessControlAction * @static * @param {signalservice.GroupChange.Actions.IModifyAddFromInviteLinkAccessControlAction} message ModifyAddFromInviteLinkAccessControlAction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ModifyAddFromInviteLinkAccessControlAction.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a ModifyAddFromInviteLinkAccessControlAction message from the specified reader or buffer. * @function decode * @memberof signalservice.GroupChange.Actions.ModifyAddFromInviteLinkAccessControlAction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.GroupChange.Actions.ModifyAddFromInviteLinkAccessControlAction} ModifyAddFromInviteLinkAccessControlAction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ModifyAddFromInviteLinkAccessControlAction.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.GroupChange.Actions.ModifyAddFromInviteLinkAccessControlAction(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.addFromInviteLinkAccess = reader.int32(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a ModifyAddFromInviteLinkAccessControlAction message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.GroupChange.Actions.ModifyAddFromInviteLinkAccessControlAction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.GroupChange.Actions.ModifyAddFromInviteLinkAccessControlAction} ModifyAddFromInviteLinkAccessControlAction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ModifyAddFromInviteLinkAccessControlAction.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return ModifyAddFromInviteLinkAccessControlAction; })(); Actions.ModifyInviteLinkPasswordAction = (function() { /** * Properties of a ModifyInviteLinkPasswordAction. * @memberof signalservice.GroupChange.Actions * @interface IModifyInviteLinkPasswordAction * @property {Uint8Array|null} [inviteLinkPassword] ModifyInviteLinkPasswordAction inviteLinkPassword */ /** * Constructs a new ModifyInviteLinkPasswordAction. * @memberof signalservice.GroupChange.Actions * @classdesc Represents a ModifyInviteLinkPasswordAction. * @implements IModifyInviteLinkPasswordAction * @constructor * @param {signalservice.GroupChange.Actions.IModifyInviteLinkPasswordAction=} [properties] Properties to set */ function ModifyInviteLinkPasswordAction(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * ModifyInviteLinkPasswordAction inviteLinkPassword. * @member {Uint8Array} inviteLinkPassword * @memberof signalservice.GroupChange.Actions.ModifyInviteLinkPasswordAction * @instance */ ModifyInviteLinkPasswordAction.prototype.inviteLinkPassword = $util.newBuffer([]); /** * Encodes the specified ModifyInviteLinkPasswordAction message. Does not implicitly {@link signalservice.GroupChange.Actions.ModifyInviteLinkPasswordAction.verify|verify} messages. * @function encode * @memberof signalservice.GroupChange.Actions.ModifyInviteLinkPasswordAction * @static * @param {signalservice.GroupChange.Actions.IModifyInviteLinkPasswordAction} message ModifyInviteLinkPasswordAction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ModifyInviteLinkPasswordAction.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.GroupChange.Actions.ModifyInviteLinkPasswordAction.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.GroupChange.Actions.ModifyInviteLinkPasswordAction.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.inviteLinkPassword != null && Object.hasOwnProperty.call(message, "inviteLinkPassword")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.inviteLinkPassword); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified ModifyInviteLinkPasswordAction message, length delimited. Does not implicitly {@link signalservice.GroupChange.Actions.ModifyInviteLinkPasswordAction.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.GroupChange.Actions.ModifyInviteLinkPasswordAction * @static * @param {signalservice.GroupChange.Actions.IModifyInviteLinkPasswordAction} message ModifyInviteLinkPasswordAction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ModifyInviteLinkPasswordAction.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a ModifyInviteLinkPasswordAction message from the specified reader or buffer. * @function decode * @memberof signalservice.GroupChange.Actions.ModifyInviteLinkPasswordAction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.GroupChange.Actions.ModifyInviteLinkPasswordAction} ModifyInviteLinkPasswordAction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ModifyInviteLinkPasswordAction.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.GroupChange.Actions.ModifyInviteLinkPasswordAction(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.inviteLinkPassword = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a ModifyInviteLinkPasswordAction message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.GroupChange.Actions.ModifyInviteLinkPasswordAction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.GroupChange.Actions.ModifyInviteLinkPasswordAction} ModifyInviteLinkPasswordAction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ModifyInviteLinkPasswordAction.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return ModifyInviteLinkPasswordAction; })(); Actions.ModifyAnnouncementsOnlyAction = (function() { /** * Properties of a ModifyAnnouncementsOnlyAction. * @memberof signalservice.GroupChange.Actions * @interface IModifyAnnouncementsOnlyAction * @property {boolean|null} [announcementsOnly] ModifyAnnouncementsOnlyAction announcementsOnly */ /** * Constructs a new ModifyAnnouncementsOnlyAction. * @memberof signalservice.GroupChange.Actions * @classdesc Represents a ModifyAnnouncementsOnlyAction. * @implements IModifyAnnouncementsOnlyAction * @constructor * @param {signalservice.GroupChange.Actions.IModifyAnnouncementsOnlyAction=} [properties] Properties to set */ function ModifyAnnouncementsOnlyAction(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * ModifyAnnouncementsOnlyAction announcementsOnly. * @member {boolean} announcementsOnly * @memberof signalservice.GroupChange.Actions.ModifyAnnouncementsOnlyAction * @instance */ ModifyAnnouncementsOnlyAction.prototype.announcementsOnly = false; /** * Encodes the specified ModifyAnnouncementsOnlyAction message. Does not implicitly {@link signalservice.GroupChange.Actions.ModifyAnnouncementsOnlyAction.verify|verify} messages. * @function encode * @memberof signalservice.GroupChange.Actions.ModifyAnnouncementsOnlyAction * @static * @param {signalservice.GroupChange.Actions.IModifyAnnouncementsOnlyAction} message ModifyAnnouncementsOnlyAction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ModifyAnnouncementsOnlyAction.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.GroupChange.Actions.ModifyAnnouncementsOnlyAction.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.GroupChange.Actions.ModifyAnnouncementsOnlyAction.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.announcementsOnly != null && Object.hasOwnProperty.call(message, "announcementsOnly")) writer.uint32(/* id 1, wireType 0 =*/8).bool(message.announcementsOnly); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified ModifyAnnouncementsOnlyAction message, length delimited. Does not implicitly {@link signalservice.GroupChange.Actions.ModifyAnnouncementsOnlyAction.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.GroupChange.Actions.ModifyAnnouncementsOnlyAction * @static * @param {signalservice.GroupChange.Actions.IModifyAnnouncementsOnlyAction} message ModifyAnnouncementsOnlyAction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ModifyAnnouncementsOnlyAction.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a ModifyAnnouncementsOnlyAction message from the specified reader or buffer. * @function decode * @memberof signalservice.GroupChange.Actions.ModifyAnnouncementsOnlyAction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.GroupChange.Actions.ModifyAnnouncementsOnlyAction} ModifyAnnouncementsOnlyAction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ModifyAnnouncementsOnlyAction.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.GroupChange.Actions.ModifyAnnouncementsOnlyAction(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.announcementsOnly = reader.bool(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a ModifyAnnouncementsOnlyAction message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.GroupChange.Actions.ModifyAnnouncementsOnlyAction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.GroupChange.Actions.ModifyAnnouncementsOnlyAction} ModifyAnnouncementsOnlyAction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ModifyAnnouncementsOnlyAction.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return ModifyAnnouncementsOnlyAction; })(); return Actions; })(); return GroupChange; })(); signalservice.ExternalGroupCredential = (function() { /** * Properties of an ExternalGroupCredential. * @memberof signalservice * @interface IExternalGroupCredential * @property {string|null} [token] ExternalGroupCredential token */ /** * Constructs a new ExternalGroupCredential. * @memberof signalservice * @classdesc Represents an ExternalGroupCredential. * @implements IExternalGroupCredential * @constructor * @param {signalservice.IExternalGroupCredential=} [properties] Properties to set */ function ExternalGroupCredential(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * ExternalGroupCredential token. * @member {string} token * @memberof signalservice.ExternalGroupCredential * @instance */ ExternalGroupCredential.prototype.token = ""; /** * Encodes the specified ExternalGroupCredential message. Does not implicitly {@link signalservice.ExternalGroupCredential.verify|verify} messages. * @function encode * @memberof signalservice.ExternalGroupCredential * @static * @param {signalservice.IExternalGroupCredential} message ExternalGroupCredential message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ExternalGroupCredential.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.ExternalGroupCredential.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.ExternalGroupCredential.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.token != null && Object.hasOwnProperty.call(message, "token")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.token); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified ExternalGroupCredential message, length delimited. Does not implicitly {@link signalservice.ExternalGroupCredential.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.ExternalGroupCredential * @static * @param {signalservice.IExternalGroupCredential} message ExternalGroupCredential message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ExternalGroupCredential.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an ExternalGroupCredential message from the specified reader or buffer. * @function decode * @memberof signalservice.ExternalGroupCredential * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.ExternalGroupCredential} ExternalGroupCredential * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ExternalGroupCredential.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.ExternalGroupCredential(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.token = reader.string(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an ExternalGroupCredential message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.ExternalGroupCredential * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.ExternalGroupCredential} ExternalGroupCredential * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ExternalGroupCredential.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return ExternalGroupCredential; })(); signalservice.GroupResponse = (function() { /** * Properties of a GroupResponse. * @memberof signalservice * @interface IGroupResponse * @property {signalservice.IGroup|null} [group] GroupResponse group * @property {Uint8Array|null} [groupSendEndorsementsResponse] GroupResponse groupSendEndorsementsResponse */ /** * Constructs a new GroupResponse. * @memberof signalservice * @classdesc Represents a GroupResponse. * @implements IGroupResponse * @constructor * @param {signalservice.IGroupResponse=} [properties] Properties to set */ function GroupResponse(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GroupResponse group. * @member {signalservice.IGroup|null|undefined} group * @memberof signalservice.GroupResponse * @instance */ GroupResponse.prototype.group = null; /** * GroupResponse groupSendEndorsementsResponse. * @member {Uint8Array} groupSendEndorsementsResponse * @memberof signalservice.GroupResponse * @instance */ GroupResponse.prototype.groupSendEndorsementsResponse = $util.newBuffer([]); /** * Encodes the specified GroupResponse message. Does not implicitly {@link signalservice.GroupResponse.verify|verify} messages. * @function encode * @memberof signalservice.GroupResponse * @static * @param {signalservice.IGroupResponse} message GroupResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupResponse.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.GroupResponse.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.GroupResponse.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.group != null && Object.hasOwnProperty.call(message, "group")) $root.signalservice.Group.encode(message.group, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.groupSendEndorsementsResponse != null && Object.hasOwnProperty.call(message, "groupSendEndorsementsResponse")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.groupSendEndorsementsResponse); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupResponse message, length delimited. Does not implicitly {@link signalservice.GroupResponse.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.GroupResponse * @static * @param {signalservice.IGroupResponse} message GroupResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupResponse.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupResponse message from the specified reader or buffer. * @function decode * @memberof signalservice.GroupResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.GroupResponse} GroupResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupResponse.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.GroupResponse(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.group = $root.signalservice.Group.decode(reader, reader.uint32()); break; } case 2: { message.groupSendEndorsementsResponse = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupResponse message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.GroupResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.GroupResponse} GroupResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupResponse.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return GroupResponse; })(); signalservice.GroupChanges = (function() { /** * Properties of a GroupChanges. * @memberof signalservice * @interface IGroupChanges * @property {Array.|null} [groupChanges] GroupChanges groupChanges * @property {Uint8Array|null} [groupSendEndorsementsResponse] GroupChanges groupSendEndorsementsResponse */ /** * Constructs a new GroupChanges. * @memberof signalservice * @classdesc Represents a GroupChanges. * @implements IGroupChanges * @constructor * @param {signalservice.IGroupChanges=} [properties] Properties to set */ function GroupChanges(properties) { this.groupChanges = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GroupChanges groupChanges. * @member {Array.} groupChanges * @memberof signalservice.GroupChanges * @instance */ GroupChanges.prototype.groupChanges = $util.emptyArray; /** * GroupChanges groupSendEndorsementsResponse. * @member {Uint8Array} groupSendEndorsementsResponse * @memberof signalservice.GroupChanges * @instance */ GroupChanges.prototype.groupSendEndorsementsResponse = $util.newBuffer([]); /** * Encodes the specified GroupChanges message. Does not implicitly {@link signalservice.GroupChanges.verify|verify} messages. * @function encode * @memberof signalservice.GroupChanges * @static * @param {signalservice.IGroupChanges} message GroupChanges message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupChanges.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.GroupChanges.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.GroupChanges.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.groupChanges != null && message.groupChanges.length) for (var i = 0; i < message.groupChanges.length; ++i) $root.signalservice.GroupChanges.GroupChangeState.encode(message.groupChanges[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.groupSendEndorsementsResponse != null && Object.hasOwnProperty.call(message, "groupSendEndorsementsResponse")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.groupSendEndorsementsResponse); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupChanges message, length delimited. Does not implicitly {@link signalservice.GroupChanges.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.GroupChanges * @static * @param {signalservice.IGroupChanges} message GroupChanges message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupChanges.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupChanges message from the specified reader or buffer. * @function decode * @memberof signalservice.GroupChanges * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.GroupChanges} GroupChanges * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupChanges.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.GroupChanges(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { if (!(message.groupChanges && message.groupChanges.length)) message.groupChanges = []; message.groupChanges.push($root.signalservice.GroupChanges.GroupChangeState.decode(reader, reader.uint32())); break; } case 2: { message.groupSendEndorsementsResponse = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupChanges message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.GroupChanges * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.GroupChanges} GroupChanges * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupChanges.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; GroupChanges.GroupChangeState = (function() { /** * Properties of a GroupChangeState. * @memberof signalservice.GroupChanges * @interface IGroupChangeState * @property {signalservice.IGroupChange|null} [groupChange] GroupChangeState groupChange * @property {signalservice.IGroup|null} [groupState] GroupChangeState groupState */ /** * Constructs a new GroupChangeState. * @memberof signalservice.GroupChanges * @classdesc Represents a GroupChangeState. * @implements IGroupChangeState * @constructor * @param {signalservice.GroupChanges.IGroupChangeState=} [properties] Properties to set */ function GroupChangeState(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GroupChangeState groupChange. * @member {signalservice.IGroupChange|null|undefined} groupChange * @memberof signalservice.GroupChanges.GroupChangeState * @instance */ GroupChangeState.prototype.groupChange = null; /** * GroupChangeState groupState. * @member {signalservice.IGroup|null|undefined} groupState * @memberof signalservice.GroupChanges.GroupChangeState * @instance */ GroupChangeState.prototype.groupState = null; /** * Encodes the specified GroupChangeState message. Does not implicitly {@link signalservice.GroupChanges.GroupChangeState.verify|verify} messages. * @function encode * @memberof signalservice.GroupChanges.GroupChangeState * @static * @param {signalservice.GroupChanges.IGroupChangeState} message GroupChangeState message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupChangeState.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.GroupChanges.GroupChangeState.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.GroupChanges.GroupChangeState.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.groupChange != null && Object.hasOwnProperty.call(message, "groupChange")) $root.signalservice.GroupChange.encode(message.groupChange, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.groupState != null && Object.hasOwnProperty.call(message, "groupState")) $root.signalservice.Group.encode(message.groupState, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupChangeState message, length delimited. Does not implicitly {@link signalservice.GroupChanges.GroupChangeState.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.GroupChanges.GroupChangeState * @static * @param {signalservice.GroupChanges.IGroupChangeState} message GroupChangeState message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupChangeState.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupChangeState message from the specified reader or buffer. * @function decode * @memberof signalservice.GroupChanges.GroupChangeState * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.GroupChanges.GroupChangeState} GroupChangeState * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupChangeState.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.GroupChanges.GroupChangeState(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.groupChange = $root.signalservice.GroupChange.decode(reader, reader.uint32()); break; } case 2: { message.groupState = $root.signalservice.Group.decode(reader, reader.uint32()); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupChangeState message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.GroupChanges.GroupChangeState * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.GroupChanges.GroupChangeState} GroupChangeState * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupChangeState.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return GroupChangeState; })(); return GroupChanges; })(); signalservice.GroupChangeResponse = (function() { /** * Properties of a GroupChangeResponse. * @memberof signalservice * @interface IGroupChangeResponse * @property {signalservice.IGroupChange|null} [groupChange] GroupChangeResponse groupChange * @property {Uint8Array|null} [groupSendEndorsementsResponse] GroupChangeResponse groupSendEndorsementsResponse */ /** * Constructs a new GroupChangeResponse. * @memberof signalservice * @classdesc Represents a GroupChangeResponse. * @implements IGroupChangeResponse * @constructor * @param {signalservice.IGroupChangeResponse=} [properties] Properties to set */ function GroupChangeResponse(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GroupChangeResponse groupChange. * @member {signalservice.IGroupChange|null|undefined} groupChange * @memberof signalservice.GroupChangeResponse * @instance */ GroupChangeResponse.prototype.groupChange = null; /** * GroupChangeResponse groupSendEndorsementsResponse. * @member {Uint8Array} groupSendEndorsementsResponse * @memberof signalservice.GroupChangeResponse * @instance */ GroupChangeResponse.prototype.groupSendEndorsementsResponse = $util.newBuffer([]); /** * Encodes the specified GroupChangeResponse message. Does not implicitly {@link signalservice.GroupChangeResponse.verify|verify} messages. * @function encode * @memberof signalservice.GroupChangeResponse * @static * @param {signalservice.IGroupChangeResponse} message GroupChangeResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupChangeResponse.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.GroupChangeResponse.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.GroupChangeResponse.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.groupChange != null && Object.hasOwnProperty.call(message, "groupChange")) $root.signalservice.GroupChange.encode(message.groupChange, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.groupSendEndorsementsResponse != null && Object.hasOwnProperty.call(message, "groupSendEndorsementsResponse")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.groupSendEndorsementsResponse); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupChangeResponse message, length delimited. Does not implicitly {@link signalservice.GroupChangeResponse.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.GroupChangeResponse * @static * @param {signalservice.IGroupChangeResponse} message GroupChangeResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupChangeResponse.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupChangeResponse message from the specified reader or buffer. * @function decode * @memberof signalservice.GroupChangeResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.GroupChangeResponse} GroupChangeResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupChangeResponse.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.GroupChangeResponse(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.groupChange = $root.signalservice.GroupChange.decode(reader, reader.uint32()); break; } case 2: { message.groupSendEndorsementsResponse = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupChangeResponse message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.GroupChangeResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.GroupChangeResponse} GroupChangeResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupChangeResponse.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return GroupChangeResponse; })(); signalservice.JumbomojiPack = (function() { /** * Properties of a JumbomojiPack. * @memberof signalservice * @interface IJumbomojiPack * @property {Array.|null} [items] JumbomojiPack items */ /** * Constructs a new JumbomojiPack. * @memberof signalservice * @classdesc Represents a JumbomojiPack. * @implements IJumbomojiPack * @constructor * @param {signalservice.IJumbomojiPack=} [properties] Properties to set */ function JumbomojiPack(properties) { this.items = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * JumbomojiPack items. * @member {Array.} items * @memberof signalservice.JumbomojiPack * @instance */ JumbomojiPack.prototype.items = $util.emptyArray; /** * Encodes the specified JumbomojiPack message. Does not implicitly {@link signalservice.JumbomojiPack.verify|verify} messages. * @function encode * @memberof signalservice.JumbomojiPack * @static * @param {signalservice.IJumbomojiPack} message JumbomojiPack message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ JumbomojiPack.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.JumbomojiPack.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.JumbomojiPack.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.items != null && message.items.length) for (var i = 0; i < message.items.length; ++i) $root.signalservice.JumbomojiItem.encode(message.items[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified JumbomojiPack message, length delimited. Does not implicitly {@link signalservice.JumbomojiPack.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.JumbomojiPack * @static * @param {signalservice.IJumbomojiPack} message JumbomojiPack message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ JumbomojiPack.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a JumbomojiPack message from the specified reader or buffer. * @function decode * @memberof signalservice.JumbomojiPack * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.JumbomojiPack} JumbomojiPack * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ JumbomojiPack.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.JumbomojiPack(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { if (!(message.items && message.items.length)) message.items = []; message.items.push($root.signalservice.JumbomojiItem.decode(reader, reader.uint32())); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a JumbomojiPack message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.JumbomojiPack * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.JumbomojiPack} JumbomojiPack * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ JumbomojiPack.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return JumbomojiPack; })(); signalservice.JumbomojiItem = (function() { /** * Properties of a JumbomojiItem. * @memberof signalservice * @interface IJumbomojiItem * @property {string|null} [name] JumbomojiItem name * @property {Uint8Array|null} [image] JumbomojiItem image */ /** * Constructs a new JumbomojiItem. * @memberof signalservice * @classdesc Represents a JumbomojiItem. * @implements IJumbomojiItem * @constructor * @param {signalservice.IJumbomojiItem=} [properties] Properties to set */ function JumbomojiItem(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * JumbomojiItem name. * @member {string} name * @memberof signalservice.JumbomojiItem * @instance */ JumbomojiItem.prototype.name = ""; /** * JumbomojiItem image. * @member {Uint8Array} image * @memberof signalservice.JumbomojiItem * @instance */ JumbomojiItem.prototype.image = $util.newBuffer([]); /** * Encodes the specified JumbomojiItem message. Does not implicitly {@link signalservice.JumbomojiItem.verify|verify} messages. * @function encode * @memberof signalservice.JumbomojiItem * @static * @param {signalservice.IJumbomojiItem} message JumbomojiItem message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ JumbomojiItem.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.JumbomojiItem.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.JumbomojiItem.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.name != null && Object.hasOwnProperty.call(message, "name")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.name); if (message.image != null && Object.hasOwnProperty.call(message, "image")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.image); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified JumbomojiItem message, length delimited. Does not implicitly {@link signalservice.JumbomojiItem.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.JumbomojiItem * @static * @param {signalservice.IJumbomojiItem} message JumbomojiItem message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ JumbomojiItem.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a JumbomojiItem message from the specified reader or buffer. * @function decode * @memberof signalservice.JumbomojiItem * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.JumbomojiItem} JumbomojiItem * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ JumbomojiItem.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.JumbomojiItem(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.name = reader.string(); break; } case 2: { message.image = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a JumbomojiItem message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.JumbomojiItem * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.JumbomojiItem} JumbomojiItem * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ JumbomojiItem.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return JumbomojiItem; })(); signalservice.Envelope = (function() { /** * Properties of an Envelope. * @memberof signalservice * @interface IEnvelope * @property {signalservice.Envelope.Type|null} [type] Envelope type * @property {string|null} [sourceServiceId] Envelope sourceServiceId * @property {number|null} [sourceDeviceId] Envelope sourceDeviceId * @property {string|null} [destinationServiceId] Envelope destinationServiceId * @property {Long|null} [clientTimestamp] Envelope clientTimestamp * @property {Uint8Array|null} [content] Envelope content * @property {string|null} [serverGuid] Envelope serverGuid * @property {Long|null} [serverTimestamp] Envelope serverTimestamp * @property {boolean|null} [ephemeral] Envelope ephemeral * @property {boolean|null} [urgent] Envelope urgent * @property {string|null} [updatedPni] Envelope updatedPni * @property {boolean|null} [story] Envelope story * @property {Uint8Array|null} [reportSpamToken] Envelope reportSpamToken * @property {Uint8Array|null} [sourceServiceIdBinary] Envelope sourceServiceIdBinary * @property {Uint8Array|null} [destinationServiceIdBinary] Envelope destinationServiceIdBinary * @property {Uint8Array|null} [serverGuidBinary] Envelope serverGuidBinary * @property {Uint8Array|null} [updatedPniBinary] Envelope updatedPniBinary */ /** * Constructs a new Envelope. * @memberof signalservice * @classdesc Represents an Envelope. * @implements IEnvelope * @constructor * @param {signalservice.IEnvelope=} [properties] Properties to set */ function Envelope(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Envelope type. * @member {signalservice.Envelope.Type} type * @memberof signalservice.Envelope * @instance */ Envelope.prototype.type = 0; /** * Envelope sourceServiceId. * @member {string} sourceServiceId * @memberof signalservice.Envelope * @instance */ Envelope.prototype.sourceServiceId = ""; /** * Envelope sourceDeviceId. * @member {number} sourceDeviceId * @memberof signalservice.Envelope * @instance */ Envelope.prototype.sourceDeviceId = 0; /** * Envelope destinationServiceId. * @member {string} destinationServiceId * @memberof signalservice.Envelope * @instance */ Envelope.prototype.destinationServiceId = ""; /** * Envelope clientTimestamp. * @member {Long} clientTimestamp * @memberof signalservice.Envelope * @instance */ Envelope.prototype.clientTimestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * Envelope content. * @member {Uint8Array} content * @memberof signalservice.Envelope * @instance */ Envelope.prototype.content = $util.newBuffer([]); /** * Envelope serverGuid. * @member {string} serverGuid * @memberof signalservice.Envelope * @instance */ Envelope.prototype.serverGuid = ""; /** * Envelope serverTimestamp. * @member {Long} serverTimestamp * @memberof signalservice.Envelope * @instance */ Envelope.prototype.serverTimestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * Envelope ephemeral. * @member {boolean} ephemeral * @memberof signalservice.Envelope * @instance */ Envelope.prototype.ephemeral = false; /** * Envelope urgent. * @member {boolean} urgent * @memberof signalservice.Envelope * @instance */ Envelope.prototype.urgent = true; /** * Envelope updatedPni. * @member {string} updatedPni * @memberof signalservice.Envelope * @instance */ Envelope.prototype.updatedPni = ""; /** * Envelope story. * @member {boolean} story * @memberof signalservice.Envelope * @instance */ Envelope.prototype.story = false; /** * Envelope reportSpamToken. * @member {Uint8Array} reportSpamToken * @memberof signalservice.Envelope * @instance */ Envelope.prototype.reportSpamToken = $util.newBuffer([]); /** * Envelope sourceServiceIdBinary. * @member {Uint8Array} sourceServiceIdBinary * @memberof signalservice.Envelope * @instance */ Envelope.prototype.sourceServiceIdBinary = $util.newBuffer([]); /** * Envelope destinationServiceIdBinary. * @member {Uint8Array} destinationServiceIdBinary * @memberof signalservice.Envelope * @instance */ Envelope.prototype.destinationServiceIdBinary = $util.newBuffer([]); /** * Envelope serverGuidBinary. * @member {Uint8Array} serverGuidBinary * @memberof signalservice.Envelope * @instance */ Envelope.prototype.serverGuidBinary = $util.newBuffer([]); /** * Envelope updatedPniBinary. * @member {Uint8Array} updatedPniBinary * @memberof signalservice.Envelope * @instance */ Envelope.prototype.updatedPniBinary = $util.newBuffer([]); /** * Encodes the specified Envelope message. Does not implicitly {@link signalservice.Envelope.verify|verify} messages. * @function encode * @memberof signalservice.Envelope * @static * @param {signalservice.IEnvelope} message Envelope message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Envelope.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.Envelope.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.Envelope.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.type != null && Object.hasOwnProperty.call(message, "type")) writer.uint32(/* id 1, wireType 0 =*/8).int32(message.type); if (message.clientTimestamp != null && Object.hasOwnProperty.call(message, "clientTimestamp")) writer.uint32(/* id 5, wireType 0 =*/40).uint64(message.clientTimestamp); if (message.sourceDeviceId != null && Object.hasOwnProperty.call(message, "sourceDeviceId")) writer.uint32(/* id 7, wireType 0 =*/56).uint32(message.sourceDeviceId); if (message.content != null && Object.hasOwnProperty.call(message, "content")) writer.uint32(/* id 8, wireType 2 =*/66).bytes(message.content); if (message.serverGuid != null && Object.hasOwnProperty.call(message, "serverGuid")) writer.uint32(/* id 9, wireType 2 =*/74).string(message.serverGuid); if (message.serverTimestamp != null && Object.hasOwnProperty.call(message, "serverTimestamp")) writer.uint32(/* id 10, wireType 0 =*/80).uint64(message.serverTimestamp); if (message.sourceServiceId != null && Object.hasOwnProperty.call(message, "sourceServiceId")) writer.uint32(/* id 11, wireType 2 =*/90).string(message.sourceServiceId); if (message.ephemeral != null && Object.hasOwnProperty.call(message, "ephemeral")) writer.uint32(/* id 12, wireType 0 =*/96).bool(message.ephemeral); if (message.destinationServiceId != null && Object.hasOwnProperty.call(message, "destinationServiceId")) writer.uint32(/* id 13, wireType 2 =*/106).string(message.destinationServiceId); if (message.urgent != null && Object.hasOwnProperty.call(message, "urgent")) writer.uint32(/* id 14, wireType 0 =*/112).bool(message.urgent); if (message.updatedPni != null && Object.hasOwnProperty.call(message, "updatedPni")) writer.uint32(/* id 15, wireType 2 =*/122).string(message.updatedPni); if (message.story != null && Object.hasOwnProperty.call(message, "story")) writer.uint32(/* id 16, wireType 0 =*/128).bool(message.story); if (message.reportSpamToken != null && Object.hasOwnProperty.call(message, "reportSpamToken")) writer.uint32(/* id 17, wireType 2 =*/138).bytes(message.reportSpamToken); if (message.sourceServiceIdBinary != null && Object.hasOwnProperty.call(message, "sourceServiceIdBinary")) writer.uint32(/* id 19, wireType 2 =*/154).bytes(message.sourceServiceIdBinary); if (message.destinationServiceIdBinary != null && Object.hasOwnProperty.call(message, "destinationServiceIdBinary")) writer.uint32(/* id 20, wireType 2 =*/162).bytes(message.destinationServiceIdBinary); if (message.serverGuidBinary != null && Object.hasOwnProperty.call(message, "serverGuidBinary")) writer.uint32(/* id 21, wireType 2 =*/170).bytes(message.serverGuidBinary); if (message.updatedPniBinary != null && Object.hasOwnProperty.call(message, "updatedPniBinary")) writer.uint32(/* id 22, wireType 2 =*/178).bytes(message.updatedPniBinary); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Envelope message, length delimited. Does not implicitly {@link signalservice.Envelope.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.Envelope * @static * @param {signalservice.IEnvelope} message Envelope message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Envelope.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an Envelope message from the specified reader or buffer. * @function decode * @memberof signalservice.Envelope * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.Envelope} Envelope * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Envelope.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.Envelope(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.type = reader.int32(); break; } case 11: { message.sourceServiceId = reader.string(); break; } case 7: { message.sourceDeviceId = reader.uint32(); break; } case 13: { message.destinationServiceId = reader.string(); break; } case 5: { message.clientTimestamp = reader.uint64(); break; } case 8: { message.content = reader.bytes(); break; } case 9: { message.serverGuid = reader.string(); break; } case 10: { message.serverTimestamp = reader.uint64(); break; } case 12: { message.ephemeral = reader.bool(); break; } case 14: { message.urgent = reader.bool(); break; } case 15: { message.updatedPni = reader.string(); break; } case 16: { message.story = reader.bool(); break; } case 17: { message.reportSpamToken = reader.bytes(); break; } case 19: { message.sourceServiceIdBinary = reader.bytes(); break; } case 20: { message.destinationServiceIdBinary = reader.bytes(); break; } case 21: { message.serverGuidBinary = reader.bytes(); break; } case 22: { message.updatedPniBinary = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an Envelope message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.Envelope * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.Envelope} Envelope * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Envelope.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * Type enum. * @name signalservice.Envelope.Type * @enum {number} * @property {number} UNKNOWN=0 UNKNOWN value * @property {number} DOUBLE_RATCHET=1 A double-ratchet message represents a "normal," "unsealed-sender" message * encrypted using the Double Ratchet within an established Signal session. * Double-ratchet messages include sender information in the plaintext * portion of the `Envelope`. * @property {number} PREKEY_MESSAGE=3 A prekey message begins a new Signal session. The `content` of a prekey * message is a superset of a double-ratchet message's `content` and * contains the sender's identity public key and information identifying the * pre-keys used in the message's ciphertext. Like double-ratchet messages, * prekey messages contain sender information in the plaintext portion of * the `Envelope`. * @property {number} SERVER_DELIVERY_RECEIPT=5 Server delivery receipts are generated by the server when * "unsealed-sender" messages are delivered to and acknowledged by the * destination device. Server delivery receipts identify the sender in the * plaintext portion of the `Envelope` and have no `content`. Note that * receipts for sealed-sender messages are generated by clients as * `UNIDENTIFIED_SENDER` messages. * * Note that, with server delivery receipts, the "client timestamp" on * the envelope refers to the timestamp of the original message (i.e. the * message the server just delivered) and not to the time of delivery. The * "server timestamp" refers to the time of delivery. * @property {number} UNIDENTIFIED_SENDER=6 An unidentified sender message represents a message with no sender * information in the plaintext portion of the `Envelope`. Unidentified * sender messages always contain an additional `subtype` in their * `content`. They may or may not be part of an existing Signal session * (i.e. an unidentified sender message may have a "prekey message" * subtype or may indicate an encryption error). * @property {number} PLAINTEXT_CONTENT=8 A plaintext message is used solely to convey encryption error receipts * and never contains encrypted message content. Encryption error receipts * must be delivered in plaintext because, encryption/decryption of a prior * message failed and there is no reason to believe that * encryption/decryption of subsequent messages with the same key material * would succeed. * * Critically, plaintext messages never have "real" message content * generated by users. Plaintext messages include sender information. */ Envelope.Type = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "UNKNOWN"] = 0; values[valuesById[1] = "DOUBLE_RATCHET"] = 1; values[valuesById[3] = "PREKEY_MESSAGE"] = 3; values[valuesById[5] = "SERVER_DELIVERY_RECEIPT"] = 5; values[valuesById[6] = "UNIDENTIFIED_SENDER"] = 6; values[valuesById[8] = "PLAINTEXT_CONTENT"] = 8; return values; })(); return Envelope; })(); signalservice.Content = (function() { /** * Properties of a Content. * @memberof signalservice * @interface IContent * @property {signalservice.IDataMessage|null} [dataMessage] Content dataMessage * @property {signalservice.ISyncMessage|null} [syncMessage] Content syncMessage * @property {signalservice.ICallMessage|null} [callMessage] Content callMessage * @property {signalservice.INullMessage|null} [nullMessage] Content nullMessage * @property {signalservice.IReceiptMessage|null} [receiptMessage] Content receiptMessage * @property {signalservice.ITypingMessage|null} [typingMessage] Content typingMessage * @property {Uint8Array|null} [senderKeyDistributionMessage] Content senderKeyDistributionMessage * @property {Uint8Array|null} [decryptionErrorMessage] Content decryptionErrorMessage * @property {signalservice.IStoryMessage|null} [storyMessage] Content storyMessage * @property {signalservice.IPniSignatureMessage|null} [pniSignatureMessage] Content pniSignatureMessage * @property {signalservice.IEditMessage|null} [editMessage] Content editMessage */ /** * Constructs a new Content. * @memberof signalservice * @classdesc Represents a Content. * @implements IContent * @constructor * @param {signalservice.IContent=} [properties] Properties to set */ function Content(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Content dataMessage. * @member {signalservice.IDataMessage|null|undefined} dataMessage * @memberof signalservice.Content * @instance */ Content.prototype.dataMessage = null; /** * Content syncMessage. * @member {signalservice.ISyncMessage|null|undefined} syncMessage * @memberof signalservice.Content * @instance */ Content.prototype.syncMessage = null; /** * Content callMessage. * @member {signalservice.ICallMessage|null|undefined} callMessage * @memberof signalservice.Content * @instance */ Content.prototype.callMessage = null; /** * Content nullMessage. * @member {signalservice.INullMessage|null|undefined} nullMessage * @memberof signalservice.Content * @instance */ Content.prototype.nullMessage = null; /** * Content receiptMessage. * @member {signalservice.IReceiptMessage|null|undefined} receiptMessage * @memberof signalservice.Content * @instance */ Content.prototype.receiptMessage = null; /** * Content typingMessage. * @member {signalservice.ITypingMessage|null|undefined} typingMessage * @memberof signalservice.Content * @instance */ Content.prototype.typingMessage = null; /** * Content senderKeyDistributionMessage. * @member {Uint8Array} senderKeyDistributionMessage * @memberof signalservice.Content * @instance */ Content.prototype.senderKeyDistributionMessage = $util.newBuffer([]); /** * Content decryptionErrorMessage. * @member {Uint8Array} decryptionErrorMessage * @memberof signalservice.Content * @instance */ Content.prototype.decryptionErrorMessage = $util.newBuffer([]); /** * Content storyMessage. * @member {signalservice.IStoryMessage|null|undefined} storyMessage * @memberof signalservice.Content * @instance */ Content.prototype.storyMessage = null; /** * Content pniSignatureMessage. * @member {signalservice.IPniSignatureMessage|null|undefined} pniSignatureMessage * @memberof signalservice.Content * @instance */ Content.prototype.pniSignatureMessage = null; /** * Content editMessage. * @member {signalservice.IEditMessage|null|undefined} editMessage * @memberof signalservice.Content * @instance */ Content.prototype.editMessage = null; /** * Encodes the specified Content message. Does not implicitly {@link signalservice.Content.verify|verify} messages. * @function encode * @memberof signalservice.Content * @static * @param {signalservice.IContent} message Content message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Content.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.Content.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.Content.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.dataMessage != null && Object.hasOwnProperty.call(message, "dataMessage")) $root.signalservice.DataMessage.encode(message.dataMessage, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.syncMessage != null && Object.hasOwnProperty.call(message, "syncMessage")) $root.signalservice.SyncMessage.encode(message.syncMessage, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); if (message.callMessage != null && Object.hasOwnProperty.call(message, "callMessage")) $root.signalservice.CallMessage.encode(message.callMessage, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); if (message.nullMessage != null && Object.hasOwnProperty.call(message, "nullMessage")) $root.signalservice.NullMessage.encode(message.nullMessage, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); if (message.receiptMessage != null && Object.hasOwnProperty.call(message, "receiptMessage")) $root.signalservice.ReceiptMessage.encode(message.receiptMessage, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); if (message.typingMessage != null && Object.hasOwnProperty.call(message, "typingMessage")) $root.signalservice.TypingMessage.encode(message.typingMessage, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim(); if (message.senderKeyDistributionMessage != null && Object.hasOwnProperty.call(message, "senderKeyDistributionMessage")) writer.uint32(/* id 7, wireType 2 =*/58).bytes(message.senderKeyDistributionMessage); if (message.decryptionErrorMessage != null && Object.hasOwnProperty.call(message, "decryptionErrorMessage")) writer.uint32(/* id 8, wireType 2 =*/66).bytes(message.decryptionErrorMessage); if (message.storyMessage != null && Object.hasOwnProperty.call(message, "storyMessage")) $root.signalservice.StoryMessage.encode(message.storyMessage, writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim(); if (message.pniSignatureMessage != null && Object.hasOwnProperty.call(message, "pniSignatureMessage")) $root.signalservice.PniSignatureMessage.encode(message.pniSignatureMessage, writer.uint32(/* id 10, wireType 2 =*/82).fork()).ldelim(); if (message.editMessage != null && Object.hasOwnProperty.call(message, "editMessage")) $root.signalservice.EditMessage.encode(message.editMessage, writer.uint32(/* id 11, wireType 2 =*/90).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Content message, length delimited. Does not implicitly {@link signalservice.Content.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.Content * @static * @param {signalservice.IContent} message Content message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Content.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Content message from the specified reader or buffer. * @function decode * @memberof signalservice.Content * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.Content} Content * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Content.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.Content(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.dataMessage = $root.signalservice.DataMessage.decode(reader, reader.uint32()); break; } case 2: { message.syncMessage = $root.signalservice.SyncMessage.decode(reader, reader.uint32()); break; } case 3: { message.callMessage = $root.signalservice.CallMessage.decode(reader, reader.uint32()); break; } case 4: { message.nullMessage = $root.signalservice.NullMessage.decode(reader, reader.uint32()); break; } case 5: { message.receiptMessage = $root.signalservice.ReceiptMessage.decode(reader, reader.uint32()); break; } case 6: { message.typingMessage = $root.signalservice.TypingMessage.decode(reader, reader.uint32()); break; } case 7: { message.senderKeyDistributionMessage = reader.bytes(); break; } case 8: { message.decryptionErrorMessage = reader.bytes(); break; } case 9: { message.storyMessage = $root.signalservice.StoryMessage.decode(reader, reader.uint32()); break; } case 10: { message.pniSignatureMessage = $root.signalservice.PniSignatureMessage.decode(reader, reader.uint32()); break; } case 11: { message.editMessage = $root.signalservice.EditMessage.decode(reader, reader.uint32()); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Content message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.Content * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.Content} Content * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Content.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return Content; })(); signalservice.CallMessage = (function() { /** * Properties of a CallMessage. * @memberof signalservice * @interface ICallMessage * @property {signalservice.CallMessage.IOffer|null} [offer] CallMessage offer * @property {signalservice.CallMessage.IAnswer|null} [answer] CallMessage answer * @property {Array.|null} [iceUpdate] CallMessage iceUpdate * @property {signalservice.CallMessage.IBusy|null} [busy] CallMessage busy * @property {signalservice.CallMessage.IHangup|null} [hangup] CallMessage hangup * @property {number|null} [destinationDeviceId] CallMessage destinationDeviceId * @property {signalservice.CallMessage.IOpaque|null} [opaque] CallMessage opaque */ /** * Constructs a new CallMessage. * @memberof signalservice * @classdesc Represents a CallMessage. * @implements ICallMessage * @constructor * @param {signalservice.ICallMessage=} [properties] Properties to set */ function CallMessage(properties) { this.iceUpdate = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * CallMessage offer. * @member {signalservice.CallMessage.IOffer|null|undefined} offer * @memberof signalservice.CallMessage * @instance */ CallMessage.prototype.offer = null; /** * CallMessage answer. * @member {signalservice.CallMessage.IAnswer|null|undefined} answer * @memberof signalservice.CallMessage * @instance */ CallMessage.prototype.answer = null; /** * CallMessage iceUpdate. * @member {Array.} iceUpdate * @memberof signalservice.CallMessage * @instance */ CallMessage.prototype.iceUpdate = $util.emptyArray; /** * CallMessage busy. * @member {signalservice.CallMessage.IBusy|null|undefined} busy * @memberof signalservice.CallMessage * @instance */ CallMessage.prototype.busy = null; /** * CallMessage hangup. * @member {signalservice.CallMessage.IHangup|null|undefined} hangup * @memberof signalservice.CallMessage * @instance */ CallMessage.prototype.hangup = null; /** * CallMessage destinationDeviceId. * @member {number} destinationDeviceId * @memberof signalservice.CallMessage * @instance */ CallMessage.prototype.destinationDeviceId = 0; /** * CallMessage opaque. * @member {signalservice.CallMessage.IOpaque|null|undefined} opaque * @memberof signalservice.CallMessage * @instance */ CallMessage.prototype.opaque = null; /** * Encodes the specified CallMessage message. Does not implicitly {@link signalservice.CallMessage.verify|verify} messages. * @function encode * @memberof signalservice.CallMessage * @static * @param {signalservice.ICallMessage} message CallMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ CallMessage.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.CallMessage.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.CallMessage.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.offer != null && Object.hasOwnProperty.call(message, "offer")) $root.signalservice.CallMessage.Offer.encode(message.offer, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.answer != null && Object.hasOwnProperty.call(message, "answer")) $root.signalservice.CallMessage.Answer.encode(message.answer, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); if (message.iceUpdate != null && message.iceUpdate.length) for (var i = 0; i < message.iceUpdate.length; ++i) $root.signalservice.CallMessage.IceUpdate.encode(message.iceUpdate[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); if (message.busy != null && Object.hasOwnProperty.call(message, "busy")) $root.signalservice.CallMessage.Busy.encode(message.busy, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); if (message.hangup != null && Object.hasOwnProperty.call(message, "hangup")) $root.signalservice.CallMessage.Hangup.encode(message.hangup, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim(); if (message.destinationDeviceId != null && Object.hasOwnProperty.call(message, "destinationDeviceId")) writer.uint32(/* id 9, wireType 0 =*/72).uint32(message.destinationDeviceId); if (message.opaque != null && Object.hasOwnProperty.call(message, "opaque")) $root.signalservice.CallMessage.Opaque.encode(message.opaque, writer.uint32(/* id 10, wireType 2 =*/82).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified CallMessage message, length delimited. Does not implicitly {@link signalservice.CallMessage.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.CallMessage * @static * @param {signalservice.ICallMessage} message CallMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ CallMessage.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a CallMessage message from the specified reader or buffer. * @function decode * @memberof signalservice.CallMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.CallMessage} CallMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ CallMessage.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.CallMessage(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.offer = $root.signalservice.CallMessage.Offer.decode(reader, reader.uint32()); break; } case 2: { message.answer = $root.signalservice.CallMessage.Answer.decode(reader, reader.uint32()); break; } case 3: { if (!(message.iceUpdate && message.iceUpdate.length)) message.iceUpdate = []; message.iceUpdate.push($root.signalservice.CallMessage.IceUpdate.decode(reader, reader.uint32())); break; } case 5: { message.busy = $root.signalservice.CallMessage.Busy.decode(reader, reader.uint32()); break; } case 7: { message.hangup = $root.signalservice.CallMessage.Hangup.decode(reader, reader.uint32()); break; } case 9: { message.destinationDeviceId = reader.uint32(); break; } case 10: { message.opaque = $root.signalservice.CallMessage.Opaque.decode(reader, reader.uint32()); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a CallMessage message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.CallMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.CallMessage} CallMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ CallMessage.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; CallMessage.Offer = (function() { /** * Properties of an Offer. * @memberof signalservice.CallMessage * @interface IOffer * @property {Long|null} [id] Offer id * @property {signalservice.CallMessage.Offer.Type|null} [type] Offer type * @property {Uint8Array|null} [opaque] Offer opaque */ /** * Constructs a new Offer. * @memberof signalservice.CallMessage * @classdesc Represents an Offer. * @implements IOffer * @constructor * @param {signalservice.CallMessage.IOffer=} [properties] Properties to set */ function Offer(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Offer id. * @member {Long} id * @memberof signalservice.CallMessage.Offer * @instance */ Offer.prototype.id = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * Offer type. * @member {signalservice.CallMessage.Offer.Type} type * @memberof signalservice.CallMessage.Offer * @instance */ Offer.prototype.type = 0; /** * Offer opaque. * @member {Uint8Array} opaque * @memberof signalservice.CallMessage.Offer * @instance */ Offer.prototype.opaque = $util.newBuffer([]); /** * Encodes the specified Offer message. Does not implicitly {@link signalservice.CallMessage.Offer.verify|verify} messages. * @function encode * @memberof signalservice.CallMessage.Offer * @static * @param {signalservice.CallMessage.IOffer} message Offer message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Offer.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.CallMessage.Offer.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.CallMessage.Offer.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.id != null && Object.hasOwnProperty.call(message, "id")) writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.id); if (message.type != null && Object.hasOwnProperty.call(message, "type")) writer.uint32(/* id 3, wireType 0 =*/24).int32(message.type); if (message.opaque != null && Object.hasOwnProperty.call(message, "opaque")) writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.opaque); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Offer message, length delimited. Does not implicitly {@link signalservice.CallMessage.Offer.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.CallMessage.Offer * @static * @param {signalservice.CallMessage.IOffer} message Offer message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Offer.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an Offer message from the specified reader or buffer. * @function decode * @memberof signalservice.CallMessage.Offer * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.CallMessage.Offer} Offer * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Offer.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.CallMessage.Offer(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.id = reader.uint64(); break; } case 3: { message.type = reader.int32(); break; } case 4: { message.opaque = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an Offer message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.CallMessage.Offer * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.CallMessage.Offer} Offer * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Offer.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * Type enum. * @name signalservice.CallMessage.Offer.Type * @enum {number} * @property {number} OFFER_AUDIO_CALL=0 OFFER_AUDIO_CALL value * @property {number} OFFER_VIDEO_CALL=1 OFFER_VIDEO_CALL value */ Offer.Type = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "OFFER_AUDIO_CALL"] = 0; values[valuesById[1] = "OFFER_VIDEO_CALL"] = 1; return values; })(); return Offer; })(); CallMessage.Answer = (function() { /** * Properties of an Answer. * @memberof signalservice.CallMessage * @interface IAnswer * @property {Long|null} [id] Answer id * @property {Uint8Array|null} [opaque] Answer opaque */ /** * Constructs a new Answer. * @memberof signalservice.CallMessage * @classdesc Represents an Answer. * @implements IAnswer * @constructor * @param {signalservice.CallMessage.IAnswer=} [properties] Properties to set */ function Answer(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Answer id. * @member {Long} id * @memberof signalservice.CallMessage.Answer * @instance */ Answer.prototype.id = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * Answer opaque. * @member {Uint8Array} opaque * @memberof signalservice.CallMessage.Answer * @instance */ Answer.prototype.opaque = $util.newBuffer([]); /** * Encodes the specified Answer message. Does not implicitly {@link signalservice.CallMessage.Answer.verify|verify} messages. * @function encode * @memberof signalservice.CallMessage.Answer * @static * @param {signalservice.CallMessage.IAnswer} message Answer message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Answer.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.CallMessage.Answer.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.CallMessage.Answer.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.id != null && Object.hasOwnProperty.call(message, "id")) writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.id); if (message.opaque != null && Object.hasOwnProperty.call(message, "opaque")) writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.opaque); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Answer message, length delimited. Does not implicitly {@link signalservice.CallMessage.Answer.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.CallMessage.Answer * @static * @param {signalservice.CallMessage.IAnswer} message Answer message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Answer.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an Answer message from the specified reader or buffer. * @function decode * @memberof signalservice.CallMessage.Answer * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.CallMessage.Answer} Answer * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Answer.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.CallMessage.Answer(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.id = reader.uint64(); break; } case 3: { message.opaque = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an Answer message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.CallMessage.Answer * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.CallMessage.Answer} Answer * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Answer.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return Answer; })(); CallMessage.IceUpdate = (function() { /** * Properties of an IceUpdate. * @memberof signalservice.CallMessage * @interface IIceUpdate * @property {Long|null} [id] IceUpdate id * @property {Uint8Array|null} [opaque] IceUpdate opaque */ /** * Constructs a new IceUpdate. * @memberof signalservice.CallMessage * @classdesc Represents an IceUpdate. * @implements IIceUpdate * @constructor * @param {signalservice.CallMessage.IIceUpdate=} [properties] Properties to set */ function IceUpdate(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * IceUpdate id. * @member {Long} id * @memberof signalservice.CallMessage.IceUpdate * @instance */ IceUpdate.prototype.id = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * IceUpdate opaque. * @member {Uint8Array} opaque * @memberof signalservice.CallMessage.IceUpdate * @instance */ IceUpdate.prototype.opaque = $util.newBuffer([]); /** * Encodes the specified IceUpdate message. Does not implicitly {@link signalservice.CallMessage.IceUpdate.verify|verify} messages. * @function encode * @memberof signalservice.CallMessage.IceUpdate * @static * @param {signalservice.CallMessage.IIceUpdate} message IceUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ IceUpdate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.CallMessage.IceUpdate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.CallMessage.IceUpdate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.id != null && Object.hasOwnProperty.call(message, "id")) writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.id); if (message.opaque != null && Object.hasOwnProperty.call(message, "opaque")) writer.uint32(/* id 5, wireType 2 =*/42).bytes(message.opaque); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified IceUpdate message, length delimited. Does not implicitly {@link signalservice.CallMessage.IceUpdate.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.CallMessage.IceUpdate * @static * @param {signalservice.CallMessage.IIceUpdate} message IceUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ IceUpdate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an IceUpdate message from the specified reader or buffer. * @function decode * @memberof signalservice.CallMessage.IceUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.CallMessage.IceUpdate} IceUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ IceUpdate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.CallMessage.IceUpdate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.id = reader.uint64(); break; } case 5: { message.opaque = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an IceUpdate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.CallMessage.IceUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.CallMessage.IceUpdate} IceUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ IceUpdate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return IceUpdate; })(); CallMessage.Busy = (function() { /** * Properties of a Busy. * @memberof signalservice.CallMessage * @interface IBusy * @property {Long|null} [id] Busy id */ /** * Constructs a new Busy. * @memberof signalservice.CallMessage * @classdesc Represents a Busy. * @implements IBusy * @constructor * @param {signalservice.CallMessage.IBusy=} [properties] Properties to set */ function Busy(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Busy id. * @member {Long} id * @memberof signalservice.CallMessage.Busy * @instance */ Busy.prototype.id = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * Encodes the specified Busy message. Does not implicitly {@link signalservice.CallMessage.Busy.verify|verify} messages. * @function encode * @memberof signalservice.CallMessage.Busy * @static * @param {signalservice.CallMessage.IBusy} message Busy message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Busy.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.CallMessage.Busy.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.CallMessage.Busy.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.id != null && Object.hasOwnProperty.call(message, "id")) writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.id); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Busy message, length delimited. Does not implicitly {@link signalservice.CallMessage.Busy.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.CallMessage.Busy * @static * @param {signalservice.CallMessage.IBusy} message Busy message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Busy.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Busy message from the specified reader or buffer. * @function decode * @memberof signalservice.CallMessage.Busy * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.CallMessage.Busy} Busy * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Busy.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.CallMessage.Busy(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.id = reader.uint64(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Busy message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.CallMessage.Busy * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.CallMessage.Busy} Busy * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Busy.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return Busy; })(); CallMessage.Hangup = (function() { /** * Properties of a Hangup. * @memberof signalservice.CallMessage * @interface IHangup * @property {Long|null} [id] Hangup id * @property {signalservice.CallMessage.Hangup.Type|null} [type] Hangup type * @property {number|null} [deviceId] Hangup deviceId */ /** * Constructs a new Hangup. * @memberof signalservice.CallMessage * @classdesc Represents a Hangup. * @implements IHangup * @constructor * @param {signalservice.CallMessage.IHangup=} [properties] Properties to set */ function Hangup(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Hangup id. * @member {Long} id * @memberof signalservice.CallMessage.Hangup * @instance */ Hangup.prototype.id = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * Hangup type. * @member {signalservice.CallMessage.Hangup.Type} type * @memberof signalservice.CallMessage.Hangup * @instance */ Hangup.prototype.type = 0; /** * Hangup deviceId. * @member {number} deviceId * @memberof signalservice.CallMessage.Hangup * @instance */ Hangup.prototype.deviceId = 0; /** * Encodes the specified Hangup message. Does not implicitly {@link signalservice.CallMessage.Hangup.verify|verify} messages. * @function encode * @memberof signalservice.CallMessage.Hangup * @static * @param {signalservice.CallMessage.IHangup} message Hangup message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Hangup.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.CallMessage.Hangup.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.CallMessage.Hangup.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.id != null && Object.hasOwnProperty.call(message, "id")) writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.id); if (message.type != null && Object.hasOwnProperty.call(message, "type")) writer.uint32(/* id 2, wireType 0 =*/16).int32(message.type); if (message.deviceId != null && Object.hasOwnProperty.call(message, "deviceId")) writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.deviceId); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Hangup message, length delimited. Does not implicitly {@link signalservice.CallMessage.Hangup.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.CallMessage.Hangup * @static * @param {signalservice.CallMessage.IHangup} message Hangup message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Hangup.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Hangup message from the specified reader or buffer. * @function decode * @memberof signalservice.CallMessage.Hangup * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.CallMessage.Hangup} Hangup * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Hangup.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.CallMessage.Hangup(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.id = reader.uint64(); break; } case 2: { message.type = reader.int32(); break; } case 3: { message.deviceId = reader.uint32(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Hangup message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.CallMessage.Hangup * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.CallMessage.Hangup} Hangup * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Hangup.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * Type enum. * @name signalservice.CallMessage.Hangup.Type * @enum {number} * @property {number} HANGUP_NORMAL=0 HANGUP_NORMAL value * @property {number} HANGUP_ACCEPTED=1 HANGUP_ACCEPTED value * @property {number} HANGUP_DECLINED=2 HANGUP_DECLINED value * @property {number} HANGUP_BUSY=3 HANGUP_BUSY value * @property {number} HANGUP_NEED_PERMISSION=4 HANGUP_NEED_PERMISSION value */ Hangup.Type = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "HANGUP_NORMAL"] = 0; values[valuesById[1] = "HANGUP_ACCEPTED"] = 1; values[valuesById[2] = "HANGUP_DECLINED"] = 2; values[valuesById[3] = "HANGUP_BUSY"] = 3; values[valuesById[4] = "HANGUP_NEED_PERMISSION"] = 4; return values; })(); return Hangup; })(); CallMessage.Opaque = (function() { /** * Properties of an Opaque. * @memberof signalservice.CallMessage * @interface IOpaque * @property {Uint8Array|null} [data] Opaque data * @property {signalservice.CallMessage.Opaque.Urgency|null} [urgency] Opaque urgency */ /** * Constructs a new Opaque. * @memberof signalservice.CallMessage * @classdesc Represents an Opaque. * @implements IOpaque * @constructor * @param {signalservice.CallMessage.IOpaque=} [properties] Properties to set */ function Opaque(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Opaque data. * @member {Uint8Array} data * @memberof signalservice.CallMessage.Opaque * @instance */ Opaque.prototype.data = $util.newBuffer([]); /** * Opaque urgency. * @member {signalservice.CallMessage.Opaque.Urgency} urgency * @memberof signalservice.CallMessage.Opaque * @instance */ Opaque.prototype.urgency = 0; /** * Encodes the specified Opaque message. Does not implicitly {@link signalservice.CallMessage.Opaque.verify|verify} messages. * @function encode * @memberof signalservice.CallMessage.Opaque * @static * @param {signalservice.CallMessage.IOpaque} message Opaque message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Opaque.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.CallMessage.Opaque.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.CallMessage.Opaque.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.data != null && Object.hasOwnProperty.call(message, "data")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.data); if (message.urgency != null && Object.hasOwnProperty.call(message, "urgency")) writer.uint32(/* id 2, wireType 0 =*/16).int32(message.urgency); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Opaque message, length delimited. Does not implicitly {@link signalservice.CallMessage.Opaque.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.CallMessage.Opaque * @static * @param {signalservice.CallMessage.IOpaque} message Opaque message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Opaque.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an Opaque message from the specified reader or buffer. * @function decode * @memberof signalservice.CallMessage.Opaque * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.CallMessage.Opaque} Opaque * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Opaque.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.CallMessage.Opaque(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.data = reader.bytes(); break; } case 2: { message.urgency = reader.int32(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an Opaque message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.CallMessage.Opaque * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.CallMessage.Opaque} Opaque * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Opaque.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * Urgency enum. * @name signalservice.CallMessage.Opaque.Urgency * @enum {number} * @property {number} DROPPABLE=0 DROPPABLE value * @property {number} HANDLE_IMMEDIATELY=1 HANDLE_IMMEDIATELY value */ Opaque.Urgency = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "DROPPABLE"] = 0; values[valuesById[1] = "HANDLE_IMMEDIATELY"] = 1; return values; })(); return Opaque; })(); return CallMessage; })(); signalservice.DataMessage = (function() { /** * Properties of a DataMessage. * @memberof signalservice * @interface IDataMessage * @property {string|null} [body] DataMessage body * @property {Array.|null} [attachments] DataMessage attachments * @property {signalservice.IGroupContextV2|null} [groupV2] DataMessage groupV2 * @property {number|null} [flags] DataMessage flags * @property {number|null} [expireTimer] DataMessage expireTimer * @property {number|null} [expireTimerVersion] DataMessage expireTimerVersion * @property {Uint8Array|null} [profileKey] DataMessage profileKey * @property {Long|null} [timestamp] DataMessage timestamp * @property {signalservice.DataMessage.IQuote|null} [quote] DataMessage quote * @property {Array.|null} [contact] DataMessage contact * @property {Array.|null} [preview] DataMessage preview * @property {signalservice.DataMessage.ISticker|null} [sticker] DataMessage sticker * @property {number|null} [requiredProtocolVersion] DataMessage requiredProtocolVersion * @property {boolean|null} [isViewOnce] DataMessage isViewOnce * @property {signalservice.DataMessage.IReaction|null} [reaction] DataMessage reaction * @property {signalservice.DataMessage.IDelete|null} ["delete"] DataMessage delete * @property {Array.|null} [bodyRanges] DataMessage bodyRanges * @property {signalservice.DataMessage.IGroupCallUpdate|null} [groupCallUpdate] DataMessage groupCallUpdate * @property {signalservice.DataMessage.IPayment|null} [payment] DataMessage payment * @property {signalservice.DataMessage.IStoryContext|null} [storyContext] DataMessage storyContext * @property {signalservice.DataMessage.IGiftBadge|null} [giftBadge] DataMessage giftBadge * @property {signalservice.DataMessage.IPollCreate|null} [pollCreate] DataMessage pollCreate * @property {signalservice.DataMessage.IPollTerminate|null} [pollTerminate] DataMessage pollTerminate * @property {signalservice.DataMessage.IPollVote|null} [pollVote] DataMessage pollVote * @property {signalservice.DataMessage.IPinMessage|null} [pinMessage] DataMessage pinMessage * @property {signalservice.DataMessage.IUnpinMessage|null} [unpinMessage] DataMessage unpinMessage */ /** * Constructs a new DataMessage. * @memberof signalservice * @classdesc Represents a DataMessage. * @implements IDataMessage * @constructor * @param {signalservice.IDataMessage=} [properties] Properties to set */ function DataMessage(properties) { this.attachments = []; this.contact = []; this.preview = []; this.bodyRanges = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * DataMessage body. * @member {string} body * @memberof signalservice.DataMessage * @instance */ DataMessage.prototype.body = ""; /** * DataMessage attachments. * @member {Array.} attachments * @memberof signalservice.DataMessage * @instance */ DataMessage.prototype.attachments = $util.emptyArray; /** * DataMessage groupV2. * @member {signalservice.IGroupContextV2|null|undefined} groupV2 * @memberof signalservice.DataMessage * @instance */ DataMessage.prototype.groupV2 = null; /** * DataMessage flags. * @member {number} flags * @memberof signalservice.DataMessage * @instance */ DataMessage.prototype.flags = 0; /** * DataMessage expireTimer. * @member {number} expireTimer * @memberof signalservice.DataMessage * @instance */ DataMessage.prototype.expireTimer = 0; /** * DataMessage expireTimerVersion. * @member {number} expireTimerVersion * @memberof signalservice.DataMessage * @instance */ DataMessage.prototype.expireTimerVersion = 0; /** * DataMessage profileKey. * @member {Uint8Array} profileKey * @memberof signalservice.DataMessage * @instance */ DataMessage.prototype.profileKey = $util.newBuffer([]); /** * DataMessage timestamp. * @member {Long} timestamp * @memberof signalservice.DataMessage * @instance */ DataMessage.prototype.timestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * DataMessage quote. * @member {signalservice.DataMessage.IQuote|null|undefined} quote * @memberof signalservice.DataMessage * @instance */ DataMessage.prototype.quote = null; /** * DataMessage contact. * @member {Array.} contact * @memberof signalservice.DataMessage * @instance */ DataMessage.prototype.contact = $util.emptyArray; /** * DataMessage preview. * @member {Array.} preview * @memberof signalservice.DataMessage * @instance */ DataMessage.prototype.preview = $util.emptyArray; /** * DataMessage sticker. * @member {signalservice.DataMessage.ISticker|null|undefined} sticker * @memberof signalservice.DataMessage * @instance */ DataMessage.prototype.sticker = null; /** * DataMessage requiredProtocolVersion. * @member {number} requiredProtocolVersion * @memberof signalservice.DataMessage * @instance */ DataMessage.prototype.requiredProtocolVersion = 0; /** * DataMessage isViewOnce. * @member {boolean} isViewOnce * @memberof signalservice.DataMessage * @instance */ DataMessage.prototype.isViewOnce = false; /** * DataMessage reaction. * @member {signalservice.DataMessage.IReaction|null|undefined} reaction * @memberof signalservice.DataMessage * @instance */ DataMessage.prototype.reaction = null; /** * DataMessage delete. * @member {signalservice.DataMessage.IDelete|null|undefined} delete * @memberof signalservice.DataMessage * @instance */ DataMessage.prototype["delete"] = null; /** * DataMessage bodyRanges. * @member {Array.} bodyRanges * @memberof signalservice.DataMessage * @instance */ DataMessage.prototype.bodyRanges = $util.emptyArray; /** * DataMessage groupCallUpdate. * @member {signalservice.DataMessage.IGroupCallUpdate|null|undefined} groupCallUpdate * @memberof signalservice.DataMessage * @instance */ DataMessage.prototype.groupCallUpdate = null; /** * DataMessage payment. * @member {signalservice.DataMessage.IPayment|null|undefined} payment * @memberof signalservice.DataMessage * @instance */ DataMessage.prototype.payment = null; /** * DataMessage storyContext. * @member {signalservice.DataMessage.IStoryContext|null|undefined} storyContext * @memberof signalservice.DataMessage * @instance */ DataMessage.prototype.storyContext = null; /** * DataMessage giftBadge. * @member {signalservice.DataMessage.IGiftBadge|null|undefined} giftBadge * @memberof signalservice.DataMessage * @instance */ DataMessage.prototype.giftBadge = null; /** * DataMessage pollCreate. * @member {signalservice.DataMessage.IPollCreate|null|undefined} pollCreate * @memberof signalservice.DataMessage * @instance */ DataMessage.prototype.pollCreate = null; /** * DataMessage pollTerminate. * @member {signalservice.DataMessage.IPollTerminate|null|undefined} pollTerminate * @memberof signalservice.DataMessage * @instance */ DataMessage.prototype.pollTerminate = null; /** * DataMessage pollVote. * @member {signalservice.DataMessage.IPollVote|null|undefined} pollVote * @memberof signalservice.DataMessage * @instance */ DataMessage.prototype.pollVote = null; /** * DataMessage pinMessage. * @member {signalservice.DataMessage.IPinMessage|null|undefined} pinMessage * @memberof signalservice.DataMessage * @instance */ DataMessage.prototype.pinMessage = null; /** * DataMessage unpinMessage. * @member {signalservice.DataMessage.IUnpinMessage|null|undefined} unpinMessage * @memberof signalservice.DataMessage * @instance */ DataMessage.prototype.unpinMessage = null; /** * Encodes the specified DataMessage message. Does not implicitly {@link signalservice.DataMessage.verify|verify} messages. * @function encode * @memberof signalservice.DataMessage * @static * @param {signalservice.IDataMessage} message DataMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ DataMessage.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.DataMessage.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.DataMessage.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.body != null && Object.hasOwnProperty.call(message, "body")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.body); if (message.attachments != null && message.attachments.length) for (var i = 0; i < message.attachments.length; ++i) $root.signalservice.AttachmentPointer.encode(message.attachments[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) writer.uint32(/* id 4, wireType 0 =*/32).uint32(message.flags); if (message.expireTimer != null && Object.hasOwnProperty.call(message, "expireTimer")) writer.uint32(/* id 5, wireType 0 =*/40).uint32(message.expireTimer); if (message.profileKey != null && Object.hasOwnProperty.call(message, "profileKey")) writer.uint32(/* id 6, wireType 2 =*/50).bytes(message.profileKey); if (message.timestamp != null && Object.hasOwnProperty.call(message, "timestamp")) writer.uint32(/* id 7, wireType 0 =*/56).uint64(message.timestamp); if (message.quote != null && Object.hasOwnProperty.call(message, "quote")) $root.signalservice.DataMessage.Quote.encode(message.quote, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim(); if (message.contact != null && message.contact.length) for (var i = 0; i < message.contact.length; ++i) $root.signalservice.DataMessage.Contact.encode(message.contact[i], writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim(); if (message.preview != null && message.preview.length) for (var i = 0; i < message.preview.length; ++i) $root.signalservice.Preview.encode(message.preview[i], writer.uint32(/* id 10, wireType 2 =*/82).fork()).ldelim(); if (message.sticker != null && Object.hasOwnProperty.call(message, "sticker")) $root.signalservice.DataMessage.Sticker.encode(message.sticker, writer.uint32(/* id 11, wireType 2 =*/90).fork()).ldelim(); if (message.requiredProtocolVersion != null && Object.hasOwnProperty.call(message, "requiredProtocolVersion")) writer.uint32(/* id 12, wireType 0 =*/96).uint32(message.requiredProtocolVersion); if (message.isViewOnce != null && Object.hasOwnProperty.call(message, "isViewOnce")) writer.uint32(/* id 14, wireType 0 =*/112).bool(message.isViewOnce); if (message.groupV2 != null && Object.hasOwnProperty.call(message, "groupV2")) $root.signalservice.GroupContextV2.encode(message.groupV2, writer.uint32(/* id 15, wireType 2 =*/122).fork()).ldelim(); if (message.reaction != null && Object.hasOwnProperty.call(message, "reaction")) $root.signalservice.DataMessage.Reaction.encode(message.reaction, writer.uint32(/* id 16, wireType 2 =*/130).fork()).ldelim(); if (message["delete"] != null && Object.hasOwnProperty.call(message, "delete")) $root.signalservice.DataMessage.Delete.encode(message["delete"], writer.uint32(/* id 17, wireType 2 =*/138).fork()).ldelim(); if (message.bodyRanges != null && message.bodyRanges.length) for (var i = 0; i < message.bodyRanges.length; ++i) $root.signalservice.BodyRange.encode(message.bodyRanges[i], writer.uint32(/* id 18, wireType 2 =*/146).fork()).ldelim(); if (message.groupCallUpdate != null && Object.hasOwnProperty.call(message, "groupCallUpdate")) $root.signalservice.DataMessage.GroupCallUpdate.encode(message.groupCallUpdate, writer.uint32(/* id 19, wireType 2 =*/154).fork()).ldelim(); if (message.payment != null && Object.hasOwnProperty.call(message, "payment")) $root.signalservice.DataMessage.Payment.encode(message.payment, writer.uint32(/* id 20, wireType 2 =*/162).fork()).ldelim(); if (message.storyContext != null && Object.hasOwnProperty.call(message, "storyContext")) $root.signalservice.DataMessage.StoryContext.encode(message.storyContext, writer.uint32(/* id 21, wireType 2 =*/170).fork()).ldelim(); if (message.giftBadge != null && Object.hasOwnProperty.call(message, "giftBadge")) $root.signalservice.DataMessage.GiftBadge.encode(message.giftBadge, writer.uint32(/* id 22, wireType 2 =*/178).fork()).ldelim(); if (message.expireTimerVersion != null && Object.hasOwnProperty.call(message, "expireTimerVersion")) writer.uint32(/* id 23, wireType 0 =*/184).uint32(message.expireTimerVersion); if (message.pollCreate != null && Object.hasOwnProperty.call(message, "pollCreate")) $root.signalservice.DataMessage.PollCreate.encode(message.pollCreate, writer.uint32(/* id 24, wireType 2 =*/194).fork()).ldelim(); if (message.pollTerminate != null && Object.hasOwnProperty.call(message, "pollTerminate")) $root.signalservice.DataMessage.PollTerminate.encode(message.pollTerminate, writer.uint32(/* id 25, wireType 2 =*/202).fork()).ldelim(); if (message.pollVote != null && Object.hasOwnProperty.call(message, "pollVote")) $root.signalservice.DataMessage.PollVote.encode(message.pollVote, writer.uint32(/* id 26, wireType 2 =*/210).fork()).ldelim(); if (message.pinMessage != null && Object.hasOwnProperty.call(message, "pinMessage")) $root.signalservice.DataMessage.PinMessage.encode(message.pinMessage, writer.uint32(/* id 27, wireType 2 =*/218).fork()).ldelim(); if (message.unpinMessage != null && Object.hasOwnProperty.call(message, "unpinMessage")) $root.signalservice.DataMessage.UnpinMessage.encode(message.unpinMessage, writer.uint32(/* id 28, wireType 2 =*/226).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified DataMessage message, length delimited. Does not implicitly {@link signalservice.DataMessage.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.DataMessage * @static * @param {signalservice.IDataMessage} message DataMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ DataMessage.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a DataMessage message from the specified reader or buffer. * @function decode * @memberof signalservice.DataMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.DataMessage} DataMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ DataMessage.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.DataMessage(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.body = reader.string(); break; } case 2: { if (!(message.attachments && message.attachments.length)) message.attachments = []; message.attachments.push($root.signalservice.AttachmentPointer.decode(reader, reader.uint32())); break; } case 15: { message.groupV2 = $root.signalservice.GroupContextV2.decode(reader, reader.uint32()); break; } case 4: { message.flags = reader.uint32(); break; } case 5: { message.expireTimer = reader.uint32(); break; } case 23: { message.expireTimerVersion = reader.uint32(); break; } case 6: { message.profileKey = reader.bytes(); break; } case 7: { message.timestamp = reader.uint64(); break; } case 8: { message.quote = $root.signalservice.DataMessage.Quote.decode(reader, reader.uint32()); break; } case 9: { if (!(message.contact && message.contact.length)) message.contact = []; message.contact.push($root.signalservice.DataMessage.Contact.decode(reader, reader.uint32())); break; } case 10: { if (!(message.preview && message.preview.length)) message.preview = []; message.preview.push($root.signalservice.Preview.decode(reader, reader.uint32())); break; } case 11: { message.sticker = $root.signalservice.DataMessage.Sticker.decode(reader, reader.uint32()); break; } case 12: { message.requiredProtocolVersion = reader.uint32(); break; } case 14: { message.isViewOnce = reader.bool(); break; } case 16: { message.reaction = $root.signalservice.DataMessage.Reaction.decode(reader, reader.uint32()); break; } case 17: { message["delete"] = $root.signalservice.DataMessage.Delete.decode(reader, reader.uint32()); break; } case 18: { if (!(message.bodyRanges && message.bodyRanges.length)) message.bodyRanges = []; message.bodyRanges.push($root.signalservice.BodyRange.decode(reader, reader.uint32())); break; } case 19: { message.groupCallUpdate = $root.signalservice.DataMessage.GroupCallUpdate.decode(reader, reader.uint32()); break; } case 20: { message.payment = $root.signalservice.DataMessage.Payment.decode(reader, reader.uint32()); break; } case 21: { message.storyContext = $root.signalservice.DataMessage.StoryContext.decode(reader, reader.uint32()); break; } case 22: { message.giftBadge = $root.signalservice.DataMessage.GiftBadge.decode(reader, reader.uint32()); break; } case 24: { message.pollCreate = $root.signalservice.DataMessage.PollCreate.decode(reader, reader.uint32()); break; } case 25: { message.pollTerminate = $root.signalservice.DataMessage.PollTerminate.decode(reader, reader.uint32()); break; } case 26: { message.pollVote = $root.signalservice.DataMessage.PollVote.decode(reader, reader.uint32()); break; } case 27: { message.pinMessage = $root.signalservice.DataMessage.PinMessage.decode(reader, reader.uint32()); break; } case 28: { message.unpinMessage = $root.signalservice.DataMessage.UnpinMessage.decode(reader, reader.uint32()); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a DataMessage message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.DataMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.DataMessage} DataMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ DataMessage.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * Flags enum. * @name signalservice.DataMessage.Flags * @enum {number} * @property {number} END_SESSION=1 END_SESSION value * @property {number} EXPIRATION_TIMER_UPDATE=2 EXPIRATION_TIMER_UPDATE value * @property {number} PROFILE_KEY_UPDATE=4 PROFILE_KEY_UPDATE value * @property {number} FORWARD=8 FORWARD value */ DataMessage.Flags = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[1] = "END_SESSION"] = 1; values[valuesById[2] = "EXPIRATION_TIMER_UPDATE"] = 2; values[valuesById[4] = "PROFILE_KEY_UPDATE"] = 4; values[valuesById[8] = "FORWARD"] = 8; return values; })(); DataMessage.Payment = (function() { /** * Properties of a Payment. * @memberof signalservice.DataMessage * @interface IPayment * @property {signalservice.DataMessage.Payment.INotification|null} [notification] Payment notification * @property {signalservice.DataMessage.Payment.IActivation|null} [activation] Payment activation */ /** * Constructs a new Payment. * @memberof signalservice.DataMessage * @classdesc Represents a Payment. * @implements IPayment * @constructor * @param {signalservice.DataMessage.IPayment=} [properties] Properties to set */ function Payment(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Payment notification. * @member {signalservice.DataMessage.Payment.INotification|null|undefined} notification * @memberof signalservice.DataMessage.Payment * @instance */ Payment.prototype.notification = null; /** * Payment activation. * @member {signalservice.DataMessage.Payment.IActivation|null|undefined} activation * @memberof signalservice.DataMessage.Payment * @instance */ Payment.prototype.activation = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * Payment Item. * @member {"notification"|"activation"|undefined} Item * @memberof signalservice.DataMessage.Payment * @instance */ Object.defineProperty(Payment.prototype, "Item", { get: $util.oneOfGetter($oneOfFields = ["notification", "activation"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified Payment message. Does not implicitly {@link signalservice.DataMessage.Payment.verify|verify} messages. * @function encode * @memberof signalservice.DataMessage.Payment * @static * @param {signalservice.DataMessage.IPayment} message Payment message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Payment.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.DataMessage.Payment.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.DataMessage.Payment.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.notification != null && Object.hasOwnProperty.call(message, "notification")) $root.signalservice.DataMessage.Payment.Notification.encode(message.notification, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.activation != null && Object.hasOwnProperty.call(message, "activation")) $root.signalservice.DataMessage.Payment.Activation.encode(message.activation, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Payment message, length delimited. Does not implicitly {@link signalservice.DataMessage.Payment.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.DataMessage.Payment * @static * @param {signalservice.DataMessage.IPayment} message Payment message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Payment.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Payment message from the specified reader or buffer. * @function decode * @memberof signalservice.DataMessage.Payment * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.DataMessage.Payment} Payment * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Payment.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.DataMessage.Payment(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.notification = $root.signalservice.DataMessage.Payment.Notification.decode(reader, reader.uint32()); break; } case 2: { message.activation = $root.signalservice.DataMessage.Payment.Activation.decode(reader, reader.uint32()); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Payment message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.DataMessage.Payment * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.DataMessage.Payment} Payment * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Payment.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; Payment.Amount = (function() { /** * Properties of an Amount. * @memberof signalservice.DataMessage.Payment * @interface IAmount * @property {signalservice.DataMessage.Payment.Amount.IMobileCoin|null} [mobileCoin] Amount mobileCoin */ /** * Constructs a new Amount. * @memberof signalservice.DataMessage.Payment * @classdesc Represents an Amount. * @implements IAmount * @constructor * @param {signalservice.DataMessage.Payment.IAmount=} [properties] Properties to set */ function Amount(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Amount mobileCoin. * @member {signalservice.DataMessage.Payment.Amount.IMobileCoin|null|undefined} mobileCoin * @memberof signalservice.DataMessage.Payment.Amount * @instance */ Amount.prototype.mobileCoin = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * Amount Amount. * @member {"mobileCoin"|undefined} Amount * @memberof signalservice.DataMessage.Payment.Amount * @instance */ Object.defineProperty(Amount.prototype, "Amount", { get: $util.oneOfGetter($oneOfFields = ["mobileCoin"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified Amount message. Does not implicitly {@link signalservice.DataMessage.Payment.Amount.verify|verify} messages. * @function encode * @memberof signalservice.DataMessage.Payment.Amount * @static * @param {signalservice.DataMessage.Payment.IAmount} message Amount message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Amount.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.DataMessage.Payment.Amount.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.DataMessage.Payment.Amount.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.mobileCoin != null && Object.hasOwnProperty.call(message, "mobileCoin")) $root.signalservice.DataMessage.Payment.Amount.MobileCoin.encode(message.mobileCoin, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Amount message, length delimited. Does not implicitly {@link signalservice.DataMessage.Payment.Amount.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.DataMessage.Payment.Amount * @static * @param {signalservice.DataMessage.Payment.IAmount} message Amount message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Amount.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an Amount message from the specified reader or buffer. * @function decode * @memberof signalservice.DataMessage.Payment.Amount * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.DataMessage.Payment.Amount} Amount * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Amount.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.DataMessage.Payment.Amount(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.mobileCoin = $root.signalservice.DataMessage.Payment.Amount.MobileCoin.decode(reader, reader.uint32()); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an Amount message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.DataMessage.Payment.Amount * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.DataMessage.Payment.Amount} Amount * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Amount.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; Amount.MobileCoin = (function() { /** * Properties of a MobileCoin. * @memberof signalservice.DataMessage.Payment.Amount * @interface IMobileCoin * @property {Long|null} [picoMob] MobileCoin picoMob */ /** * Constructs a new MobileCoin. * @memberof signalservice.DataMessage.Payment.Amount * @classdesc Represents a MobileCoin. * @implements IMobileCoin * @constructor * @param {signalservice.DataMessage.Payment.Amount.IMobileCoin=} [properties] Properties to set */ function MobileCoin(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * MobileCoin picoMob. * @member {Long} picoMob * @memberof signalservice.DataMessage.Payment.Amount.MobileCoin * @instance */ MobileCoin.prototype.picoMob = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * Encodes the specified MobileCoin message. Does not implicitly {@link signalservice.DataMessage.Payment.Amount.MobileCoin.verify|verify} messages. * @function encode * @memberof signalservice.DataMessage.Payment.Amount.MobileCoin * @static * @param {signalservice.DataMessage.Payment.Amount.IMobileCoin} message MobileCoin message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ MobileCoin.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.DataMessage.Payment.Amount.MobileCoin.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.DataMessage.Payment.Amount.MobileCoin.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.picoMob != null && Object.hasOwnProperty.call(message, "picoMob")) writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.picoMob); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified MobileCoin message, length delimited. Does not implicitly {@link signalservice.DataMessage.Payment.Amount.MobileCoin.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.DataMessage.Payment.Amount.MobileCoin * @static * @param {signalservice.DataMessage.Payment.Amount.IMobileCoin} message MobileCoin message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ MobileCoin.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a MobileCoin message from the specified reader or buffer. * @function decode * @memberof signalservice.DataMessage.Payment.Amount.MobileCoin * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.DataMessage.Payment.Amount.MobileCoin} MobileCoin * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ MobileCoin.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.DataMessage.Payment.Amount.MobileCoin(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.picoMob = reader.uint64(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a MobileCoin message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.DataMessage.Payment.Amount.MobileCoin * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.DataMessage.Payment.Amount.MobileCoin} MobileCoin * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ MobileCoin.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return MobileCoin; })(); return Amount; })(); Payment.Notification = (function() { /** * Properties of a Notification. * @memberof signalservice.DataMessage.Payment * @interface INotification * @property {signalservice.DataMessage.Payment.Notification.IMobileCoin|null} [mobileCoin] Notification mobileCoin * @property {string|null} [note] Notification note */ /** * Constructs a new Notification. * @memberof signalservice.DataMessage.Payment * @classdesc Represents a Notification. * @implements INotification * @constructor * @param {signalservice.DataMessage.Payment.INotification=} [properties] Properties to set */ function Notification(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Notification mobileCoin. * @member {signalservice.DataMessage.Payment.Notification.IMobileCoin|null|undefined} mobileCoin * @memberof signalservice.DataMessage.Payment.Notification * @instance */ Notification.prototype.mobileCoin = null; /** * Notification note. * @member {string} note * @memberof signalservice.DataMessage.Payment.Notification * @instance */ Notification.prototype.note = ""; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * Notification Transaction. * @member {"mobileCoin"|undefined} Transaction * @memberof signalservice.DataMessage.Payment.Notification * @instance */ Object.defineProperty(Notification.prototype, "Transaction", { get: $util.oneOfGetter($oneOfFields = ["mobileCoin"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified Notification message. Does not implicitly {@link signalservice.DataMessage.Payment.Notification.verify|verify} messages. * @function encode * @memberof signalservice.DataMessage.Payment.Notification * @static * @param {signalservice.DataMessage.Payment.INotification} message Notification message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Notification.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.DataMessage.Payment.Notification.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.DataMessage.Payment.Notification.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.mobileCoin != null && Object.hasOwnProperty.call(message, "mobileCoin")) $root.signalservice.DataMessage.Payment.Notification.MobileCoin.encode(message.mobileCoin, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.note != null && Object.hasOwnProperty.call(message, "note")) writer.uint32(/* id 2, wireType 2 =*/18).string(message.note); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Notification message, length delimited. Does not implicitly {@link signalservice.DataMessage.Payment.Notification.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.DataMessage.Payment.Notification * @static * @param {signalservice.DataMessage.Payment.INotification} message Notification message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Notification.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Notification message from the specified reader or buffer. * @function decode * @memberof signalservice.DataMessage.Payment.Notification * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.DataMessage.Payment.Notification} Notification * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Notification.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.DataMessage.Payment.Notification(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.mobileCoin = $root.signalservice.DataMessage.Payment.Notification.MobileCoin.decode(reader, reader.uint32()); break; } case 2: { message.note = reader.string(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Notification message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.DataMessage.Payment.Notification * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.DataMessage.Payment.Notification} Notification * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Notification.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; Notification.MobileCoin = (function() { /** * Properties of a MobileCoin. * @memberof signalservice.DataMessage.Payment.Notification * @interface IMobileCoin * @property {Uint8Array|null} [receipt] MobileCoin receipt */ /** * Constructs a new MobileCoin. * @memberof signalservice.DataMessage.Payment.Notification * @classdesc Represents a MobileCoin. * @implements IMobileCoin * @constructor * @param {signalservice.DataMessage.Payment.Notification.IMobileCoin=} [properties] Properties to set */ function MobileCoin(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * MobileCoin receipt. * @member {Uint8Array} receipt * @memberof signalservice.DataMessage.Payment.Notification.MobileCoin * @instance */ MobileCoin.prototype.receipt = $util.newBuffer([]); /** * Encodes the specified MobileCoin message. Does not implicitly {@link signalservice.DataMessage.Payment.Notification.MobileCoin.verify|verify} messages. * @function encode * @memberof signalservice.DataMessage.Payment.Notification.MobileCoin * @static * @param {signalservice.DataMessage.Payment.Notification.IMobileCoin} message MobileCoin message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ MobileCoin.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.DataMessage.Payment.Notification.MobileCoin.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.DataMessage.Payment.Notification.MobileCoin.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.receipt != null && Object.hasOwnProperty.call(message, "receipt")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.receipt); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified MobileCoin message, length delimited. Does not implicitly {@link signalservice.DataMessage.Payment.Notification.MobileCoin.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.DataMessage.Payment.Notification.MobileCoin * @static * @param {signalservice.DataMessage.Payment.Notification.IMobileCoin} message MobileCoin message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ MobileCoin.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a MobileCoin message from the specified reader or buffer. * @function decode * @memberof signalservice.DataMessage.Payment.Notification.MobileCoin * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.DataMessage.Payment.Notification.MobileCoin} MobileCoin * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ MobileCoin.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.DataMessage.Payment.Notification.MobileCoin(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.receipt = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a MobileCoin message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.DataMessage.Payment.Notification.MobileCoin * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.DataMessage.Payment.Notification.MobileCoin} MobileCoin * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ MobileCoin.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return MobileCoin; })(); return Notification; })(); Payment.Activation = (function() { /** * Properties of an Activation. * @memberof signalservice.DataMessage.Payment * @interface IActivation * @property {signalservice.DataMessage.Payment.Activation.Type|null} [type] Activation type */ /** * Constructs a new Activation. * @memberof signalservice.DataMessage.Payment * @classdesc Represents an Activation. * @implements IActivation * @constructor * @param {signalservice.DataMessage.Payment.IActivation=} [properties] Properties to set */ function Activation(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Activation type. * @member {signalservice.DataMessage.Payment.Activation.Type} type * @memberof signalservice.DataMessage.Payment.Activation * @instance */ Activation.prototype.type = 0; /** * Encodes the specified Activation message. Does not implicitly {@link signalservice.DataMessage.Payment.Activation.verify|verify} messages. * @function encode * @memberof signalservice.DataMessage.Payment.Activation * @static * @param {signalservice.DataMessage.Payment.IActivation} message Activation message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Activation.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.DataMessage.Payment.Activation.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.DataMessage.Payment.Activation.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.type != null && Object.hasOwnProperty.call(message, "type")) writer.uint32(/* id 1, wireType 0 =*/8).int32(message.type); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Activation message, length delimited. Does not implicitly {@link signalservice.DataMessage.Payment.Activation.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.DataMessage.Payment.Activation * @static * @param {signalservice.DataMessage.Payment.IActivation} message Activation message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Activation.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an Activation message from the specified reader or buffer. * @function decode * @memberof signalservice.DataMessage.Payment.Activation * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.DataMessage.Payment.Activation} Activation * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Activation.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.DataMessage.Payment.Activation(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.type = reader.int32(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an Activation message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.DataMessage.Payment.Activation * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.DataMessage.Payment.Activation} Activation * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Activation.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * Type enum. * @name signalservice.DataMessage.Payment.Activation.Type * @enum {number} * @property {number} REQUEST=0 REQUEST value * @property {number} ACTIVATED=1 ACTIVATED value */ Activation.Type = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "REQUEST"] = 0; values[valuesById[1] = "ACTIVATED"] = 1; return values; })(); return Activation; })(); return Payment; })(); DataMessage.Quote = (function() { /** * Properties of a Quote. * @memberof signalservice.DataMessage * @interface IQuote * @property {Long|null} [id] Quote id * @property {string|null} [authorAci] Quote authorAci * @property {string|null} [text] Quote text * @property {Array.|null} [attachments] Quote attachments * @property {Array.|null} [bodyRanges] Quote bodyRanges * @property {signalservice.DataMessage.Quote.Type|null} [type] Quote type * @property {Uint8Array|null} [authorAciBinary] Quote authorAciBinary */ /** * Constructs a new Quote. * @memberof signalservice.DataMessage * @classdesc Represents a Quote. * @implements IQuote * @constructor * @param {signalservice.DataMessage.IQuote=} [properties] Properties to set */ function Quote(properties) { this.attachments = []; this.bodyRanges = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Quote id. * @member {Long} id * @memberof signalservice.DataMessage.Quote * @instance */ Quote.prototype.id = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * Quote authorAci. * @member {string} authorAci * @memberof signalservice.DataMessage.Quote * @instance */ Quote.prototype.authorAci = ""; /** * Quote text. * @member {string} text * @memberof signalservice.DataMessage.Quote * @instance */ Quote.prototype.text = ""; /** * Quote attachments. * @member {Array.} attachments * @memberof signalservice.DataMessage.Quote * @instance */ Quote.prototype.attachments = $util.emptyArray; /** * Quote bodyRanges. * @member {Array.} bodyRanges * @memberof signalservice.DataMessage.Quote * @instance */ Quote.prototype.bodyRanges = $util.emptyArray; /** * Quote type. * @member {signalservice.DataMessage.Quote.Type} type * @memberof signalservice.DataMessage.Quote * @instance */ Quote.prototype.type = 0; /** * Quote authorAciBinary. * @member {Uint8Array} authorAciBinary * @memberof signalservice.DataMessage.Quote * @instance */ Quote.prototype.authorAciBinary = $util.newBuffer([]); /** * Encodes the specified Quote message. Does not implicitly {@link signalservice.DataMessage.Quote.verify|verify} messages. * @function encode * @memberof signalservice.DataMessage.Quote * @static * @param {signalservice.DataMessage.IQuote} message Quote message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Quote.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.DataMessage.Quote.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.DataMessage.Quote.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.id != null && Object.hasOwnProperty.call(message, "id")) writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.id); if (message.text != null && Object.hasOwnProperty.call(message, "text")) writer.uint32(/* id 3, wireType 2 =*/26).string(message.text); if (message.attachments != null && message.attachments.length) for (var i = 0; i < message.attachments.length; ++i) $root.signalservice.DataMessage.Quote.QuotedAttachment.encode(message.attachments[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); if (message.authorAci != null && Object.hasOwnProperty.call(message, "authorAci")) writer.uint32(/* id 5, wireType 2 =*/42).string(message.authorAci); if (message.bodyRanges != null && message.bodyRanges.length) for (var i = 0; i < message.bodyRanges.length; ++i) $root.signalservice.BodyRange.encode(message.bodyRanges[i], writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim(); if (message.type != null && Object.hasOwnProperty.call(message, "type")) writer.uint32(/* id 7, wireType 0 =*/56).int32(message.type); if (message.authorAciBinary != null && Object.hasOwnProperty.call(message, "authorAciBinary")) writer.uint32(/* id 8, wireType 2 =*/66).bytes(message.authorAciBinary); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Quote message, length delimited. Does not implicitly {@link signalservice.DataMessage.Quote.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.DataMessage.Quote * @static * @param {signalservice.DataMessage.IQuote} message Quote message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Quote.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Quote message from the specified reader or buffer. * @function decode * @memberof signalservice.DataMessage.Quote * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.DataMessage.Quote} Quote * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Quote.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.DataMessage.Quote(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.id = reader.uint64(); break; } case 5: { message.authorAci = reader.string(); break; } case 3: { message.text = reader.string(); break; } case 4: { if (!(message.attachments && message.attachments.length)) message.attachments = []; message.attachments.push($root.signalservice.DataMessage.Quote.QuotedAttachment.decode(reader, reader.uint32())); break; } case 6: { if (!(message.bodyRanges && message.bodyRanges.length)) message.bodyRanges = []; message.bodyRanges.push($root.signalservice.BodyRange.decode(reader, reader.uint32())); break; } case 7: { message.type = reader.int32(); break; } case 8: { message.authorAciBinary = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Quote message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.DataMessage.Quote * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.DataMessage.Quote} Quote * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Quote.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * Type enum. * @name signalservice.DataMessage.Quote.Type * @enum {number} * @property {number} NORMAL=0 NORMAL value * @property {number} GIFT_BADGE=1 GIFT_BADGE value */ Quote.Type = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "NORMAL"] = 0; values[valuesById[1] = "GIFT_BADGE"] = 1; return values; })(); Quote.QuotedAttachment = (function() { /** * Properties of a QuotedAttachment. * @memberof signalservice.DataMessage.Quote * @interface IQuotedAttachment * @property {string|null} [contentType] QuotedAttachment contentType * @property {string|null} [fileName] QuotedAttachment fileName * @property {signalservice.IAttachmentPointer|null} [thumbnail] QuotedAttachment thumbnail */ /** * Constructs a new QuotedAttachment. * @memberof signalservice.DataMessage.Quote * @classdesc Represents a QuotedAttachment. * @implements IQuotedAttachment * @constructor * @param {signalservice.DataMessage.Quote.IQuotedAttachment=} [properties] Properties to set */ function QuotedAttachment(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * QuotedAttachment contentType. * @member {string} contentType * @memberof signalservice.DataMessage.Quote.QuotedAttachment * @instance */ QuotedAttachment.prototype.contentType = ""; /** * QuotedAttachment fileName. * @member {string} fileName * @memberof signalservice.DataMessage.Quote.QuotedAttachment * @instance */ QuotedAttachment.prototype.fileName = ""; /** * QuotedAttachment thumbnail. * @member {signalservice.IAttachmentPointer|null|undefined} thumbnail * @memberof signalservice.DataMessage.Quote.QuotedAttachment * @instance */ QuotedAttachment.prototype.thumbnail = null; /** * Encodes the specified QuotedAttachment message. Does not implicitly {@link signalservice.DataMessage.Quote.QuotedAttachment.verify|verify} messages. * @function encode * @memberof signalservice.DataMessage.Quote.QuotedAttachment * @static * @param {signalservice.DataMessage.Quote.IQuotedAttachment} message QuotedAttachment message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ QuotedAttachment.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.DataMessage.Quote.QuotedAttachment.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.DataMessage.Quote.QuotedAttachment.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.contentType != null && Object.hasOwnProperty.call(message, "contentType")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.contentType); if (message.fileName != null && Object.hasOwnProperty.call(message, "fileName")) writer.uint32(/* id 2, wireType 2 =*/18).string(message.fileName); if (message.thumbnail != null && Object.hasOwnProperty.call(message, "thumbnail")) $root.signalservice.AttachmentPointer.encode(message.thumbnail, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified QuotedAttachment message, length delimited. Does not implicitly {@link signalservice.DataMessage.Quote.QuotedAttachment.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.DataMessage.Quote.QuotedAttachment * @static * @param {signalservice.DataMessage.Quote.IQuotedAttachment} message QuotedAttachment message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ QuotedAttachment.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a QuotedAttachment message from the specified reader or buffer. * @function decode * @memberof signalservice.DataMessage.Quote.QuotedAttachment * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.DataMessage.Quote.QuotedAttachment} QuotedAttachment * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ QuotedAttachment.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.DataMessage.Quote.QuotedAttachment(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.contentType = reader.string(); break; } case 2: { message.fileName = reader.string(); break; } case 3: { message.thumbnail = $root.signalservice.AttachmentPointer.decode(reader, reader.uint32()); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a QuotedAttachment message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.DataMessage.Quote.QuotedAttachment * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.DataMessage.Quote.QuotedAttachment} QuotedAttachment * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ QuotedAttachment.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return QuotedAttachment; })(); return Quote; })(); DataMessage.Contact = (function() { /** * Properties of a Contact. * @memberof signalservice.DataMessage * @interface IContact * @property {signalservice.DataMessage.Contact.IName|null} [name] Contact name * @property {Array.|null} [number] Contact number * @property {Array.|null} [email] Contact email * @property {Array.|null} [address] Contact address * @property {signalservice.DataMessage.Contact.IAvatar|null} [avatar] Contact avatar * @property {string|null} [organization] Contact organization */ /** * Constructs a new Contact. * @memberof signalservice.DataMessage * @classdesc Represents a Contact. * @implements IContact * @constructor * @param {signalservice.DataMessage.IContact=} [properties] Properties to set */ function Contact(properties) { this.number = []; this.email = []; this.address = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Contact name. * @member {signalservice.DataMessage.Contact.IName|null|undefined} name * @memberof signalservice.DataMessage.Contact * @instance */ Contact.prototype.name = null; /** * Contact number. * @member {Array.} number * @memberof signalservice.DataMessage.Contact * @instance */ Contact.prototype.number = $util.emptyArray; /** * Contact email. * @member {Array.} email * @memberof signalservice.DataMessage.Contact * @instance */ Contact.prototype.email = $util.emptyArray; /** * Contact address. * @member {Array.} address * @memberof signalservice.DataMessage.Contact * @instance */ Contact.prototype.address = $util.emptyArray; /** * Contact avatar. * @member {signalservice.DataMessage.Contact.IAvatar|null|undefined} avatar * @memberof signalservice.DataMessage.Contact * @instance */ Contact.prototype.avatar = null; /** * Contact organization. * @member {string} organization * @memberof signalservice.DataMessage.Contact * @instance */ Contact.prototype.organization = ""; /** * Encodes the specified Contact message. Does not implicitly {@link signalservice.DataMessage.Contact.verify|verify} messages. * @function encode * @memberof signalservice.DataMessage.Contact * @static * @param {signalservice.DataMessage.IContact} message Contact message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Contact.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.DataMessage.Contact.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.DataMessage.Contact.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.name != null && Object.hasOwnProperty.call(message, "name")) $root.signalservice.DataMessage.Contact.Name.encode(message.name, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.number != null && message.number.length) for (var i = 0; i < message.number.length; ++i) $root.signalservice.DataMessage.Contact.Phone.encode(message.number[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); if (message.email != null && message.email.length) for (var i = 0; i < message.email.length; ++i) $root.signalservice.DataMessage.Contact.Email.encode(message.email[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); if (message.address != null && message.address.length) for (var i = 0; i < message.address.length; ++i) $root.signalservice.DataMessage.Contact.PostalAddress.encode(message.address[i], writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); if (message.avatar != null && Object.hasOwnProperty.call(message, "avatar")) $root.signalservice.DataMessage.Contact.Avatar.encode(message.avatar, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim(); if (message.organization != null && Object.hasOwnProperty.call(message, "organization")) writer.uint32(/* id 7, wireType 2 =*/58).string(message.organization); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Contact message, length delimited. Does not implicitly {@link signalservice.DataMessage.Contact.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.DataMessage.Contact * @static * @param {signalservice.DataMessage.IContact} message Contact message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Contact.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Contact message from the specified reader or buffer. * @function decode * @memberof signalservice.DataMessage.Contact * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.DataMessage.Contact} Contact * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Contact.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.DataMessage.Contact(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.name = $root.signalservice.DataMessage.Contact.Name.decode(reader, reader.uint32()); break; } case 3: { if (!(message.number && message.number.length)) message.number = []; message.number.push($root.signalservice.DataMessage.Contact.Phone.decode(reader, reader.uint32())); break; } case 4: { if (!(message.email && message.email.length)) message.email = []; message.email.push($root.signalservice.DataMessage.Contact.Email.decode(reader, reader.uint32())); break; } case 5: { if (!(message.address && message.address.length)) message.address = []; message.address.push($root.signalservice.DataMessage.Contact.PostalAddress.decode(reader, reader.uint32())); break; } case 6: { message.avatar = $root.signalservice.DataMessage.Contact.Avatar.decode(reader, reader.uint32()); break; } case 7: { message.organization = reader.string(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Contact message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.DataMessage.Contact * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.DataMessage.Contact} Contact * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Contact.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; Contact.Name = (function() { /** * Properties of a Name. * @memberof signalservice.DataMessage.Contact * @interface IName * @property {string|null} [givenName] Name givenName * @property {string|null} [familyName] Name familyName * @property {string|null} [prefix] Name prefix * @property {string|null} [suffix] Name suffix * @property {string|null} [middleName] Name middleName * @property {string|null} [nickname] Name nickname */ /** * Constructs a new Name. * @memberof signalservice.DataMessage.Contact * @classdesc Represents a Name. * @implements IName * @constructor * @param {signalservice.DataMessage.Contact.IName=} [properties] Properties to set */ function Name(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Name givenName. * @member {string} givenName * @memberof signalservice.DataMessage.Contact.Name * @instance */ Name.prototype.givenName = ""; /** * Name familyName. * @member {string} familyName * @memberof signalservice.DataMessage.Contact.Name * @instance */ Name.prototype.familyName = ""; /** * Name prefix. * @member {string} prefix * @memberof signalservice.DataMessage.Contact.Name * @instance */ Name.prototype.prefix = ""; /** * Name suffix. * @member {string} suffix * @memberof signalservice.DataMessage.Contact.Name * @instance */ Name.prototype.suffix = ""; /** * Name middleName. * @member {string} middleName * @memberof signalservice.DataMessage.Contact.Name * @instance */ Name.prototype.middleName = ""; /** * Name nickname. * @member {string} nickname * @memberof signalservice.DataMessage.Contact.Name * @instance */ Name.prototype.nickname = ""; /** * Encodes the specified Name message. Does not implicitly {@link signalservice.DataMessage.Contact.Name.verify|verify} messages. * @function encode * @memberof signalservice.DataMessage.Contact.Name * @static * @param {signalservice.DataMessage.Contact.IName} message Name message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Name.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.DataMessage.Contact.Name.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.DataMessage.Contact.Name.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.givenName != null && Object.hasOwnProperty.call(message, "givenName")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.givenName); if (message.familyName != null && Object.hasOwnProperty.call(message, "familyName")) writer.uint32(/* id 2, wireType 2 =*/18).string(message.familyName); if (message.prefix != null && Object.hasOwnProperty.call(message, "prefix")) writer.uint32(/* id 3, wireType 2 =*/26).string(message.prefix); if (message.suffix != null && Object.hasOwnProperty.call(message, "suffix")) writer.uint32(/* id 4, wireType 2 =*/34).string(message.suffix); if (message.middleName != null && Object.hasOwnProperty.call(message, "middleName")) writer.uint32(/* id 5, wireType 2 =*/42).string(message.middleName); if (message.nickname != null && Object.hasOwnProperty.call(message, "nickname")) writer.uint32(/* id 7, wireType 2 =*/58).string(message.nickname); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Name message, length delimited. Does not implicitly {@link signalservice.DataMessage.Contact.Name.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.DataMessage.Contact.Name * @static * @param {signalservice.DataMessage.Contact.IName} message Name message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Name.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Name message from the specified reader or buffer. * @function decode * @memberof signalservice.DataMessage.Contact.Name * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.DataMessage.Contact.Name} Name * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Name.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.DataMessage.Contact.Name(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.givenName = reader.string(); break; } case 2: { message.familyName = reader.string(); break; } case 3: { message.prefix = reader.string(); break; } case 4: { message.suffix = reader.string(); break; } case 5: { message.middleName = reader.string(); break; } case 7: { message.nickname = reader.string(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Name message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.DataMessage.Contact.Name * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.DataMessage.Contact.Name} Name * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Name.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return Name; })(); Contact.Phone = (function() { /** * Properties of a Phone. * @memberof signalservice.DataMessage.Contact * @interface IPhone * @property {string|null} [value] Phone value * @property {signalservice.DataMessage.Contact.Phone.Type|null} [type] Phone type * @property {string|null} [label] Phone label */ /** * Constructs a new Phone. * @memberof signalservice.DataMessage.Contact * @classdesc Represents a Phone. * @implements IPhone * @constructor * @param {signalservice.DataMessage.Contact.IPhone=} [properties] Properties to set */ function Phone(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Phone value. * @member {string} value * @memberof signalservice.DataMessage.Contact.Phone * @instance */ Phone.prototype.value = ""; /** * Phone type. * @member {signalservice.DataMessage.Contact.Phone.Type} type * @memberof signalservice.DataMessage.Contact.Phone * @instance */ Phone.prototype.type = 1; /** * Phone label. * @member {string} label * @memberof signalservice.DataMessage.Contact.Phone * @instance */ Phone.prototype.label = ""; /** * Encodes the specified Phone message. Does not implicitly {@link signalservice.DataMessage.Contact.Phone.verify|verify} messages. * @function encode * @memberof signalservice.DataMessage.Contact.Phone * @static * @param {signalservice.DataMessage.Contact.IPhone} message Phone message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Phone.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.DataMessage.Contact.Phone.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.DataMessage.Contact.Phone.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.value != null && Object.hasOwnProperty.call(message, "value")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.value); if (message.type != null && Object.hasOwnProperty.call(message, "type")) writer.uint32(/* id 2, wireType 0 =*/16).int32(message.type); if (message.label != null && Object.hasOwnProperty.call(message, "label")) writer.uint32(/* id 3, wireType 2 =*/26).string(message.label); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Phone message, length delimited. Does not implicitly {@link signalservice.DataMessage.Contact.Phone.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.DataMessage.Contact.Phone * @static * @param {signalservice.DataMessage.Contact.IPhone} message Phone message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Phone.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Phone message from the specified reader or buffer. * @function decode * @memberof signalservice.DataMessage.Contact.Phone * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.DataMessage.Contact.Phone} Phone * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Phone.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.DataMessage.Contact.Phone(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.value = reader.string(); break; } case 2: { message.type = reader.int32(); break; } case 3: { message.label = reader.string(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Phone message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.DataMessage.Contact.Phone * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.DataMessage.Contact.Phone} Phone * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Phone.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * Type enum. * @name signalservice.DataMessage.Contact.Phone.Type * @enum {number} * @property {number} HOME=1 HOME value * @property {number} MOBILE=2 MOBILE value * @property {number} WORK=3 WORK value * @property {number} CUSTOM=4 CUSTOM value */ Phone.Type = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[1] = "HOME"] = 1; values[valuesById[2] = "MOBILE"] = 2; values[valuesById[3] = "WORK"] = 3; values[valuesById[4] = "CUSTOM"] = 4; return values; })(); return Phone; })(); Contact.Email = (function() { /** * Properties of an Email. * @memberof signalservice.DataMessage.Contact * @interface IEmail * @property {string|null} [value] Email value * @property {signalservice.DataMessage.Contact.Email.Type|null} [type] Email type * @property {string|null} [label] Email label */ /** * Constructs a new Email. * @memberof signalservice.DataMessage.Contact * @classdesc Represents an Email. * @implements IEmail * @constructor * @param {signalservice.DataMessage.Contact.IEmail=} [properties] Properties to set */ function Email(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Email value. * @member {string} value * @memberof signalservice.DataMessage.Contact.Email * @instance */ Email.prototype.value = ""; /** * Email type. * @member {signalservice.DataMessage.Contact.Email.Type} type * @memberof signalservice.DataMessage.Contact.Email * @instance */ Email.prototype.type = 1; /** * Email label. * @member {string} label * @memberof signalservice.DataMessage.Contact.Email * @instance */ Email.prototype.label = ""; /** * Encodes the specified Email message. Does not implicitly {@link signalservice.DataMessage.Contact.Email.verify|verify} messages. * @function encode * @memberof signalservice.DataMessage.Contact.Email * @static * @param {signalservice.DataMessage.Contact.IEmail} message Email message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Email.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.DataMessage.Contact.Email.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.DataMessage.Contact.Email.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.value != null && Object.hasOwnProperty.call(message, "value")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.value); if (message.type != null && Object.hasOwnProperty.call(message, "type")) writer.uint32(/* id 2, wireType 0 =*/16).int32(message.type); if (message.label != null && Object.hasOwnProperty.call(message, "label")) writer.uint32(/* id 3, wireType 2 =*/26).string(message.label); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Email message, length delimited. Does not implicitly {@link signalservice.DataMessage.Contact.Email.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.DataMessage.Contact.Email * @static * @param {signalservice.DataMessage.Contact.IEmail} message Email message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Email.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an Email message from the specified reader or buffer. * @function decode * @memberof signalservice.DataMessage.Contact.Email * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.DataMessage.Contact.Email} Email * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Email.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.DataMessage.Contact.Email(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.value = reader.string(); break; } case 2: { message.type = reader.int32(); break; } case 3: { message.label = reader.string(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an Email message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.DataMessage.Contact.Email * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.DataMessage.Contact.Email} Email * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Email.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * Type enum. * @name signalservice.DataMessage.Contact.Email.Type * @enum {number} * @property {number} HOME=1 HOME value * @property {number} MOBILE=2 MOBILE value * @property {number} WORK=3 WORK value * @property {number} CUSTOM=4 CUSTOM value */ Email.Type = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[1] = "HOME"] = 1; values[valuesById[2] = "MOBILE"] = 2; values[valuesById[3] = "WORK"] = 3; values[valuesById[4] = "CUSTOM"] = 4; return values; })(); return Email; })(); Contact.PostalAddress = (function() { /** * Properties of a PostalAddress. * @memberof signalservice.DataMessage.Contact * @interface IPostalAddress * @property {signalservice.DataMessage.Contact.PostalAddress.Type|null} [type] PostalAddress type * @property {string|null} [label] PostalAddress label * @property {string|null} [street] PostalAddress street * @property {string|null} [pobox] PostalAddress pobox * @property {string|null} [neighborhood] PostalAddress neighborhood * @property {string|null} [city] PostalAddress city * @property {string|null} [region] PostalAddress region * @property {string|null} [postcode] PostalAddress postcode * @property {string|null} [country] PostalAddress country */ /** * Constructs a new PostalAddress. * @memberof signalservice.DataMessage.Contact * @classdesc Represents a PostalAddress. * @implements IPostalAddress * @constructor * @param {signalservice.DataMessage.Contact.IPostalAddress=} [properties] Properties to set */ function PostalAddress(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * PostalAddress type. * @member {signalservice.DataMessage.Contact.PostalAddress.Type} type * @memberof signalservice.DataMessage.Contact.PostalAddress * @instance */ PostalAddress.prototype.type = 1; /** * PostalAddress label. * @member {string} label * @memberof signalservice.DataMessage.Contact.PostalAddress * @instance */ PostalAddress.prototype.label = ""; /** * PostalAddress street. * @member {string} street * @memberof signalservice.DataMessage.Contact.PostalAddress * @instance */ PostalAddress.prototype.street = ""; /** * PostalAddress pobox. * @member {string} pobox * @memberof signalservice.DataMessage.Contact.PostalAddress * @instance */ PostalAddress.prototype.pobox = ""; /** * PostalAddress neighborhood. * @member {string} neighborhood * @memberof signalservice.DataMessage.Contact.PostalAddress * @instance */ PostalAddress.prototype.neighborhood = ""; /** * PostalAddress city. * @member {string} city * @memberof signalservice.DataMessage.Contact.PostalAddress * @instance */ PostalAddress.prototype.city = ""; /** * PostalAddress region. * @member {string} region * @memberof signalservice.DataMessage.Contact.PostalAddress * @instance */ PostalAddress.prototype.region = ""; /** * PostalAddress postcode. * @member {string} postcode * @memberof signalservice.DataMessage.Contact.PostalAddress * @instance */ PostalAddress.prototype.postcode = ""; /** * PostalAddress country. * @member {string} country * @memberof signalservice.DataMessage.Contact.PostalAddress * @instance */ PostalAddress.prototype.country = ""; /** * Encodes the specified PostalAddress message. Does not implicitly {@link signalservice.DataMessage.Contact.PostalAddress.verify|verify} messages. * @function encode * @memberof signalservice.DataMessage.Contact.PostalAddress * @static * @param {signalservice.DataMessage.Contact.IPostalAddress} message PostalAddress message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ PostalAddress.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.DataMessage.Contact.PostalAddress.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.DataMessage.Contact.PostalAddress.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.type != null && Object.hasOwnProperty.call(message, "type")) writer.uint32(/* id 1, wireType 0 =*/8).int32(message.type); if (message.label != null && Object.hasOwnProperty.call(message, "label")) writer.uint32(/* id 2, wireType 2 =*/18).string(message.label); if (message.street != null && Object.hasOwnProperty.call(message, "street")) writer.uint32(/* id 3, wireType 2 =*/26).string(message.street); if (message.pobox != null && Object.hasOwnProperty.call(message, "pobox")) writer.uint32(/* id 4, wireType 2 =*/34).string(message.pobox); if (message.neighborhood != null && Object.hasOwnProperty.call(message, "neighborhood")) writer.uint32(/* id 5, wireType 2 =*/42).string(message.neighborhood); if (message.city != null && Object.hasOwnProperty.call(message, "city")) writer.uint32(/* id 6, wireType 2 =*/50).string(message.city); if (message.region != null && Object.hasOwnProperty.call(message, "region")) writer.uint32(/* id 7, wireType 2 =*/58).string(message.region); if (message.postcode != null && Object.hasOwnProperty.call(message, "postcode")) writer.uint32(/* id 8, wireType 2 =*/66).string(message.postcode); if (message.country != null && Object.hasOwnProperty.call(message, "country")) writer.uint32(/* id 9, wireType 2 =*/74).string(message.country); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified PostalAddress message, length delimited. Does not implicitly {@link signalservice.DataMessage.Contact.PostalAddress.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.DataMessage.Contact.PostalAddress * @static * @param {signalservice.DataMessage.Contact.IPostalAddress} message PostalAddress message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ PostalAddress.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a PostalAddress message from the specified reader or buffer. * @function decode * @memberof signalservice.DataMessage.Contact.PostalAddress * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.DataMessage.Contact.PostalAddress} PostalAddress * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ PostalAddress.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.DataMessage.Contact.PostalAddress(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.type = reader.int32(); break; } case 2: { message.label = reader.string(); break; } case 3: { message.street = reader.string(); break; } case 4: { message.pobox = reader.string(); break; } case 5: { message.neighborhood = reader.string(); break; } case 6: { message.city = reader.string(); break; } case 7: { message.region = reader.string(); break; } case 8: { message.postcode = reader.string(); break; } case 9: { message.country = reader.string(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a PostalAddress message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.DataMessage.Contact.PostalAddress * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.DataMessage.Contact.PostalAddress} PostalAddress * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ PostalAddress.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * Type enum. * @name signalservice.DataMessage.Contact.PostalAddress.Type * @enum {number} * @property {number} HOME=1 HOME value * @property {number} WORK=2 WORK value * @property {number} CUSTOM=3 CUSTOM value */ PostalAddress.Type = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[1] = "HOME"] = 1; values[valuesById[2] = "WORK"] = 2; values[valuesById[3] = "CUSTOM"] = 3; return values; })(); return PostalAddress; })(); Contact.Avatar = (function() { /** * Properties of an Avatar. * @memberof signalservice.DataMessage.Contact * @interface IAvatar * @property {signalservice.IAttachmentPointer|null} [avatar] Avatar avatar * @property {boolean|null} [isProfile] Avatar isProfile */ /** * Constructs a new Avatar. * @memberof signalservice.DataMessage.Contact * @classdesc Represents an Avatar. * @implements IAvatar * @constructor * @param {signalservice.DataMessage.Contact.IAvatar=} [properties] Properties to set */ function Avatar(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Avatar avatar. * @member {signalservice.IAttachmentPointer|null|undefined} avatar * @memberof signalservice.DataMessage.Contact.Avatar * @instance */ Avatar.prototype.avatar = null; /** * Avatar isProfile. * @member {boolean} isProfile * @memberof signalservice.DataMessage.Contact.Avatar * @instance */ Avatar.prototype.isProfile = false; /** * Encodes the specified Avatar message. Does not implicitly {@link signalservice.DataMessage.Contact.Avatar.verify|verify} messages. * @function encode * @memberof signalservice.DataMessage.Contact.Avatar * @static * @param {signalservice.DataMessage.Contact.IAvatar} message Avatar message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Avatar.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.DataMessage.Contact.Avatar.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.DataMessage.Contact.Avatar.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.avatar != null && Object.hasOwnProperty.call(message, "avatar")) $root.signalservice.AttachmentPointer.encode(message.avatar, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.isProfile != null && Object.hasOwnProperty.call(message, "isProfile")) writer.uint32(/* id 2, wireType 0 =*/16).bool(message.isProfile); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Avatar message, length delimited. Does not implicitly {@link signalservice.DataMessage.Contact.Avatar.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.DataMessage.Contact.Avatar * @static * @param {signalservice.DataMessage.Contact.IAvatar} message Avatar message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Avatar.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an Avatar message from the specified reader or buffer. * @function decode * @memberof signalservice.DataMessage.Contact.Avatar * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.DataMessage.Contact.Avatar} Avatar * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Avatar.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.DataMessage.Contact.Avatar(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.avatar = $root.signalservice.AttachmentPointer.decode(reader, reader.uint32()); break; } case 2: { message.isProfile = reader.bool(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an Avatar message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.DataMessage.Contact.Avatar * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.DataMessage.Contact.Avatar} Avatar * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Avatar.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return Avatar; })(); return Contact; })(); DataMessage.Sticker = (function() { /** * Properties of a Sticker. * @memberof signalservice.DataMessage * @interface ISticker * @property {Uint8Array|null} [packId] Sticker packId * @property {Uint8Array|null} [packKey] Sticker packKey * @property {number|null} [stickerId] Sticker stickerId * @property {signalservice.IAttachmentPointer|null} [data] Sticker data * @property {string|null} [emoji] Sticker emoji */ /** * Constructs a new Sticker. * @memberof signalservice.DataMessage * @classdesc Represents a Sticker. * @implements ISticker * @constructor * @param {signalservice.DataMessage.ISticker=} [properties] Properties to set */ function Sticker(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Sticker packId. * @member {Uint8Array} packId * @memberof signalservice.DataMessage.Sticker * @instance */ Sticker.prototype.packId = $util.newBuffer([]); /** * Sticker packKey. * @member {Uint8Array} packKey * @memberof signalservice.DataMessage.Sticker * @instance */ Sticker.prototype.packKey = $util.newBuffer([]); /** * Sticker stickerId. * @member {number} stickerId * @memberof signalservice.DataMessage.Sticker * @instance */ Sticker.prototype.stickerId = 0; /** * Sticker data. * @member {signalservice.IAttachmentPointer|null|undefined} data * @memberof signalservice.DataMessage.Sticker * @instance */ Sticker.prototype.data = null; /** * Sticker emoji. * @member {string} emoji * @memberof signalservice.DataMessage.Sticker * @instance */ Sticker.prototype.emoji = ""; /** * Encodes the specified Sticker message. Does not implicitly {@link signalservice.DataMessage.Sticker.verify|verify} messages. * @function encode * @memberof signalservice.DataMessage.Sticker * @static * @param {signalservice.DataMessage.ISticker} message Sticker message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Sticker.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.DataMessage.Sticker.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.DataMessage.Sticker.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.packId != null && Object.hasOwnProperty.call(message, "packId")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.packId); if (message.packKey != null && Object.hasOwnProperty.call(message, "packKey")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.packKey); if (message.stickerId != null && Object.hasOwnProperty.call(message, "stickerId")) writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.stickerId); if (message.data != null && Object.hasOwnProperty.call(message, "data")) $root.signalservice.AttachmentPointer.encode(message.data, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); if (message.emoji != null && Object.hasOwnProperty.call(message, "emoji")) writer.uint32(/* id 5, wireType 2 =*/42).string(message.emoji); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Sticker message, length delimited. Does not implicitly {@link signalservice.DataMessage.Sticker.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.DataMessage.Sticker * @static * @param {signalservice.DataMessage.ISticker} message Sticker message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Sticker.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Sticker message from the specified reader or buffer. * @function decode * @memberof signalservice.DataMessage.Sticker * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.DataMessage.Sticker} Sticker * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Sticker.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.DataMessage.Sticker(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.packId = reader.bytes(); break; } case 2: { message.packKey = reader.bytes(); break; } case 3: { message.stickerId = reader.uint32(); break; } case 4: { message.data = $root.signalservice.AttachmentPointer.decode(reader, reader.uint32()); break; } case 5: { message.emoji = reader.string(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Sticker message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.DataMessage.Sticker * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.DataMessage.Sticker} Sticker * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Sticker.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return Sticker; })(); DataMessage.Reaction = (function() { /** * Properties of a Reaction. * @memberof signalservice.DataMessage * @interface IReaction * @property {string|null} [emoji] Reaction emoji * @property {boolean|null} [remove] Reaction remove * @property {string|null} [targetAuthorAci] Reaction targetAuthorAci * @property {Long|null} [targetSentTimestamp] Reaction targetSentTimestamp * @property {Uint8Array|null} [targetAuthorAciBinary] Reaction targetAuthorAciBinary */ /** * Constructs a new Reaction. * @memberof signalservice.DataMessage * @classdesc Represents a Reaction. * @implements IReaction * @constructor * @param {signalservice.DataMessage.IReaction=} [properties] Properties to set */ function Reaction(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Reaction emoji. * @member {string} emoji * @memberof signalservice.DataMessage.Reaction * @instance */ Reaction.prototype.emoji = ""; /** * Reaction remove. * @member {boolean} remove * @memberof signalservice.DataMessage.Reaction * @instance */ Reaction.prototype.remove = false; /** * Reaction targetAuthorAci. * @member {string} targetAuthorAci * @memberof signalservice.DataMessage.Reaction * @instance */ Reaction.prototype.targetAuthorAci = ""; /** * Reaction targetSentTimestamp. * @member {Long} targetSentTimestamp * @memberof signalservice.DataMessage.Reaction * @instance */ Reaction.prototype.targetSentTimestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * Reaction targetAuthorAciBinary. * @member {Uint8Array} targetAuthorAciBinary * @memberof signalservice.DataMessage.Reaction * @instance */ Reaction.prototype.targetAuthorAciBinary = $util.newBuffer([]); /** * Encodes the specified Reaction message. Does not implicitly {@link signalservice.DataMessage.Reaction.verify|verify} messages. * @function encode * @memberof signalservice.DataMessage.Reaction * @static * @param {signalservice.DataMessage.IReaction} message Reaction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Reaction.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.DataMessage.Reaction.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.DataMessage.Reaction.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.emoji != null && Object.hasOwnProperty.call(message, "emoji")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.emoji); if (message.remove != null && Object.hasOwnProperty.call(message, "remove")) writer.uint32(/* id 2, wireType 0 =*/16).bool(message.remove); if (message.targetAuthorAci != null && Object.hasOwnProperty.call(message, "targetAuthorAci")) writer.uint32(/* id 4, wireType 2 =*/34).string(message.targetAuthorAci); if (message.targetSentTimestamp != null && Object.hasOwnProperty.call(message, "targetSentTimestamp")) writer.uint32(/* id 5, wireType 0 =*/40).uint64(message.targetSentTimestamp); if (message.targetAuthorAciBinary != null && Object.hasOwnProperty.call(message, "targetAuthorAciBinary")) writer.uint32(/* id 6, wireType 2 =*/50).bytes(message.targetAuthorAciBinary); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Reaction message, length delimited. Does not implicitly {@link signalservice.DataMessage.Reaction.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.DataMessage.Reaction * @static * @param {signalservice.DataMessage.IReaction} message Reaction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Reaction.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Reaction message from the specified reader or buffer. * @function decode * @memberof signalservice.DataMessage.Reaction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.DataMessage.Reaction} Reaction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Reaction.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.DataMessage.Reaction(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.emoji = reader.string(); break; } case 2: { message.remove = reader.bool(); break; } case 4: { message.targetAuthorAci = reader.string(); break; } case 5: { message.targetSentTimestamp = reader.uint64(); break; } case 6: { message.targetAuthorAciBinary = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Reaction message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.DataMessage.Reaction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.DataMessage.Reaction} Reaction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Reaction.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return Reaction; })(); DataMessage.Delete = (function() { /** * Properties of a Delete. * @memberof signalservice.DataMessage * @interface IDelete * @property {Long|null} [targetSentTimestamp] Delete targetSentTimestamp */ /** * Constructs a new Delete. * @memberof signalservice.DataMessage * @classdesc Represents a Delete. * @implements IDelete * @constructor * @param {signalservice.DataMessage.IDelete=} [properties] Properties to set */ function Delete(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Delete targetSentTimestamp. * @member {Long} targetSentTimestamp * @memberof signalservice.DataMessage.Delete * @instance */ Delete.prototype.targetSentTimestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * Encodes the specified Delete message. Does not implicitly {@link signalservice.DataMessage.Delete.verify|verify} messages. * @function encode * @memberof signalservice.DataMessage.Delete * @static * @param {signalservice.DataMessage.IDelete} message Delete message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Delete.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.DataMessage.Delete.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.DataMessage.Delete.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.targetSentTimestamp != null && Object.hasOwnProperty.call(message, "targetSentTimestamp")) writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.targetSentTimestamp); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Delete message, length delimited. Does not implicitly {@link signalservice.DataMessage.Delete.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.DataMessage.Delete * @static * @param {signalservice.DataMessage.IDelete} message Delete message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Delete.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Delete message from the specified reader or buffer. * @function decode * @memberof signalservice.DataMessage.Delete * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.DataMessage.Delete} Delete * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Delete.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.DataMessage.Delete(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.targetSentTimestamp = reader.uint64(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Delete message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.DataMessage.Delete * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.DataMessage.Delete} Delete * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Delete.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return Delete; })(); DataMessage.GroupCallUpdate = (function() { /** * Properties of a GroupCallUpdate. * @memberof signalservice.DataMessage * @interface IGroupCallUpdate * @property {string|null} [eraId] GroupCallUpdate eraId */ /** * Constructs a new GroupCallUpdate. * @memberof signalservice.DataMessage * @classdesc Represents a GroupCallUpdate. * @implements IGroupCallUpdate * @constructor * @param {signalservice.DataMessage.IGroupCallUpdate=} [properties] Properties to set */ function GroupCallUpdate(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GroupCallUpdate eraId. * @member {string} eraId * @memberof signalservice.DataMessage.GroupCallUpdate * @instance */ GroupCallUpdate.prototype.eraId = ""; /** * Encodes the specified GroupCallUpdate message. Does not implicitly {@link signalservice.DataMessage.GroupCallUpdate.verify|verify} messages. * @function encode * @memberof signalservice.DataMessage.GroupCallUpdate * @static * @param {signalservice.DataMessage.IGroupCallUpdate} message GroupCallUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupCallUpdate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.DataMessage.GroupCallUpdate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.DataMessage.GroupCallUpdate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.eraId != null && Object.hasOwnProperty.call(message, "eraId")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.eraId); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupCallUpdate message, length delimited. Does not implicitly {@link signalservice.DataMessage.GroupCallUpdate.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.DataMessage.GroupCallUpdate * @static * @param {signalservice.DataMessage.IGroupCallUpdate} message GroupCallUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupCallUpdate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupCallUpdate message from the specified reader or buffer. * @function decode * @memberof signalservice.DataMessage.GroupCallUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.DataMessage.GroupCallUpdate} GroupCallUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupCallUpdate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.DataMessage.GroupCallUpdate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.eraId = reader.string(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupCallUpdate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.DataMessage.GroupCallUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.DataMessage.GroupCallUpdate} GroupCallUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupCallUpdate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return GroupCallUpdate; })(); DataMessage.StoryContext = (function() { /** * Properties of a StoryContext. * @memberof signalservice.DataMessage * @interface IStoryContext * @property {string|null} [authorAci] StoryContext authorAci * @property {Long|null} [sentTimestamp] StoryContext sentTimestamp * @property {Uint8Array|null} [authorAciBinary] StoryContext authorAciBinary */ /** * Constructs a new StoryContext. * @memberof signalservice.DataMessage * @classdesc Represents a StoryContext. * @implements IStoryContext * @constructor * @param {signalservice.DataMessage.IStoryContext=} [properties] Properties to set */ function StoryContext(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * StoryContext authorAci. * @member {string} authorAci * @memberof signalservice.DataMessage.StoryContext * @instance */ StoryContext.prototype.authorAci = ""; /** * StoryContext sentTimestamp. * @member {Long} sentTimestamp * @memberof signalservice.DataMessage.StoryContext * @instance */ StoryContext.prototype.sentTimestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * StoryContext authorAciBinary. * @member {Uint8Array} authorAciBinary * @memberof signalservice.DataMessage.StoryContext * @instance */ StoryContext.prototype.authorAciBinary = $util.newBuffer([]); /** * Encodes the specified StoryContext message. Does not implicitly {@link signalservice.DataMessage.StoryContext.verify|verify} messages. * @function encode * @memberof signalservice.DataMessage.StoryContext * @static * @param {signalservice.DataMessage.IStoryContext} message StoryContext message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ StoryContext.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.DataMessage.StoryContext.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.DataMessage.StoryContext.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.authorAci != null && Object.hasOwnProperty.call(message, "authorAci")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.authorAci); if (message.sentTimestamp != null && Object.hasOwnProperty.call(message, "sentTimestamp")) writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.sentTimestamp); if (message.authorAciBinary != null && Object.hasOwnProperty.call(message, "authorAciBinary")) writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.authorAciBinary); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified StoryContext message, length delimited. Does not implicitly {@link signalservice.DataMessage.StoryContext.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.DataMessage.StoryContext * @static * @param {signalservice.DataMessage.IStoryContext} message StoryContext message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ StoryContext.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a StoryContext message from the specified reader or buffer. * @function decode * @memberof signalservice.DataMessage.StoryContext * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.DataMessage.StoryContext} StoryContext * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ StoryContext.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.DataMessage.StoryContext(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.authorAci = reader.string(); break; } case 2: { message.sentTimestamp = reader.uint64(); break; } case 3: { message.authorAciBinary = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a StoryContext message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.DataMessage.StoryContext * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.DataMessage.StoryContext} StoryContext * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ StoryContext.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return StoryContext; })(); /** * ProtocolVersion enum. * @name signalservice.DataMessage.ProtocolVersion * @enum {number} * @property {number} INITIAL=0 INITIAL value * @property {number} MESSAGE_TIMERS=1 MESSAGE_TIMERS value * @property {number} VIEW_ONCE=2 VIEW_ONCE value * @property {number} VIEW_ONCE_VIDEO=3 VIEW_ONCE_VIDEO value * @property {number} REACTIONS=4 REACTIONS value * @property {number} CDN_SELECTOR_ATTACHMENTS=5 CDN_SELECTOR_ATTACHMENTS value * @property {number} MENTIONS=6 MENTIONS value * @property {number} PAYMENTS=7 PAYMENTS value * @property {number} POLLS=8 POLLS value * @property {number} CURRENT=8 CURRENT value */ DataMessage.ProtocolVersion = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "INITIAL"] = 0; values[valuesById[1] = "MESSAGE_TIMERS"] = 1; values[valuesById[2] = "VIEW_ONCE"] = 2; values[valuesById[3] = "VIEW_ONCE_VIDEO"] = 3; values[valuesById[4] = "REACTIONS"] = 4; values[valuesById[5] = "CDN_SELECTOR_ATTACHMENTS"] = 5; values[valuesById[6] = "MENTIONS"] = 6; values[valuesById[7] = "PAYMENTS"] = 7; values[valuesById[8] = "POLLS"] = 8; values["CURRENT"] = 8; return values; })(); DataMessage.GiftBadge = (function() { /** * Properties of a GiftBadge. * @memberof signalservice.DataMessage * @interface IGiftBadge * @property {Uint8Array|null} [receiptCredentialPresentation] GiftBadge receiptCredentialPresentation */ /** * Constructs a new GiftBadge. * @memberof signalservice.DataMessage * @classdesc Represents a GiftBadge. * @implements IGiftBadge * @constructor * @param {signalservice.DataMessage.IGiftBadge=} [properties] Properties to set */ function GiftBadge(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GiftBadge receiptCredentialPresentation. * @member {Uint8Array} receiptCredentialPresentation * @memberof signalservice.DataMessage.GiftBadge * @instance */ GiftBadge.prototype.receiptCredentialPresentation = $util.newBuffer([]); /** * Encodes the specified GiftBadge message. Does not implicitly {@link signalservice.DataMessage.GiftBadge.verify|verify} messages. * @function encode * @memberof signalservice.DataMessage.GiftBadge * @static * @param {signalservice.DataMessage.IGiftBadge} message GiftBadge message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GiftBadge.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.DataMessage.GiftBadge.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.DataMessage.GiftBadge.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.receiptCredentialPresentation != null && Object.hasOwnProperty.call(message, "receiptCredentialPresentation")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.receiptCredentialPresentation); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GiftBadge message, length delimited. Does not implicitly {@link signalservice.DataMessage.GiftBadge.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.DataMessage.GiftBadge * @static * @param {signalservice.DataMessage.IGiftBadge} message GiftBadge message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GiftBadge.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GiftBadge message from the specified reader or buffer. * @function decode * @memberof signalservice.DataMessage.GiftBadge * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.DataMessage.GiftBadge} GiftBadge * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GiftBadge.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.DataMessage.GiftBadge(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.receiptCredentialPresentation = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GiftBadge message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.DataMessage.GiftBadge * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.DataMessage.GiftBadge} GiftBadge * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GiftBadge.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return GiftBadge; })(); DataMessage.PollCreate = (function() { /** * Properties of a PollCreate. * @memberof signalservice.DataMessage * @interface IPollCreate * @property {string|null} [question] PollCreate question * @property {boolean|null} [allowMultiple] PollCreate allowMultiple * @property {Array.|null} [options] PollCreate options */ /** * Constructs a new PollCreate. * @memberof signalservice.DataMessage * @classdesc Represents a PollCreate. * @implements IPollCreate * @constructor * @param {signalservice.DataMessage.IPollCreate=} [properties] Properties to set */ function PollCreate(properties) { this.options = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * PollCreate question. * @member {string} question * @memberof signalservice.DataMessage.PollCreate * @instance */ PollCreate.prototype.question = ""; /** * PollCreate allowMultiple. * @member {boolean} allowMultiple * @memberof signalservice.DataMessage.PollCreate * @instance */ PollCreate.prototype.allowMultiple = false; /** * PollCreate options. * @member {Array.} options * @memberof signalservice.DataMessage.PollCreate * @instance */ PollCreate.prototype.options = $util.emptyArray; /** * Encodes the specified PollCreate message. Does not implicitly {@link signalservice.DataMessage.PollCreate.verify|verify} messages. * @function encode * @memberof signalservice.DataMessage.PollCreate * @static * @param {signalservice.DataMessage.IPollCreate} message PollCreate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ PollCreate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.DataMessage.PollCreate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.DataMessage.PollCreate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.question != null && Object.hasOwnProperty.call(message, "question")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.question); if (message.allowMultiple != null && Object.hasOwnProperty.call(message, "allowMultiple")) writer.uint32(/* id 2, wireType 0 =*/16).bool(message.allowMultiple); if (message.options != null && message.options.length) for (var i = 0; i < message.options.length; ++i) writer.uint32(/* id 3, wireType 2 =*/26).string(message.options[i]); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified PollCreate message, length delimited. Does not implicitly {@link signalservice.DataMessage.PollCreate.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.DataMessage.PollCreate * @static * @param {signalservice.DataMessage.IPollCreate} message PollCreate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ PollCreate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a PollCreate message from the specified reader or buffer. * @function decode * @memberof signalservice.DataMessage.PollCreate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.DataMessage.PollCreate} PollCreate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ PollCreate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.DataMessage.PollCreate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.question = reader.string(); break; } case 2: { message.allowMultiple = reader.bool(); break; } case 3: { if (!(message.options && message.options.length)) message.options = []; message.options.push(reader.string()); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a PollCreate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.DataMessage.PollCreate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.DataMessage.PollCreate} PollCreate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ PollCreate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return PollCreate; })(); DataMessage.PollTerminate = (function() { /** * Properties of a PollTerminate. * @memberof signalservice.DataMessage * @interface IPollTerminate * @property {Long|null} [targetSentTimestamp] PollTerminate targetSentTimestamp */ /** * Constructs a new PollTerminate. * @memberof signalservice.DataMessage * @classdesc Represents a PollTerminate. * @implements IPollTerminate * @constructor * @param {signalservice.DataMessage.IPollTerminate=} [properties] Properties to set */ function PollTerminate(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * PollTerminate targetSentTimestamp. * @member {Long} targetSentTimestamp * @memberof signalservice.DataMessage.PollTerminate * @instance */ PollTerminate.prototype.targetSentTimestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * Encodes the specified PollTerminate message. Does not implicitly {@link signalservice.DataMessage.PollTerminate.verify|verify} messages. * @function encode * @memberof signalservice.DataMessage.PollTerminate * @static * @param {signalservice.DataMessage.IPollTerminate} message PollTerminate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ PollTerminate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.DataMessage.PollTerminate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.DataMessage.PollTerminate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.targetSentTimestamp != null && Object.hasOwnProperty.call(message, "targetSentTimestamp")) writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.targetSentTimestamp); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified PollTerminate message, length delimited. Does not implicitly {@link signalservice.DataMessage.PollTerminate.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.DataMessage.PollTerminate * @static * @param {signalservice.DataMessage.IPollTerminate} message PollTerminate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ PollTerminate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a PollTerminate message from the specified reader or buffer. * @function decode * @memberof signalservice.DataMessage.PollTerminate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.DataMessage.PollTerminate} PollTerminate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ PollTerminate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.DataMessage.PollTerminate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.targetSentTimestamp = reader.uint64(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a PollTerminate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.DataMessage.PollTerminate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.DataMessage.PollTerminate} PollTerminate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ PollTerminate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return PollTerminate; })(); DataMessage.PollVote = (function() { /** * Properties of a PollVote. * @memberof signalservice.DataMessage * @interface IPollVote * @property {Uint8Array|null} [targetAuthorAciBinary] PollVote targetAuthorAciBinary * @property {Long|null} [targetSentTimestamp] PollVote targetSentTimestamp * @property {Array.|null} [optionIndexes] PollVote optionIndexes * @property {number|null} [voteCount] PollVote voteCount */ /** * Constructs a new PollVote. * @memberof signalservice.DataMessage * @classdesc Represents a PollVote. * @implements IPollVote * @constructor * @param {signalservice.DataMessage.IPollVote=} [properties] Properties to set */ function PollVote(properties) { this.optionIndexes = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * PollVote targetAuthorAciBinary. * @member {Uint8Array} targetAuthorAciBinary * @memberof signalservice.DataMessage.PollVote * @instance */ PollVote.prototype.targetAuthorAciBinary = $util.newBuffer([]); /** * PollVote targetSentTimestamp. * @member {Long} targetSentTimestamp * @memberof signalservice.DataMessage.PollVote * @instance */ PollVote.prototype.targetSentTimestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * PollVote optionIndexes. * @member {Array.} optionIndexes * @memberof signalservice.DataMessage.PollVote * @instance */ PollVote.prototype.optionIndexes = $util.emptyArray; /** * PollVote voteCount. * @member {number} voteCount * @memberof signalservice.DataMessage.PollVote * @instance */ PollVote.prototype.voteCount = 0; /** * Encodes the specified PollVote message. Does not implicitly {@link signalservice.DataMessage.PollVote.verify|verify} messages. * @function encode * @memberof signalservice.DataMessage.PollVote * @static * @param {signalservice.DataMessage.IPollVote} message PollVote message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ PollVote.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.DataMessage.PollVote.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.DataMessage.PollVote.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.targetAuthorAciBinary != null && Object.hasOwnProperty.call(message, "targetAuthorAciBinary")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.targetAuthorAciBinary); if (message.targetSentTimestamp != null && Object.hasOwnProperty.call(message, "targetSentTimestamp")) writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.targetSentTimestamp); if (message.optionIndexes != null && message.optionIndexes.length) for (var i = 0; i < message.optionIndexes.length; ++i) writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.optionIndexes[i]); if (message.voteCount != null && Object.hasOwnProperty.call(message, "voteCount")) writer.uint32(/* id 4, wireType 0 =*/32).uint32(message.voteCount); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified PollVote message, length delimited. Does not implicitly {@link signalservice.DataMessage.PollVote.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.DataMessage.PollVote * @static * @param {signalservice.DataMessage.IPollVote} message PollVote message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ PollVote.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a PollVote message from the specified reader or buffer. * @function decode * @memberof signalservice.DataMessage.PollVote * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.DataMessage.PollVote} PollVote * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ PollVote.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.DataMessage.PollVote(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.targetAuthorAciBinary = reader.bytes(); break; } case 2: { message.targetSentTimestamp = reader.uint64(); break; } case 3: { if (!(message.optionIndexes && message.optionIndexes.length)) message.optionIndexes = []; if ((tag & 7) === 2) { var end2 = reader.uint32() + reader.pos; while (reader.pos < end2) message.optionIndexes.push(reader.uint32()); } else message.optionIndexes.push(reader.uint32()); break; } case 4: { message.voteCount = reader.uint32(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a PollVote message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.DataMessage.PollVote * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.DataMessage.PollVote} PollVote * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ PollVote.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return PollVote; })(); DataMessage.PinMessage = (function() { /** * Properties of a PinMessage. * @memberof signalservice.DataMessage * @interface IPinMessage * @property {Uint8Array|null} [targetAuthorAciBinary] PinMessage targetAuthorAciBinary * @property {Long|null} [targetSentTimestamp] PinMessage targetSentTimestamp * @property {number|null} [pinDurationSeconds] PinMessage pinDurationSeconds * @property {boolean|null} [pinDurationForever] PinMessage pinDurationForever */ /** * Constructs a new PinMessage. * @memberof signalservice.DataMessage * @classdesc Represents a PinMessage. * @implements IPinMessage * @constructor * @param {signalservice.DataMessage.IPinMessage=} [properties] Properties to set */ function PinMessage(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * PinMessage targetAuthorAciBinary. * @member {Uint8Array} targetAuthorAciBinary * @memberof signalservice.DataMessage.PinMessage * @instance */ PinMessage.prototype.targetAuthorAciBinary = $util.newBuffer([]); /** * PinMessage targetSentTimestamp. * @member {Long} targetSentTimestamp * @memberof signalservice.DataMessage.PinMessage * @instance */ PinMessage.prototype.targetSentTimestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * PinMessage pinDurationSeconds. * @member {number|null|undefined} pinDurationSeconds * @memberof signalservice.DataMessage.PinMessage * @instance */ PinMessage.prototype.pinDurationSeconds = null; /** * PinMessage pinDurationForever. * @member {boolean|null|undefined} pinDurationForever * @memberof signalservice.DataMessage.PinMessage * @instance */ PinMessage.prototype.pinDurationForever = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * PinMessage pinDuration. * @member {"pinDurationSeconds"|"pinDurationForever"|undefined} pinDuration * @memberof signalservice.DataMessage.PinMessage * @instance */ Object.defineProperty(PinMessage.prototype, "pinDuration", { get: $util.oneOfGetter($oneOfFields = ["pinDurationSeconds", "pinDurationForever"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified PinMessage message. Does not implicitly {@link signalservice.DataMessage.PinMessage.verify|verify} messages. * @function encode * @memberof signalservice.DataMessage.PinMessage * @static * @param {signalservice.DataMessage.IPinMessage} message PinMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ PinMessage.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.DataMessage.PinMessage.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.DataMessage.PinMessage.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.targetAuthorAciBinary != null && Object.hasOwnProperty.call(message, "targetAuthorAciBinary")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.targetAuthorAciBinary); if (message.targetSentTimestamp != null && Object.hasOwnProperty.call(message, "targetSentTimestamp")) writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.targetSentTimestamp); if (message.pinDurationSeconds != null && Object.hasOwnProperty.call(message, "pinDurationSeconds")) writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.pinDurationSeconds); if (message.pinDurationForever != null && Object.hasOwnProperty.call(message, "pinDurationForever")) writer.uint32(/* id 4, wireType 0 =*/32).bool(message.pinDurationForever); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified PinMessage message, length delimited. Does not implicitly {@link signalservice.DataMessage.PinMessage.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.DataMessage.PinMessage * @static * @param {signalservice.DataMessage.IPinMessage} message PinMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ PinMessage.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a PinMessage message from the specified reader or buffer. * @function decode * @memberof signalservice.DataMessage.PinMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.DataMessage.PinMessage} PinMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ PinMessage.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.DataMessage.PinMessage(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.targetAuthorAciBinary = reader.bytes(); break; } case 2: { message.targetSentTimestamp = reader.uint64(); break; } case 3: { message.pinDurationSeconds = reader.uint32(); break; } case 4: { message.pinDurationForever = reader.bool(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a PinMessage message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.DataMessage.PinMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.DataMessage.PinMessage} PinMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ PinMessage.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return PinMessage; })(); DataMessage.UnpinMessage = (function() { /** * Properties of an UnpinMessage. * @memberof signalservice.DataMessage * @interface IUnpinMessage * @property {Uint8Array|null} [targetAuthorAciBinary] UnpinMessage targetAuthorAciBinary * @property {Long|null} [targetSentTimestamp] UnpinMessage targetSentTimestamp */ /** * Constructs a new UnpinMessage. * @memberof signalservice.DataMessage * @classdesc Represents an UnpinMessage. * @implements IUnpinMessage * @constructor * @param {signalservice.DataMessage.IUnpinMessage=} [properties] Properties to set */ function UnpinMessage(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * UnpinMessage targetAuthorAciBinary. * @member {Uint8Array} targetAuthorAciBinary * @memberof signalservice.DataMessage.UnpinMessage * @instance */ UnpinMessage.prototype.targetAuthorAciBinary = $util.newBuffer([]); /** * UnpinMessage targetSentTimestamp. * @member {Long} targetSentTimestamp * @memberof signalservice.DataMessage.UnpinMessage * @instance */ UnpinMessage.prototype.targetSentTimestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * Encodes the specified UnpinMessage message. Does not implicitly {@link signalservice.DataMessage.UnpinMessage.verify|verify} messages. * @function encode * @memberof signalservice.DataMessage.UnpinMessage * @static * @param {signalservice.DataMessage.IUnpinMessage} message UnpinMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ UnpinMessage.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.DataMessage.UnpinMessage.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.DataMessage.UnpinMessage.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.targetAuthorAciBinary != null && Object.hasOwnProperty.call(message, "targetAuthorAciBinary")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.targetAuthorAciBinary); if (message.targetSentTimestamp != null && Object.hasOwnProperty.call(message, "targetSentTimestamp")) writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.targetSentTimestamp); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified UnpinMessage message, length delimited. Does not implicitly {@link signalservice.DataMessage.UnpinMessage.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.DataMessage.UnpinMessage * @static * @param {signalservice.DataMessage.IUnpinMessage} message UnpinMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ UnpinMessage.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an UnpinMessage message from the specified reader or buffer. * @function decode * @memberof signalservice.DataMessage.UnpinMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.DataMessage.UnpinMessage} UnpinMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ UnpinMessage.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.DataMessage.UnpinMessage(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.targetAuthorAciBinary = reader.bytes(); break; } case 2: { message.targetSentTimestamp = reader.uint64(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an UnpinMessage message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.DataMessage.UnpinMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.DataMessage.UnpinMessage} UnpinMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ UnpinMessage.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return UnpinMessage; })(); return DataMessage; })(); signalservice.NullMessage = (function() { /** * Properties of a NullMessage. * @memberof signalservice * @interface INullMessage * @property {Uint8Array|null} [padding] NullMessage padding */ /** * Constructs a new NullMessage. * @memberof signalservice * @classdesc Represents a NullMessage. * @implements INullMessage * @constructor * @param {signalservice.INullMessage=} [properties] Properties to set */ function NullMessage(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * NullMessage padding. * @member {Uint8Array} padding * @memberof signalservice.NullMessage * @instance */ NullMessage.prototype.padding = $util.newBuffer([]); /** * Encodes the specified NullMessage message. Does not implicitly {@link signalservice.NullMessage.verify|verify} messages. * @function encode * @memberof signalservice.NullMessage * @static * @param {signalservice.INullMessage} message NullMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ NullMessage.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.NullMessage.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.NullMessage.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.padding != null && Object.hasOwnProperty.call(message, "padding")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.padding); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified NullMessage message, length delimited. Does not implicitly {@link signalservice.NullMessage.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.NullMessage * @static * @param {signalservice.INullMessage} message NullMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ NullMessage.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a NullMessage message from the specified reader or buffer. * @function decode * @memberof signalservice.NullMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.NullMessage} NullMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ NullMessage.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.NullMessage(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.padding = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a NullMessage message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.NullMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.NullMessage} NullMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ NullMessage.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return NullMessage; })(); signalservice.ReceiptMessage = (function() { /** * Properties of a ReceiptMessage. * @memberof signalservice * @interface IReceiptMessage * @property {signalservice.ReceiptMessage.Type|null} [type] ReceiptMessage type * @property {Array.|null} [timestamp] ReceiptMessage timestamp */ /** * Constructs a new ReceiptMessage. * @memberof signalservice * @classdesc Represents a ReceiptMessage. * @implements IReceiptMessage * @constructor * @param {signalservice.IReceiptMessage=} [properties] Properties to set */ function ReceiptMessage(properties) { this.timestamp = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * ReceiptMessage type. * @member {signalservice.ReceiptMessage.Type} type * @memberof signalservice.ReceiptMessage * @instance */ ReceiptMessage.prototype.type = 0; /** * ReceiptMessage timestamp. * @member {Array.} timestamp * @memberof signalservice.ReceiptMessage * @instance */ ReceiptMessage.prototype.timestamp = $util.emptyArray; /** * Encodes the specified ReceiptMessage message. Does not implicitly {@link signalservice.ReceiptMessage.verify|verify} messages. * @function encode * @memberof signalservice.ReceiptMessage * @static * @param {signalservice.IReceiptMessage} message ReceiptMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ReceiptMessage.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.ReceiptMessage.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.ReceiptMessage.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.type != null && Object.hasOwnProperty.call(message, "type")) writer.uint32(/* id 1, wireType 0 =*/8).int32(message.type); if (message.timestamp != null && message.timestamp.length) for (var i = 0; i < message.timestamp.length; ++i) writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.timestamp[i]); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified ReceiptMessage message, length delimited. Does not implicitly {@link signalservice.ReceiptMessage.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.ReceiptMessage * @static * @param {signalservice.IReceiptMessage} message ReceiptMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ReceiptMessage.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a ReceiptMessage message from the specified reader or buffer. * @function decode * @memberof signalservice.ReceiptMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.ReceiptMessage} ReceiptMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ReceiptMessage.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.ReceiptMessage(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.type = reader.int32(); break; } case 2: { if (!(message.timestamp && message.timestamp.length)) message.timestamp = []; if ((tag & 7) === 2) { var end2 = reader.uint32() + reader.pos; while (reader.pos < end2) message.timestamp.push(reader.uint64()); } else message.timestamp.push(reader.uint64()); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a ReceiptMessage message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.ReceiptMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.ReceiptMessage} ReceiptMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ReceiptMessage.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * Type enum. * @name signalservice.ReceiptMessage.Type * @enum {number} * @property {number} DELIVERY=0 DELIVERY value * @property {number} READ=1 READ value * @property {number} VIEWED=2 VIEWED value */ ReceiptMessage.Type = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "DELIVERY"] = 0; values[valuesById[1] = "READ"] = 1; values[valuesById[2] = "VIEWED"] = 2; return values; })(); return ReceiptMessage; })(); signalservice.TypingMessage = (function() { /** * Properties of a TypingMessage. * @memberof signalservice * @interface ITypingMessage * @property {Long|null} [timestamp] TypingMessage timestamp * @property {signalservice.TypingMessage.Action|null} [action] TypingMessage action * @property {Uint8Array|null} [groupId] TypingMessage groupId */ /** * Constructs a new TypingMessage. * @memberof signalservice * @classdesc Represents a TypingMessage. * @implements ITypingMessage * @constructor * @param {signalservice.ITypingMessage=} [properties] Properties to set */ function TypingMessage(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * TypingMessage timestamp. * @member {Long} timestamp * @memberof signalservice.TypingMessage * @instance */ TypingMessage.prototype.timestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * TypingMessage action. * @member {signalservice.TypingMessage.Action} action * @memberof signalservice.TypingMessage * @instance */ TypingMessage.prototype.action = 0; /** * TypingMessage groupId. * @member {Uint8Array} groupId * @memberof signalservice.TypingMessage * @instance */ TypingMessage.prototype.groupId = $util.newBuffer([]); /** * Encodes the specified TypingMessage message. Does not implicitly {@link signalservice.TypingMessage.verify|verify} messages. * @function encode * @memberof signalservice.TypingMessage * @static * @param {signalservice.ITypingMessage} message TypingMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ TypingMessage.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.TypingMessage.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.TypingMessage.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.timestamp != null && Object.hasOwnProperty.call(message, "timestamp")) writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.timestamp); if (message.action != null && Object.hasOwnProperty.call(message, "action")) writer.uint32(/* id 2, wireType 0 =*/16).int32(message.action); if (message.groupId != null && Object.hasOwnProperty.call(message, "groupId")) writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.groupId); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified TypingMessage message, length delimited. Does not implicitly {@link signalservice.TypingMessage.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.TypingMessage * @static * @param {signalservice.ITypingMessage} message TypingMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ TypingMessage.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a TypingMessage message from the specified reader or buffer. * @function decode * @memberof signalservice.TypingMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.TypingMessage} TypingMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ TypingMessage.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.TypingMessage(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.timestamp = reader.uint64(); break; } case 2: { message.action = reader.int32(); break; } case 3: { message.groupId = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a TypingMessage message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.TypingMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.TypingMessage} TypingMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ TypingMessage.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * Action enum. * @name signalservice.TypingMessage.Action * @enum {number} * @property {number} STARTED=0 STARTED value * @property {number} STOPPED=1 STOPPED value */ TypingMessage.Action = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "STARTED"] = 0; values[valuesById[1] = "STOPPED"] = 1; return values; })(); return TypingMessage; })(); signalservice.StoryMessage = (function() { /** * Properties of a StoryMessage. * @memberof signalservice * @interface IStoryMessage * @property {Uint8Array|null} [profileKey] StoryMessage profileKey * @property {signalservice.IGroupContextV2|null} [group] StoryMessage group * @property {signalservice.IAttachmentPointer|null} [fileAttachment] StoryMessage fileAttachment * @property {signalservice.ITextAttachment|null} [textAttachment] StoryMessage textAttachment * @property {boolean|null} [allowsReplies] StoryMessage allowsReplies * @property {Array.|null} [bodyRanges] StoryMessage bodyRanges */ /** * Constructs a new StoryMessage. * @memberof signalservice * @classdesc Represents a StoryMessage. * @implements IStoryMessage * @constructor * @param {signalservice.IStoryMessage=} [properties] Properties to set */ function StoryMessage(properties) { this.bodyRanges = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * StoryMessage profileKey. * @member {Uint8Array} profileKey * @memberof signalservice.StoryMessage * @instance */ StoryMessage.prototype.profileKey = $util.newBuffer([]); /** * StoryMessage group. * @member {signalservice.IGroupContextV2|null|undefined} group * @memberof signalservice.StoryMessage * @instance */ StoryMessage.prototype.group = null; /** * StoryMessage fileAttachment. * @member {signalservice.IAttachmentPointer|null|undefined} fileAttachment * @memberof signalservice.StoryMessage * @instance */ StoryMessage.prototype.fileAttachment = null; /** * StoryMessage textAttachment. * @member {signalservice.ITextAttachment|null|undefined} textAttachment * @memberof signalservice.StoryMessage * @instance */ StoryMessage.prototype.textAttachment = null; /** * StoryMessage allowsReplies. * @member {boolean} allowsReplies * @memberof signalservice.StoryMessage * @instance */ StoryMessage.prototype.allowsReplies = false; /** * StoryMessage bodyRanges. * @member {Array.} bodyRanges * @memberof signalservice.StoryMessage * @instance */ StoryMessage.prototype.bodyRanges = $util.emptyArray; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * StoryMessage attachment. * @member {"fileAttachment"|"textAttachment"|undefined} attachment * @memberof signalservice.StoryMessage * @instance */ Object.defineProperty(StoryMessage.prototype, "attachment", { get: $util.oneOfGetter($oneOfFields = ["fileAttachment", "textAttachment"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified StoryMessage message. Does not implicitly {@link signalservice.StoryMessage.verify|verify} messages. * @function encode * @memberof signalservice.StoryMessage * @static * @param {signalservice.IStoryMessage} message StoryMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ StoryMessage.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.StoryMessage.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.StoryMessage.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.profileKey != null && Object.hasOwnProperty.call(message, "profileKey")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.profileKey); if (message.group != null && Object.hasOwnProperty.call(message, "group")) $root.signalservice.GroupContextV2.encode(message.group, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); if (message.fileAttachment != null && Object.hasOwnProperty.call(message, "fileAttachment")) $root.signalservice.AttachmentPointer.encode(message.fileAttachment, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); if (message.textAttachment != null && Object.hasOwnProperty.call(message, "textAttachment")) $root.signalservice.TextAttachment.encode(message.textAttachment, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); if (message.allowsReplies != null && Object.hasOwnProperty.call(message, "allowsReplies")) writer.uint32(/* id 5, wireType 0 =*/40).bool(message.allowsReplies); if (message.bodyRanges != null && message.bodyRanges.length) for (var i = 0; i < message.bodyRanges.length; ++i) $root.signalservice.BodyRange.encode(message.bodyRanges[i], writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified StoryMessage message, length delimited. Does not implicitly {@link signalservice.StoryMessage.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.StoryMessage * @static * @param {signalservice.IStoryMessage} message StoryMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ StoryMessage.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a StoryMessage message from the specified reader or buffer. * @function decode * @memberof signalservice.StoryMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.StoryMessage} StoryMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ StoryMessage.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.StoryMessage(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.profileKey = reader.bytes(); break; } case 2: { message.group = $root.signalservice.GroupContextV2.decode(reader, reader.uint32()); break; } case 3: { message.fileAttachment = $root.signalservice.AttachmentPointer.decode(reader, reader.uint32()); break; } case 4: { message.textAttachment = $root.signalservice.TextAttachment.decode(reader, reader.uint32()); break; } case 5: { message.allowsReplies = reader.bool(); break; } case 6: { if (!(message.bodyRanges && message.bodyRanges.length)) message.bodyRanges = []; message.bodyRanges.push($root.signalservice.BodyRange.decode(reader, reader.uint32())); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a StoryMessage message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.StoryMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.StoryMessage} StoryMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ StoryMessage.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return StoryMessage; })(); signalservice.Preview = (function() { /** * Properties of a Preview. * @memberof signalservice * @interface IPreview * @property {string|null} [url] Preview url * @property {string|null} [title] Preview title * @property {signalservice.IAttachmentPointer|null} [image] Preview image * @property {string|null} [description] Preview description * @property {Long|null} [date] Preview date */ /** * Constructs a new Preview. * @memberof signalservice * @classdesc Represents a Preview. * @implements IPreview * @constructor * @param {signalservice.IPreview=} [properties] Properties to set */ function Preview(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Preview url. * @member {string} url * @memberof signalservice.Preview * @instance */ Preview.prototype.url = ""; /** * Preview title. * @member {string} title * @memberof signalservice.Preview * @instance */ Preview.prototype.title = ""; /** * Preview image. * @member {signalservice.IAttachmentPointer|null|undefined} image * @memberof signalservice.Preview * @instance */ Preview.prototype.image = null; /** * Preview description. * @member {string} description * @memberof signalservice.Preview * @instance */ Preview.prototype.description = ""; /** * Preview date. * @member {Long} date * @memberof signalservice.Preview * @instance */ Preview.prototype.date = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * Encodes the specified Preview message. Does not implicitly {@link signalservice.Preview.verify|verify} messages. * @function encode * @memberof signalservice.Preview * @static * @param {signalservice.IPreview} message Preview message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Preview.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.Preview.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.Preview.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.url != null && Object.hasOwnProperty.call(message, "url")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.url); if (message.title != null && Object.hasOwnProperty.call(message, "title")) writer.uint32(/* id 2, wireType 2 =*/18).string(message.title); if (message.image != null && Object.hasOwnProperty.call(message, "image")) $root.signalservice.AttachmentPointer.encode(message.image, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); if (message.description != null && Object.hasOwnProperty.call(message, "description")) writer.uint32(/* id 4, wireType 2 =*/34).string(message.description); if (message.date != null && Object.hasOwnProperty.call(message, "date")) writer.uint32(/* id 5, wireType 0 =*/40).uint64(message.date); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Preview message, length delimited. Does not implicitly {@link signalservice.Preview.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.Preview * @static * @param {signalservice.IPreview} message Preview message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Preview.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Preview message from the specified reader or buffer. * @function decode * @memberof signalservice.Preview * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.Preview} Preview * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Preview.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.Preview(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.url = reader.string(); break; } case 2: { message.title = reader.string(); break; } case 3: { message.image = $root.signalservice.AttachmentPointer.decode(reader, reader.uint32()); break; } case 4: { message.description = reader.string(); break; } case 5: { message.date = reader.uint64(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Preview message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.Preview * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.Preview} Preview * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Preview.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return Preview; })(); signalservice.TextAttachment = (function() { /** * Properties of a TextAttachment. * @memberof signalservice * @interface ITextAttachment * @property {string|null} [text] TextAttachment text * @property {signalservice.TextAttachment.Style|null} [textStyle] TextAttachment textStyle * @property {number|null} [textForegroundColor] TextAttachment textForegroundColor * @property {number|null} [textBackgroundColor] TextAttachment textBackgroundColor * @property {signalservice.IPreview|null} [preview] TextAttachment preview * @property {signalservice.TextAttachment.IGradient|null} [gradient] TextAttachment gradient * @property {number|null} [color] TextAttachment color */ /** * Constructs a new TextAttachment. * @memberof signalservice * @classdesc Represents a TextAttachment. * @implements ITextAttachment * @constructor * @param {signalservice.ITextAttachment=} [properties] Properties to set */ function TextAttachment(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * TextAttachment text. * @member {string} text * @memberof signalservice.TextAttachment * @instance */ TextAttachment.prototype.text = ""; /** * TextAttachment textStyle. * @member {signalservice.TextAttachment.Style} textStyle * @memberof signalservice.TextAttachment * @instance */ TextAttachment.prototype.textStyle = 0; /** * TextAttachment textForegroundColor. * @member {number} textForegroundColor * @memberof signalservice.TextAttachment * @instance */ TextAttachment.prototype.textForegroundColor = 0; /** * TextAttachment textBackgroundColor. * @member {number} textBackgroundColor * @memberof signalservice.TextAttachment * @instance */ TextAttachment.prototype.textBackgroundColor = 0; /** * TextAttachment preview. * @member {signalservice.IPreview|null|undefined} preview * @memberof signalservice.TextAttachment * @instance */ TextAttachment.prototype.preview = null; /** * TextAttachment gradient. * @member {signalservice.TextAttachment.IGradient|null|undefined} gradient * @memberof signalservice.TextAttachment * @instance */ TextAttachment.prototype.gradient = null; /** * TextAttachment color. * @member {number|null|undefined} color * @memberof signalservice.TextAttachment * @instance */ TextAttachment.prototype.color = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * TextAttachment background. * @member {"gradient"|"color"|undefined} background * @memberof signalservice.TextAttachment * @instance */ Object.defineProperty(TextAttachment.prototype, "background", { get: $util.oneOfGetter($oneOfFields = ["gradient", "color"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified TextAttachment message. Does not implicitly {@link signalservice.TextAttachment.verify|verify} messages. * @function encode * @memberof signalservice.TextAttachment * @static * @param {signalservice.ITextAttachment} message TextAttachment message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ TextAttachment.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.TextAttachment.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.TextAttachment.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.text != null && Object.hasOwnProperty.call(message, "text")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.text); if (message.textStyle != null && Object.hasOwnProperty.call(message, "textStyle")) writer.uint32(/* id 2, wireType 0 =*/16).int32(message.textStyle); if (message.textForegroundColor != null && Object.hasOwnProperty.call(message, "textForegroundColor")) writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.textForegroundColor); if (message.textBackgroundColor != null && Object.hasOwnProperty.call(message, "textBackgroundColor")) writer.uint32(/* id 4, wireType 0 =*/32).uint32(message.textBackgroundColor); if (message.preview != null && Object.hasOwnProperty.call(message, "preview")) $root.signalservice.Preview.encode(message.preview, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); if (message.gradient != null && Object.hasOwnProperty.call(message, "gradient")) $root.signalservice.TextAttachment.Gradient.encode(message.gradient, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim(); if (message.color != null && Object.hasOwnProperty.call(message, "color")) writer.uint32(/* id 7, wireType 0 =*/56).uint32(message.color); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified TextAttachment message, length delimited. Does not implicitly {@link signalservice.TextAttachment.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.TextAttachment * @static * @param {signalservice.ITextAttachment} message TextAttachment message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ TextAttachment.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a TextAttachment message from the specified reader or buffer. * @function decode * @memberof signalservice.TextAttachment * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.TextAttachment} TextAttachment * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ TextAttachment.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.TextAttachment(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.text = reader.string(); break; } case 2: { message.textStyle = reader.int32(); break; } case 3: { message.textForegroundColor = reader.uint32(); break; } case 4: { message.textBackgroundColor = reader.uint32(); break; } case 5: { message.preview = $root.signalservice.Preview.decode(reader, reader.uint32()); break; } case 6: { message.gradient = $root.signalservice.TextAttachment.Gradient.decode(reader, reader.uint32()); break; } case 7: { message.color = reader.uint32(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a TextAttachment message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.TextAttachment * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.TextAttachment} TextAttachment * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ TextAttachment.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * Style enum. * @name signalservice.TextAttachment.Style * @enum {number} * @property {number} DEFAULT=0 DEFAULT value * @property {number} REGULAR=1 REGULAR value * @property {number} BOLD=2 BOLD value * @property {number} SERIF=3 SERIF value * @property {number} SCRIPT=4 SCRIPT value * @property {number} CONDENSED=5 CONDENSED value */ TextAttachment.Style = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "DEFAULT"] = 0; values[valuesById[1] = "REGULAR"] = 1; values[valuesById[2] = "BOLD"] = 2; values[valuesById[3] = "SERIF"] = 3; values[valuesById[4] = "SCRIPT"] = 4; values[valuesById[5] = "CONDENSED"] = 5; return values; })(); TextAttachment.Gradient = (function() { /** * Properties of a Gradient. * @memberof signalservice.TextAttachment * @interface IGradient * @property {number|null} [startColor] Gradient startColor * @property {number|null} [endColor] Gradient endColor * @property {number|null} [angle] Gradient angle * @property {Array.|null} [colors] Gradient colors * @property {Array.|null} [positions] Gradient positions */ /** * Constructs a new Gradient. * @memberof signalservice.TextAttachment * @classdesc Represents a Gradient. * @implements IGradient * @constructor * @param {signalservice.TextAttachment.IGradient=} [properties] Properties to set */ function Gradient(properties) { this.colors = []; this.positions = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Gradient startColor. * @member {number} startColor * @memberof signalservice.TextAttachment.Gradient * @instance */ Gradient.prototype.startColor = 0; /** * Gradient endColor. * @member {number} endColor * @memberof signalservice.TextAttachment.Gradient * @instance */ Gradient.prototype.endColor = 0; /** * Gradient angle. * @member {number} angle * @memberof signalservice.TextAttachment.Gradient * @instance */ Gradient.prototype.angle = 0; /** * Gradient colors. * @member {Array.} colors * @memberof signalservice.TextAttachment.Gradient * @instance */ Gradient.prototype.colors = $util.emptyArray; /** * Gradient positions. * @member {Array.} positions * @memberof signalservice.TextAttachment.Gradient * @instance */ Gradient.prototype.positions = $util.emptyArray; /** * Encodes the specified Gradient message. Does not implicitly {@link signalservice.TextAttachment.Gradient.verify|verify} messages. * @function encode * @memberof signalservice.TextAttachment.Gradient * @static * @param {signalservice.TextAttachment.IGradient} message Gradient message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Gradient.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.TextAttachment.Gradient.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.TextAttachment.Gradient.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.startColor != null && Object.hasOwnProperty.call(message, "startColor")) writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.startColor); if (message.endColor != null && Object.hasOwnProperty.call(message, "endColor")) writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.endColor); if (message.angle != null && Object.hasOwnProperty.call(message, "angle")) writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.angle); if (message.colors != null && message.colors.length) for (var i = 0; i < message.colors.length; ++i) writer.uint32(/* id 4, wireType 0 =*/32).uint32(message.colors[i]); if (message.positions != null && message.positions.length) for (var i = 0; i < message.positions.length; ++i) writer.uint32(/* id 5, wireType 5 =*/45).float(message.positions[i]); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Gradient message, length delimited. Does not implicitly {@link signalservice.TextAttachment.Gradient.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.TextAttachment.Gradient * @static * @param {signalservice.TextAttachment.IGradient} message Gradient message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Gradient.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Gradient message from the specified reader or buffer. * @function decode * @memberof signalservice.TextAttachment.Gradient * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.TextAttachment.Gradient} Gradient * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Gradient.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.TextAttachment.Gradient(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.startColor = reader.uint32(); break; } case 2: { message.endColor = reader.uint32(); break; } case 3: { message.angle = reader.uint32(); break; } case 4: { if (!(message.colors && message.colors.length)) message.colors = []; if ((tag & 7) === 2) { var end2 = reader.uint32() + reader.pos; while (reader.pos < end2) message.colors.push(reader.uint32()); } else message.colors.push(reader.uint32()); break; } case 5: { if (!(message.positions && message.positions.length)) message.positions = []; if ((tag & 7) === 2) { var end2 = reader.uint32() + reader.pos; while (reader.pos < end2) message.positions.push(reader.float()); } else message.positions.push(reader.float()); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Gradient message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.TextAttachment.Gradient * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.TextAttachment.Gradient} Gradient * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Gradient.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return Gradient; })(); return TextAttachment; })(); signalservice.Verified = (function() { /** * Properties of a Verified. * @memberof signalservice * @interface IVerified * @property {string|null} [destinationAci] Verified destinationAci * @property {Uint8Array|null} [identityKey] Verified identityKey * @property {signalservice.Verified.State|null} [state] Verified state * @property {Uint8Array|null} [nullMessage] Verified nullMessage * @property {Uint8Array|null} [destinationAciBinary] Verified destinationAciBinary */ /** * Constructs a new Verified. * @memberof signalservice * @classdesc Represents a Verified. * @implements IVerified * @constructor * @param {signalservice.IVerified=} [properties] Properties to set */ function Verified(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Verified destinationAci. * @member {string} destinationAci * @memberof signalservice.Verified * @instance */ Verified.prototype.destinationAci = ""; /** * Verified identityKey. * @member {Uint8Array} identityKey * @memberof signalservice.Verified * @instance */ Verified.prototype.identityKey = $util.newBuffer([]); /** * Verified state. * @member {signalservice.Verified.State} state * @memberof signalservice.Verified * @instance */ Verified.prototype.state = 0; /** * Verified nullMessage. * @member {Uint8Array} nullMessage * @memberof signalservice.Verified * @instance */ Verified.prototype.nullMessage = $util.newBuffer([]); /** * Verified destinationAciBinary. * @member {Uint8Array} destinationAciBinary * @memberof signalservice.Verified * @instance */ Verified.prototype.destinationAciBinary = $util.newBuffer([]); /** * Encodes the specified Verified message. Does not implicitly {@link signalservice.Verified.verify|verify} messages. * @function encode * @memberof signalservice.Verified * @static * @param {signalservice.IVerified} message Verified message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Verified.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.Verified.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.Verified.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.identityKey != null && Object.hasOwnProperty.call(message, "identityKey")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.identityKey); if (message.state != null && Object.hasOwnProperty.call(message, "state")) writer.uint32(/* id 3, wireType 0 =*/24).int32(message.state); if (message.nullMessage != null && Object.hasOwnProperty.call(message, "nullMessage")) writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.nullMessage); if (message.destinationAci != null && Object.hasOwnProperty.call(message, "destinationAci")) writer.uint32(/* id 5, wireType 2 =*/42).string(message.destinationAci); if (message.destinationAciBinary != null && Object.hasOwnProperty.call(message, "destinationAciBinary")) writer.uint32(/* id 6, wireType 2 =*/50).bytes(message.destinationAciBinary); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Verified message, length delimited. Does not implicitly {@link signalservice.Verified.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.Verified * @static * @param {signalservice.IVerified} message Verified message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Verified.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Verified message from the specified reader or buffer. * @function decode * @memberof signalservice.Verified * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.Verified} Verified * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Verified.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.Verified(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 5: { message.destinationAci = reader.string(); break; } case 2: { message.identityKey = reader.bytes(); break; } case 3: { message.state = reader.int32(); break; } case 4: { message.nullMessage = reader.bytes(); break; } case 6: { message.destinationAciBinary = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Verified message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.Verified * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.Verified} Verified * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Verified.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * State enum. * @name signalservice.Verified.State * @enum {number} * @property {number} DEFAULT=0 DEFAULT value * @property {number} VERIFIED=1 VERIFIED value * @property {number} UNVERIFIED=2 UNVERIFIED value */ Verified.State = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "DEFAULT"] = 0; values[valuesById[1] = "VERIFIED"] = 1; values[valuesById[2] = "UNVERIFIED"] = 2; return values; })(); return Verified; })(); signalservice.SyncMessage = (function() { /** * Properties of a SyncMessage. * @memberof signalservice * @interface ISyncMessage * @property {signalservice.SyncMessage.ISent|null} [sent] SyncMessage sent * @property {signalservice.SyncMessage.IContacts|null} [contacts] SyncMessage contacts * @property {signalservice.SyncMessage.IRequest|null} [request] SyncMessage request * @property {Array.|null} [read] SyncMessage read * @property {signalservice.SyncMessage.IBlocked|null} [blocked] SyncMessage blocked * @property {signalservice.IVerified|null} [verified] SyncMessage verified * @property {signalservice.SyncMessage.IConfiguration|null} [configuration] SyncMessage configuration * @property {Uint8Array|null} [padding] SyncMessage padding * @property {Array.|null} [stickerPackOperation] SyncMessage stickerPackOperation * @property {signalservice.SyncMessage.IViewOnceOpen|null} [viewOnceOpen] SyncMessage viewOnceOpen * @property {signalservice.SyncMessage.IFetchLatest|null} [fetchLatest] SyncMessage fetchLatest * @property {signalservice.SyncMessage.IKeys|null} [keys] SyncMessage keys * @property {signalservice.SyncMessage.IMessageRequestResponse|null} [messageRequestResponse] SyncMessage messageRequestResponse * @property {signalservice.SyncMessage.IOutgoingPayment|null} [outgoingPayment] SyncMessage outgoingPayment * @property {Array.|null} [viewed] SyncMessage viewed * @property {signalservice.SyncMessage.IPniChangeNumber|null} [pniChangeNumber] SyncMessage pniChangeNumber * @property {signalservice.SyncMessage.ICallEvent|null} [callEvent] SyncMessage callEvent * @property {signalservice.SyncMessage.ICallLinkUpdate|null} [callLinkUpdate] SyncMessage callLinkUpdate * @property {signalservice.SyncMessage.ICallLogEvent|null} [callLogEvent] SyncMessage callLogEvent * @property {signalservice.SyncMessage.IDeleteForMe|null} [deleteForMe] SyncMessage deleteForMe * @property {signalservice.SyncMessage.IDeviceNameChange|null} [deviceNameChange] SyncMessage deviceNameChange * @property {signalservice.SyncMessage.IAttachmentBackfillRequest|null} [attachmentBackfillRequest] SyncMessage attachmentBackfillRequest * @property {signalservice.SyncMessage.IAttachmentBackfillResponse|null} [attachmentBackfillResponse] SyncMessage attachmentBackfillResponse */ /** * Constructs a new SyncMessage. * @memberof signalservice * @classdesc Represents a SyncMessage. * @implements ISyncMessage * @constructor * @param {signalservice.ISyncMessage=} [properties] Properties to set */ function SyncMessage(properties) { this.read = []; this.stickerPackOperation = []; this.viewed = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * SyncMessage sent. * @member {signalservice.SyncMessage.ISent|null|undefined} sent * @memberof signalservice.SyncMessage * @instance */ SyncMessage.prototype.sent = null; /** * SyncMessage contacts. * @member {signalservice.SyncMessage.IContacts|null|undefined} contacts * @memberof signalservice.SyncMessage * @instance */ SyncMessage.prototype.contacts = null; /** * SyncMessage request. * @member {signalservice.SyncMessage.IRequest|null|undefined} request * @memberof signalservice.SyncMessage * @instance */ SyncMessage.prototype.request = null; /** * SyncMessage read. * @member {Array.} read * @memberof signalservice.SyncMessage * @instance */ SyncMessage.prototype.read = $util.emptyArray; /** * SyncMessage blocked. * @member {signalservice.SyncMessage.IBlocked|null|undefined} blocked * @memberof signalservice.SyncMessage * @instance */ SyncMessage.prototype.blocked = null; /** * SyncMessage verified. * @member {signalservice.IVerified|null|undefined} verified * @memberof signalservice.SyncMessage * @instance */ SyncMessage.prototype.verified = null; /** * SyncMessage configuration. * @member {signalservice.SyncMessage.IConfiguration|null|undefined} configuration * @memberof signalservice.SyncMessage * @instance */ SyncMessage.prototype.configuration = null; /** * SyncMessage padding. * @member {Uint8Array} padding * @memberof signalservice.SyncMessage * @instance */ SyncMessage.prototype.padding = $util.newBuffer([]); /** * SyncMessage stickerPackOperation. * @member {Array.} stickerPackOperation * @memberof signalservice.SyncMessage * @instance */ SyncMessage.prototype.stickerPackOperation = $util.emptyArray; /** * SyncMessage viewOnceOpen. * @member {signalservice.SyncMessage.IViewOnceOpen|null|undefined} viewOnceOpen * @memberof signalservice.SyncMessage * @instance */ SyncMessage.prototype.viewOnceOpen = null; /** * SyncMessage fetchLatest. * @member {signalservice.SyncMessage.IFetchLatest|null|undefined} fetchLatest * @memberof signalservice.SyncMessage * @instance */ SyncMessage.prototype.fetchLatest = null; /** * SyncMessage keys. * @member {signalservice.SyncMessage.IKeys|null|undefined} keys * @memberof signalservice.SyncMessage * @instance */ SyncMessage.prototype.keys = null; /** * SyncMessage messageRequestResponse. * @member {signalservice.SyncMessage.IMessageRequestResponse|null|undefined} messageRequestResponse * @memberof signalservice.SyncMessage * @instance */ SyncMessage.prototype.messageRequestResponse = null; /** * SyncMessage outgoingPayment. * @member {signalservice.SyncMessage.IOutgoingPayment|null|undefined} outgoingPayment * @memberof signalservice.SyncMessage * @instance */ SyncMessage.prototype.outgoingPayment = null; /** * SyncMessage viewed. * @member {Array.} viewed * @memberof signalservice.SyncMessage * @instance */ SyncMessage.prototype.viewed = $util.emptyArray; /** * SyncMessage pniChangeNumber. * @member {signalservice.SyncMessage.IPniChangeNumber|null|undefined} pniChangeNumber * @memberof signalservice.SyncMessage * @instance */ SyncMessage.prototype.pniChangeNumber = null; /** * SyncMessage callEvent. * @member {signalservice.SyncMessage.ICallEvent|null|undefined} callEvent * @memberof signalservice.SyncMessage * @instance */ SyncMessage.prototype.callEvent = null; /** * SyncMessage callLinkUpdate. * @member {signalservice.SyncMessage.ICallLinkUpdate|null|undefined} callLinkUpdate * @memberof signalservice.SyncMessage * @instance */ SyncMessage.prototype.callLinkUpdate = null; /** * SyncMessage callLogEvent. * @member {signalservice.SyncMessage.ICallLogEvent|null|undefined} callLogEvent * @memberof signalservice.SyncMessage * @instance */ SyncMessage.prototype.callLogEvent = null; /** * SyncMessage deleteForMe. * @member {signalservice.SyncMessage.IDeleteForMe|null|undefined} deleteForMe * @memberof signalservice.SyncMessage * @instance */ SyncMessage.prototype.deleteForMe = null; /** * SyncMessage deviceNameChange. * @member {signalservice.SyncMessage.IDeviceNameChange|null|undefined} deviceNameChange * @memberof signalservice.SyncMessage * @instance */ SyncMessage.prototype.deviceNameChange = null; /** * SyncMessage attachmentBackfillRequest. * @member {signalservice.SyncMessage.IAttachmentBackfillRequest|null|undefined} attachmentBackfillRequest * @memberof signalservice.SyncMessage * @instance */ SyncMessage.prototype.attachmentBackfillRequest = null; /** * SyncMessage attachmentBackfillResponse. * @member {signalservice.SyncMessage.IAttachmentBackfillResponse|null|undefined} attachmentBackfillResponse * @memberof signalservice.SyncMessage * @instance */ SyncMessage.prototype.attachmentBackfillResponse = null; /** * Encodes the specified SyncMessage message. Does not implicitly {@link signalservice.SyncMessage.verify|verify} messages. * @function encode * @memberof signalservice.SyncMessage * @static * @param {signalservice.ISyncMessage} message SyncMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ SyncMessage.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.SyncMessage.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.SyncMessage.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.sent != null && Object.hasOwnProperty.call(message, "sent")) $root.signalservice.SyncMessage.Sent.encode(message.sent, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.contacts != null && Object.hasOwnProperty.call(message, "contacts")) $root.signalservice.SyncMessage.Contacts.encode(message.contacts, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); if (message.request != null && Object.hasOwnProperty.call(message, "request")) $root.signalservice.SyncMessage.Request.encode(message.request, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); if (message.read != null && message.read.length) for (var i = 0; i < message.read.length; ++i) $root.signalservice.SyncMessage.Read.encode(message.read[i], writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); if (message.blocked != null && Object.hasOwnProperty.call(message, "blocked")) $root.signalservice.SyncMessage.Blocked.encode(message.blocked, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim(); if (message.verified != null && Object.hasOwnProperty.call(message, "verified")) $root.signalservice.Verified.encode(message.verified, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim(); if (message.padding != null && Object.hasOwnProperty.call(message, "padding")) writer.uint32(/* id 8, wireType 2 =*/66).bytes(message.padding); if (message.configuration != null && Object.hasOwnProperty.call(message, "configuration")) $root.signalservice.SyncMessage.Configuration.encode(message.configuration, writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim(); if (message.stickerPackOperation != null && message.stickerPackOperation.length) for (var i = 0; i < message.stickerPackOperation.length; ++i) $root.signalservice.SyncMessage.StickerPackOperation.encode(message.stickerPackOperation[i], writer.uint32(/* id 10, wireType 2 =*/82).fork()).ldelim(); if (message.viewOnceOpen != null && Object.hasOwnProperty.call(message, "viewOnceOpen")) $root.signalservice.SyncMessage.ViewOnceOpen.encode(message.viewOnceOpen, writer.uint32(/* id 11, wireType 2 =*/90).fork()).ldelim(); if (message.fetchLatest != null && Object.hasOwnProperty.call(message, "fetchLatest")) $root.signalservice.SyncMessage.FetchLatest.encode(message.fetchLatest, writer.uint32(/* id 12, wireType 2 =*/98).fork()).ldelim(); if (message.keys != null && Object.hasOwnProperty.call(message, "keys")) $root.signalservice.SyncMessage.Keys.encode(message.keys, writer.uint32(/* id 13, wireType 2 =*/106).fork()).ldelim(); if (message.messageRequestResponse != null && Object.hasOwnProperty.call(message, "messageRequestResponse")) $root.signalservice.SyncMessage.MessageRequestResponse.encode(message.messageRequestResponse, writer.uint32(/* id 14, wireType 2 =*/114).fork()).ldelim(); if (message.outgoingPayment != null && Object.hasOwnProperty.call(message, "outgoingPayment")) $root.signalservice.SyncMessage.OutgoingPayment.encode(message.outgoingPayment, writer.uint32(/* id 15, wireType 2 =*/122).fork()).ldelim(); if (message.viewed != null && message.viewed.length) for (var i = 0; i < message.viewed.length; ++i) $root.signalservice.SyncMessage.Viewed.encode(message.viewed[i], writer.uint32(/* id 16, wireType 2 =*/130).fork()).ldelim(); if (message.pniChangeNumber != null && Object.hasOwnProperty.call(message, "pniChangeNumber")) $root.signalservice.SyncMessage.PniChangeNumber.encode(message.pniChangeNumber, writer.uint32(/* id 18, wireType 2 =*/146).fork()).ldelim(); if (message.callEvent != null && Object.hasOwnProperty.call(message, "callEvent")) $root.signalservice.SyncMessage.CallEvent.encode(message.callEvent, writer.uint32(/* id 19, wireType 2 =*/154).fork()).ldelim(); if (message.callLinkUpdate != null && Object.hasOwnProperty.call(message, "callLinkUpdate")) $root.signalservice.SyncMessage.CallLinkUpdate.encode(message.callLinkUpdate, writer.uint32(/* id 20, wireType 2 =*/162).fork()).ldelim(); if (message.callLogEvent != null && Object.hasOwnProperty.call(message, "callLogEvent")) $root.signalservice.SyncMessage.CallLogEvent.encode(message.callLogEvent, writer.uint32(/* id 21, wireType 2 =*/170).fork()).ldelim(); if (message.deleteForMe != null && Object.hasOwnProperty.call(message, "deleteForMe")) $root.signalservice.SyncMessage.DeleteForMe.encode(message.deleteForMe, writer.uint32(/* id 22, wireType 2 =*/178).fork()).ldelim(); if (message.deviceNameChange != null && Object.hasOwnProperty.call(message, "deviceNameChange")) $root.signalservice.SyncMessage.DeviceNameChange.encode(message.deviceNameChange, writer.uint32(/* id 23, wireType 2 =*/186).fork()).ldelim(); if (message.attachmentBackfillRequest != null && Object.hasOwnProperty.call(message, "attachmentBackfillRequest")) $root.signalservice.SyncMessage.AttachmentBackfillRequest.encode(message.attachmentBackfillRequest, writer.uint32(/* id 24, wireType 2 =*/194).fork()).ldelim(); if (message.attachmentBackfillResponse != null && Object.hasOwnProperty.call(message, "attachmentBackfillResponse")) $root.signalservice.SyncMessage.AttachmentBackfillResponse.encode(message.attachmentBackfillResponse, writer.uint32(/* id 25, wireType 2 =*/202).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified SyncMessage message, length delimited. Does not implicitly {@link signalservice.SyncMessage.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.SyncMessage * @static * @param {signalservice.ISyncMessage} message SyncMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ SyncMessage.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a SyncMessage message from the specified reader or buffer. * @function decode * @memberof signalservice.SyncMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.SyncMessage} SyncMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ SyncMessage.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.SyncMessage(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.sent = $root.signalservice.SyncMessage.Sent.decode(reader, reader.uint32()); break; } case 2: { message.contacts = $root.signalservice.SyncMessage.Contacts.decode(reader, reader.uint32()); break; } case 4: { message.request = $root.signalservice.SyncMessage.Request.decode(reader, reader.uint32()); break; } case 5: { if (!(message.read && message.read.length)) message.read = []; message.read.push($root.signalservice.SyncMessage.Read.decode(reader, reader.uint32())); break; } case 6: { message.blocked = $root.signalservice.SyncMessage.Blocked.decode(reader, reader.uint32()); break; } case 7: { message.verified = $root.signalservice.Verified.decode(reader, reader.uint32()); break; } case 9: { message.configuration = $root.signalservice.SyncMessage.Configuration.decode(reader, reader.uint32()); break; } case 8: { message.padding = reader.bytes(); break; } case 10: { if (!(message.stickerPackOperation && message.stickerPackOperation.length)) message.stickerPackOperation = []; message.stickerPackOperation.push($root.signalservice.SyncMessage.StickerPackOperation.decode(reader, reader.uint32())); break; } case 11: { message.viewOnceOpen = $root.signalservice.SyncMessage.ViewOnceOpen.decode(reader, reader.uint32()); break; } case 12: { message.fetchLatest = $root.signalservice.SyncMessage.FetchLatest.decode(reader, reader.uint32()); break; } case 13: { message.keys = $root.signalservice.SyncMessage.Keys.decode(reader, reader.uint32()); break; } case 14: { message.messageRequestResponse = $root.signalservice.SyncMessage.MessageRequestResponse.decode(reader, reader.uint32()); break; } case 15: { message.outgoingPayment = $root.signalservice.SyncMessage.OutgoingPayment.decode(reader, reader.uint32()); break; } case 16: { if (!(message.viewed && message.viewed.length)) message.viewed = []; message.viewed.push($root.signalservice.SyncMessage.Viewed.decode(reader, reader.uint32())); break; } case 18: { message.pniChangeNumber = $root.signalservice.SyncMessage.PniChangeNumber.decode(reader, reader.uint32()); break; } case 19: { message.callEvent = $root.signalservice.SyncMessage.CallEvent.decode(reader, reader.uint32()); break; } case 20: { message.callLinkUpdate = $root.signalservice.SyncMessage.CallLinkUpdate.decode(reader, reader.uint32()); break; } case 21: { message.callLogEvent = $root.signalservice.SyncMessage.CallLogEvent.decode(reader, reader.uint32()); break; } case 22: { message.deleteForMe = $root.signalservice.SyncMessage.DeleteForMe.decode(reader, reader.uint32()); break; } case 23: { message.deviceNameChange = $root.signalservice.SyncMessage.DeviceNameChange.decode(reader, reader.uint32()); break; } case 24: { message.attachmentBackfillRequest = $root.signalservice.SyncMessage.AttachmentBackfillRequest.decode(reader, reader.uint32()); break; } case 25: { message.attachmentBackfillResponse = $root.signalservice.SyncMessage.AttachmentBackfillResponse.decode(reader, reader.uint32()); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a SyncMessage message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.SyncMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.SyncMessage} SyncMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ SyncMessage.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; SyncMessage.Sent = (function() { /** * Properties of a Sent. * @memberof signalservice.SyncMessage * @interface ISent * @property {string|null} [destinationE164] Sent destinationE164 * @property {string|null} [destinationServiceId] Sent destinationServiceId * @property {Long|null} [timestamp] Sent timestamp * @property {signalservice.IDataMessage|null} [message] Sent message * @property {Long|null} [expirationStartTimestamp] Sent expirationStartTimestamp * @property {Array.|null} [unidentifiedStatus] Sent unidentifiedStatus * @property {boolean|null} [isRecipientUpdate] Sent isRecipientUpdate * @property {signalservice.IStoryMessage|null} [storyMessage] Sent storyMessage * @property {Array.|null} [storyMessageRecipients] Sent storyMessageRecipients * @property {signalservice.IEditMessage|null} [editMessage] Sent editMessage * @property {Uint8Array|null} [destinationServiceIdBinary] Sent destinationServiceIdBinary */ /** * Constructs a new Sent. * @memberof signalservice.SyncMessage * @classdesc Represents a Sent. * @implements ISent * @constructor * @param {signalservice.SyncMessage.ISent=} [properties] Properties to set */ function Sent(properties) { this.unidentifiedStatus = []; this.storyMessageRecipients = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Sent destinationE164. * @member {string} destinationE164 * @memberof signalservice.SyncMessage.Sent * @instance */ Sent.prototype.destinationE164 = ""; /** * Sent destinationServiceId. * @member {string} destinationServiceId * @memberof signalservice.SyncMessage.Sent * @instance */ Sent.prototype.destinationServiceId = ""; /** * Sent timestamp. * @member {Long} timestamp * @memberof signalservice.SyncMessage.Sent * @instance */ Sent.prototype.timestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * Sent message. * @member {signalservice.IDataMessage|null|undefined} message * @memberof signalservice.SyncMessage.Sent * @instance */ Sent.prototype.message = null; /** * Sent expirationStartTimestamp. * @member {Long} expirationStartTimestamp * @memberof signalservice.SyncMessage.Sent * @instance */ Sent.prototype.expirationStartTimestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * Sent unidentifiedStatus. * @member {Array.} unidentifiedStatus * @memberof signalservice.SyncMessage.Sent * @instance */ Sent.prototype.unidentifiedStatus = $util.emptyArray; /** * Sent isRecipientUpdate. * @member {boolean} isRecipientUpdate * @memberof signalservice.SyncMessage.Sent * @instance */ Sent.prototype.isRecipientUpdate = false; /** * Sent storyMessage. * @member {signalservice.IStoryMessage|null|undefined} storyMessage * @memberof signalservice.SyncMessage.Sent * @instance */ Sent.prototype.storyMessage = null; /** * Sent storyMessageRecipients. * @member {Array.} storyMessageRecipients * @memberof signalservice.SyncMessage.Sent * @instance */ Sent.prototype.storyMessageRecipients = $util.emptyArray; /** * Sent editMessage. * @member {signalservice.IEditMessage|null|undefined} editMessage * @memberof signalservice.SyncMessage.Sent * @instance */ Sent.prototype.editMessage = null; /** * Sent destinationServiceIdBinary. * @member {Uint8Array} destinationServiceIdBinary * @memberof signalservice.SyncMessage.Sent * @instance */ Sent.prototype.destinationServiceIdBinary = $util.newBuffer([]); /** * Encodes the specified Sent message. Does not implicitly {@link signalservice.SyncMessage.Sent.verify|verify} messages. * @function encode * @memberof signalservice.SyncMessage.Sent * @static * @param {signalservice.SyncMessage.ISent} message Sent message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Sent.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.SyncMessage.Sent.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.SyncMessage.Sent.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.destinationE164 != null && Object.hasOwnProperty.call(message, "destinationE164")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.destinationE164); if (message.timestamp != null && Object.hasOwnProperty.call(message, "timestamp")) writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.timestamp); if (message.message != null && Object.hasOwnProperty.call(message, "message")) $root.signalservice.DataMessage.encode(message.message, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); if (message.expirationStartTimestamp != null && Object.hasOwnProperty.call(message, "expirationStartTimestamp")) writer.uint32(/* id 4, wireType 0 =*/32).uint64(message.expirationStartTimestamp); if (message.unidentifiedStatus != null && message.unidentifiedStatus.length) for (var i = 0; i < message.unidentifiedStatus.length; ++i) $root.signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus.encode(message.unidentifiedStatus[i], writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); if (message.isRecipientUpdate != null && Object.hasOwnProperty.call(message, "isRecipientUpdate")) writer.uint32(/* id 6, wireType 0 =*/48).bool(message.isRecipientUpdate); if (message.destinationServiceId != null && Object.hasOwnProperty.call(message, "destinationServiceId")) writer.uint32(/* id 7, wireType 2 =*/58).string(message.destinationServiceId); if (message.storyMessage != null && Object.hasOwnProperty.call(message, "storyMessage")) $root.signalservice.StoryMessage.encode(message.storyMessage, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim(); if (message.storyMessageRecipients != null && message.storyMessageRecipients.length) for (var i = 0; i < message.storyMessageRecipients.length; ++i) $root.signalservice.SyncMessage.Sent.StoryMessageRecipient.encode(message.storyMessageRecipients[i], writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim(); if (message.editMessage != null && Object.hasOwnProperty.call(message, "editMessage")) $root.signalservice.EditMessage.encode(message.editMessage, writer.uint32(/* id 10, wireType 2 =*/82).fork()).ldelim(); if (message.destinationServiceIdBinary != null && Object.hasOwnProperty.call(message, "destinationServiceIdBinary")) writer.uint32(/* id 12, wireType 2 =*/98).bytes(message.destinationServiceIdBinary); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Sent message, length delimited. Does not implicitly {@link signalservice.SyncMessage.Sent.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.SyncMessage.Sent * @static * @param {signalservice.SyncMessage.ISent} message Sent message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Sent.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Sent message from the specified reader or buffer. * @function decode * @memberof signalservice.SyncMessage.Sent * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.SyncMessage.Sent} Sent * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Sent.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.SyncMessage.Sent(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.destinationE164 = reader.string(); break; } case 7: { message.destinationServiceId = reader.string(); break; } case 2: { message.timestamp = reader.uint64(); break; } case 3: { message.message = $root.signalservice.DataMessage.decode(reader, reader.uint32()); break; } case 4: { message.expirationStartTimestamp = reader.uint64(); break; } case 5: { if (!(message.unidentifiedStatus && message.unidentifiedStatus.length)) message.unidentifiedStatus = []; message.unidentifiedStatus.push($root.signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus.decode(reader, reader.uint32())); break; } case 6: { message.isRecipientUpdate = reader.bool(); break; } case 8: { message.storyMessage = $root.signalservice.StoryMessage.decode(reader, reader.uint32()); break; } case 9: { if (!(message.storyMessageRecipients && message.storyMessageRecipients.length)) message.storyMessageRecipients = []; message.storyMessageRecipients.push($root.signalservice.SyncMessage.Sent.StoryMessageRecipient.decode(reader, reader.uint32())); break; } case 10: { message.editMessage = $root.signalservice.EditMessage.decode(reader, reader.uint32()); break; } case 12: { message.destinationServiceIdBinary = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Sent message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.SyncMessage.Sent * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.SyncMessage.Sent} Sent * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Sent.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; Sent.UnidentifiedDeliveryStatus = (function() { /** * Properties of an UnidentifiedDeliveryStatus. * @memberof signalservice.SyncMessage.Sent * @interface IUnidentifiedDeliveryStatus * @property {string|null} [destinationServiceId] UnidentifiedDeliveryStatus destinationServiceId * @property {boolean|null} [unidentified] UnidentifiedDeliveryStatus unidentified * @property {Uint8Array|null} [destinationPniIdentityKey] UnidentifiedDeliveryStatus destinationPniIdentityKey * @property {Uint8Array|null} [destinationServiceIdBinary] UnidentifiedDeliveryStatus destinationServiceIdBinary */ /** * Constructs a new UnidentifiedDeliveryStatus. * @memberof signalservice.SyncMessage.Sent * @classdesc Represents an UnidentifiedDeliveryStatus. * @implements IUnidentifiedDeliveryStatus * @constructor * @param {signalservice.SyncMessage.Sent.IUnidentifiedDeliveryStatus=} [properties] Properties to set */ function UnidentifiedDeliveryStatus(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * UnidentifiedDeliveryStatus destinationServiceId. * @member {string} destinationServiceId * @memberof signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus * @instance */ UnidentifiedDeliveryStatus.prototype.destinationServiceId = ""; /** * UnidentifiedDeliveryStatus unidentified. * @member {boolean} unidentified * @memberof signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus * @instance */ UnidentifiedDeliveryStatus.prototype.unidentified = false; /** * UnidentifiedDeliveryStatus destinationPniIdentityKey. * @member {Uint8Array} destinationPniIdentityKey * @memberof signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus * @instance */ UnidentifiedDeliveryStatus.prototype.destinationPniIdentityKey = $util.newBuffer([]); /** * UnidentifiedDeliveryStatus destinationServiceIdBinary. * @member {Uint8Array} destinationServiceIdBinary * @memberof signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus * @instance */ UnidentifiedDeliveryStatus.prototype.destinationServiceIdBinary = $util.newBuffer([]); /** * Encodes the specified UnidentifiedDeliveryStatus message. Does not implicitly {@link signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus.verify|verify} messages. * @function encode * @memberof signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus * @static * @param {signalservice.SyncMessage.Sent.IUnidentifiedDeliveryStatus} message UnidentifiedDeliveryStatus message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ UnidentifiedDeliveryStatus.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.unidentified != null && Object.hasOwnProperty.call(message, "unidentified")) writer.uint32(/* id 2, wireType 0 =*/16).bool(message.unidentified); if (message.destinationServiceId != null && Object.hasOwnProperty.call(message, "destinationServiceId")) writer.uint32(/* id 3, wireType 2 =*/26).string(message.destinationServiceId); if (message.destinationPniIdentityKey != null && Object.hasOwnProperty.call(message, "destinationPniIdentityKey")) writer.uint32(/* id 5, wireType 2 =*/42).bytes(message.destinationPniIdentityKey); if (message.destinationServiceIdBinary != null && Object.hasOwnProperty.call(message, "destinationServiceIdBinary")) writer.uint32(/* id 6, wireType 2 =*/50).bytes(message.destinationServiceIdBinary); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified UnidentifiedDeliveryStatus message, length delimited. Does not implicitly {@link signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus * @static * @param {signalservice.SyncMessage.Sent.IUnidentifiedDeliveryStatus} message UnidentifiedDeliveryStatus message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ UnidentifiedDeliveryStatus.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an UnidentifiedDeliveryStatus message from the specified reader or buffer. * @function decode * @memberof signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus} UnidentifiedDeliveryStatus * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ UnidentifiedDeliveryStatus.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 3: { message.destinationServiceId = reader.string(); break; } case 2: { message.unidentified = reader.bool(); break; } case 5: { message.destinationPniIdentityKey = reader.bytes(); break; } case 6: { message.destinationServiceIdBinary = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an UnidentifiedDeliveryStatus message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus} UnidentifiedDeliveryStatus * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ UnidentifiedDeliveryStatus.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return UnidentifiedDeliveryStatus; })(); Sent.StoryMessageRecipient = (function() { /** * Properties of a StoryMessageRecipient. * @memberof signalservice.SyncMessage.Sent * @interface IStoryMessageRecipient * @property {string|null} [destinationServiceId] StoryMessageRecipient destinationServiceId * @property {Array.|null} [distributionListIds] StoryMessageRecipient distributionListIds * @property {boolean|null} [isAllowedToReply] StoryMessageRecipient isAllowedToReply * @property {Uint8Array|null} [destinationServiceIdBinary] StoryMessageRecipient destinationServiceIdBinary */ /** * Constructs a new StoryMessageRecipient. * @memberof signalservice.SyncMessage.Sent * @classdesc Represents a StoryMessageRecipient. * @implements IStoryMessageRecipient * @constructor * @param {signalservice.SyncMessage.Sent.IStoryMessageRecipient=} [properties] Properties to set */ function StoryMessageRecipient(properties) { this.distributionListIds = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * StoryMessageRecipient destinationServiceId. * @member {string} destinationServiceId * @memberof signalservice.SyncMessage.Sent.StoryMessageRecipient * @instance */ StoryMessageRecipient.prototype.destinationServiceId = ""; /** * StoryMessageRecipient distributionListIds. * @member {Array.} distributionListIds * @memberof signalservice.SyncMessage.Sent.StoryMessageRecipient * @instance */ StoryMessageRecipient.prototype.distributionListIds = $util.emptyArray; /** * StoryMessageRecipient isAllowedToReply. * @member {boolean} isAllowedToReply * @memberof signalservice.SyncMessage.Sent.StoryMessageRecipient * @instance */ StoryMessageRecipient.prototype.isAllowedToReply = false; /** * StoryMessageRecipient destinationServiceIdBinary. * @member {Uint8Array} destinationServiceIdBinary * @memberof signalservice.SyncMessage.Sent.StoryMessageRecipient * @instance */ StoryMessageRecipient.prototype.destinationServiceIdBinary = $util.newBuffer([]); /** * Encodes the specified StoryMessageRecipient message. Does not implicitly {@link signalservice.SyncMessage.Sent.StoryMessageRecipient.verify|verify} messages. * @function encode * @memberof signalservice.SyncMessage.Sent.StoryMessageRecipient * @static * @param {signalservice.SyncMessage.Sent.IStoryMessageRecipient} message StoryMessageRecipient message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ StoryMessageRecipient.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.SyncMessage.Sent.StoryMessageRecipient.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.SyncMessage.Sent.StoryMessageRecipient.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.destinationServiceId != null && Object.hasOwnProperty.call(message, "destinationServiceId")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.destinationServiceId); if (message.distributionListIds != null && message.distributionListIds.length) for (var i = 0; i < message.distributionListIds.length; ++i) writer.uint32(/* id 2, wireType 2 =*/18).string(message.distributionListIds[i]); if (message.isAllowedToReply != null && Object.hasOwnProperty.call(message, "isAllowedToReply")) writer.uint32(/* id 3, wireType 0 =*/24).bool(message.isAllowedToReply); if (message.destinationServiceIdBinary != null && Object.hasOwnProperty.call(message, "destinationServiceIdBinary")) writer.uint32(/* id 5, wireType 2 =*/42).bytes(message.destinationServiceIdBinary); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified StoryMessageRecipient message, length delimited. Does not implicitly {@link signalservice.SyncMessage.Sent.StoryMessageRecipient.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.SyncMessage.Sent.StoryMessageRecipient * @static * @param {signalservice.SyncMessage.Sent.IStoryMessageRecipient} message StoryMessageRecipient message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ StoryMessageRecipient.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a StoryMessageRecipient message from the specified reader or buffer. * @function decode * @memberof signalservice.SyncMessage.Sent.StoryMessageRecipient * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.SyncMessage.Sent.StoryMessageRecipient} StoryMessageRecipient * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ StoryMessageRecipient.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.SyncMessage.Sent.StoryMessageRecipient(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.destinationServiceId = reader.string(); break; } case 2: { if (!(message.distributionListIds && message.distributionListIds.length)) message.distributionListIds = []; message.distributionListIds.push(reader.string()); break; } case 3: { message.isAllowedToReply = reader.bool(); break; } case 5: { message.destinationServiceIdBinary = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a StoryMessageRecipient message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.SyncMessage.Sent.StoryMessageRecipient * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.SyncMessage.Sent.StoryMessageRecipient} StoryMessageRecipient * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ StoryMessageRecipient.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return StoryMessageRecipient; })(); return Sent; })(); SyncMessage.Contacts = (function() { /** * Properties of a Contacts. * @memberof signalservice.SyncMessage * @interface IContacts * @property {signalservice.IAttachmentPointer|null} [blob] Contacts blob * @property {boolean|null} [complete] Contacts complete */ /** * Constructs a new Contacts. * @memberof signalservice.SyncMessage * @classdesc Represents a Contacts. * @implements IContacts * @constructor * @param {signalservice.SyncMessage.IContacts=} [properties] Properties to set */ function Contacts(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Contacts blob. * @member {signalservice.IAttachmentPointer|null|undefined} blob * @memberof signalservice.SyncMessage.Contacts * @instance */ Contacts.prototype.blob = null; /** * Contacts complete. * @member {boolean} complete * @memberof signalservice.SyncMessage.Contacts * @instance */ Contacts.prototype.complete = false; /** * Encodes the specified Contacts message. Does not implicitly {@link signalservice.SyncMessage.Contacts.verify|verify} messages. * @function encode * @memberof signalservice.SyncMessage.Contacts * @static * @param {signalservice.SyncMessage.IContacts} message Contacts message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Contacts.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.SyncMessage.Contacts.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.SyncMessage.Contacts.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.blob != null && Object.hasOwnProperty.call(message, "blob")) $root.signalservice.AttachmentPointer.encode(message.blob, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.complete != null && Object.hasOwnProperty.call(message, "complete")) writer.uint32(/* id 2, wireType 0 =*/16).bool(message.complete); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Contacts message, length delimited. Does not implicitly {@link signalservice.SyncMessage.Contacts.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.SyncMessage.Contacts * @static * @param {signalservice.SyncMessage.IContacts} message Contacts message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Contacts.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Contacts message from the specified reader or buffer. * @function decode * @memberof signalservice.SyncMessage.Contacts * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.SyncMessage.Contacts} Contacts * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Contacts.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.SyncMessage.Contacts(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.blob = $root.signalservice.AttachmentPointer.decode(reader, reader.uint32()); break; } case 2: { message.complete = reader.bool(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Contacts message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.SyncMessage.Contacts * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.SyncMessage.Contacts} Contacts * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Contacts.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return Contacts; })(); SyncMessage.Blocked = (function() { /** * Properties of a Blocked. * @memberof signalservice.SyncMessage * @interface IBlocked * @property {Array.|null} [numbers] Blocked numbers * @property {Array.|null} [acis] Blocked acis * @property {Array.|null} [groupIds] Blocked groupIds * @property {Array.|null} [acisBinary] Blocked acisBinary */ /** * Constructs a new Blocked. * @memberof signalservice.SyncMessage * @classdesc Represents a Blocked. * @implements IBlocked * @constructor * @param {signalservice.SyncMessage.IBlocked=} [properties] Properties to set */ function Blocked(properties) { this.numbers = []; this.acis = []; this.groupIds = []; this.acisBinary = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Blocked numbers. * @member {Array.} numbers * @memberof signalservice.SyncMessage.Blocked * @instance */ Blocked.prototype.numbers = $util.emptyArray; /** * Blocked acis. * @member {Array.} acis * @memberof signalservice.SyncMessage.Blocked * @instance */ Blocked.prototype.acis = $util.emptyArray; /** * Blocked groupIds. * @member {Array.} groupIds * @memberof signalservice.SyncMessage.Blocked * @instance */ Blocked.prototype.groupIds = $util.emptyArray; /** * Blocked acisBinary. * @member {Array.} acisBinary * @memberof signalservice.SyncMessage.Blocked * @instance */ Blocked.prototype.acisBinary = $util.emptyArray; /** * Encodes the specified Blocked message. Does not implicitly {@link signalservice.SyncMessage.Blocked.verify|verify} messages. * @function encode * @memberof signalservice.SyncMessage.Blocked * @static * @param {signalservice.SyncMessage.IBlocked} message Blocked message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Blocked.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.SyncMessage.Blocked.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.SyncMessage.Blocked.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.numbers != null && message.numbers.length) for (var i = 0; i < message.numbers.length; ++i) writer.uint32(/* id 1, wireType 2 =*/10).string(message.numbers[i]); if (message.groupIds != null && message.groupIds.length) for (var i = 0; i < message.groupIds.length; ++i) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.groupIds[i]); if (message.acis != null && message.acis.length) for (var i = 0; i < message.acis.length; ++i) writer.uint32(/* id 3, wireType 2 =*/26).string(message.acis[i]); if (message.acisBinary != null && message.acisBinary.length) for (var i = 0; i < message.acisBinary.length; ++i) writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.acisBinary[i]); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Blocked message, length delimited. Does not implicitly {@link signalservice.SyncMessage.Blocked.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.SyncMessage.Blocked * @static * @param {signalservice.SyncMessage.IBlocked} message Blocked message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Blocked.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Blocked message from the specified reader or buffer. * @function decode * @memberof signalservice.SyncMessage.Blocked * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.SyncMessage.Blocked} Blocked * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Blocked.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.SyncMessage.Blocked(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { if (!(message.numbers && message.numbers.length)) message.numbers = []; message.numbers.push(reader.string()); break; } case 3: { if (!(message.acis && message.acis.length)) message.acis = []; message.acis.push(reader.string()); break; } case 2: { if (!(message.groupIds && message.groupIds.length)) message.groupIds = []; message.groupIds.push(reader.bytes()); break; } case 4: { if (!(message.acisBinary && message.acisBinary.length)) message.acisBinary = []; message.acisBinary.push(reader.bytes()); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Blocked message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.SyncMessage.Blocked * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.SyncMessage.Blocked} Blocked * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Blocked.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return Blocked; })(); SyncMessage.Request = (function() { /** * Properties of a Request. * @memberof signalservice.SyncMessage * @interface IRequest * @property {signalservice.SyncMessage.Request.Type|null} [type] Request type */ /** * Constructs a new Request. * @memberof signalservice.SyncMessage * @classdesc Represents a Request. * @implements IRequest * @constructor * @param {signalservice.SyncMessage.IRequest=} [properties] Properties to set */ function Request(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Request type. * @member {signalservice.SyncMessage.Request.Type} type * @memberof signalservice.SyncMessage.Request * @instance */ Request.prototype.type = 0; /** * Encodes the specified Request message. Does not implicitly {@link signalservice.SyncMessage.Request.verify|verify} messages. * @function encode * @memberof signalservice.SyncMessage.Request * @static * @param {signalservice.SyncMessage.IRequest} message Request message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Request.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.SyncMessage.Request.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.SyncMessage.Request.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.type != null && Object.hasOwnProperty.call(message, "type")) writer.uint32(/* id 1, wireType 0 =*/8).int32(message.type); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Request message, length delimited. Does not implicitly {@link signalservice.SyncMessage.Request.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.SyncMessage.Request * @static * @param {signalservice.SyncMessage.IRequest} message Request message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Request.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Request message from the specified reader or buffer. * @function decode * @memberof signalservice.SyncMessage.Request * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.SyncMessage.Request} Request * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Request.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.SyncMessage.Request(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.type = reader.int32(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Request message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.SyncMessage.Request * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.SyncMessage.Request} Request * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Request.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * Type enum. * @name signalservice.SyncMessage.Request.Type * @enum {number} * @property {number} UNKNOWN=0 UNKNOWN value * @property {number} CONTACTS=1 CONTACTS value * @property {number} BLOCKED=3 BLOCKED value * @property {number} CONFIGURATION=4 CONFIGURATION value * @property {number} KEYS=5 KEYS value */ Request.Type = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "UNKNOWN"] = 0; values[valuesById[1] = "CONTACTS"] = 1; values[valuesById[3] = "BLOCKED"] = 3; values[valuesById[4] = "CONFIGURATION"] = 4; values[valuesById[5] = "KEYS"] = 5; return values; })(); return Request; })(); SyncMessage.Read = (function() { /** * Properties of a Read. * @memberof signalservice.SyncMessage * @interface IRead * @property {string|null} [senderAci] Read senderAci * @property {Long|null} [timestamp] Read timestamp * @property {Uint8Array|null} [senderAciBinary] Read senderAciBinary */ /** * Constructs a new Read. * @memberof signalservice.SyncMessage * @classdesc Represents a Read. * @implements IRead * @constructor * @param {signalservice.SyncMessage.IRead=} [properties] Properties to set */ function Read(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Read senderAci. * @member {string} senderAci * @memberof signalservice.SyncMessage.Read * @instance */ Read.prototype.senderAci = ""; /** * Read timestamp. * @member {Long} timestamp * @memberof signalservice.SyncMessage.Read * @instance */ Read.prototype.timestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * Read senderAciBinary. * @member {Uint8Array} senderAciBinary * @memberof signalservice.SyncMessage.Read * @instance */ Read.prototype.senderAciBinary = $util.newBuffer([]); /** * Encodes the specified Read message. Does not implicitly {@link signalservice.SyncMessage.Read.verify|verify} messages. * @function encode * @memberof signalservice.SyncMessage.Read * @static * @param {signalservice.SyncMessage.IRead} message Read message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Read.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.SyncMessage.Read.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.SyncMessage.Read.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.timestamp != null && Object.hasOwnProperty.call(message, "timestamp")) writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.timestamp); if (message.senderAci != null && Object.hasOwnProperty.call(message, "senderAci")) writer.uint32(/* id 3, wireType 2 =*/26).string(message.senderAci); if (message.senderAciBinary != null && Object.hasOwnProperty.call(message, "senderAciBinary")) writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.senderAciBinary); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Read message, length delimited. Does not implicitly {@link signalservice.SyncMessage.Read.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.SyncMessage.Read * @static * @param {signalservice.SyncMessage.IRead} message Read message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Read.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Read message from the specified reader or buffer. * @function decode * @memberof signalservice.SyncMessage.Read * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.SyncMessage.Read} Read * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Read.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.SyncMessage.Read(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 3: { message.senderAci = reader.string(); break; } case 2: { message.timestamp = reader.uint64(); break; } case 4: { message.senderAciBinary = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Read message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.SyncMessage.Read * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.SyncMessage.Read} Read * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Read.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return Read; })(); SyncMessage.Viewed = (function() { /** * Properties of a Viewed. * @memberof signalservice.SyncMessage * @interface IViewed * @property {string|null} [senderAci] Viewed senderAci * @property {Long|null} [timestamp] Viewed timestamp * @property {Uint8Array|null} [senderAciBinary] Viewed senderAciBinary */ /** * Constructs a new Viewed. * @memberof signalservice.SyncMessage * @classdesc Represents a Viewed. * @implements IViewed * @constructor * @param {signalservice.SyncMessage.IViewed=} [properties] Properties to set */ function Viewed(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Viewed senderAci. * @member {string} senderAci * @memberof signalservice.SyncMessage.Viewed * @instance */ Viewed.prototype.senderAci = ""; /** * Viewed timestamp. * @member {Long} timestamp * @memberof signalservice.SyncMessage.Viewed * @instance */ Viewed.prototype.timestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * Viewed senderAciBinary. * @member {Uint8Array} senderAciBinary * @memberof signalservice.SyncMessage.Viewed * @instance */ Viewed.prototype.senderAciBinary = $util.newBuffer([]); /** * Encodes the specified Viewed message. Does not implicitly {@link signalservice.SyncMessage.Viewed.verify|verify} messages. * @function encode * @memberof signalservice.SyncMessage.Viewed * @static * @param {signalservice.SyncMessage.IViewed} message Viewed message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Viewed.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.SyncMessage.Viewed.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.SyncMessage.Viewed.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.timestamp != null && Object.hasOwnProperty.call(message, "timestamp")) writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.timestamp); if (message.senderAci != null && Object.hasOwnProperty.call(message, "senderAci")) writer.uint32(/* id 3, wireType 2 =*/26).string(message.senderAci); if (message.senderAciBinary != null && Object.hasOwnProperty.call(message, "senderAciBinary")) writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.senderAciBinary); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Viewed message, length delimited. Does not implicitly {@link signalservice.SyncMessage.Viewed.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.SyncMessage.Viewed * @static * @param {signalservice.SyncMessage.IViewed} message Viewed message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Viewed.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Viewed message from the specified reader or buffer. * @function decode * @memberof signalservice.SyncMessage.Viewed * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.SyncMessage.Viewed} Viewed * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Viewed.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.SyncMessage.Viewed(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 3: { message.senderAci = reader.string(); break; } case 2: { message.timestamp = reader.uint64(); break; } case 4: { message.senderAciBinary = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Viewed message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.SyncMessage.Viewed * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.SyncMessage.Viewed} Viewed * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Viewed.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return Viewed; })(); SyncMessage.Configuration = (function() { /** * Properties of a Configuration. * @memberof signalservice.SyncMessage * @interface IConfiguration * @property {boolean|null} [readReceipts] Configuration readReceipts * @property {boolean|null} [unidentifiedDeliveryIndicators] Configuration unidentifiedDeliveryIndicators * @property {boolean|null} [typingIndicators] Configuration typingIndicators * @property {number|null} [provisioningVersion] Configuration provisioningVersion * @property {boolean|null} [linkPreviews] Configuration linkPreviews */ /** * Constructs a new Configuration. * @memberof signalservice.SyncMessage * @classdesc Represents a Configuration. * @implements IConfiguration * @constructor * @param {signalservice.SyncMessage.IConfiguration=} [properties] Properties to set */ function Configuration(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Configuration readReceipts. * @member {boolean} readReceipts * @memberof signalservice.SyncMessage.Configuration * @instance */ Configuration.prototype.readReceipts = false; /** * Configuration unidentifiedDeliveryIndicators. * @member {boolean} unidentifiedDeliveryIndicators * @memberof signalservice.SyncMessage.Configuration * @instance */ Configuration.prototype.unidentifiedDeliveryIndicators = false; /** * Configuration typingIndicators. * @member {boolean} typingIndicators * @memberof signalservice.SyncMessage.Configuration * @instance */ Configuration.prototype.typingIndicators = false; /** * Configuration provisioningVersion. * @member {number} provisioningVersion * @memberof signalservice.SyncMessage.Configuration * @instance */ Configuration.prototype.provisioningVersion = 0; /** * Configuration linkPreviews. * @member {boolean} linkPreviews * @memberof signalservice.SyncMessage.Configuration * @instance */ Configuration.prototype.linkPreviews = false; /** * Encodes the specified Configuration message. Does not implicitly {@link signalservice.SyncMessage.Configuration.verify|verify} messages. * @function encode * @memberof signalservice.SyncMessage.Configuration * @static * @param {signalservice.SyncMessage.IConfiguration} message Configuration message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Configuration.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.SyncMessage.Configuration.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.SyncMessage.Configuration.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.readReceipts != null && Object.hasOwnProperty.call(message, "readReceipts")) writer.uint32(/* id 1, wireType 0 =*/8).bool(message.readReceipts); if (message.unidentifiedDeliveryIndicators != null && Object.hasOwnProperty.call(message, "unidentifiedDeliveryIndicators")) writer.uint32(/* id 2, wireType 0 =*/16).bool(message.unidentifiedDeliveryIndicators); if (message.typingIndicators != null && Object.hasOwnProperty.call(message, "typingIndicators")) writer.uint32(/* id 3, wireType 0 =*/24).bool(message.typingIndicators); if (message.provisioningVersion != null && Object.hasOwnProperty.call(message, "provisioningVersion")) writer.uint32(/* id 5, wireType 0 =*/40).uint32(message.provisioningVersion); if (message.linkPreviews != null && Object.hasOwnProperty.call(message, "linkPreviews")) writer.uint32(/* id 6, wireType 0 =*/48).bool(message.linkPreviews); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Configuration message, length delimited. Does not implicitly {@link signalservice.SyncMessage.Configuration.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.SyncMessage.Configuration * @static * @param {signalservice.SyncMessage.IConfiguration} message Configuration message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Configuration.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Configuration message from the specified reader or buffer. * @function decode * @memberof signalservice.SyncMessage.Configuration * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.SyncMessage.Configuration} Configuration * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Configuration.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.SyncMessage.Configuration(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.readReceipts = reader.bool(); break; } case 2: { message.unidentifiedDeliveryIndicators = reader.bool(); break; } case 3: { message.typingIndicators = reader.bool(); break; } case 5: { message.provisioningVersion = reader.uint32(); break; } case 6: { message.linkPreviews = reader.bool(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Configuration message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.SyncMessage.Configuration * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.SyncMessage.Configuration} Configuration * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Configuration.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return Configuration; })(); SyncMessage.StickerPackOperation = (function() { /** * Properties of a StickerPackOperation. * @memberof signalservice.SyncMessage * @interface IStickerPackOperation * @property {Uint8Array|null} [packId] StickerPackOperation packId * @property {Uint8Array|null} [packKey] StickerPackOperation packKey * @property {signalservice.SyncMessage.StickerPackOperation.Type|null} [type] StickerPackOperation type */ /** * Constructs a new StickerPackOperation. * @memberof signalservice.SyncMessage * @classdesc Represents a StickerPackOperation. * @implements IStickerPackOperation * @constructor * @param {signalservice.SyncMessage.IStickerPackOperation=} [properties] Properties to set */ function StickerPackOperation(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * StickerPackOperation packId. * @member {Uint8Array} packId * @memberof signalservice.SyncMessage.StickerPackOperation * @instance */ StickerPackOperation.prototype.packId = $util.newBuffer([]); /** * StickerPackOperation packKey. * @member {Uint8Array} packKey * @memberof signalservice.SyncMessage.StickerPackOperation * @instance */ StickerPackOperation.prototype.packKey = $util.newBuffer([]); /** * StickerPackOperation type. * @member {signalservice.SyncMessage.StickerPackOperation.Type} type * @memberof signalservice.SyncMessage.StickerPackOperation * @instance */ StickerPackOperation.prototype.type = 0; /** * Encodes the specified StickerPackOperation message. Does not implicitly {@link signalservice.SyncMessage.StickerPackOperation.verify|verify} messages. * @function encode * @memberof signalservice.SyncMessage.StickerPackOperation * @static * @param {signalservice.SyncMessage.IStickerPackOperation} message StickerPackOperation message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ StickerPackOperation.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.SyncMessage.StickerPackOperation.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.SyncMessage.StickerPackOperation.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.packId != null && Object.hasOwnProperty.call(message, "packId")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.packId); if (message.packKey != null && Object.hasOwnProperty.call(message, "packKey")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.packKey); if (message.type != null && Object.hasOwnProperty.call(message, "type")) writer.uint32(/* id 3, wireType 0 =*/24).int32(message.type); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified StickerPackOperation message, length delimited. Does not implicitly {@link signalservice.SyncMessage.StickerPackOperation.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.SyncMessage.StickerPackOperation * @static * @param {signalservice.SyncMessage.IStickerPackOperation} message StickerPackOperation message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ StickerPackOperation.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a StickerPackOperation message from the specified reader or buffer. * @function decode * @memberof signalservice.SyncMessage.StickerPackOperation * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.SyncMessage.StickerPackOperation} StickerPackOperation * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ StickerPackOperation.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.SyncMessage.StickerPackOperation(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.packId = reader.bytes(); break; } case 2: { message.packKey = reader.bytes(); break; } case 3: { message.type = reader.int32(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a StickerPackOperation message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.SyncMessage.StickerPackOperation * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.SyncMessage.StickerPackOperation} StickerPackOperation * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ StickerPackOperation.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * Type enum. * @name signalservice.SyncMessage.StickerPackOperation.Type * @enum {number} * @property {number} INSTALL=0 INSTALL value * @property {number} REMOVE=1 REMOVE value */ StickerPackOperation.Type = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "INSTALL"] = 0; values[valuesById[1] = "REMOVE"] = 1; return values; })(); return StickerPackOperation; })(); SyncMessage.ViewOnceOpen = (function() { /** * Properties of a ViewOnceOpen. * @memberof signalservice.SyncMessage * @interface IViewOnceOpen * @property {string|null} [senderAci] ViewOnceOpen senderAci * @property {Long|null} [timestamp] ViewOnceOpen timestamp * @property {Uint8Array|null} [senderAciBinary] ViewOnceOpen senderAciBinary */ /** * Constructs a new ViewOnceOpen. * @memberof signalservice.SyncMessage * @classdesc Represents a ViewOnceOpen. * @implements IViewOnceOpen * @constructor * @param {signalservice.SyncMessage.IViewOnceOpen=} [properties] Properties to set */ function ViewOnceOpen(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * ViewOnceOpen senderAci. * @member {string} senderAci * @memberof signalservice.SyncMessage.ViewOnceOpen * @instance */ ViewOnceOpen.prototype.senderAci = ""; /** * ViewOnceOpen timestamp. * @member {Long} timestamp * @memberof signalservice.SyncMessage.ViewOnceOpen * @instance */ ViewOnceOpen.prototype.timestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * ViewOnceOpen senderAciBinary. * @member {Uint8Array} senderAciBinary * @memberof signalservice.SyncMessage.ViewOnceOpen * @instance */ ViewOnceOpen.prototype.senderAciBinary = $util.newBuffer([]); /** * Encodes the specified ViewOnceOpen message. Does not implicitly {@link signalservice.SyncMessage.ViewOnceOpen.verify|verify} messages. * @function encode * @memberof signalservice.SyncMessage.ViewOnceOpen * @static * @param {signalservice.SyncMessage.IViewOnceOpen} message ViewOnceOpen message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ViewOnceOpen.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.SyncMessage.ViewOnceOpen.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.SyncMessage.ViewOnceOpen.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.timestamp != null && Object.hasOwnProperty.call(message, "timestamp")) writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.timestamp); if (message.senderAci != null && Object.hasOwnProperty.call(message, "senderAci")) writer.uint32(/* id 3, wireType 2 =*/26).string(message.senderAci); if (message.senderAciBinary != null && Object.hasOwnProperty.call(message, "senderAciBinary")) writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.senderAciBinary); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified ViewOnceOpen message, length delimited. Does not implicitly {@link signalservice.SyncMessage.ViewOnceOpen.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.SyncMessage.ViewOnceOpen * @static * @param {signalservice.SyncMessage.IViewOnceOpen} message ViewOnceOpen message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ViewOnceOpen.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a ViewOnceOpen message from the specified reader or buffer. * @function decode * @memberof signalservice.SyncMessage.ViewOnceOpen * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.SyncMessage.ViewOnceOpen} ViewOnceOpen * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ViewOnceOpen.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.SyncMessage.ViewOnceOpen(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 3: { message.senderAci = reader.string(); break; } case 2: { message.timestamp = reader.uint64(); break; } case 4: { message.senderAciBinary = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a ViewOnceOpen message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.SyncMessage.ViewOnceOpen * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.SyncMessage.ViewOnceOpen} ViewOnceOpen * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ViewOnceOpen.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return ViewOnceOpen; })(); SyncMessage.FetchLatest = (function() { /** * Properties of a FetchLatest. * @memberof signalservice.SyncMessage * @interface IFetchLatest * @property {signalservice.SyncMessage.FetchLatest.Type|null} [type] FetchLatest type */ /** * Constructs a new FetchLatest. * @memberof signalservice.SyncMessage * @classdesc Represents a FetchLatest. * @implements IFetchLatest * @constructor * @param {signalservice.SyncMessage.IFetchLatest=} [properties] Properties to set */ function FetchLatest(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * FetchLatest type. * @member {signalservice.SyncMessage.FetchLatest.Type} type * @memberof signalservice.SyncMessage.FetchLatest * @instance */ FetchLatest.prototype.type = 0; /** * Encodes the specified FetchLatest message. Does not implicitly {@link signalservice.SyncMessage.FetchLatest.verify|verify} messages. * @function encode * @memberof signalservice.SyncMessage.FetchLatest * @static * @param {signalservice.SyncMessage.IFetchLatest} message FetchLatest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ FetchLatest.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.SyncMessage.FetchLatest.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.SyncMessage.FetchLatest.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.type != null && Object.hasOwnProperty.call(message, "type")) writer.uint32(/* id 1, wireType 0 =*/8).int32(message.type); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified FetchLatest message, length delimited. Does not implicitly {@link signalservice.SyncMessage.FetchLatest.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.SyncMessage.FetchLatest * @static * @param {signalservice.SyncMessage.IFetchLatest} message FetchLatest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ FetchLatest.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a FetchLatest message from the specified reader or buffer. * @function decode * @memberof signalservice.SyncMessage.FetchLatest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.SyncMessage.FetchLatest} FetchLatest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ FetchLatest.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.SyncMessage.FetchLatest(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.type = reader.int32(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a FetchLatest message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.SyncMessage.FetchLatest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.SyncMessage.FetchLatest} FetchLatest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ FetchLatest.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * Type enum. * @name signalservice.SyncMessage.FetchLatest.Type * @enum {number} * @property {number} UNKNOWN=0 UNKNOWN value * @property {number} LOCAL_PROFILE=1 LOCAL_PROFILE value * @property {number} STORAGE_MANIFEST=2 STORAGE_MANIFEST value * @property {number} SUBSCRIPTION_STATUS=3 SUBSCRIPTION_STATUS value */ FetchLatest.Type = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "UNKNOWN"] = 0; values[valuesById[1] = "LOCAL_PROFILE"] = 1; values[valuesById[2] = "STORAGE_MANIFEST"] = 2; values[valuesById[3] = "SUBSCRIPTION_STATUS"] = 3; return values; })(); return FetchLatest; })(); SyncMessage.Keys = (function() { /** * Properties of a Keys. * @memberof signalservice.SyncMessage * @interface IKeys * @property {Uint8Array|null} [master] Keys master * @property {string|null} [accountEntropyPool] Keys accountEntropyPool * @property {Uint8Array|null} [mediaRootBackupKey] Keys mediaRootBackupKey */ /** * Constructs a new Keys. * @memberof signalservice.SyncMessage * @classdesc Represents a Keys. * @implements IKeys * @constructor * @param {signalservice.SyncMessage.IKeys=} [properties] Properties to set */ function Keys(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Keys master. * @member {Uint8Array} master * @memberof signalservice.SyncMessage.Keys * @instance */ Keys.prototype.master = $util.newBuffer([]); /** * Keys accountEntropyPool. * @member {string} accountEntropyPool * @memberof signalservice.SyncMessage.Keys * @instance */ Keys.prototype.accountEntropyPool = ""; /** * Keys mediaRootBackupKey. * @member {Uint8Array} mediaRootBackupKey * @memberof signalservice.SyncMessage.Keys * @instance */ Keys.prototype.mediaRootBackupKey = $util.newBuffer([]); /** * Encodes the specified Keys message. Does not implicitly {@link signalservice.SyncMessage.Keys.verify|verify} messages. * @function encode * @memberof signalservice.SyncMessage.Keys * @static * @param {signalservice.SyncMessage.IKeys} message Keys message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Keys.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.SyncMessage.Keys.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.SyncMessage.Keys.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.master != null && Object.hasOwnProperty.call(message, "master")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.master); if (message.accountEntropyPool != null && Object.hasOwnProperty.call(message, "accountEntropyPool")) writer.uint32(/* id 3, wireType 2 =*/26).string(message.accountEntropyPool); if (message.mediaRootBackupKey != null && Object.hasOwnProperty.call(message, "mediaRootBackupKey")) writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.mediaRootBackupKey); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Keys message, length delimited. Does not implicitly {@link signalservice.SyncMessage.Keys.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.SyncMessage.Keys * @static * @param {signalservice.SyncMessage.IKeys} message Keys message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Keys.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Keys message from the specified reader or buffer. * @function decode * @memberof signalservice.SyncMessage.Keys * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.SyncMessage.Keys} Keys * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Keys.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.SyncMessage.Keys(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 2: { message.master = reader.bytes(); break; } case 3: { message.accountEntropyPool = reader.string(); break; } case 4: { message.mediaRootBackupKey = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Keys message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.SyncMessage.Keys * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.SyncMessage.Keys} Keys * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Keys.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return Keys; })(); SyncMessage.PniIdentity = (function() { /** * Properties of a PniIdentity. * @memberof signalservice.SyncMessage * @interface IPniIdentity * @property {Uint8Array|null} [publicKey] PniIdentity publicKey * @property {Uint8Array|null} [privateKey] PniIdentity privateKey */ /** * Constructs a new PniIdentity. * @memberof signalservice.SyncMessage * @classdesc Represents a PniIdentity. * @implements IPniIdentity * @constructor * @param {signalservice.SyncMessage.IPniIdentity=} [properties] Properties to set */ function PniIdentity(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * PniIdentity publicKey. * @member {Uint8Array} publicKey * @memberof signalservice.SyncMessage.PniIdentity * @instance */ PniIdentity.prototype.publicKey = $util.newBuffer([]); /** * PniIdentity privateKey. * @member {Uint8Array} privateKey * @memberof signalservice.SyncMessage.PniIdentity * @instance */ PniIdentity.prototype.privateKey = $util.newBuffer([]); /** * Encodes the specified PniIdentity message. Does not implicitly {@link signalservice.SyncMessage.PniIdentity.verify|verify} messages. * @function encode * @memberof signalservice.SyncMessage.PniIdentity * @static * @param {signalservice.SyncMessage.IPniIdentity} message PniIdentity message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ PniIdentity.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.SyncMessage.PniIdentity.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.SyncMessage.PniIdentity.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.publicKey != null && Object.hasOwnProperty.call(message, "publicKey")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.publicKey); if (message.privateKey != null && Object.hasOwnProperty.call(message, "privateKey")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.privateKey); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified PniIdentity message, length delimited. Does not implicitly {@link signalservice.SyncMessage.PniIdentity.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.SyncMessage.PniIdentity * @static * @param {signalservice.SyncMessage.IPniIdentity} message PniIdentity message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ PniIdentity.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a PniIdentity message from the specified reader or buffer. * @function decode * @memberof signalservice.SyncMessage.PniIdentity * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.SyncMessage.PniIdentity} PniIdentity * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ PniIdentity.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.SyncMessage.PniIdentity(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.publicKey = reader.bytes(); break; } case 2: { message.privateKey = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a PniIdentity message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.SyncMessage.PniIdentity * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.SyncMessage.PniIdentity} PniIdentity * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ PniIdentity.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return PniIdentity; })(); SyncMessage.MessageRequestResponse = (function() { /** * Properties of a MessageRequestResponse. * @memberof signalservice.SyncMessage * @interface IMessageRequestResponse * @property {string|null} [threadAci] MessageRequestResponse threadAci * @property {Uint8Array|null} [groupId] MessageRequestResponse groupId * @property {signalservice.SyncMessage.MessageRequestResponse.Type|null} [type] MessageRequestResponse type * @property {Uint8Array|null} [threadAciBinary] MessageRequestResponse threadAciBinary */ /** * Constructs a new MessageRequestResponse. * @memberof signalservice.SyncMessage * @classdesc Represents a MessageRequestResponse. * @implements IMessageRequestResponse * @constructor * @param {signalservice.SyncMessage.IMessageRequestResponse=} [properties] Properties to set */ function MessageRequestResponse(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * MessageRequestResponse threadAci. * @member {string} threadAci * @memberof signalservice.SyncMessage.MessageRequestResponse * @instance */ MessageRequestResponse.prototype.threadAci = ""; /** * MessageRequestResponse groupId. * @member {Uint8Array} groupId * @memberof signalservice.SyncMessage.MessageRequestResponse * @instance */ MessageRequestResponse.prototype.groupId = $util.newBuffer([]); /** * MessageRequestResponse type. * @member {signalservice.SyncMessage.MessageRequestResponse.Type} type * @memberof signalservice.SyncMessage.MessageRequestResponse * @instance */ MessageRequestResponse.prototype.type = 0; /** * MessageRequestResponse threadAciBinary. * @member {Uint8Array} threadAciBinary * @memberof signalservice.SyncMessage.MessageRequestResponse * @instance */ MessageRequestResponse.prototype.threadAciBinary = $util.newBuffer([]); /** * Encodes the specified MessageRequestResponse message. Does not implicitly {@link signalservice.SyncMessage.MessageRequestResponse.verify|verify} messages. * @function encode * @memberof signalservice.SyncMessage.MessageRequestResponse * @static * @param {signalservice.SyncMessage.IMessageRequestResponse} message MessageRequestResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ MessageRequestResponse.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.SyncMessage.MessageRequestResponse.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.SyncMessage.MessageRequestResponse.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.threadAci != null && Object.hasOwnProperty.call(message, "threadAci")) writer.uint32(/* id 2, wireType 2 =*/18).string(message.threadAci); if (message.groupId != null && Object.hasOwnProperty.call(message, "groupId")) writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.groupId); if (message.type != null && Object.hasOwnProperty.call(message, "type")) writer.uint32(/* id 4, wireType 0 =*/32).int32(message.type); if (message.threadAciBinary != null && Object.hasOwnProperty.call(message, "threadAciBinary")) writer.uint32(/* id 5, wireType 2 =*/42).bytes(message.threadAciBinary); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified MessageRequestResponse message, length delimited. Does not implicitly {@link signalservice.SyncMessage.MessageRequestResponse.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.SyncMessage.MessageRequestResponse * @static * @param {signalservice.SyncMessage.IMessageRequestResponse} message MessageRequestResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ MessageRequestResponse.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a MessageRequestResponse message from the specified reader or buffer. * @function decode * @memberof signalservice.SyncMessage.MessageRequestResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.SyncMessage.MessageRequestResponse} MessageRequestResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ MessageRequestResponse.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.SyncMessage.MessageRequestResponse(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 2: { message.threadAci = reader.string(); break; } case 3: { message.groupId = reader.bytes(); break; } case 4: { message.type = reader.int32(); break; } case 5: { message.threadAciBinary = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a MessageRequestResponse message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.SyncMessage.MessageRequestResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.SyncMessage.MessageRequestResponse} MessageRequestResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ MessageRequestResponse.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * Type enum. * @name signalservice.SyncMessage.MessageRequestResponse.Type * @enum {number} * @property {number} UNKNOWN=0 UNKNOWN value * @property {number} ACCEPT=1 ACCEPT value * @property {number} DELETE=2 DELETE value * @property {number} BLOCK=3 BLOCK value * @property {number} BLOCK_AND_DELETE=4 BLOCK_AND_DELETE value * @property {number} SPAM=5 SPAM value * @property {number} BLOCK_AND_SPAM=6 BLOCK_AND_SPAM value */ MessageRequestResponse.Type = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "UNKNOWN"] = 0; values[valuesById[1] = "ACCEPT"] = 1; values[valuesById[2] = "DELETE"] = 2; values[valuesById[3] = "BLOCK"] = 3; values[valuesById[4] = "BLOCK_AND_DELETE"] = 4; values[valuesById[5] = "SPAM"] = 5; values[valuesById[6] = "BLOCK_AND_SPAM"] = 6; return values; })(); return MessageRequestResponse; })(); SyncMessage.OutgoingPayment = (function() { /** * Properties of an OutgoingPayment. * @memberof signalservice.SyncMessage * @interface IOutgoingPayment * @property {string|null} [recipientServiceId] OutgoingPayment recipientServiceId * @property {string|null} [note] OutgoingPayment note * @property {signalservice.SyncMessage.OutgoingPayment.IMobileCoin|null} [mobileCoin] OutgoingPayment mobileCoin */ /** * Constructs a new OutgoingPayment. * @memberof signalservice.SyncMessage * @classdesc Represents an OutgoingPayment. * @implements IOutgoingPayment * @constructor * @param {signalservice.SyncMessage.IOutgoingPayment=} [properties] Properties to set */ function OutgoingPayment(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * OutgoingPayment recipientServiceId. * @member {string} recipientServiceId * @memberof signalservice.SyncMessage.OutgoingPayment * @instance */ OutgoingPayment.prototype.recipientServiceId = ""; /** * OutgoingPayment note. * @member {string} note * @memberof signalservice.SyncMessage.OutgoingPayment * @instance */ OutgoingPayment.prototype.note = ""; /** * OutgoingPayment mobileCoin. * @member {signalservice.SyncMessage.OutgoingPayment.IMobileCoin|null|undefined} mobileCoin * @memberof signalservice.SyncMessage.OutgoingPayment * @instance */ OutgoingPayment.prototype.mobileCoin = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * OutgoingPayment attachmentIdentifier. * @member {"mobileCoin"|undefined} attachmentIdentifier * @memberof signalservice.SyncMessage.OutgoingPayment * @instance */ Object.defineProperty(OutgoingPayment.prototype, "attachmentIdentifier", { get: $util.oneOfGetter($oneOfFields = ["mobileCoin"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified OutgoingPayment message. Does not implicitly {@link signalservice.SyncMessage.OutgoingPayment.verify|verify} messages. * @function encode * @memberof signalservice.SyncMessage.OutgoingPayment * @static * @param {signalservice.SyncMessage.IOutgoingPayment} message OutgoingPayment message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ OutgoingPayment.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.SyncMessage.OutgoingPayment.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.SyncMessage.OutgoingPayment.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.recipientServiceId != null && Object.hasOwnProperty.call(message, "recipientServiceId")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.recipientServiceId); if (message.note != null && Object.hasOwnProperty.call(message, "note")) writer.uint32(/* id 2, wireType 2 =*/18).string(message.note); if (message.mobileCoin != null && Object.hasOwnProperty.call(message, "mobileCoin")) $root.signalservice.SyncMessage.OutgoingPayment.MobileCoin.encode(message.mobileCoin, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified OutgoingPayment message, length delimited. Does not implicitly {@link signalservice.SyncMessage.OutgoingPayment.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.SyncMessage.OutgoingPayment * @static * @param {signalservice.SyncMessage.IOutgoingPayment} message OutgoingPayment message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ OutgoingPayment.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an OutgoingPayment message from the specified reader or buffer. * @function decode * @memberof signalservice.SyncMessage.OutgoingPayment * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.SyncMessage.OutgoingPayment} OutgoingPayment * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ OutgoingPayment.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.SyncMessage.OutgoingPayment(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.recipientServiceId = reader.string(); break; } case 2: { message.note = reader.string(); break; } case 3: { message.mobileCoin = $root.signalservice.SyncMessage.OutgoingPayment.MobileCoin.decode(reader, reader.uint32()); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an OutgoingPayment message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.SyncMessage.OutgoingPayment * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.SyncMessage.OutgoingPayment} OutgoingPayment * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ OutgoingPayment.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; OutgoingPayment.MobileCoin = (function() { /** * Properties of a MobileCoin. * @memberof signalservice.SyncMessage.OutgoingPayment * @interface IMobileCoin * @property {Uint8Array|null} [recipientAddress] MobileCoin recipientAddress * @property {Long|null} [amountPicoMob] MobileCoin amountPicoMob * @property {Long|null} [feePicoMob] MobileCoin feePicoMob * @property {Uint8Array|null} [receipt] MobileCoin receipt * @property {Long|null} [ledgerBlockTimestamp] MobileCoin ledgerBlockTimestamp * @property {Long|null} [ledgerBlockIndex] MobileCoin ledgerBlockIndex * @property {Array.|null} [spentKeyImages] MobileCoin spentKeyImages * @property {Array.|null} [outputPublicKeys] MobileCoin outputPublicKeys */ /** * Constructs a new MobileCoin. * @memberof signalservice.SyncMessage.OutgoingPayment * @classdesc Represents a MobileCoin. * @implements IMobileCoin * @constructor * @param {signalservice.SyncMessage.OutgoingPayment.IMobileCoin=} [properties] Properties to set */ function MobileCoin(properties) { this.spentKeyImages = []; this.outputPublicKeys = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * MobileCoin recipientAddress. * @member {Uint8Array} recipientAddress * @memberof signalservice.SyncMessage.OutgoingPayment.MobileCoin * @instance */ MobileCoin.prototype.recipientAddress = $util.newBuffer([]); /** * MobileCoin amountPicoMob. * @member {Long} amountPicoMob * @memberof signalservice.SyncMessage.OutgoingPayment.MobileCoin * @instance */ MobileCoin.prototype.amountPicoMob = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * MobileCoin feePicoMob. * @member {Long} feePicoMob * @memberof signalservice.SyncMessage.OutgoingPayment.MobileCoin * @instance */ MobileCoin.prototype.feePicoMob = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * MobileCoin receipt. * @member {Uint8Array} receipt * @memberof signalservice.SyncMessage.OutgoingPayment.MobileCoin * @instance */ MobileCoin.prototype.receipt = $util.newBuffer([]); /** * MobileCoin ledgerBlockTimestamp. * @member {Long} ledgerBlockTimestamp * @memberof signalservice.SyncMessage.OutgoingPayment.MobileCoin * @instance */ MobileCoin.prototype.ledgerBlockTimestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * MobileCoin ledgerBlockIndex. * @member {Long} ledgerBlockIndex * @memberof signalservice.SyncMessage.OutgoingPayment.MobileCoin * @instance */ MobileCoin.prototype.ledgerBlockIndex = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * MobileCoin spentKeyImages. * @member {Array.} spentKeyImages * @memberof signalservice.SyncMessage.OutgoingPayment.MobileCoin * @instance */ MobileCoin.prototype.spentKeyImages = $util.emptyArray; /** * MobileCoin outputPublicKeys. * @member {Array.} outputPublicKeys * @memberof signalservice.SyncMessage.OutgoingPayment.MobileCoin * @instance */ MobileCoin.prototype.outputPublicKeys = $util.emptyArray; /** * Encodes the specified MobileCoin message. Does not implicitly {@link signalservice.SyncMessage.OutgoingPayment.MobileCoin.verify|verify} messages. * @function encode * @memberof signalservice.SyncMessage.OutgoingPayment.MobileCoin * @static * @param {signalservice.SyncMessage.OutgoingPayment.IMobileCoin} message MobileCoin message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ MobileCoin.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.SyncMessage.OutgoingPayment.MobileCoin.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.SyncMessage.OutgoingPayment.MobileCoin.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.recipientAddress != null && Object.hasOwnProperty.call(message, "recipientAddress")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.recipientAddress); if (message.amountPicoMob != null && Object.hasOwnProperty.call(message, "amountPicoMob")) writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.amountPicoMob); if (message.feePicoMob != null && Object.hasOwnProperty.call(message, "feePicoMob")) writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.feePicoMob); if (message.receipt != null && Object.hasOwnProperty.call(message, "receipt")) writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.receipt); if (message.ledgerBlockTimestamp != null && Object.hasOwnProperty.call(message, "ledgerBlockTimestamp")) writer.uint32(/* id 5, wireType 0 =*/40).uint64(message.ledgerBlockTimestamp); if (message.ledgerBlockIndex != null && Object.hasOwnProperty.call(message, "ledgerBlockIndex")) writer.uint32(/* id 6, wireType 0 =*/48).uint64(message.ledgerBlockIndex); if (message.spentKeyImages != null && message.spentKeyImages.length) for (var i = 0; i < message.spentKeyImages.length; ++i) writer.uint32(/* id 7, wireType 2 =*/58).bytes(message.spentKeyImages[i]); if (message.outputPublicKeys != null && message.outputPublicKeys.length) for (var i = 0; i < message.outputPublicKeys.length; ++i) writer.uint32(/* id 8, wireType 2 =*/66).bytes(message.outputPublicKeys[i]); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified MobileCoin message, length delimited. Does not implicitly {@link signalservice.SyncMessage.OutgoingPayment.MobileCoin.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.SyncMessage.OutgoingPayment.MobileCoin * @static * @param {signalservice.SyncMessage.OutgoingPayment.IMobileCoin} message MobileCoin message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ MobileCoin.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a MobileCoin message from the specified reader or buffer. * @function decode * @memberof signalservice.SyncMessage.OutgoingPayment.MobileCoin * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.SyncMessage.OutgoingPayment.MobileCoin} MobileCoin * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ MobileCoin.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.SyncMessage.OutgoingPayment.MobileCoin(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.recipientAddress = reader.bytes(); break; } case 2: { message.amountPicoMob = reader.uint64(); break; } case 3: { message.feePicoMob = reader.uint64(); break; } case 4: { message.receipt = reader.bytes(); break; } case 5: { message.ledgerBlockTimestamp = reader.uint64(); break; } case 6: { message.ledgerBlockIndex = reader.uint64(); break; } case 7: { if (!(message.spentKeyImages && message.spentKeyImages.length)) message.spentKeyImages = []; message.spentKeyImages.push(reader.bytes()); break; } case 8: { if (!(message.outputPublicKeys && message.outputPublicKeys.length)) message.outputPublicKeys = []; message.outputPublicKeys.push(reader.bytes()); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a MobileCoin message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.SyncMessage.OutgoingPayment.MobileCoin * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.SyncMessage.OutgoingPayment.MobileCoin} MobileCoin * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ MobileCoin.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return MobileCoin; })(); return OutgoingPayment; })(); SyncMessage.PniChangeNumber = (function() { /** * Properties of a PniChangeNumber. * @memberof signalservice.SyncMessage * @interface IPniChangeNumber * @property {Uint8Array|null} [identityKeyPair] PniChangeNumber identityKeyPair * @property {Uint8Array|null} [signedPreKey] PniChangeNumber signedPreKey * @property {Uint8Array|null} [lastResortKyberPreKey] PniChangeNumber lastResortKyberPreKey * @property {number|null} [registrationId] PniChangeNumber registrationId * @property {string|null} [newE164] PniChangeNumber newE164 */ /** * Constructs a new PniChangeNumber. * @memberof signalservice.SyncMessage * @classdesc Represents a PniChangeNumber. * @implements IPniChangeNumber * @constructor * @param {signalservice.SyncMessage.IPniChangeNumber=} [properties] Properties to set */ function PniChangeNumber(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * PniChangeNumber identityKeyPair. * @member {Uint8Array} identityKeyPair * @memberof signalservice.SyncMessage.PniChangeNumber * @instance */ PniChangeNumber.prototype.identityKeyPair = $util.newBuffer([]); /** * PniChangeNumber signedPreKey. * @member {Uint8Array} signedPreKey * @memberof signalservice.SyncMessage.PniChangeNumber * @instance */ PniChangeNumber.prototype.signedPreKey = $util.newBuffer([]); /** * PniChangeNumber lastResortKyberPreKey. * @member {Uint8Array} lastResortKyberPreKey * @memberof signalservice.SyncMessage.PniChangeNumber * @instance */ PniChangeNumber.prototype.lastResortKyberPreKey = $util.newBuffer([]); /** * PniChangeNumber registrationId. * @member {number} registrationId * @memberof signalservice.SyncMessage.PniChangeNumber * @instance */ PniChangeNumber.prototype.registrationId = 0; /** * PniChangeNumber newE164. * @member {string} newE164 * @memberof signalservice.SyncMessage.PniChangeNumber * @instance */ PniChangeNumber.prototype.newE164 = ""; /** * Encodes the specified PniChangeNumber message. Does not implicitly {@link signalservice.SyncMessage.PniChangeNumber.verify|verify} messages. * @function encode * @memberof signalservice.SyncMessage.PniChangeNumber * @static * @param {signalservice.SyncMessage.IPniChangeNumber} message PniChangeNumber message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ PniChangeNumber.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.SyncMessage.PniChangeNumber.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.SyncMessage.PniChangeNumber.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.identityKeyPair != null && Object.hasOwnProperty.call(message, "identityKeyPair")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.identityKeyPair); if (message.signedPreKey != null && Object.hasOwnProperty.call(message, "signedPreKey")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.signedPreKey); if (message.registrationId != null && Object.hasOwnProperty.call(message, "registrationId")) writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.registrationId); if (message.newE164 != null && Object.hasOwnProperty.call(message, "newE164")) writer.uint32(/* id 4, wireType 2 =*/34).string(message.newE164); if (message.lastResortKyberPreKey != null && Object.hasOwnProperty.call(message, "lastResortKyberPreKey")) writer.uint32(/* id 5, wireType 2 =*/42).bytes(message.lastResortKyberPreKey); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified PniChangeNumber message, length delimited. Does not implicitly {@link signalservice.SyncMessage.PniChangeNumber.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.SyncMessage.PniChangeNumber * @static * @param {signalservice.SyncMessage.IPniChangeNumber} message PniChangeNumber message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ PniChangeNumber.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a PniChangeNumber message from the specified reader or buffer. * @function decode * @memberof signalservice.SyncMessage.PniChangeNumber * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.SyncMessage.PniChangeNumber} PniChangeNumber * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ PniChangeNumber.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.SyncMessage.PniChangeNumber(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.identityKeyPair = reader.bytes(); break; } case 2: { message.signedPreKey = reader.bytes(); break; } case 5: { message.lastResortKyberPreKey = reader.bytes(); break; } case 3: { message.registrationId = reader.uint32(); break; } case 4: { message.newE164 = reader.string(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a PniChangeNumber message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.SyncMessage.PniChangeNumber * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.SyncMessage.PniChangeNumber} PniChangeNumber * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ PniChangeNumber.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return PniChangeNumber; })(); SyncMessage.CallEvent = (function() { /** * Properties of a CallEvent. * @memberof signalservice.SyncMessage * @interface ICallEvent * @property {Uint8Array|null} [peerId] CallEvent peerId * @property {Long|null} [callId] CallEvent callId * @property {Long|null} [timestamp] CallEvent timestamp * @property {signalservice.SyncMessage.CallEvent.Type|null} [type] CallEvent type * @property {signalservice.SyncMessage.CallEvent.Direction|null} [direction] CallEvent direction * @property {signalservice.SyncMessage.CallEvent.Event|null} [event] CallEvent event */ /** * Constructs a new CallEvent. * @memberof signalservice.SyncMessage * @classdesc Represents a CallEvent. * @implements ICallEvent * @constructor * @param {signalservice.SyncMessage.ICallEvent=} [properties] Properties to set */ function CallEvent(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * CallEvent peerId. * @member {Uint8Array} peerId * @memberof signalservice.SyncMessage.CallEvent * @instance */ CallEvent.prototype.peerId = $util.newBuffer([]); /** * CallEvent callId. * @member {Long} callId * @memberof signalservice.SyncMessage.CallEvent * @instance */ CallEvent.prototype.callId = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * CallEvent timestamp. * @member {Long} timestamp * @memberof signalservice.SyncMessage.CallEvent * @instance */ CallEvent.prototype.timestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * CallEvent type. * @member {signalservice.SyncMessage.CallEvent.Type} type * @memberof signalservice.SyncMessage.CallEvent * @instance */ CallEvent.prototype.type = 0; /** * CallEvent direction. * @member {signalservice.SyncMessage.CallEvent.Direction} direction * @memberof signalservice.SyncMessage.CallEvent * @instance */ CallEvent.prototype.direction = 0; /** * CallEvent event. * @member {signalservice.SyncMessage.CallEvent.Event} event * @memberof signalservice.SyncMessage.CallEvent * @instance */ CallEvent.prototype.event = 0; /** * Encodes the specified CallEvent message. Does not implicitly {@link signalservice.SyncMessage.CallEvent.verify|verify} messages. * @function encode * @memberof signalservice.SyncMessage.CallEvent * @static * @param {signalservice.SyncMessage.ICallEvent} message CallEvent message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ CallEvent.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.SyncMessage.CallEvent.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.SyncMessage.CallEvent.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.peerId != null && Object.hasOwnProperty.call(message, "peerId")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.peerId); if (message.callId != null && Object.hasOwnProperty.call(message, "callId")) writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.callId); if (message.timestamp != null && Object.hasOwnProperty.call(message, "timestamp")) writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.timestamp); if (message.type != null && Object.hasOwnProperty.call(message, "type")) writer.uint32(/* id 4, wireType 0 =*/32).int32(message.type); if (message.direction != null && Object.hasOwnProperty.call(message, "direction")) writer.uint32(/* id 5, wireType 0 =*/40).int32(message.direction); if (message.event != null && Object.hasOwnProperty.call(message, "event")) writer.uint32(/* id 6, wireType 0 =*/48).int32(message.event); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified CallEvent message, length delimited. Does not implicitly {@link signalservice.SyncMessage.CallEvent.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.SyncMessage.CallEvent * @static * @param {signalservice.SyncMessage.ICallEvent} message CallEvent message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ CallEvent.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a CallEvent message from the specified reader or buffer. * @function decode * @memberof signalservice.SyncMessage.CallEvent * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.SyncMessage.CallEvent} CallEvent * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ CallEvent.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.SyncMessage.CallEvent(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.peerId = reader.bytes(); break; } case 2: { message.callId = reader.uint64(); break; } case 3: { message.timestamp = reader.uint64(); break; } case 4: { message.type = reader.int32(); break; } case 5: { message.direction = reader.int32(); break; } case 6: { message.event = reader.int32(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a CallEvent message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.SyncMessage.CallEvent * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.SyncMessage.CallEvent} CallEvent * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ CallEvent.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * Type enum. * @name signalservice.SyncMessage.CallEvent.Type * @enum {number} * @property {number} UNKNOWN_TYPE=0 UNKNOWN_TYPE value * @property {number} AUDIO_CALL=1 AUDIO_CALL value * @property {number} VIDEO_CALL=2 VIDEO_CALL value * @property {number} GROUP_CALL=3 GROUP_CALL value * @property {number} AD_HOC_CALL=4 AD_HOC_CALL value */ CallEvent.Type = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "UNKNOWN_TYPE"] = 0; values[valuesById[1] = "AUDIO_CALL"] = 1; values[valuesById[2] = "VIDEO_CALL"] = 2; values[valuesById[3] = "GROUP_CALL"] = 3; values[valuesById[4] = "AD_HOC_CALL"] = 4; return values; })(); /** * Direction enum. * @name signalservice.SyncMessage.CallEvent.Direction * @enum {number} * @property {number} UNKNOWN_DIRECTION=0 UNKNOWN_DIRECTION value * @property {number} INCOMING=1 INCOMING value * @property {number} OUTGOING=2 OUTGOING value */ CallEvent.Direction = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "UNKNOWN_DIRECTION"] = 0; values[valuesById[1] = "INCOMING"] = 1; values[valuesById[2] = "OUTGOING"] = 2; return values; })(); /** * Event enum. * @name signalservice.SyncMessage.CallEvent.Event * @enum {number} * @property {number} UNKNOWN_EVENT=0 UNKNOWN_EVENT value * @property {number} ACCEPTED=1 ACCEPTED value * @property {number} NOT_ACCEPTED=2 NOT_ACCEPTED value * @property {number} DELETE=3 DELETE value * @property {number} OBSERVED=4 OBSERVED value */ CallEvent.Event = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "UNKNOWN_EVENT"] = 0; values[valuesById[1] = "ACCEPTED"] = 1; values[valuesById[2] = "NOT_ACCEPTED"] = 2; values[valuesById[3] = "DELETE"] = 3; values[valuesById[4] = "OBSERVED"] = 4; return values; })(); return CallEvent; })(); SyncMessage.CallLinkUpdate = (function() { /** * Properties of a CallLinkUpdate. * @memberof signalservice.SyncMessage * @interface ICallLinkUpdate * @property {Uint8Array|null} [rootKey] CallLinkUpdate rootKey * @property {Uint8Array|null} [adminPasskey] CallLinkUpdate adminPasskey * @property {signalservice.SyncMessage.CallLinkUpdate.Type|null} [type] CallLinkUpdate type * @property {Uint8Array|null} [epoch] CallLinkUpdate epoch */ /** * Constructs a new CallLinkUpdate. * @memberof signalservice.SyncMessage * @classdesc Represents a CallLinkUpdate. * @implements ICallLinkUpdate * @constructor * @param {signalservice.SyncMessage.ICallLinkUpdate=} [properties] Properties to set */ function CallLinkUpdate(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * CallLinkUpdate rootKey. * @member {Uint8Array} rootKey * @memberof signalservice.SyncMessage.CallLinkUpdate * @instance */ CallLinkUpdate.prototype.rootKey = $util.newBuffer([]); /** * CallLinkUpdate adminPasskey. * @member {Uint8Array} adminPasskey * @memberof signalservice.SyncMessage.CallLinkUpdate * @instance */ CallLinkUpdate.prototype.adminPasskey = $util.newBuffer([]); /** * CallLinkUpdate type. * @member {signalservice.SyncMessage.CallLinkUpdate.Type} type * @memberof signalservice.SyncMessage.CallLinkUpdate * @instance */ CallLinkUpdate.prototype.type = 0; /** * CallLinkUpdate epoch. * @member {Uint8Array} epoch * @memberof signalservice.SyncMessage.CallLinkUpdate * @instance */ CallLinkUpdate.prototype.epoch = $util.newBuffer([]); /** * Encodes the specified CallLinkUpdate message. Does not implicitly {@link signalservice.SyncMessage.CallLinkUpdate.verify|verify} messages. * @function encode * @memberof signalservice.SyncMessage.CallLinkUpdate * @static * @param {signalservice.SyncMessage.ICallLinkUpdate} message CallLinkUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ CallLinkUpdate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.SyncMessage.CallLinkUpdate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.SyncMessage.CallLinkUpdate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.rootKey != null && Object.hasOwnProperty.call(message, "rootKey")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.rootKey); if (message.adminPasskey != null && Object.hasOwnProperty.call(message, "adminPasskey")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.adminPasskey); if (message.type != null && Object.hasOwnProperty.call(message, "type")) writer.uint32(/* id 3, wireType 0 =*/24).int32(message.type); if (message.epoch != null && Object.hasOwnProperty.call(message, "epoch")) writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.epoch); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified CallLinkUpdate message, length delimited. Does not implicitly {@link signalservice.SyncMessage.CallLinkUpdate.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.SyncMessage.CallLinkUpdate * @static * @param {signalservice.SyncMessage.ICallLinkUpdate} message CallLinkUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ CallLinkUpdate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a CallLinkUpdate message from the specified reader or buffer. * @function decode * @memberof signalservice.SyncMessage.CallLinkUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.SyncMessage.CallLinkUpdate} CallLinkUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ CallLinkUpdate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.SyncMessage.CallLinkUpdate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.rootKey = reader.bytes(); break; } case 2: { message.adminPasskey = reader.bytes(); break; } case 3: { message.type = reader.int32(); break; } case 4: { message.epoch = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a CallLinkUpdate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.SyncMessage.CallLinkUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.SyncMessage.CallLinkUpdate} CallLinkUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ CallLinkUpdate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * Type enum. * @name signalservice.SyncMessage.CallLinkUpdate.Type * @enum {number} * @property {number} UPDATE=0 UPDATE value */ CallLinkUpdate.Type = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "UPDATE"] = 0; return values; })(); return CallLinkUpdate; })(); SyncMessage.CallLogEvent = (function() { /** * Properties of a CallLogEvent. * @memberof signalservice.SyncMessage * @interface ICallLogEvent * @property {signalservice.SyncMessage.CallLogEvent.Type|null} [type] CallLogEvent type * @property {Long|null} [timestamp] CallLogEvent timestamp * @property {Uint8Array|null} [peerId] CallLogEvent peerId * @property {Long|null} [callId] CallLogEvent callId */ /** * Constructs a new CallLogEvent. * @memberof signalservice.SyncMessage * @classdesc Represents a CallLogEvent. * @implements ICallLogEvent * @constructor * @param {signalservice.SyncMessage.ICallLogEvent=} [properties] Properties to set */ function CallLogEvent(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * CallLogEvent type. * @member {signalservice.SyncMessage.CallLogEvent.Type} type * @memberof signalservice.SyncMessage.CallLogEvent * @instance */ CallLogEvent.prototype.type = 0; /** * CallLogEvent timestamp. * @member {Long} timestamp * @memberof signalservice.SyncMessage.CallLogEvent * @instance */ CallLogEvent.prototype.timestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * CallLogEvent peerId. * @member {Uint8Array} peerId * @memberof signalservice.SyncMessage.CallLogEvent * @instance */ CallLogEvent.prototype.peerId = $util.newBuffer([]); /** * CallLogEvent callId. * @member {Long} callId * @memberof signalservice.SyncMessage.CallLogEvent * @instance */ CallLogEvent.prototype.callId = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * Encodes the specified CallLogEvent message. Does not implicitly {@link signalservice.SyncMessage.CallLogEvent.verify|verify} messages. * @function encode * @memberof signalservice.SyncMessage.CallLogEvent * @static * @param {signalservice.SyncMessage.ICallLogEvent} message CallLogEvent message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ CallLogEvent.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.SyncMessage.CallLogEvent.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.SyncMessage.CallLogEvent.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.type != null && Object.hasOwnProperty.call(message, "type")) writer.uint32(/* id 1, wireType 0 =*/8).int32(message.type); if (message.timestamp != null && Object.hasOwnProperty.call(message, "timestamp")) writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.timestamp); if (message.peerId != null && Object.hasOwnProperty.call(message, "peerId")) writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.peerId); if (message.callId != null && Object.hasOwnProperty.call(message, "callId")) writer.uint32(/* id 4, wireType 0 =*/32).uint64(message.callId); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified CallLogEvent message, length delimited. Does not implicitly {@link signalservice.SyncMessage.CallLogEvent.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.SyncMessage.CallLogEvent * @static * @param {signalservice.SyncMessage.ICallLogEvent} message CallLogEvent message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ CallLogEvent.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a CallLogEvent message from the specified reader or buffer. * @function decode * @memberof signalservice.SyncMessage.CallLogEvent * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.SyncMessage.CallLogEvent} CallLogEvent * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ CallLogEvent.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.SyncMessage.CallLogEvent(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.type = reader.int32(); break; } case 2: { message.timestamp = reader.uint64(); break; } case 3: { message.peerId = reader.bytes(); break; } case 4: { message.callId = reader.uint64(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a CallLogEvent message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.SyncMessage.CallLogEvent * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.SyncMessage.CallLogEvent} CallLogEvent * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ CallLogEvent.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * Type enum. * @name signalservice.SyncMessage.CallLogEvent.Type * @enum {number} * @property {number} CLEAR=0 CLEAR value * @property {number} MARKED_AS_READ=1 MARKED_AS_READ value * @property {number} MARKED_AS_READ_IN_CONVERSATION=2 MARKED_AS_READ_IN_CONVERSATION value * @property {number} CLEAR_IN_CONVERSATION=3 CLEAR_IN_CONVERSATION value */ CallLogEvent.Type = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "CLEAR"] = 0; values[valuesById[1] = "MARKED_AS_READ"] = 1; values[valuesById[2] = "MARKED_AS_READ_IN_CONVERSATION"] = 2; values[valuesById[3] = "CLEAR_IN_CONVERSATION"] = 3; return values; })(); return CallLogEvent; })(); SyncMessage.DeleteForMe = (function() { /** * Properties of a DeleteForMe. * @memberof signalservice.SyncMessage * @interface IDeleteForMe * @property {Array.|null} [messageDeletes] DeleteForMe messageDeletes * @property {Array.|null} [conversationDeletes] DeleteForMe conversationDeletes * @property {Array.|null} [localOnlyConversationDeletes] DeleteForMe localOnlyConversationDeletes * @property {Array.|null} [attachmentDeletes] DeleteForMe attachmentDeletes */ /** * Constructs a new DeleteForMe. * @memberof signalservice.SyncMessage * @classdesc Represents a DeleteForMe. * @implements IDeleteForMe * @constructor * @param {signalservice.SyncMessage.IDeleteForMe=} [properties] Properties to set */ function DeleteForMe(properties) { this.messageDeletes = []; this.conversationDeletes = []; this.localOnlyConversationDeletes = []; this.attachmentDeletes = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * DeleteForMe messageDeletes. * @member {Array.} messageDeletes * @memberof signalservice.SyncMessage.DeleteForMe * @instance */ DeleteForMe.prototype.messageDeletes = $util.emptyArray; /** * DeleteForMe conversationDeletes. * @member {Array.} conversationDeletes * @memberof signalservice.SyncMessage.DeleteForMe * @instance */ DeleteForMe.prototype.conversationDeletes = $util.emptyArray; /** * DeleteForMe localOnlyConversationDeletes. * @member {Array.} localOnlyConversationDeletes * @memberof signalservice.SyncMessage.DeleteForMe * @instance */ DeleteForMe.prototype.localOnlyConversationDeletes = $util.emptyArray; /** * DeleteForMe attachmentDeletes. * @member {Array.} attachmentDeletes * @memberof signalservice.SyncMessage.DeleteForMe * @instance */ DeleteForMe.prototype.attachmentDeletes = $util.emptyArray; /** * Encodes the specified DeleteForMe message. Does not implicitly {@link signalservice.SyncMessage.DeleteForMe.verify|verify} messages. * @function encode * @memberof signalservice.SyncMessage.DeleteForMe * @static * @param {signalservice.SyncMessage.IDeleteForMe} message DeleteForMe message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ DeleteForMe.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.SyncMessage.DeleteForMe.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.SyncMessage.DeleteForMe.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.messageDeletes != null && message.messageDeletes.length) for (var i = 0; i < message.messageDeletes.length; ++i) $root.signalservice.SyncMessage.DeleteForMe.MessageDeletes.encode(message.messageDeletes[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.conversationDeletes != null && message.conversationDeletes.length) for (var i = 0; i < message.conversationDeletes.length; ++i) $root.signalservice.SyncMessage.DeleteForMe.ConversationDelete.encode(message.conversationDeletes[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); if (message.localOnlyConversationDeletes != null && message.localOnlyConversationDeletes.length) for (var i = 0; i < message.localOnlyConversationDeletes.length; ++i) $root.signalservice.SyncMessage.DeleteForMe.LocalOnlyConversationDelete.encode(message.localOnlyConversationDeletes[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); if (message.attachmentDeletes != null && message.attachmentDeletes.length) for (var i = 0; i < message.attachmentDeletes.length; ++i) $root.signalservice.SyncMessage.DeleteForMe.AttachmentDelete.encode(message.attachmentDeletes[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified DeleteForMe message, length delimited. Does not implicitly {@link signalservice.SyncMessage.DeleteForMe.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.SyncMessage.DeleteForMe * @static * @param {signalservice.SyncMessage.IDeleteForMe} message DeleteForMe message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ DeleteForMe.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a DeleteForMe message from the specified reader or buffer. * @function decode * @memberof signalservice.SyncMessage.DeleteForMe * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.SyncMessage.DeleteForMe} DeleteForMe * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ DeleteForMe.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.SyncMessage.DeleteForMe(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { if (!(message.messageDeletes && message.messageDeletes.length)) message.messageDeletes = []; message.messageDeletes.push($root.signalservice.SyncMessage.DeleteForMe.MessageDeletes.decode(reader, reader.uint32())); break; } case 2: { if (!(message.conversationDeletes && message.conversationDeletes.length)) message.conversationDeletes = []; message.conversationDeletes.push($root.signalservice.SyncMessage.DeleteForMe.ConversationDelete.decode(reader, reader.uint32())); break; } case 3: { if (!(message.localOnlyConversationDeletes && message.localOnlyConversationDeletes.length)) message.localOnlyConversationDeletes = []; message.localOnlyConversationDeletes.push($root.signalservice.SyncMessage.DeleteForMe.LocalOnlyConversationDelete.decode(reader, reader.uint32())); break; } case 4: { if (!(message.attachmentDeletes && message.attachmentDeletes.length)) message.attachmentDeletes = []; message.attachmentDeletes.push($root.signalservice.SyncMessage.DeleteForMe.AttachmentDelete.decode(reader, reader.uint32())); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a DeleteForMe message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.SyncMessage.DeleteForMe * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.SyncMessage.DeleteForMe} DeleteForMe * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ DeleteForMe.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; DeleteForMe.MessageDeletes = (function() { /** * Properties of a MessageDeletes. * @memberof signalservice.SyncMessage.DeleteForMe * @interface IMessageDeletes * @property {signalservice.IConversationIdentifier|null} [conversation] MessageDeletes conversation * @property {Array.|null} [messages] MessageDeletes messages */ /** * Constructs a new MessageDeletes. * @memberof signalservice.SyncMessage.DeleteForMe * @classdesc Represents a MessageDeletes. * @implements IMessageDeletes * @constructor * @param {signalservice.SyncMessage.DeleteForMe.IMessageDeletes=} [properties] Properties to set */ function MessageDeletes(properties) { this.messages = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * MessageDeletes conversation. * @member {signalservice.IConversationIdentifier|null|undefined} conversation * @memberof signalservice.SyncMessage.DeleteForMe.MessageDeletes * @instance */ MessageDeletes.prototype.conversation = null; /** * MessageDeletes messages. * @member {Array.} messages * @memberof signalservice.SyncMessage.DeleteForMe.MessageDeletes * @instance */ MessageDeletes.prototype.messages = $util.emptyArray; /** * Encodes the specified MessageDeletes message. Does not implicitly {@link signalservice.SyncMessage.DeleteForMe.MessageDeletes.verify|verify} messages. * @function encode * @memberof signalservice.SyncMessage.DeleteForMe.MessageDeletes * @static * @param {signalservice.SyncMessage.DeleteForMe.IMessageDeletes} message MessageDeletes message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ MessageDeletes.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.SyncMessage.DeleteForMe.MessageDeletes.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.SyncMessage.DeleteForMe.MessageDeletes.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.conversation != null && Object.hasOwnProperty.call(message, "conversation")) $root.signalservice.ConversationIdentifier.encode(message.conversation, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.messages != null && message.messages.length) for (var i = 0; i < message.messages.length; ++i) $root.signalservice.AddressableMessage.encode(message.messages[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified MessageDeletes message, length delimited. Does not implicitly {@link signalservice.SyncMessage.DeleteForMe.MessageDeletes.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.SyncMessage.DeleteForMe.MessageDeletes * @static * @param {signalservice.SyncMessage.DeleteForMe.IMessageDeletes} message MessageDeletes message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ MessageDeletes.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a MessageDeletes message from the specified reader or buffer. * @function decode * @memberof signalservice.SyncMessage.DeleteForMe.MessageDeletes * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.SyncMessage.DeleteForMe.MessageDeletes} MessageDeletes * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ MessageDeletes.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.SyncMessage.DeleteForMe.MessageDeletes(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.conversation = $root.signalservice.ConversationIdentifier.decode(reader, reader.uint32()); break; } case 2: { if (!(message.messages && message.messages.length)) message.messages = []; message.messages.push($root.signalservice.AddressableMessage.decode(reader, reader.uint32())); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a MessageDeletes message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.SyncMessage.DeleteForMe.MessageDeletes * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.SyncMessage.DeleteForMe.MessageDeletes} MessageDeletes * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ MessageDeletes.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return MessageDeletes; })(); DeleteForMe.AttachmentDelete = (function() { /** * Properties of an AttachmentDelete. * @memberof signalservice.SyncMessage.DeleteForMe * @interface IAttachmentDelete * @property {signalservice.IConversationIdentifier|null} [conversation] AttachmentDelete conversation * @property {signalservice.IAddressableMessage|null} [targetMessage] AttachmentDelete targetMessage * @property {Uint8Array|null} [clientUuid] AttachmentDelete clientUuid * @property {Uint8Array|null} [fallbackDigest] AttachmentDelete fallbackDigest * @property {Uint8Array|null} [fallbackPlaintextHash] AttachmentDelete fallbackPlaintextHash */ /** * Constructs a new AttachmentDelete. * @memberof signalservice.SyncMessage.DeleteForMe * @classdesc Represents an AttachmentDelete. * @implements IAttachmentDelete * @constructor * @param {signalservice.SyncMessage.DeleteForMe.IAttachmentDelete=} [properties] Properties to set */ function AttachmentDelete(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * AttachmentDelete conversation. * @member {signalservice.IConversationIdentifier|null|undefined} conversation * @memberof signalservice.SyncMessage.DeleteForMe.AttachmentDelete * @instance */ AttachmentDelete.prototype.conversation = null; /** * AttachmentDelete targetMessage. * @member {signalservice.IAddressableMessage|null|undefined} targetMessage * @memberof signalservice.SyncMessage.DeleteForMe.AttachmentDelete * @instance */ AttachmentDelete.prototype.targetMessage = null; /** * AttachmentDelete clientUuid. * @member {Uint8Array} clientUuid * @memberof signalservice.SyncMessage.DeleteForMe.AttachmentDelete * @instance */ AttachmentDelete.prototype.clientUuid = $util.newBuffer([]); /** * AttachmentDelete fallbackDigest. * @member {Uint8Array} fallbackDigest * @memberof signalservice.SyncMessage.DeleteForMe.AttachmentDelete * @instance */ AttachmentDelete.prototype.fallbackDigest = $util.newBuffer([]); /** * AttachmentDelete fallbackPlaintextHash. * @member {Uint8Array} fallbackPlaintextHash * @memberof signalservice.SyncMessage.DeleteForMe.AttachmentDelete * @instance */ AttachmentDelete.prototype.fallbackPlaintextHash = $util.newBuffer([]); /** * Encodes the specified AttachmentDelete message. Does not implicitly {@link signalservice.SyncMessage.DeleteForMe.AttachmentDelete.verify|verify} messages. * @function encode * @memberof signalservice.SyncMessage.DeleteForMe.AttachmentDelete * @static * @param {signalservice.SyncMessage.DeleteForMe.IAttachmentDelete} message AttachmentDelete message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ AttachmentDelete.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.SyncMessage.DeleteForMe.AttachmentDelete.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.SyncMessage.DeleteForMe.AttachmentDelete.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.conversation != null && Object.hasOwnProperty.call(message, "conversation")) $root.signalservice.ConversationIdentifier.encode(message.conversation, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.targetMessage != null && Object.hasOwnProperty.call(message, "targetMessage")) $root.signalservice.AddressableMessage.encode(message.targetMessage, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); if (message.clientUuid != null && Object.hasOwnProperty.call(message, "clientUuid")) writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.clientUuid); if (message.fallbackDigest != null && Object.hasOwnProperty.call(message, "fallbackDigest")) writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.fallbackDigest); if (message.fallbackPlaintextHash != null && Object.hasOwnProperty.call(message, "fallbackPlaintextHash")) writer.uint32(/* id 5, wireType 2 =*/42).bytes(message.fallbackPlaintextHash); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified AttachmentDelete message, length delimited. Does not implicitly {@link signalservice.SyncMessage.DeleteForMe.AttachmentDelete.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.SyncMessage.DeleteForMe.AttachmentDelete * @static * @param {signalservice.SyncMessage.DeleteForMe.IAttachmentDelete} message AttachmentDelete message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ AttachmentDelete.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an AttachmentDelete message from the specified reader or buffer. * @function decode * @memberof signalservice.SyncMessage.DeleteForMe.AttachmentDelete * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.SyncMessage.DeleteForMe.AttachmentDelete} AttachmentDelete * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ AttachmentDelete.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.SyncMessage.DeleteForMe.AttachmentDelete(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.conversation = $root.signalservice.ConversationIdentifier.decode(reader, reader.uint32()); break; } case 2: { message.targetMessage = $root.signalservice.AddressableMessage.decode(reader, reader.uint32()); break; } case 3: { message.clientUuid = reader.bytes(); break; } case 4: { message.fallbackDigest = reader.bytes(); break; } case 5: { message.fallbackPlaintextHash = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an AttachmentDelete message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.SyncMessage.DeleteForMe.AttachmentDelete * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.SyncMessage.DeleteForMe.AttachmentDelete} AttachmentDelete * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ AttachmentDelete.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return AttachmentDelete; })(); DeleteForMe.ConversationDelete = (function() { /** * Properties of a ConversationDelete. * @memberof signalservice.SyncMessage.DeleteForMe * @interface IConversationDelete * @property {signalservice.IConversationIdentifier|null} [conversation] ConversationDelete conversation * @property {Array.|null} [mostRecentMessages] ConversationDelete mostRecentMessages * @property {boolean|null} [isFullDelete] ConversationDelete isFullDelete * @property {Array.|null} [mostRecentNonExpiringMessages] ConversationDelete mostRecentNonExpiringMessages */ /** * Constructs a new ConversationDelete. * @memberof signalservice.SyncMessage.DeleteForMe * @classdesc Represents a ConversationDelete. * @implements IConversationDelete * @constructor * @param {signalservice.SyncMessage.DeleteForMe.IConversationDelete=} [properties] Properties to set */ function ConversationDelete(properties) { this.mostRecentMessages = []; this.mostRecentNonExpiringMessages = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * ConversationDelete conversation. * @member {signalservice.IConversationIdentifier|null|undefined} conversation * @memberof signalservice.SyncMessage.DeleteForMe.ConversationDelete * @instance */ ConversationDelete.prototype.conversation = null; /** * ConversationDelete mostRecentMessages. * @member {Array.} mostRecentMessages * @memberof signalservice.SyncMessage.DeleteForMe.ConversationDelete * @instance */ ConversationDelete.prototype.mostRecentMessages = $util.emptyArray; /** * ConversationDelete isFullDelete. * @member {boolean} isFullDelete * @memberof signalservice.SyncMessage.DeleteForMe.ConversationDelete * @instance */ ConversationDelete.prototype.isFullDelete = false; /** * ConversationDelete mostRecentNonExpiringMessages. * @member {Array.} mostRecentNonExpiringMessages * @memberof signalservice.SyncMessage.DeleteForMe.ConversationDelete * @instance */ ConversationDelete.prototype.mostRecentNonExpiringMessages = $util.emptyArray; /** * Encodes the specified ConversationDelete message. Does not implicitly {@link signalservice.SyncMessage.DeleteForMe.ConversationDelete.verify|verify} messages. * @function encode * @memberof signalservice.SyncMessage.DeleteForMe.ConversationDelete * @static * @param {signalservice.SyncMessage.DeleteForMe.IConversationDelete} message ConversationDelete message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ConversationDelete.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.SyncMessage.DeleteForMe.ConversationDelete.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.SyncMessage.DeleteForMe.ConversationDelete.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.conversation != null && Object.hasOwnProperty.call(message, "conversation")) $root.signalservice.ConversationIdentifier.encode(message.conversation, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.mostRecentMessages != null && message.mostRecentMessages.length) for (var i = 0; i < message.mostRecentMessages.length; ++i) $root.signalservice.AddressableMessage.encode(message.mostRecentMessages[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); if (message.isFullDelete != null && Object.hasOwnProperty.call(message, "isFullDelete")) writer.uint32(/* id 3, wireType 0 =*/24).bool(message.isFullDelete); if (message.mostRecentNonExpiringMessages != null && message.mostRecentNonExpiringMessages.length) for (var i = 0; i < message.mostRecentNonExpiringMessages.length; ++i) $root.signalservice.AddressableMessage.encode(message.mostRecentNonExpiringMessages[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified ConversationDelete message, length delimited. Does not implicitly {@link signalservice.SyncMessage.DeleteForMe.ConversationDelete.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.SyncMessage.DeleteForMe.ConversationDelete * @static * @param {signalservice.SyncMessage.DeleteForMe.IConversationDelete} message ConversationDelete message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ConversationDelete.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a ConversationDelete message from the specified reader or buffer. * @function decode * @memberof signalservice.SyncMessage.DeleteForMe.ConversationDelete * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.SyncMessage.DeleteForMe.ConversationDelete} ConversationDelete * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ConversationDelete.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.SyncMessage.DeleteForMe.ConversationDelete(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.conversation = $root.signalservice.ConversationIdentifier.decode(reader, reader.uint32()); break; } case 2: { if (!(message.mostRecentMessages && message.mostRecentMessages.length)) message.mostRecentMessages = []; message.mostRecentMessages.push($root.signalservice.AddressableMessage.decode(reader, reader.uint32())); break; } case 3: { message.isFullDelete = reader.bool(); break; } case 4: { if (!(message.mostRecentNonExpiringMessages && message.mostRecentNonExpiringMessages.length)) message.mostRecentNonExpiringMessages = []; message.mostRecentNonExpiringMessages.push($root.signalservice.AddressableMessage.decode(reader, reader.uint32())); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a ConversationDelete message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.SyncMessage.DeleteForMe.ConversationDelete * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.SyncMessage.DeleteForMe.ConversationDelete} ConversationDelete * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ConversationDelete.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return ConversationDelete; })(); DeleteForMe.LocalOnlyConversationDelete = (function() { /** * Properties of a LocalOnlyConversationDelete. * @memberof signalservice.SyncMessage.DeleteForMe * @interface ILocalOnlyConversationDelete * @property {signalservice.IConversationIdentifier|null} [conversation] LocalOnlyConversationDelete conversation */ /** * Constructs a new LocalOnlyConversationDelete. * @memberof signalservice.SyncMessage.DeleteForMe * @classdesc Represents a LocalOnlyConversationDelete. * @implements ILocalOnlyConversationDelete * @constructor * @param {signalservice.SyncMessage.DeleteForMe.ILocalOnlyConversationDelete=} [properties] Properties to set */ function LocalOnlyConversationDelete(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * LocalOnlyConversationDelete conversation. * @member {signalservice.IConversationIdentifier|null|undefined} conversation * @memberof signalservice.SyncMessage.DeleteForMe.LocalOnlyConversationDelete * @instance */ LocalOnlyConversationDelete.prototype.conversation = null; /** * Encodes the specified LocalOnlyConversationDelete message. Does not implicitly {@link signalservice.SyncMessage.DeleteForMe.LocalOnlyConversationDelete.verify|verify} messages. * @function encode * @memberof signalservice.SyncMessage.DeleteForMe.LocalOnlyConversationDelete * @static * @param {signalservice.SyncMessage.DeleteForMe.ILocalOnlyConversationDelete} message LocalOnlyConversationDelete message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ LocalOnlyConversationDelete.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.SyncMessage.DeleteForMe.LocalOnlyConversationDelete.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.SyncMessage.DeleteForMe.LocalOnlyConversationDelete.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.conversation != null && Object.hasOwnProperty.call(message, "conversation")) $root.signalservice.ConversationIdentifier.encode(message.conversation, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified LocalOnlyConversationDelete message, length delimited. Does not implicitly {@link signalservice.SyncMessage.DeleteForMe.LocalOnlyConversationDelete.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.SyncMessage.DeleteForMe.LocalOnlyConversationDelete * @static * @param {signalservice.SyncMessage.DeleteForMe.ILocalOnlyConversationDelete} message LocalOnlyConversationDelete message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ LocalOnlyConversationDelete.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a LocalOnlyConversationDelete message from the specified reader or buffer. * @function decode * @memberof signalservice.SyncMessage.DeleteForMe.LocalOnlyConversationDelete * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.SyncMessage.DeleteForMe.LocalOnlyConversationDelete} LocalOnlyConversationDelete * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ LocalOnlyConversationDelete.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.SyncMessage.DeleteForMe.LocalOnlyConversationDelete(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.conversation = $root.signalservice.ConversationIdentifier.decode(reader, reader.uint32()); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a LocalOnlyConversationDelete message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.SyncMessage.DeleteForMe.LocalOnlyConversationDelete * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.SyncMessage.DeleteForMe.LocalOnlyConversationDelete} LocalOnlyConversationDelete * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ LocalOnlyConversationDelete.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return LocalOnlyConversationDelete; })(); return DeleteForMe; })(); SyncMessage.DeviceNameChange = (function() { /** * Properties of a DeviceNameChange. * @memberof signalservice.SyncMessage * @interface IDeviceNameChange * @property {number|null} [deviceId] DeviceNameChange deviceId */ /** * Constructs a new DeviceNameChange. * @memberof signalservice.SyncMessage * @classdesc Represents a DeviceNameChange. * @implements IDeviceNameChange * @constructor * @param {signalservice.SyncMessage.IDeviceNameChange=} [properties] Properties to set */ function DeviceNameChange(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * DeviceNameChange deviceId. * @member {number} deviceId * @memberof signalservice.SyncMessage.DeviceNameChange * @instance */ DeviceNameChange.prototype.deviceId = 0; /** * Encodes the specified DeviceNameChange message. Does not implicitly {@link signalservice.SyncMessage.DeviceNameChange.verify|verify} messages. * @function encode * @memberof signalservice.SyncMessage.DeviceNameChange * @static * @param {signalservice.SyncMessage.IDeviceNameChange} message DeviceNameChange message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ DeviceNameChange.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.SyncMessage.DeviceNameChange.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.SyncMessage.DeviceNameChange.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.deviceId != null && Object.hasOwnProperty.call(message, "deviceId")) writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.deviceId); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified DeviceNameChange message, length delimited. Does not implicitly {@link signalservice.SyncMessage.DeviceNameChange.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.SyncMessage.DeviceNameChange * @static * @param {signalservice.SyncMessage.IDeviceNameChange} message DeviceNameChange message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ DeviceNameChange.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a DeviceNameChange message from the specified reader or buffer. * @function decode * @memberof signalservice.SyncMessage.DeviceNameChange * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.SyncMessage.DeviceNameChange} DeviceNameChange * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ DeviceNameChange.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.SyncMessage.DeviceNameChange(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 2: { message.deviceId = reader.uint32(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a DeviceNameChange message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.SyncMessage.DeviceNameChange * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.SyncMessage.DeviceNameChange} DeviceNameChange * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ DeviceNameChange.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return DeviceNameChange; })(); SyncMessage.AttachmentBackfillRequest = (function() { /** * Properties of an AttachmentBackfillRequest. * @memberof signalservice.SyncMessage * @interface IAttachmentBackfillRequest * @property {signalservice.IAddressableMessage|null} [targetMessage] AttachmentBackfillRequest targetMessage * @property {signalservice.IConversationIdentifier|null} [targetConversation] AttachmentBackfillRequest targetConversation */ /** * Constructs a new AttachmentBackfillRequest. * @memberof signalservice.SyncMessage * @classdesc Represents an AttachmentBackfillRequest. * @implements IAttachmentBackfillRequest * @constructor * @param {signalservice.SyncMessage.IAttachmentBackfillRequest=} [properties] Properties to set */ function AttachmentBackfillRequest(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * AttachmentBackfillRequest targetMessage. * @member {signalservice.IAddressableMessage|null|undefined} targetMessage * @memberof signalservice.SyncMessage.AttachmentBackfillRequest * @instance */ AttachmentBackfillRequest.prototype.targetMessage = null; /** * AttachmentBackfillRequest targetConversation. * @member {signalservice.IConversationIdentifier|null|undefined} targetConversation * @memberof signalservice.SyncMessage.AttachmentBackfillRequest * @instance */ AttachmentBackfillRequest.prototype.targetConversation = null; /** * Encodes the specified AttachmentBackfillRequest message. Does not implicitly {@link signalservice.SyncMessage.AttachmentBackfillRequest.verify|verify} messages. * @function encode * @memberof signalservice.SyncMessage.AttachmentBackfillRequest * @static * @param {signalservice.SyncMessage.IAttachmentBackfillRequest} message AttachmentBackfillRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ AttachmentBackfillRequest.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.SyncMessage.AttachmentBackfillRequest.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.SyncMessage.AttachmentBackfillRequest.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.targetMessage != null && Object.hasOwnProperty.call(message, "targetMessage")) $root.signalservice.AddressableMessage.encode(message.targetMessage, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.targetConversation != null && Object.hasOwnProperty.call(message, "targetConversation")) $root.signalservice.ConversationIdentifier.encode(message.targetConversation, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified AttachmentBackfillRequest message, length delimited. Does not implicitly {@link signalservice.SyncMessage.AttachmentBackfillRequest.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.SyncMessage.AttachmentBackfillRequest * @static * @param {signalservice.SyncMessage.IAttachmentBackfillRequest} message AttachmentBackfillRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ AttachmentBackfillRequest.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an AttachmentBackfillRequest message from the specified reader or buffer. * @function decode * @memberof signalservice.SyncMessage.AttachmentBackfillRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.SyncMessage.AttachmentBackfillRequest} AttachmentBackfillRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ AttachmentBackfillRequest.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.SyncMessage.AttachmentBackfillRequest(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.targetMessage = $root.signalservice.AddressableMessage.decode(reader, reader.uint32()); break; } case 2: { message.targetConversation = $root.signalservice.ConversationIdentifier.decode(reader, reader.uint32()); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an AttachmentBackfillRequest message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.SyncMessage.AttachmentBackfillRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.SyncMessage.AttachmentBackfillRequest} AttachmentBackfillRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ AttachmentBackfillRequest.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return AttachmentBackfillRequest; })(); SyncMessage.AttachmentBackfillResponse = (function() { /** * Properties of an AttachmentBackfillResponse. * @memberof signalservice.SyncMessage * @interface IAttachmentBackfillResponse * @property {signalservice.IAddressableMessage|null} [targetMessage] AttachmentBackfillResponse targetMessage * @property {signalservice.IConversationIdentifier|null} [targetConversation] AttachmentBackfillResponse targetConversation * @property {signalservice.SyncMessage.AttachmentBackfillResponse.IAttachmentDataList|null} [attachments] AttachmentBackfillResponse attachments * @property {signalservice.SyncMessage.AttachmentBackfillResponse.Error|null} [error] AttachmentBackfillResponse error */ /** * Constructs a new AttachmentBackfillResponse. * @memberof signalservice.SyncMessage * @classdesc Represents an AttachmentBackfillResponse. * @implements IAttachmentBackfillResponse * @constructor * @param {signalservice.SyncMessage.IAttachmentBackfillResponse=} [properties] Properties to set */ function AttachmentBackfillResponse(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * AttachmentBackfillResponse targetMessage. * @member {signalservice.IAddressableMessage|null|undefined} targetMessage * @memberof signalservice.SyncMessage.AttachmentBackfillResponse * @instance */ AttachmentBackfillResponse.prototype.targetMessage = null; /** * AttachmentBackfillResponse targetConversation. * @member {signalservice.IConversationIdentifier|null|undefined} targetConversation * @memberof signalservice.SyncMessage.AttachmentBackfillResponse * @instance */ AttachmentBackfillResponse.prototype.targetConversation = null; /** * AttachmentBackfillResponse attachments. * @member {signalservice.SyncMessage.AttachmentBackfillResponse.IAttachmentDataList|null|undefined} attachments * @memberof signalservice.SyncMessage.AttachmentBackfillResponse * @instance */ AttachmentBackfillResponse.prototype.attachments = null; /** * AttachmentBackfillResponse error. * @member {signalservice.SyncMessage.AttachmentBackfillResponse.Error|null|undefined} error * @memberof signalservice.SyncMessage.AttachmentBackfillResponse * @instance */ AttachmentBackfillResponse.prototype.error = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * AttachmentBackfillResponse data. * @member {"attachments"|"error"|undefined} data * @memberof signalservice.SyncMessage.AttachmentBackfillResponse * @instance */ Object.defineProperty(AttachmentBackfillResponse.prototype, "data", { get: $util.oneOfGetter($oneOfFields = ["attachments", "error"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified AttachmentBackfillResponse message. Does not implicitly {@link signalservice.SyncMessage.AttachmentBackfillResponse.verify|verify} messages. * @function encode * @memberof signalservice.SyncMessage.AttachmentBackfillResponse * @static * @param {signalservice.SyncMessage.IAttachmentBackfillResponse} message AttachmentBackfillResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ AttachmentBackfillResponse.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.SyncMessage.AttachmentBackfillResponse.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.SyncMessage.AttachmentBackfillResponse.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.targetMessage != null && Object.hasOwnProperty.call(message, "targetMessage")) $root.signalservice.AddressableMessage.encode(message.targetMessage, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.targetConversation != null && Object.hasOwnProperty.call(message, "targetConversation")) $root.signalservice.ConversationIdentifier.encode(message.targetConversation, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); if (message.attachments != null && Object.hasOwnProperty.call(message, "attachments")) $root.signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentDataList.encode(message.attachments, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); if (message.error != null && Object.hasOwnProperty.call(message, "error")) writer.uint32(/* id 4, wireType 0 =*/32).int32(message.error); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified AttachmentBackfillResponse message, length delimited. Does not implicitly {@link signalservice.SyncMessage.AttachmentBackfillResponse.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.SyncMessage.AttachmentBackfillResponse * @static * @param {signalservice.SyncMessage.IAttachmentBackfillResponse} message AttachmentBackfillResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ AttachmentBackfillResponse.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an AttachmentBackfillResponse message from the specified reader or buffer. * @function decode * @memberof signalservice.SyncMessage.AttachmentBackfillResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.SyncMessage.AttachmentBackfillResponse} AttachmentBackfillResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ AttachmentBackfillResponse.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.SyncMessage.AttachmentBackfillResponse(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.targetMessage = $root.signalservice.AddressableMessage.decode(reader, reader.uint32()); break; } case 2: { message.targetConversation = $root.signalservice.ConversationIdentifier.decode(reader, reader.uint32()); break; } case 3: { message.attachments = $root.signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentDataList.decode(reader, reader.uint32()); break; } case 4: { message.error = reader.int32(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an AttachmentBackfillResponse message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.SyncMessage.AttachmentBackfillResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.SyncMessage.AttachmentBackfillResponse} AttachmentBackfillResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ AttachmentBackfillResponse.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; AttachmentBackfillResponse.AttachmentData = (function() { /** * Properties of an AttachmentData. * @memberof signalservice.SyncMessage.AttachmentBackfillResponse * @interface IAttachmentData * @property {signalservice.IAttachmentPointer|null} [attachment] AttachmentData attachment * @property {signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData.Status|null} [status] AttachmentData status */ /** * Constructs a new AttachmentData. * @memberof signalservice.SyncMessage.AttachmentBackfillResponse * @classdesc Represents an AttachmentData. * @implements IAttachmentData * @constructor * @param {signalservice.SyncMessage.AttachmentBackfillResponse.IAttachmentData=} [properties] Properties to set */ function AttachmentData(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * AttachmentData attachment. * @member {signalservice.IAttachmentPointer|null|undefined} attachment * @memberof signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData * @instance */ AttachmentData.prototype.attachment = null; /** * AttachmentData status. * @member {signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData.Status|null|undefined} status * @memberof signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData * @instance */ AttachmentData.prototype.status = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * AttachmentData data. * @member {"attachment"|"status"|undefined} data * @memberof signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData * @instance */ Object.defineProperty(AttachmentData.prototype, "data", { get: $util.oneOfGetter($oneOfFields = ["attachment", "status"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified AttachmentData message. Does not implicitly {@link signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData.verify|verify} messages. * @function encode * @memberof signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData * @static * @param {signalservice.SyncMessage.AttachmentBackfillResponse.IAttachmentData} message AttachmentData message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ AttachmentData.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.attachment != null && Object.hasOwnProperty.call(message, "attachment")) $root.signalservice.AttachmentPointer.encode(message.attachment, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.status != null && Object.hasOwnProperty.call(message, "status")) writer.uint32(/* id 2, wireType 0 =*/16).int32(message.status); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified AttachmentData message, length delimited. Does not implicitly {@link signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData * @static * @param {signalservice.SyncMessage.AttachmentBackfillResponse.IAttachmentData} message AttachmentData message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ AttachmentData.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an AttachmentData message from the specified reader or buffer. * @function decode * @memberof signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData} AttachmentData * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ AttachmentData.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.attachment = $root.signalservice.AttachmentPointer.decode(reader, reader.uint32()); break; } case 2: { message.status = reader.int32(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an AttachmentData message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData} AttachmentData * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ AttachmentData.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * Status enum. * @name signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData.Status * @enum {number} * @property {number} PENDING=0 PENDING value * @property {number} TERMINAL_ERROR=1 TERMINAL_ERROR value */ AttachmentData.Status = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "PENDING"] = 0; values[valuesById[1] = "TERMINAL_ERROR"] = 1; return values; })(); return AttachmentData; })(); /** * Error enum. * @name signalservice.SyncMessage.AttachmentBackfillResponse.Error * @enum {number} * @property {number} MESSAGE_NOT_FOUND=0 MESSAGE_NOT_FOUND value */ AttachmentBackfillResponse.Error = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "MESSAGE_NOT_FOUND"] = 0; return values; })(); AttachmentBackfillResponse.AttachmentDataList = (function() { /** * Properties of an AttachmentDataList. * @memberof signalservice.SyncMessage.AttachmentBackfillResponse * @interface IAttachmentDataList * @property {Array.|null} [attachments] AttachmentDataList attachments * @property {signalservice.SyncMessage.AttachmentBackfillResponse.IAttachmentData|null} [longText] AttachmentDataList longText */ /** * Constructs a new AttachmentDataList. * @memberof signalservice.SyncMessage.AttachmentBackfillResponse * @classdesc Represents an AttachmentDataList. * @implements IAttachmentDataList * @constructor * @param {signalservice.SyncMessage.AttachmentBackfillResponse.IAttachmentDataList=} [properties] Properties to set */ function AttachmentDataList(properties) { this.attachments = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * AttachmentDataList attachments. * @member {Array.} attachments * @memberof signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentDataList * @instance */ AttachmentDataList.prototype.attachments = $util.emptyArray; /** * AttachmentDataList longText. * @member {signalservice.SyncMessage.AttachmentBackfillResponse.IAttachmentData|null|undefined} longText * @memberof signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentDataList * @instance */ AttachmentDataList.prototype.longText = null; /** * Encodes the specified AttachmentDataList message. Does not implicitly {@link signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentDataList.verify|verify} messages. * @function encode * @memberof signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentDataList * @static * @param {signalservice.SyncMessage.AttachmentBackfillResponse.IAttachmentDataList} message AttachmentDataList message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ AttachmentDataList.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentDataList.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentDataList.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.attachments != null && message.attachments.length) for (var i = 0; i < message.attachments.length; ++i) $root.signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData.encode(message.attachments[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.longText != null && Object.hasOwnProperty.call(message, "longText")) $root.signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData.encode(message.longText, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified AttachmentDataList message, length delimited. Does not implicitly {@link signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentDataList.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentDataList * @static * @param {signalservice.SyncMessage.AttachmentBackfillResponse.IAttachmentDataList} message AttachmentDataList message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ AttachmentDataList.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an AttachmentDataList message from the specified reader or buffer. * @function decode * @memberof signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentDataList * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentDataList} AttachmentDataList * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ AttachmentDataList.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentDataList(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { if (!(message.attachments && message.attachments.length)) message.attachments = []; message.attachments.push($root.signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData.decode(reader, reader.uint32())); break; } case 2: { message.longText = $root.signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData.decode(reader, reader.uint32()); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an AttachmentDataList message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentDataList * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentDataList} AttachmentDataList * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ AttachmentDataList.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return AttachmentDataList; })(); return AttachmentBackfillResponse; })(); return SyncMessage; })(); signalservice.AttachmentPointer = (function() { /** * Properties of an AttachmentPointer. * @memberof signalservice * @interface IAttachmentPointer * @property {Long|null} [cdnId] AttachmentPointer cdnId * @property {string|null} [cdnKey] AttachmentPointer cdnKey * @property {Uint8Array|null} [clientUuid] AttachmentPointer clientUuid * @property {string|null} [contentType] AttachmentPointer contentType * @property {Uint8Array|null} [key] AttachmentPointer key * @property {number|null} [size] AttachmentPointer size * @property {Uint8Array|null} [thumbnail] AttachmentPointer thumbnail * @property {Uint8Array|null} [digest] AttachmentPointer digest * @property {Uint8Array|null} [incrementalMac] AttachmentPointer incrementalMac * @property {number|null} [chunkSize] AttachmentPointer chunkSize * @property {string|null} [fileName] AttachmentPointer fileName * @property {number|null} [flags] AttachmentPointer flags * @property {number|null} [width] AttachmentPointer width * @property {number|null} [height] AttachmentPointer height * @property {string|null} [caption] AttachmentPointer caption * @property {string|null} [blurHash] AttachmentPointer blurHash * @property {Long|null} [uploadTimestamp] AttachmentPointer uploadTimestamp * @property {number|null} [cdnNumber] AttachmentPointer cdnNumber */ /** * Constructs a new AttachmentPointer. * @memberof signalservice * @classdesc Represents an AttachmentPointer. * @implements IAttachmentPointer * @constructor * @param {signalservice.IAttachmentPointer=} [properties] Properties to set */ function AttachmentPointer(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * AttachmentPointer cdnId. * @member {Long|null|undefined} cdnId * @memberof signalservice.AttachmentPointer * @instance */ AttachmentPointer.prototype.cdnId = null; /** * AttachmentPointer cdnKey. * @member {string|null|undefined} cdnKey * @memberof signalservice.AttachmentPointer * @instance */ AttachmentPointer.prototype.cdnKey = null; /** * AttachmentPointer clientUuid. * @member {Uint8Array} clientUuid * @memberof signalservice.AttachmentPointer * @instance */ AttachmentPointer.prototype.clientUuid = $util.newBuffer([]); /** * AttachmentPointer contentType. * @member {string} contentType * @memberof signalservice.AttachmentPointer * @instance */ AttachmentPointer.prototype.contentType = ""; /** * AttachmentPointer key. * @member {Uint8Array} key * @memberof signalservice.AttachmentPointer * @instance */ AttachmentPointer.prototype.key = $util.newBuffer([]); /** * AttachmentPointer size. * @member {number} size * @memberof signalservice.AttachmentPointer * @instance */ AttachmentPointer.prototype.size = 0; /** * AttachmentPointer thumbnail. * @member {Uint8Array} thumbnail * @memberof signalservice.AttachmentPointer * @instance */ AttachmentPointer.prototype.thumbnail = $util.newBuffer([]); /** * AttachmentPointer digest. * @member {Uint8Array} digest * @memberof signalservice.AttachmentPointer * @instance */ AttachmentPointer.prototype.digest = $util.newBuffer([]); /** * AttachmentPointer incrementalMac. * @member {Uint8Array} incrementalMac * @memberof signalservice.AttachmentPointer * @instance */ AttachmentPointer.prototype.incrementalMac = $util.newBuffer([]); /** * AttachmentPointer chunkSize. * @member {number} chunkSize * @memberof signalservice.AttachmentPointer * @instance */ AttachmentPointer.prototype.chunkSize = 0; /** * AttachmentPointer fileName. * @member {string} fileName * @memberof signalservice.AttachmentPointer * @instance */ AttachmentPointer.prototype.fileName = ""; /** * AttachmentPointer flags. * @member {number} flags * @memberof signalservice.AttachmentPointer * @instance */ AttachmentPointer.prototype.flags = 0; /** * AttachmentPointer width. * @member {number} width * @memberof signalservice.AttachmentPointer * @instance */ AttachmentPointer.prototype.width = 0; /** * AttachmentPointer height. * @member {number} height * @memberof signalservice.AttachmentPointer * @instance */ AttachmentPointer.prototype.height = 0; /** * AttachmentPointer caption. * @member {string} caption * @memberof signalservice.AttachmentPointer * @instance */ AttachmentPointer.prototype.caption = ""; /** * AttachmentPointer blurHash. * @member {string} blurHash * @memberof signalservice.AttachmentPointer * @instance */ AttachmentPointer.prototype.blurHash = ""; /** * AttachmentPointer uploadTimestamp. * @member {Long} uploadTimestamp * @memberof signalservice.AttachmentPointer * @instance */ AttachmentPointer.prototype.uploadTimestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * AttachmentPointer cdnNumber. * @member {number} cdnNumber * @memberof signalservice.AttachmentPointer * @instance */ AttachmentPointer.prototype.cdnNumber = 0; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * AttachmentPointer attachmentIdentifier. * @member {"cdnId"|"cdnKey"|undefined} attachmentIdentifier * @memberof signalservice.AttachmentPointer * @instance */ Object.defineProperty(AttachmentPointer.prototype, "attachmentIdentifier", { get: $util.oneOfGetter($oneOfFields = ["cdnId", "cdnKey"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified AttachmentPointer message. Does not implicitly {@link signalservice.AttachmentPointer.verify|verify} messages. * @function encode * @memberof signalservice.AttachmentPointer * @static * @param {signalservice.IAttachmentPointer} message AttachmentPointer message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ AttachmentPointer.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.AttachmentPointer.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.AttachmentPointer.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.cdnId != null && Object.hasOwnProperty.call(message, "cdnId")) writer.uint32(/* id 1, wireType 1 =*/9).fixed64(message.cdnId); if (message.contentType != null && Object.hasOwnProperty.call(message, "contentType")) writer.uint32(/* id 2, wireType 2 =*/18).string(message.contentType); if (message.key != null && Object.hasOwnProperty.call(message, "key")) writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.key); if (message.size != null && Object.hasOwnProperty.call(message, "size")) writer.uint32(/* id 4, wireType 0 =*/32).uint32(message.size); if (message.thumbnail != null && Object.hasOwnProperty.call(message, "thumbnail")) writer.uint32(/* id 5, wireType 2 =*/42).bytes(message.thumbnail); if (message.digest != null && Object.hasOwnProperty.call(message, "digest")) writer.uint32(/* id 6, wireType 2 =*/50).bytes(message.digest); if (message.fileName != null && Object.hasOwnProperty.call(message, "fileName")) writer.uint32(/* id 7, wireType 2 =*/58).string(message.fileName); if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) writer.uint32(/* id 8, wireType 0 =*/64).uint32(message.flags); if (message.width != null && Object.hasOwnProperty.call(message, "width")) writer.uint32(/* id 9, wireType 0 =*/72).uint32(message.width); if (message.height != null && Object.hasOwnProperty.call(message, "height")) writer.uint32(/* id 10, wireType 0 =*/80).uint32(message.height); if (message.caption != null && Object.hasOwnProperty.call(message, "caption")) writer.uint32(/* id 11, wireType 2 =*/90).string(message.caption); if (message.blurHash != null && Object.hasOwnProperty.call(message, "blurHash")) writer.uint32(/* id 12, wireType 2 =*/98).string(message.blurHash); if (message.uploadTimestamp != null && Object.hasOwnProperty.call(message, "uploadTimestamp")) writer.uint32(/* id 13, wireType 0 =*/104).uint64(message.uploadTimestamp); if (message.cdnNumber != null && Object.hasOwnProperty.call(message, "cdnNumber")) writer.uint32(/* id 14, wireType 0 =*/112).uint32(message.cdnNumber); if (message.cdnKey != null && Object.hasOwnProperty.call(message, "cdnKey")) writer.uint32(/* id 15, wireType 2 =*/122).string(message.cdnKey); if (message.chunkSize != null && Object.hasOwnProperty.call(message, "chunkSize")) writer.uint32(/* id 17, wireType 0 =*/136).uint32(message.chunkSize); if (message.incrementalMac != null && Object.hasOwnProperty.call(message, "incrementalMac")) writer.uint32(/* id 19, wireType 2 =*/154).bytes(message.incrementalMac); if (message.clientUuid != null && Object.hasOwnProperty.call(message, "clientUuid")) writer.uint32(/* id 20, wireType 2 =*/162).bytes(message.clientUuid); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified AttachmentPointer message, length delimited. Does not implicitly {@link signalservice.AttachmentPointer.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.AttachmentPointer * @static * @param {signalservice.IAttachmentPointer} message AttachmentPointer message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ AttachmentPointer.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an AttachmentPointer message from the specified reader or buffer. * @function decode * @memberof signalservice.AttachmentPointer * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.AttachmentPointer} AttachmentPointer * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ AttachmentPointer.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.AttachmentPointer(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.cdnId = reader.fixed64(); break; } case 15: { message.cdnKey = reader.string(); break; } case 20: { message.clientUuid = reader.bytes(); break; } case 2: { message.contentType = reader.string(); break; } case 3: { message.key = reader.bytes(); break; } case 4: { message.size = reader.uint32(); break; } case 5: { message.thumbnail = reader.bytes(); break; } case 6: { message.digest = reader.bytes(); break; } case 19: { message.incrementalMac = reader.bytes(); break; } case 17: { message.chunkSize = reader.uint32(); break; } case 7: { message.fileName = reader.string(); break; } case 8: { message.flags = reader.uint32(); break; } case 9: { message.width = reader.uint32(); break; } case 10: { message.height = reader.uint32(); break; } case 11: { message.caption = reader.string(); break; } case 12: { message.blurHash = reader.string(); break; } case 13: { message.uploadTimestamp = reader.uint64(); break; } case 14: { message.cdnNumber = reader.uint32(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an AttachmentPointer message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.AttachmentPointer * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.AttachmentPointer} AttachmentPointer * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ AttachmentPointer.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * Flags enum. * @name signalservice.AttachmentPointer.Flags * @enum {number} * @property {number} VOICE_MESSAGE=1 VOICE_MESSAGE value * @property {number} BORDERLESS=2 BORDERLESS value * @property {number} GIF=8 GIF value */ AttachmentPointer.Flags = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[1] = "VOICE_MESSAGE"] = 1; values[valuesById[2] = "BORDERLESS"] = 2; values[valuesById[8] = "GIF"] = 8; return values; })(); return AttachmentPointer; })(); signalservice.GroupContextV2 = (function() { /** * Properties of a GroupContextV2. * @memberof signalservice * @interface IGroupContextV2 * @property {Uint8Array|null} [masterKey] GroupContextV2 masterKey * @property {number|null} [revision] GroupContextV2 revision * @property {Uint8Array|null} [groupChange] GroupContextV2 groupChange */ /** * Constructs a new GroupContextV2. * @memberof signalservice * @classdesc Represents a GroupContextV2. * @implements IGroupContextV2 * @constructor * @param {signalservice.IGroupContextV2=} [properties] Properties to set */ function GroupContextV2(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GroupContextV2 masterKey. * @member {Uint8Array} masterKey * @memberof signalservice.GroupContextV2 * @instance */ GroupContextV2.prototype.masterKey = $util.newBuffer([]); /** * GroupContextV2 revision. * @member {number} revision * @memberof signalservice.GroupContextV2 * @instance */ GroupContextV2.prototype.revision = 0; /** * GroupContextV2 groupChange. * @member {Uint8Array} groupChange * @memberof signalservice.GroupContextV2 * @instance */ GroupContextV2.prototype.groupChange = $util.newBuffer([]); /** * Encodes the specified GroupContextV2 message. Does not implicitly {@link signalservice.GroupContextV2.verify|verify} messages. * @function encode * @memberof signalservice.GroupContextV2 * @static * @param {signalservice.IGroupContextV2} message GroupContextV2 message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupContextV2.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.GroupContextV2.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.GroupContextV2.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.masterKey != null && Object.hasOwnProperty.call(message, "masterKey")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.masterKey); if (message.revision != null && Object.hasOwnProperty.call(message, "revision")) writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.revision); if (message.groupChange != null && Object.hasOwnProperty.call(message, "groupChange")) writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.groupChange); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupContextV2 message, length delimited. Does not implicitly {@link signalservice.GroupContextV2.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.GroupContextV2 * @static * @param {signalservice.IGroupContextV2} message GroupContextV2 message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupContextV2.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupContextV2 message from the specified reader or buffer. * @function decode * @memberof signalservice.GroupContextV2 * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.GroupContextV2} GroupContextV2 * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupContextV2.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.GroupContextV2(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.masterKey = reader.bytes(); break; } case 2: { message.revision = reader.uint32(); break; } case 3: { message.groupChange = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupContextV2 message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.GroupContextV2 * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.GroupContextV2} GroupContextV2 * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupContextV2.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return GroupContextV2; })(); signalservice.ContactDetails = (function() { /** * Properties of a ContactDetails. * @memberof signalservice * @interface IContactDetails * @property {string|null} [number] ContactDetails number * @property {string|null} [aci] ContactDetails aci * @property {Uint8Array|null} [aciBinary] ContactDetails aciBinary * @property {string|null} [name] ContactDetails name * @property {signalservice.ContactDetails.IAvatar|null} [avatar] ContactDetails avatar * @property {number|null} [expireTimer] ContactDetails expireTimer * @property {number|null} [expireTimerVersion] ContactDetails expireTimerVersion * @property {number|null} [inboxPosition] ContactDetails inboxPosition */ /** * Constructs a new ContactDetails. * @memberof signalservice * @classdesc Represents a ContactDetails. * @implements IContactDetails * @constructor * @param {signalservice.IContactDetails=} [properties] Properties to set */ function ContactDetails(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * ContactDetails number. * @member {string} number * @memberof signalservice.ContactDetails * @instance */ ContactDetails.prototype.number = ""; /** * ContactDetails aci. * @member {string} aci * @memberof signalservice.ContactDetails * @instance */ ContactDetails.prototype.aci = ""; /** * ContactDetails aciBinary. * @member {Uint8Array} aciBinary * @memberof signalservice.ContactDetails * @instance */ ContactDetails.prototype.aciBinary = $util.newBuffer([]); /** * ContactDetails name. * @member {string} name * @memberof signalservice.ContactDetails * @instance */ ContactDetails.prototype.name = ""; /** * ContactDetails avatar. * @member {signalservice.ContactDetails.IAvatar|null|undefined} avatar * @memberof signalservice.ContactDetails * @instance */ ContactDetails.prototype.avatar = null; /** * ContactDetails expireTimer. * @member {number} expireTimer * @memberof signalservice.ContactDetails * @instance */ ContactDetails.prototype.expireTimer = 0; /** * ContactDetails expireTimerVersion. * @member {number} expireTimerVersion * @memberof signalservice.ContactDetails * @instance */ ContactDetails.prototype.expireTimerVersion = 0; /** * ContactDetails inboxPosition. * @member {number} inboxPosition * @memberof signalservice.ContactDetails * @instance */ ContactDetails.prototype.inboxPosition = 0; /** * Encodes the specified ContactDetails message. Does not implicitly {@link signalservice.ContactDetails.verify|verify} messages. * @function encode * @memberof signalservice.ContactDetails * @static * @param {signalservice.IContactDetails} message ContactDetails message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ContactDetails.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.ContactDetails.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.ContactDetails.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.number != null && Object.hasOwnProperty.call(message, "number")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.number); if (message.name != null && Object.hasOwnProperty.call(message, "name")) writer.uint32(/* id 2, wireType 2 =*/18).string(message.name); if (message.avatar != null && Object.hasOwnProperty.call(message, "avatar")) $root.signalservice.ContactDetails.Avatar.encode(message.avatar, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); if (message.expireTimer != null && Object.hasOwnProperty.call(message, "expireTimer")) writer.uint32(/* id 8, wireType 0 =*/64).uint32(message.expireTimer); if (message.aci != null && Object.hasOwnProperty.call(message, "aci")) writer.uint32(/* id 9, wireType 2 =*/74).string(message.aci); if (message.inboxPosition != null && Object.hasOwnProperty.call(message, "inboxPosition")) writer.uint32(/* id 10, wireType 0 =*/80).uint32(message.inboxPosition); if (message.expireTimerVersion != null && Object.hasOwnProperty.call(message, "expireTimerVersion")) writer.uint32(/* id 12, wireType 0 =*/96).uint32(message.expireTimerVersion); if (message.aciBinary != null && Object.hasOwnProperty.call(message, "aciBinary")) writer.uint32(/* id 13, wireType 2 =*/106).bytes(message.aciBinary); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified ContactDetails message, length delimited. Does not implicitly {@link signalservice.ContactDetails.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.ContactDetails * @static * @param {signalservice.IContactDetails} message ContactDetails message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ContactDetails.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a ContactDetails message from the specified reader or buffer. * @function decode * @memberof signalservice.ContactDetails * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.ContactDetails} ContactDetails * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ContactDetails.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.ContactDetails(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.number = reader.string(); break; } case 9: { message.aci = reader.string(); break; } case 13: { message.aciBinary = reader.bytes(); break; } case 2: { message.name = reader.string(); break; } case 3: { message.avatar = $root.signalservice.ContactDetails.Avatar.decode(reader, reader.uint32()); break; } case 8: { message.expireTimer = reader.uint32(); break; } case 12: { message.expireTimerVersion = reader.uint32(); break; } case 10: { message.inboxPosition = reader.uint32(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a ContactDetails message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.ContactDetails * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.ContactDetails} ContactDetails * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ContactDetails.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; ContactDetails.Avatar = (function() { /** * Properties of an Avatar. * @memberof signalservice.ContactDetails * @interface IAvatar * @property {string|null} [contentType] Avatar contentType * @property {number|null} [length] Avatar length */ /** * Constructs a new Avatar. * @memberof signalservice.ContactDetails * @classdesc Represents an Avatar. * @implements IAvatar * @constructor * @param {signalservice.ContactDetails.IAvatar=} [properties] Properties to set */ function Avatar(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Avatar contentType. * @member {string} contentType * @memberof signalservice.ContactDetails.Avatar * @instance */ Avatar.prototype.contentType = ""; /** * Avatar length. * @member {number} length * @memberof signalservice.ContactDetails.Avatar * @instance */ Avatar.prototype.length = 0; /** * Encodes the specified Avatar message. Does not implicitly {@link signalservice.ContactDetails.Avatar.verify|verify} messages. * @function encode * @memberof signalservice.ContactDetails.Avatar * @static * @param {signalservice.ContactDetails.IAvatar} message Avatar message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Avatar.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.ContactDetails.Avatar.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.ContactDetails.Avatar.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.contentType != null && Object.hasOwnProperty.call(message, "contentType")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.contentType); if (message.length != null && Object.hasOwnProperty.call(message, "length")) writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.length); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Avatar message, length delimited. Does not implicitly {@link signalservice.ContactDetails.Avatar.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.ContactDetails.Avatar * @static * @param {signalservice.ContactDetails.IAvatar} message Avatar message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Avatar.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an Avatar message from the specified reader or buffer. * @function decode * @memberof signalservice.ContactDetails.Avatar * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.ContactDetails.Avatar} Avatar * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Avatar.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.ContactDetails.Avatar(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.contentType = reader.string(); break; } case 2: { message.length = reader.uint32(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an Avatar message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.ContactDetails.Avatar * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.ContactDetails.Avatar} Avatar * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Avatar.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return Avatar; })(); return ContactDetails; })(); signalservice.PaymentAddress = (function() { /** * Properties of a PaymentAddress. * @memberof signalservice * @interface IPaymentAddress * @property {signalservice.PaymentAddress.IMobileCoin|null} [mobileCoin] PaymentAddress mobileCoin */ /** * Constructs a new PaymentAddress. * @memberof signalservice * @classdesc Represents a PaymentAddress. * @implements IPaymentAddress * @constructor * @param {signalservice.IPaymentAddress=} [properties] Properties to set */ function PaymentAddress(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * PaymentAddress mobileCoin. * @member {signalservice.PaymentAddress.IMobileCoin|null|undefined} mobileCoin * @memberof signalservice.PaymentAddress * @instance */ PaymentAddress.prototype.mobileCoin = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * PaymentAddress Address. * @member {"mobileCoin"|undefined} Address * @memberof signalservice.PaymentAddress * @instance */ Object.defineProperty(PaymentAddress.prototype, "Address", { get: $util.oneOfGetter($oneOfFields = ["mobileCoin"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified PaymentAddress message. Does not implicitly {@link signalservice.PaymentAddress.verify|verify} messages. * @function encode * @memberof signalservice.PaymentAddress * @static * @param {signalservice.IPaymentAddress} message PaymentAddress message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ PaymentAddress.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.PaymentAddress.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.PaymentAddress.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.mobileCoin != null && Object.hasOwnProperty.call(message, "mobileCoin")) $root.signalservice.PaymentAddress.MobileCoin.encode(message.mobileCoin, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified PaymentAddress message, length delimited. Does not implicitly {@link signalservice.PaymentAddress.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.PaymentAddress * @static * @param {signalservice.IPaymentAddress} message PaymentAddress message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ PaymentAddress.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a PaymentAddress message from the specified reader or buffer. * @function decode * @memberof signalservice.PaymentAddress * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.PaymentAddress} PaymentAddress * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ PaymentAddress.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.PaymentAddress(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.mobileCoin = $root.signalservice.PaymentAddress.MobileCoin.decode(reader, reader.uint32()); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a PaymentAddress message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.PaymentAddress * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.PaymentAddress} PaymentAddress * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ PaymentAddress.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; PaymentAddress.MobileCoin = (function() { /** * Properties of a MobileCoin. * @memberof signalservice.PaymentAddress * @interface IMobileCoin * @property {Uint8Array|null} [publicAddress] MobileCoin publicAddress * @property {Uint8Array|null} [signature] MobileCoin signature */ /** * Constructs a new MobileCoin. * @memberof signalservice.PaymentAddress * @classdesc Represents a MobileCoin. * @implements IMobileCoin * @constructor * @param {signalservice.PaymentAddress.IMobileCoin=} [properties] Properties to set */ function MobileCoin(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * MobileCoin publicAddress. * @member {Uint8Array} publicAddress * @memberof signalservice.PaymentAddress.MobileCoin * @instance */ MobileCoin.prototype.publicAddress = $util.newBuffer([]); /** * MobileCoin signature. * @member {Uint8Array} signature * @memberof signalservice.PaymentAddress.MobileCoin * @instance */ MobileCoin.prototype.signature = $util.newBuffer([]); /** * Encodes the specified MobileCoin message. Does not implicitly {@link signalservice.PaymentAddress.MobileCoin.verify|verify} messages. * @function encode * @memberof signalservice.PaymentAddress.MobileCoin * @static * @param {signalservice.PaymentAddress.IMobileCoin} message MobileCoin message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ MobileCoin.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.PaymentAddress.MobileCoin.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.PaymentAddress.MobileCoin.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.publicAddress != null && Object.hasOwnProperty.call(message, "publicAddress")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.publicAddress); if (message.signature != null && Object.hasOwnProperty.call(message, "signature")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.signature); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified MobileCoin message, length delimited. Does not implicitly {@link signalservice.PaymentAddress.MobileCoin.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.PaymentAddress.MobileCoin * @static * @param {signalservice.PaymentAddress.IMobileCoin} message MobileCoin message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ MobileCoin.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a MobileCoin message from the specified reader or buffer. * @function decode * @memberof signalservice.PaymentAddress.MobileCoin * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.PaymentAddress.MobileCoin} MobileCoin * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ MobileCoin.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.PaymentAddress.MobileCoin(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.publicAddress = reader.bytes(); break; } case 2: { message.signature = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a MobileCoin message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.PaymentAddress.MobileCoin * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.PaymentAddress.MobileCoin} MobileCoin * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ MobileCoin.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return MobileCoin; })(); return PaymentAddress; })(); signalservice.DecryptionErrorMessage = (function() { /** * Properties of a DecryptionErrorMessage. * @memberof signalservice * @interface IDecryptionErrorMessage * @property {Uint8Array|null} [ratchetKey] DecryptionErrorMessage ratchetKey * @property {Long|null} [timestamp] DecryptionErrorMessage timestamp * @property {number|null} [deviceId] DecryptionErrorMessage deviceId */ /** * Constructs a new DecryptionErrorMessage. * @memberof signalservice * @classdesc Represents a DecryptionErrorMessage. * @implements IDecryptionErrorMessage * @constructor * @param {signalservice.IDecryptionErrorMessage=} [properties] Properties to set */ function DecryptionErrorMessage(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * DecryptionErrorMessage ratchetKey. * @member {Uint8Array} ratchetKey * @memberof signalservice.DecryptionErrorMessage * @instance */ DecryptionErrorMessage.prototype.ratchetKey = $util.newBuffer([]); /** * DecryptionErrorMessage timestamp. * @member {Long} timestamp * @memberof signalservice.DecryptionErrorMessage * @instance */ DecryptionErrorMessage.prototype.timestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * DecryptionErrorMessage deviceId. * @member {number} deviceId * @memberof signalservice.DecryptionErrorMessage * @instance */ DecryptionErrorMessage.prototype.deviceId = 0; /** * Encodes the specified DecryptionErrorMessage message. Does not implicitly {@link signalservice.DecryptionErrorMessage.verify|verify} messages. * @function encode * @memberof signalservice.DecryptionErrorMessage * @static * @param {signalservice.IDecryptionErrorMessage} message DecryptionErrorMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ DecryptionErrorMessage.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.DecryptionErrorMessage.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.DecryptionErrorMessage.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.ratchetKey != null && Object.hasOwnProperty.call(message, "ratchetKey")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.ratchetKey); if (message.timestamp != null && Object.hasOwnProperty.call(message, "timestamp")) writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.timestamp); if (message.deviceId != null && Object.hasOwnProperty.call(message, "deviceId")) writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.deviceId); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified DecryptionErrorMessage message, length delimited. Does not implicitly {@link signalservice.DecryptionErrorMessage.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.DecryptionErrorMessage * @static * @param {signalservice.IDecryptionErrorMessage} message DecryptionErrorMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ DecryptionErrorMessage.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a DecryptionErrorMessage message from the specified reader or buffer. * @function decode * @memberof signalservice.DecryptionErrorMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.DecryptionErrorMessage} DecryptionErrorMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ DecryptionErrorMessage.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.DecryptionErrorMessage(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.ratchetKey = reader.bytes(); break; } case 2: { message.timestamp = reader.uint64(); break; } case 3: { message.deviceId = reader.uint32(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a DecryptionErrorMessage message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.DecryptionErrorMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.DecryptionErrorMessage} DecryptionErrorMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ DecryptionErrorMessage.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return DecryptionErrorMessage; })(); signalservice.PniSignatureMessage = (function() { /** * Properties of a PniSignatureMessage. * @memberof signalservice * @interface IPniSignatureMessage * @property {Uint8Array|null} [pni] PniSignatureMessage pni * @property {Uint8Array|null} [signature] PniSignatureMessage signature */ /** * Constructs a new PniSignatureMessage. * @memberof signalservice * @classdesc Represents a PniSignatureMessage. * @implements IPniSignatureMessage * @constructor * @param {signalservice.IPniSignatureMessage=} [properties] Properties to set */ function PniSignatureMessage(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * PniSignatureMessage pni. * @member {Uint8Array} pni * @memberof signalservice.PniSignatureMessage * @instance */ PniSignatureMessage.prototype.pni = $util.newBuffer([]); /** * PniSignatureMessage signature. * @member {Uint8Array} signature * @memberof signalservice.PniSignatureMessage * @instance */ PniSignatureMessage.prototype.signature = $util.newBuffer([]); /** * Encodes the specified PniSignatureMessage message. Does not implicitly {@link signalservice.PniSignatureMessage.verify|verify} messages. * @function encode * @memberof signalservice.PniSignatureMessage * @static * @param {signalservice.IPniSignatureMessage} message PniSignatureMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ PniSignatureMessage.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.PniSignatureMessage.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.PniSignatureMessage.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.pni != null && Object.hasOwnProperty.call(message, "pni")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.pni); if (message.signature != null && Object.hasOwnProperty.call(message, "signature")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.signature); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified PniSignatureMessage message, length delimited. Does not implicitly {@link signalservice.PniSignatureMessage.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.PniSignatureMessage * @static * @param {signalservice.IPniSignatureMessage} message PniSignatureMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ PniSignatureMessage.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a PniSignatureMessage message from the specified reader or buffer. * @function decode * @memberof signalservice.PniSignatureMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.PniSignatureMessage} PniSignatureMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ PniSignatureMessage.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.PniSignatureMessage(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.pni = reader.bytes(); break; } case 2: { message.signature = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a PniSignatureMessage message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.PniSignatureMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.PniSignatureMessage} PniSignatureMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ PniSignatureMessage.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return PniSignatureMessage; })(); signalservice.EditMessage = (function() { /** * Properties of an EditMessage. * @memberof signalservice * @interface IEditMessage * @property {Long|null} [targetSentTimestamp] EditMessage targetSentTimestamp * @property {signalservice.IDataMessage|null} [dataMessage] EditMessage dataMessage */ /** * Constructs a new EditMessage. * @memberof signalservice * @classdesc Represents an EditMessage. * @implements IEditMessage * @constructor * @param {signalservice.IEditMessage=} [properties] Properties to set */ function EditMessage(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * EditMessage targetSentTimestamp. * @member {Long} targetSentTimestamp * @memberof signalservice.EditMessage * @instance */ EditMessage.prototype.targetSentTimestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * EditMessage dataMessage. * @member {signalservice.IDataMessage|null|undefined} dataMessage * @memberof signalservice.EditMessage * @instance */ EditMessage.prototype.dataMessage = null; /** * Encodes the specified EditMessage message. Does not implicitly {@link signalservice.EditMessage.verify|verify} messages. * @function encode * @memberof signalservice.EditMessage * @static * @param {signalservice.IEditMessage} message EditMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ EditMessage.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.EditMessage.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.EditMessage.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.targetSentTimestamp != null && Object.hasOwnProperty.call(message, "targetSentTimestamp")) writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.targetSentTimestamp); if (message.dataMessage != null && Object.hasOwnProperty.call(message, "dataMessage")) $root.signalservice.DataMessage.encode(message.dataMessage, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified EditMessage message, length delimited. Does not implicitly {@link signalservice.EditMessage.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.EditMessage * @static * @param {signalservice.IEditMessage} message EditMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ EditMessage.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an EditMessage message from the specified reader or buffer. * @function decode * @memberof signalservice.EditMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.EditMessage} EditMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ EditMessage.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.EditMessage(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.targetSentTimestamp = reader.uint64(); break; } case 2: { message.dataMessage = $root.signalservice.DataMessage.decode(reader, reader.uint32()); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an EditMessage message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.EditMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.EditMessage} EditMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ EditMessage.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return EditMessage; })(); signalservice.BodyRange = (function() { /** * Properties of a BodyRange. * @memberof signalservice * @interface IBodyRange * @property {number|null} [start] BodyRange start * @property {number|null} [length] BodyRange length * @property {string|null} [mentionAci] BodyRange mentionAci * @property {signalservice.BodyRange.Style|null} [style] BodyRange style * @property {Uint8Array|null} [mentionAciBinary] BodyRange mentionAciBinary */ /** * Constructs a new BodyRange. * @memberof signalservice * @classdesc Represents a BodyRange. * @implements IBodyRange * @constructor * @param {signalservice.IBodyRange=} [properties] Properties to set */ function BodyRange(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * BodyRange start. * @member {number} start * @memberof signalservice.BodyRange * @instance */ BodyRange.prototype.start = 0; /** * BodyRange length. * @member {number} length * @memberof signalservice.BodyRange * @instance */ BodyRange.prototype.length = 0; /** * BodyRange mentionAci. * @member {string|null|undefined} mentionAci * @memberof signalservice.BodyRange * @instance */ BodyRange.prototype.mentionAci = null; /** * BodyRange style. * @member {signalservice.BodyRange.Style|null|undefined} style * @memberof signalservice.BodyRange * @instance */ BodyRange.prototype.style = null; /** * BodyRange mentionAciBinary. * @member {Uint8Array|null|undefined} mentionAciBinary * @memberof signalservice.BodyRange * @instance */ BodyRange.prototype.mentionAciBinary = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * BodyRange associatedValue. * @member {"mentionAci"|"style"|"mentionAciBinary"|undefined} associatedValue * @memberof signalservice.BodyRange * @instance */ Object.defineProperty(BodyRange.prototype, "associatedValue", { get: $util.oneOfGetter($oneOfFields = ["mentionAci", "style", "mentionAciBinary"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified BodyRange message. Does not implicitly {@link signalservice.BodyRange.verify|verify} messages. * @function encode * @memberof signalservice.BodyRange * @static * @param {signalservice.IBodyRange} message BodyRange message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ BodyRange.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.BodyRange.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.BodyRange.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.start != null && Object.hasOwnProperty.call(message, "start")) writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.start); if (message.length != null && Object.hasOwnProperty.call(message, "length")) writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.length); if (message.mentionAci != null && Object.hasOwnProperty.call(message, "mentionAci")) writer.uint32(/* id 3, wireType 2 =*/26).string(message.mentionAci); if (message.style != null && Object.hasOwnProperty.call(message, "style")) writer.uint32(/* id 4, wireType 0 =*/32).int32(message.style); if (message.mentionAciBinary != null && Object.hasOwnProperty.call(message, "mentionAciBinary")) writer.uint32(/* id 5, wireType 2 =*/42).bytes(message.mentionAciBinary); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified BodyRange message, length delimited. Does not implicitly {@link signalservice.BodyRange.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.BodyRange * @static * @param {signalservice.IBodyRange} message BodyRange message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ BodyRange.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a BodyRange message from the specified reader or buffer. * @function decode * @memberof signalservice.BodyRange * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.BodyRange} BodyRange * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ BodyRange.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.BodyRange(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.start = reader.uint32(); break; } case 2: { message.length = reader.uint32(); break; } case 3: { message.mentionAci = reader.string(); break; } case 4: { message.style = reader.int32(); break; } case 5: { message.mentionAciBinary = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a BodyRange message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.BodyRange * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.BodyRange} BodyRange * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ BodyRange.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * Style enum. * @name signalservice.BodyRange.Style * @enum {number} * @property {number} NONE=0 NONE value * @property {number} BOLD=1 BOLD value * @property {number} ITALIC=2 ITALIC value * @property {number} SPOILER=3 SPOILER value * @property {number} STRIKETHROUGH=4 STRIKETHROUGH value * @property {number} MONOSPACE=5 MONOSPACE value */ BodyRange.Style = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "NONE"] = 0; values[valuesById[1] = "BOLD"] = 1; values[valuesById[2] = "ITALIC"] = 2; values[valuesById[3] = "SPOILER"] = 3; values[valuesById[4] = "STRIKETHROUGH"] = 4; values[valuesById[5] = "MONOSPACE"] = 5; return values; })(); return BodyRange; })(); signalservice.AddressableMessage = (function() { /** * Properties of an AddressableMessage. * @memberof signalservice * @interface IAddressableMessage * @property {string|null} [authorServiceId] AddressableMessage authorServiceId * @property {string|null} [authorE164] AddressableMessage authorE164 * @property {Uint8Array|null} [authorServiceIdBinary] AddressableMessage authorServiceIdBinary * @property {Long|null} [sentTimestamp] AddressableMessage sentTimestamp */ /** * Constructs a new AddressableMessage. * @memberof signalservice * @classdesc Represents an AddressableMessage. * @implements IAddressableMessage * @constructor * @param {signalservice.IAddressableMessage=} [properties] Properties to set */ function AddressableMessage(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * AddressableMessage authorServiceId. * @member {string|null|undefined} authorServiceId * @memberof signalservice.AddressableMessage * @instance */ AddressableMessage.prototype.authorServiceId = null; /** * AddressableMessage authorE164. * @member {string|null|undefined} authorE164 * @memberof signalservice.AddressableMessage * @instance */ AddressableMessage.prototype.authorE164 = null; /** * AddressableMessage authorServiceIdBinary. * @member {Uint8Array|null|undefined} authorServiceIdBinary * @memberof signalservice.AddressableMessage * @instance */ AddressableMessage.prototype.authorServiceIdBinary = null; /** * AddressableMessage sentTimestamp. * @member {Long} sentTimestamp * @memberof signalservice.AddressableMessage * @instance */ AddressableMessage.prototype.sentTimestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * AddressableMessage author. * @member {"authorServiceId"|"authorE164"|"authorServiceIdBinary"|undefined} author * @memberof signalservice.AddressableMessage * @instance */ Object.defineProperty(AddressableMessage.prototype, "author", { get: $util.oneOfGetter($oneOfFields = ["authorServiceId", "authorE164", "authorServiceIdBinary"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified AddressableMessage message. Does not implicitly {@link signalservice.AddressableMessage.verify|verify} messages. * @function encode * @memberof signalservice.AddressableMessage * @static * @param {signalservice.IAddressableMessage} message AddressableMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ AddressableMessage.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.AddressableMessage.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.AddressableMessage.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.authorServiceId != null && Object.hasOwnProperty.call(message, "authorServiceId")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.authorServiceId); if (message.authorE164 != null && Object.hasOwnProperty.call(message, "authorE164")) writer.uint32(/* id 2, wireType 2 =*/18).string(message.authorE164); if (message.sentTimestamp != null && Object.hasOwnProperty.call(message, "sentTimestamp")) writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.sentTimestamp); if (message.authorServiceIdBinary != null && Object.hasOwnProperty.call(message, "authorServiceIdBinary")) writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.authorServiceIdBinary); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified AddressableMessage message, length delimited. Does not implicitly {@link signalservice.AddressableMessage.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.AddressableMessage * @static * @param {signalservice.IAddressableMessage} message AddressableMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ AddressableMessage.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an AddressableMessage message from the specified reader or buffer. * @function decode * @memberof signalservice.AddressableMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.AddressableMessage} AddressableMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ AddressableMessage.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.AddressableMessage(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.authorServiceId = reader.string(); break; } case 2: { message.authorE164 = reader.string(); break; } case 4: { message.authorServiceIdBinary = reader.bytes(); break; } case 3: { message.sentTimestamp = reader.uint64(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an AddressableMessage message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.AddressableMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.AddressableMessage} AddressableMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ AddressableMessage.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return AddressableMessage; })(); signalservice.ConversationIdentifier = (function() { /** * Properties of a ConversationIdentifier. * @memberof signalservice * @interface IConversationIdentifier * @property {string|null} [threadServiceId] ConversationIdentifier threadServiceId * @property {Uint8Array|null} [threadGroupId] ConversationIdentifier threadGroupId * @property {string|null} [threadE164] ConversationIdentifier threadE164 * @property {Uint8Array|null} [threadServiceIdBinary] ConversationIdentifier threadServiceIdBinary */ /** * Constructs a new ConversationIdentifier. * @memberof signalservice * @classdesc Represents a ConversationIdentifier. * @implements IConversationIdentifier * @constructor * @param {signalservice.IConversationIdentifier=} [properties] Properties to set */ function ConversationIdentifier(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * ConversationIdentifier threadServiceId. * @member {string|null|undefined} threadServiceId * @memberof signalservice.ConversationIdentifier * @instance */ ConversationIdentifier.prototype.threadServiceId = null; /** * ConversationIdentifier threadGroupId. * @member {Uint8Array|null|undefined} threadGroupId * @memberof signalservice.ConversationIdentifier * @instance */ ConversationIdentifier.prototype.threadGroupId = null; /** * ConversationIdentifier threadE164. * @member {string|null|undefined} threadE164 * @memberof signalservice.ConversationIdentifier * @instance */ ConversationIdentifier.prototype.threadE164 = null; /** * ConversationIdentifier threadServiceIdBinary. * @member {Uint8Array|null|undefined} threadServiceIdBinary * @memberof signalservice.ConversationIdentifier * @instance */ ConversationIdentifier.prototype.threadServiceIdBinary = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * ConversationIdentifier identifier. * @member {"threadServiceId"|"threadGroupId"|"threadE164"|"threadServiceIdBinary"|undefined} identifier * @memberof signalservice.ConversationIdentifier * @instance */ Object.defineProperty(ConversationIdentifier.prototype, "identifier", { get: $util.oneOfGetter($oneOfFields = ["threadServiceId", "threadGroupId", "threadE164", "threadServiceIdBinary"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified ConversationIdentifier message. Does not implicitly {@link signalservice.ConversationIdentifier.verify|verify} messages. * @function encode * @memberof signalservice.ConversationIdentifier * @static * @param {signalservice.IConversationIdentifier} message ConversationIdentifier message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ConversationIdentifier.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.ConversationIdentifier.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.ConversationIdentifier.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.threadServiceId != null && Object.hasOwnProperty.call(message, "threadServiceId")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.threadServiceId); if (message.threadGroupId != null && Object.hasOwnProperty.call(message, "threadGroupId")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.threadGroupId); if (message.threadE164 != null && Object.hasOwnProperty.call(message, "threadE164")) writer.uint32(/* id 3, wireType 2 =*/26).string(message.threadE164); if (message.threadServiceIdBinary != null && Object.hasOwnProperty.call(message, "threadServiceIdBinary")) writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.threadServiceIdBinary); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified ConversationIdentifier message, length delimited. Does not implicitly {@link signalservice.ConversationIdentifier.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.ConversationIdentifier * @static * @param {signalservice.IConversationIdentifier} message ConversationIdentifier message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ConversationIdentifier.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a ConversationIdentifier message from the specified reader or buffer. * @function decode * @memberof signalservice.ConversationIdentifier * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.ConversationIdentifier} ConversationIdentifier * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ConversationIdentifier.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.ConversationIdentifier(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.threadServiceId = reader.string(); break; } case 2: { message.threadGroupId = reader.bytes(); break; } case 3: { message.threadE164 = reader.string(); break; } case 4: { message.threadServiceIdBinary = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a ConversationIdentifier message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.ConversationIdentifier * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.ConversationIdentifier} ConversationIdentifier * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ConversationIdentifier.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return ConversationIdentifier; })(); /** * OptionalBool enum. * @name signalservice.OptionalBool * @enum {number} * @property {number} UNSET=0 UNSET value * @property {number} ENABLED=1 ENABLED value * @property {number} DISABLED=2 DISABLED value */ signalservice.OptionalBool = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "UNSET"] = 0; values[valuesById[1] = "ENABLED"] = 1; values[valuesById[2] = "DISABLED"] = 2; return values; })(); signalservice.StorageManifest = (function() { /** * Properties of a StorageManifest. * @memberof signalservice * @interface IStorageManifest * @property {Long|null} [version] StorageManifest version * @property {Uint8Array|null} [value] StorageManifest value */ /** * Constructs a new StorageManifest. * @memberof signalservice * @classdesc Represents a StorageManifest. * @implements IStorageManifest * @constructor * @param {signalservice.IStorageManifest=} [properties] Properties to set */ function StorageManifest(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * StorageManifest version. * @member {Long} version * @memberof signalservice.StorageManifest * @instance */ StorageManifest.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * StorageManifest value. * @member {Uint8Array} value * @memberof signalservice.StorageManifest * @instance */ StorageManifest.prototype.value = $util.newBuffer([]); /** * Encodes the specified StorageManifest message. Does not implicitly {@link signalservice.StorageManifest.verify|verify} messages. * @function encode * @memberof signalservice.StorageManifest * @static * @param {signalservice.IStorageManifest} message StorageManifest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ StorageManifest.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.StorageManifest.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.StorageManifest.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.version != null && Object.hasOwnProperty.call(message, "version")) writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version); if (message.value != null && Object.hasOwnProperty.call(message, "value")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.value); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified StorageManifest message, length delimited. Does not implicitly {@link signalservice.StorageManifest.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.StorageManifest * @static * @param {signalservice.IStorageManifest} message StorageManifest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ StorageManifest.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a StorageManifest message from the specified reader or buffer. * @function decode * @memberof signalservice.StorageManifest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.StorageManifest} StorageManifest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ StorageManifest.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.StorageManifest(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.version = reader.uint64(); break; } case 2: { message.value = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a StorageManifest message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.StorageManifest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.StorageManifest} StorageManifest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ StorageManifest.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return StorageManifest; })(); signalservice.StorageItem = (function() { /** * Properties of a StorageItem. * @memberof signalservice * @interface IStorageItem * @property {Uint8Array|null} [key] StorageItem key * @property {Uint8Array|null} [value] StorageItem value */ /** * Constructs a new StorageItem. * @memberof signalservice * @classdesc Represents a StorageItem. * @implements IStorageItem * @constructor * @param {signalservice.IStorageItem=} [properties] Properties to set */ function StorageItem(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * StorageItem key. * @member {Uint8Array} key * @memberof signalservice.StorageItem * @instance */ StorageItem.prototype.key = $util.newBuffer([]); /** * StorageItem value. * @member {Uint8Array} value * @memberof signalservice.StorageItem * @instance */ StorageItem.prototype.value = $util.newBuffer([]); /** * Encodes the specified StorageItem message. Does not implicitly {@link signalservice.StorageItem.verify|verify} messages. * @function encode * @memberof signalservice.StorageItem * @static * @param {signalservice.IStorageItem} message StorageItem message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ StorageItem.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.StorageItem.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.StorageItem.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.key != null && Object.hasOwnProperty.call(message, "key")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.key); if (message.value != null && Object.hasOwnProperty.call(message, "value")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.value); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified StorageItem message, length delimited. Does not implicitly {@link signalservice.StorageItem.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.StorageItem * @static * @param {signalservice.IStorageItem} message StorageItem message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ StorageItem.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a StorageItem message from the specified reader or buffer. * @function decode * @memberof signalservice.StorageItem * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.StorageItem} StorageItem * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ StorageItem.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.StorageItem(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.key = reader.bytes(); break; } case 2: { message.value = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a StorageItem message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.StorageItem * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.StorageItem} StorageItem * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ StorageItem.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return StorageItem; })(); signalservice.StorageItems = (function() { /** * Properties of a StorageItems. * @memberof signalservice * @interface IStorageItems * @property {Array.|null} [items] StorageItems items */ /** * Constructs a new StorageItems. * @memberof signalservice * @classdesc Represents a StorageItems. * @implements IStorageItems * @constructor * @param {signalservice.IStorageItems=} [properties] Properties to set */ function StorageItems(properties) { this.items = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * StorageItems items. * @member {Array.} items * @memberof signalservice.StorageItems * @instance */ StorageItems.prototype.items = $util.emptyArray; /** * Encodes the specified StorageItems message. Does not implicitly {@link signalservice.StorageItems.verify|verify} messages. * @function encode * @memberof signalservice.StorageItems * @static * @param {signalservice.IStorageItems} message StorageItems message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ StorageItems.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.StorageItems.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.StorageItems.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.items != null && message.items.length) for (var i = 0; i < message.items.length; ++i) $root.signalservice.StorageItem.encode(message.items[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified StorageItems message, length delimited. Does not implicitly {@link signalservice.StorageItems.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.StorageItems * @static * @param {signalservice.IStorageItems} message StorageItems message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ StorageItems.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a StorageItems message from the specified reader or buffer. * @function decode * @memberof signalservice.StorageItems * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.StorageItems} StorageItems * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ StorageItems.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.StorageItems(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { if (!(message.items && message.items.length)) message.items = []; message.items.push($root.signalservice.StorageItem.decode(reader, reader.uint32())); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a StorageItems message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.StorageItems * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.StorageItems} StorageItems * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ StorageItems.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return StorageItems; })(); signalservice.WriteOperation = (function() { /** * Properties of a WriteOperation. * @memberof signalservice * @interface IWriteOperation * @property {signalservice.IStorageManifest|null} [manifest] WriteOperation manifest * @property {Array.|null} [insertItem] WriteOperation insertItem * @property {Array.|null} [deleteKey] WriteOperation deleteKey * @property {boolean|null} [clearAll] WriteOperation clearAll */ /** * Constructs a new WriteOperation. * @memberof signalservice * @classdesc Represents a WriteOperation. * @implements IWriteOperation * @constructor * @param {signalservice.IWriteOperation=} [properties] Properties to set */ function WriteOperation(properties) { this.insertItem = []; this.deleteKey = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * WriteOperation manifest. * @member {signalservice.IStorageManifest|null|undefined} manifest * @memberof signalservice.WriteOperation * @instance */ WriteOperation.prototype.manifest = null; /** * WriteOperation insertItem. * @member {Array.} insertItem * @memberof signalservice.WriteOperation * @instance */ WriteOperation.prototype.insertItem = $util.emptyArray; /** * WriteOperation deleteKey. * @member {Array.} deleteKey * @memberof signalservice.WriteOperation * @instance */ WriteOperation.prototype.deleteKey = $util.emptyArray; /** * WriteOperation clearAll. * @member {boolean} clearAll * @memberof signalservice.WriteOperation * @instance */ WriteOperation.prototype.clearAll = false; /** * Encodes the specified WriteOperation message. Does not implicitly {@link signalservice.WriteOperation.verify|verify} messages. * @function encode * @memberof signalservice.WriteOperation * @static * @param {signalservice.IWriteOperation} message WriteOperation message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ WriteOperation.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.WriteOperation.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.WriteOperation.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.manifest != null && Object.hasOwnProperty.call(message, "manifest")) $root.signalservice.StorageManifest.encode(message.manifest, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.insertItem != null && message.insertItem.length) for (var i = 0; i < message.insertItem.length; ++i) $root.signalservice.StorageItem.encode(message.insertItem[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); if (message.deleteKey != null && message.deleteKey.length) for (var i = 0; i < message.deleteKey.length; ++i) writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.deleteKey[i]); if (message.clearAll != null && Object.hasOwnProperty.call(message, "clearAll")) writer.uint32(/* id 4, wireType 0 =*/32).bool(message.clearAll); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified WriteOperation message, length delimited. Does not implicitly {@link signalservice.WriteOperation.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.WriteOperation * @static * @param {signalservice.IWriteOperation} message WriteOperation message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ WriteOperation.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a WriteOperation message from the specified reader or buffer. * @function decode * @memberof signalservice.WriteOperation * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.WriteOperation} WriteOperation * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ WriteOperation.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.WriteOperation(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.manifest = $root.signalservice.StorageManifest.decode(reader, reader.uint32()); break; } case 2: { if (!(message.insertItem && message.insertItem.length)) message.insertItem = []; message.insertItem.push($root.signalservice.StorageItem.decode(reader, reader.uint32())); break; } case 3: { if (!(message.deleteKey && message.deleteKey.length)) message.deleteKey = []; message.deleteKey.push(reader.bytes()); break; } case 4: { message.clearAll = reader.bool(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a WriteOperation message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.WriteOperation * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.WriteOperation} WriteOperation * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ WriteOperation.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return WriteOperation; })(); signalservice.ReadOperation = (function() { /** * Properties of a ReadOperation. * @memberof signalservice * @interface IReadOperation * @property {Array.|null} [readKey] ReadOperation readKey */ /** * Constructs a new ReadOperation. * @memberof signalservice * @classdesc Represents a ReadOperation. * @implements IReadOperation * @constructor * @param {signalservice.IReadOperation=} [properties] Properties to set */ function ReadOperation(properties) { this.readKey = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * ReadOperation readKey. * @member {Array.} readKey * @memberof signalservice.ReadOperation * @instance */ ReadOperation.prototype.readKey = $util.emptyArray; /** * Encodes the specified ReadOperation message. Does not implicitly {@link signalservice.ReadOperation.verify|verify} messages. * @function encode * @memberof signalservice.ReadOperation * @static * @param {signalservice.IReadOperation} message ReadOperation message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ReadOperation.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.ReadOperation.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.ReadOperation.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.readKey != null && message.readKey.length) for (var i = 0; i < message.readKey.length; ++i) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.readKey[i]); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified ReadOperation message, length delimited. Does not implicitly {@link signalservice.ReadOperation.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.ReadOperation * @static * @param {signalservice.IReadOperation} message ReadOperation message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ReadOperation.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a ReadOperation message from the specified reader or buffer. * @function decode * @memberof signalservice.ReadOperation * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.ReadOperation} ReadOperation * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ReadOperation.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.ReadOperation(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { if (!(message.readKey && message.readKey.length)) message.readKey = []; message.readKey.push(reader.bytes()); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a ReadOperation message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.ReadOperation * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.ReadOperation} ReadOperation * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ReadOperation.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return ReadOperation; })(); signalservice.ManifestRecord = (function() { /** * Properties of a ManifestRecord. * @memberof signalservice * @interface IManifestRecord * @property {Long|null} [version] ManifestRecord version * @property {number|null} [sourceDevice] ManifestRecord sourceDevice * @property {Array.|null} [identifiers] ManifestRecord identifiers * @property {Uint8Array|null} [recordIkm] ManifestRecord recordIkm */ /** * Constructs a new ManifestRecord. * @memberof signalservice * @classdesc Represents a ManifestRecord. * @implements IManifestRecord * @constructor * @param {signalservice.IManifestRecord=} [properties] Properties to set */ function ManifestRecord(properties) { this.identifiers = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * ManifestRecord version. * @member {Long} version * @memberof signalservice.ManifestRecord * @instance */ ManifestRecord.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * ManifestRecord sourceDevice. * @member {number} sourceDevice * @memberof signalservice.ManifestRecord * @instance */ ManifestRecord.prototype.sourceDevice = 0; /** * ManifestRecord identifiers. * @member {Array.} identifiers * @memberof signalservice.ManifestRecord * @instance */ ManifestRecord.prototype.identifiers = $util.emptyArray; /** * ManifestRecord recordIkm. * @member {Uint8Array} recordIkm * @memberof signalservice.ManifestRecord * @instance */ ManifestRecord.prototype.recordIkm = $util.newBuffer([]); /** * Encodes the specified ManifestRecord message. Does not implicitly {@link signalservice.ManifestRecord.verify|verify} messages. * @function encode * @memberof signalservice.ManifestRecord * @static * @param {signalservice.IManifestRecord} message ManifestRecord message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ManifestRecord.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.ManifestRecord.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.ManifestRecord.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.version != null && Object.hasOwnProperty.call(message, "version")) writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version); if (message.identifiers != null && message.identifiers.length) for (var i = 0; i < message.identifiers.length; ++i) $root.signalservice.ManifestRecord.Identifier.encode(message.identifiers[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); if (message.sourceDevice != null && Object.hasOwnProperty.call(message, "sourceDevice")) writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.sourceDevice); if (message.recordIkm != null && Object.hasOwnProperty.call(message, "recordIkm")) writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.recordIkm); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified ManifestRecord message, length delimited. Does not implicitly {@link signalservice.ManifestRecord.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.ManifestRecord * @static * @param {signalservice.IManifestRecord} message ManifestRecord message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ManifestRecord.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a ManifestRecord message from the specified reader or buffer. * @function decode * @memberof signalservice.ManifestRecord * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.ManifestRecord} ManifestRecord * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ManifestRecord.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.ManifestRecord(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.version = reader.uint64(); break; } case 3: { message.sourceDevice = reader.uint32(); break; } case 2: { if (!(message.identifiers && message.identifiers.length)) message.identifiers = []; message.identifiers.push($root.signalservice.ManifestRecord.Identifier.decode(reader, reader.uint32())); break; } case 4: { message.recordIkm = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a ManifestRecord message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.ManifestRecord * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.ManifestRecord} ManifestRecord * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ManifestRecord.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; ManifestRecord.Identifier = (function() { /** * Properties of an Identifier. * @memberof signalservice.ManifestRecord * @interface IIdentifier * @property {Uint8Array|null} [raw] Identifier raw * @property {signalservice.ManifestRecord.Identifier.Type|null} [type] Identifier type */ /** * Constructs a new Identifier. * @memberof signalservice.ManifestRecord * @classdesc Represents an Identifier. * @implements IIdentifier * @constructor * @param {signalservice.ManifestRecord.IIdentifier=} [properties] Properties to set */ function Identifier(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Identifier raw. * @member {Uint8Array} raw * @memberof signalservice.ManifestRecord.Identifier * @instance */ Identifier.prototype.raw = $util.newBuffer([]); /** * Identifier type. * @member {signalservice.ManifestRecord.Identifier.Type} type * @memberof signalservice.ManifestRecord.Identifier * @instance */ Identifier.prototype.type = 0; /** * Encodes the specified Identifier message. Does not implicitly {@link signalservice.ManifestRecord.Identifier.verify|verify} messages. * @function encode * @memberof signalservice.ManifestRecord.Identifier * @static * @param {signalservice.ManifestRecord.IIdentifier} message Identifier message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Identifier.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.ManifestRecord.Identifier.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.ManifestRecord.Identifier.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.raw != null && Object.hasOwnProperty.call(message, "raw")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.raw); if (message.type != null && Object.hasOwnProperty.call(message, "type")) writer.uint32(/* id 2, wireType 0 =*/16).int32(message.type); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Identifier message, length delimited. Does not implicitly {@link signalservice.ManifestRecord.Identifier.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.ManifestRecord.Identifier * @static * @param {signalservice.ManifestRecord.IIdentifier} message Identifier message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Identifier.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an Identifier message from the specified reader or buffer. * @function decode * @memberof signalservice.ManifestRecord.Identifier * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.ManifestRecord.Identifier} Identifier * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Identifier.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.ManifestRecord.Identifier(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.raw = reader.bytes(); break; } case 2: { message.type = reader.int32(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an Identifier message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.ManifestRecord.Identifier * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.ManifestRecord.Identifier} Identifier * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Identifier.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * Type enum. * @name signalservice.ManifestRecord.Identifier.Type * @enum {number} * @property {number} UNKNOWN=0 UNKNOWN value * @property {number} CONTACT=1 CONTACT value * @property {number} GROUPV1=2 GROUPV1 value * @property {number} GROUPV2=3 GROUPV2 value * @property {number} ACCOUNT=4 ACCOUNT value * @property {number} STORY_DISTRIBUTION_LIST=5 STORY_DISTRIBUTION_LIST value * @property {number} STICKER_PACK=6 STICKER_PACK value * @property {number} CALL_LINK=7 CALL_LINK value * @property {number} CHAT_FOLDER=8 CHAT_FOLDER value * @property {number} NOTIFICATION_PROFILE=9 NOTIFICATION_PROFILE value */ Identifier.Type = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "UNKNOWN"] = 0; values[valuesById[1] = "CONTACT"] = 1; values[valuesById[2] = "GROUPV1"] = 2; values[valuesById[3] = "GROUPV2"] = 3; values[valuesById[4] = "ACCOUNT"] = 4; values[valuesById[5] = "STORY_DISTRIBUTION_LIST"] = 5; values[valuesById[6] = "STICKER_PACK"] = 6; values[valuesById[7] = "CALL_LINK"] = 7; values[valuesById[8] = "CHAT_FOLDER"] = 8; values[valuesById[9] = "NOTIFICATION_PROFILE"] = 9; return values; })(); return Identifier; })(); return ManifestRecord; })(); signalservice.StorageRecord = (function() { /** * Properties of a StorageRecord. * @memberof signalservice * @interface IStorageRecord * @property {signalservice.IContactRecord|null} [contact] StorageRecord contact * @property {signalservice.IGroupV1Record|null} [groupV1] StorageRecord groupV1 * @property {signalservice.IGroupV2Record|null} [groupV2] StorageRecord groupV2 * @property {signalservice.IAccountRecord|null} [account] StorageRecord account * @property {signalservice.IStoryDistributionListRecord|null} [storyDistributionList] StorageRecord storyDistributionList * @property {signalservice.IStickerPackRecord|null} [stickerPack] StorageRecord stickerPack * @property {signalservice.ICallLinkRecord|null} [callLink] StorageRecord callLink * @property {signalservice.IChatFolderRecord|null} [chatFolder] StorageRecord chatFolder * @property {signalservice.INotificationProfile|null} [notificationProfile] StorageRecord notificationProfile */ /** * Constructs a new StorageRecord. * @memberof signalservice * @classdesc Represents a StorageRecord. * @implements IStorageRecord * @constructor * @param {signalservice.IStorageRecord=} [properties] Properties to set */ function StorageRecord(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * StorageRecord contact. * @member {signalservice.IContactRecord|null|undefined} contact * @memberof signalservice.StorageRecord * @instance */ StorageRecord.prototype.contact = null; /** * StorageRecord groupV1. * @member {signalservice.IGroupV1Record|null|undefined} groupV1 * @memberof signalservice.StorageRecord * @instance */ StorageRecord.prototype.groupV1 = null; /** * StorageRecord groupV2. * @member {signalservice.IGroupV2Record|null|undefined} groupV2 * @memberof signalservice.StorageRecord * @instance */ StorageRecord.prototype.groupV2 = null; /** * StorageRecord account. * @member {signalservice.IAccountRecord|null|undefined} account * @memberof signalservice.StorageRecord * @instance */ StorageRecord.prototype.account = null; /** * StorageRecord storyDistributionList. * @member {signalservice.IStoryDistributionListRecord|null|undefined} storyDistributionList * @memberof signalservice.StorageRecord * @instance */ StorageRecord.prototype.storyDistributionList = null; /** * StorageRecord stickerPack. * @member {signalservice.IStickerPackRecord|null|undefined} stickerPack * @memberof signalservice.StorageRecord * @instance */ StorageRecord.prototype.stickerPack = null; /** * StorageRecord callLink. * @member {signalservice.ICallLinkRecord|null|undefined} callLink * @memberof signalservice.StorageRecord * @instance */ StorageRecord.prototype.callLink = null; /** * StorageRecord chatFolder. * @member {signalservice.IChatFolderRecord|null|undefined} chatFolder * @memberof signalservice.StorageRecord * @instance */ StorageRecord.prototype.chatFolder = null; /** * StorageRecord notificationProfile. * @member {signalservice.INotificationProfile|null|undefined} notificationProfile * @memberof signalservice.StorageRecord * @instance */ StorageRecord.prototype.notificationProfile = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * StorageRecord record. * @member {"contact"|"groupV1"|"groupV2"|"account"|"storyDistributionList"|"stickerPack"|"callLink"|"chatFolder"|"notificationProfile"|undefined} record * @memberof signalservice.StorageRecord * @instance */ Object.defineProperty(StorageRecord.prototype, "record", { get: $util.oneOfGetter($oneOfFields = ["contact", "groupV1", "groupV2", "account", "storyDistributionList", "stickerPack", "callLink", "chatFolder", "notificationProfile"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified StorageRecord message. Does not implicitly {@link signalservice.StorageRecord.verify|verify} messages. * @function encode * @memberof signalservice.StorageRecord * @static * @param {signalservice.IStorageRecord} message StorageRecord message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ StorageRecord.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.StorageRecord.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.StorageRecord.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.contact != null && Object.hasOwnProperty.call(message, "contact")) $root.signalservice.ContactRecord.encode(message.contact, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.groupV1 != null && Object.hasOwnProperty.call(message, "groupV1")) $root.signalservice.GroupV1Record.encode(message.groupV1, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); if (message.groupV2 != null && Object.hasOwnProperty.call(message, "groupV2")) $root.signalservice.GroupV2Record.encode(message.groupV2, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); if (message.account != null && Object.hasOwnProperty.call(message, "account")) $root.signalservice.AccountRecord.encode(message.account, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); if (message.storyDistributionList != null && Object.hasOwnProperty.call(message, "storyDistributionList")) $root.signalservice.StoryDistributionListRecord.encode(message.storyDistributionList, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); if (message.stickerPack != null && Object.hasOwnProperty.call(message, "stickerPack")) $root.signalservice.StickerPackRecord.encode(message.stickerPack, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim(); if (message.callLink != null && Object.hasOwnProperty.call(message, "callLink")) $root.signalservice.CallLinkRecord.encode(message.callLink, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim(); if (message.chatFolder != null && Object.hasOwnProperty.call(message, "chatFolder")) $root.signalservice.ChatFolderRecord.encode(message.chatFolder, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim(); if (message.notificationProfile != null && Object.hasOwnProperty.call(message, "notificationProfile")) $root.signalservice.NotificationProfile.encode(message.notificationProfile, writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified StorageRecord message, length delimited. Does not implicitly {@link signalservice.StorageRecord.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.StorageRecord * @static * @param {signalservice.IStorageRecord} message StorageRecord message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ StorageRecord.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a StorageRecord message from the specified reader or buffer. * @function decode * @memberof signalservice.StorageRecord * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.StorageRecord} StorageRecord * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ StorageRecord.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.StorageRecord(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.contact = $root.signalservice.ContactRecord.decode(reader, reader.uint32()); break; } case 2: { message.groupV1 = $root.signalservice.GroupV1Record.decode(reader, reader.uint32()); break; } case 3: { message.groupV2 = $root.signalservice.GroupV2Record.decode(reader, reader.uint32()); break; } case 4: { message.account = $root.signalservice.AccountRecord.decode(reader, reader.uint32()); break; } case 5: { message.storyDistributionList = $root.signalservice.StoryDistributionListRecord.decode(reader, reader.uint32()); break; } case 6: { message.stickerPack = $root.signalservice.StickerPackRecord.decode(reader, reader.uint32()); break; } case 7: { message.callLink = $root.signalservice.CallLinkRecord.decode(reader, reader.uint32()); break; } case 8: { message.chatFolder = $root.signalservice.ChatFolderRecord.decode(reader, reader.uint32()); break; } case 9: { message.notificationProfile = $root.signalservice.NotificationProfile.decode(reader, reader.uint32()); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a StorageRecord message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.StorageRecord * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.StorageRecord} StorageRecord * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ StorageRecord.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return StorageRecord; })(); /** * AvatarColor enum. * @name signalservice.AvatarColor * @enum {number} * @property {number} A100=0 A100 value * @property {number} A110=1 A110 value * @property {number} A120=2 A120 value * @property {number} A130=3 A130 value * @property {number} A140=4 A140 value * @property {number} A150=5 A150 value * @property {number} A160=6 A160 value * @property {number} A170=7 A170 value * @property {number} A180=8 A180 value * @property {number} A190=9 A190 value * @property {number} A200=10 A200 value * @property {number} A210=11 A210 value */ signalservice.AvatarColor = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "A100"] = 0; values[valuesById[1] = "A110"] = 1; values[valuesById[2] = "A120"] = 2; values[valuesById[3] = "A130"] = 3; values[valuesById[4] = "A140"] = 4; values[valuesById[5] = "A150"] = 5; values[valuesById[6] = "A160"] = 6; values[valuesById[7] = "A170"] = 7; values[valuesById[8] = "A180"] = 8; values[valuesById[9] = "A190"] = 9; values[valuesById[10] = "A200"] = 10; values[valuesById[11] = "A210"] = 11; return values; })(); signalservice.ContactRecord = (function() { /** * Properties of a ContactRecord. * @memberof signalservice * @interface IContactRecord * @property {string|null} [aci] ContactRecord aci * @property {string|null} [e164] ContactRecord e164 * @property {string|null} [pni] ContactRecord pni * @property {Uint8Array|null} [profileKey] ContactRecord profileKey * @property {Uint8Array|null} [identityKey] ContactRecord identityKey * @property {signalservice.ContactRecord.IdentityState|null} [identityState] ContactRecord identityState * @property {string|null} [givenName] ContactRecord givenName * @property {string|null} [familyName] ContactRecord familyName * @property {string|null} [username] ContactRecord username * @property {boolean|null} [blocked] ContactRecord blocked * @property {boolean|null} [whitelisted] ContactRecord whitelisted * @property {boolean|null} [archived] ContactRecord archived * @property {boolean|null} [markedUnread] ContactRecord markedUnread * @property {Long|null} [mutedUntilTimestamp] ContactRecord mutedUntilTimestamp * @property {boolean|null} [hideStory] ContactRecord hideStory * @property {Long|null} [unregisteredAtTimestamp] ContactRecord unregisteredAtTimestamp * @property {string|null} [systemGivenName] ContactRecord systemGivenName * @property {string|null} [systemFamilyName] ContactRecord systemFamilyName * @property {string|null} [systemNickname] ContactRecord systemNickname * @property {boolean|null} [hidden] ContactRecord hidden * @property {boolean|null} [pniSignatureVerified] ContactRecord pniSignatureVerified * @property {signalservice.ContactRecord.IName|null} [nickname] ContactRecord nickname * @property {string|null} [note] ContactRecord note * @property {signalservice.AvatarColor|null} [avatarColor] ContactRecord avatarColor * @property {Uint8Array|null} [aciBinary] ContactRecord aciBinary * @property {Uint8Array|null} [pniBinary] ContactRecord pniBinary */ /** * Constructs a new ContactRecord. * @memberof signalservice * @classdesc Represents a ContactRecord. * @implements IContactRecord * @constructor * @param {signalservice.IContactRecord=} [properties] Properties to set */ function ContactRecord(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * ContactRecord aci. * @member {string} aci * @memberof signalservice.ContactRecord * @instance */ ContactRecord.prototype.aci = ""; /** * ContactRecord e164. * @member {string} e164 * @memberof signalservice.ContactRecord * @instance */ ContactRecord.prototype.e164 = ""; /** * ContactRecord pni. * @member {string} pni * @memberof signalservice.ContactRecord * @instance */ ContactRecord.prototype.pni = ""; /** * ContactRecord profileKey. * @member {Uint8Array} profileKey * @memberof signalservice.ContactRecord * @instance */ ContactRecord.prototype.profileKey = $util.newBuffer([]); /** * ContactRecord identityKey. * @member {Uint8Array} identityKey * @memberof signalservice.ContactRecord * @instance */ ContactRecord.prototype.identityKey = $util.newBuffer([]); /** * ContactRecord identityState. * @member {signalservice.ContactRecord.IdentityState} identityState * @memberof signalservice.ContactRecord * @instance */ ContactRecord.prototype.identityState = 0; /** * ContactRecord givenName. * @member {string} givenName * @memberof signalservice.ContactRecord * @instance */ ContactRecord.prototype.givenName = ""; /** * ContactRecord familyName. * @member {string} familyName * @memberof signalservice.ContactRecord * @instance */ ContactRecord.prototype.familyName = ""; /** * ContactRecord username. * @member {string} username * @memberof signalservice.ContactRecord * @instance */ ContactRecord.prototype.username = ""; /** * ContactRecord blocked. * @member {boolean} blocked * @memberof signalservice.ContactRecord * @instance */ ContactRecord.prototype.blocked = false; /** * ContactRecord whitelisted. * @member {boolean} whitelisted * @memberof signalservice.ContactRecord * @instance */ ContactRecord.prototype.whitelisted = false; /** * ContactRecord archived. * @member {boolean} archived * @memberof signalservice.ContactRecord * @instance */ ContactRecord.prototype.archived = false; /** * ContactRecord markedUnread. * @member {boolean} markedUnread * @memberof signalservice.ContactRecord * @instance */ ContactRecord.prototype.markedUnread = false; /** * ContactRecord mutedUntilTimestamp. * @member {Long} mutedUntilTimestamp * @memberof signalservice.ContactRecord * @instance */ ContactRecord.prototype.mutedUntilTimestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * ContactRecord hideStory. * @member {boolean} hideStory * @memberof signalservice.ContactRecord * @instance */ ContactRecord.prototype.hideStory = false; /** * ContactRecord unregisteredAtTimestamp. * @member {Long} unregisteredAtTimestamp * @memberof signalservice.ContactRecord * @instance */ ContactRecord.prototype.unregisteredAtTimestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * ContactRecord systemGivenName. * @member {string} systemGivenName * @memberof signalservice.ContactRecord * @instance */ ContactRecord.prototype.systemGivenName = ""; /** * ContactRecord systemFamilyName. * @member {string} systemFamilyName * @memberof signalservice.ContactRecord * @instance */ ContactRecord.prototype.systemFamilyName = ""; /** * ContactRecord systemNickname. * @member {string} systemNickname * @memberof signalservice.ContactRecord * @instance */ ContactRecord.prototype.systemNickname = ""; /** * ContactRecord hidden. * @member {boolean} hidden * @memberof signalservice.ContactRecord * @instance */ ContactRecord.prototype.hidden = false; /** * ContactRecord pniSignatureVerified. * @member {boolean} pniSignatureVerified * @memberof signalservice.ContactRecord * @instance */ ContactRecord.prototype.pniSignatureVerified = false; /** * ContactRecord nickname. * @member {signalservice.ContactRecord.IName|null|undefined} nickname * @memberof signalservice.ContactRecord * @instance */ ContactRecord.prototype.nickname = null; /** * ContactRecord note. * @member {string} note * @memberof signalservice.ContactRecord * @instance */ ContactRecord.prototype.note = ""; /** * ContactRecord avatarColor. * @member {signalservice.AvatarColor|null|undefined} avatarColor * @memberof signalservice.ContactRecord * @instance */ ContactRecord.prototype.avatarColor = null; /** * ContactRecord aciBinary. * @member {Uint8Array} aciBinary * @memberof signalservice.ContactRecord * @instance */ ContactRecord.prototype.aciBinary = $util.newBuffer([]); /** * ContactRecord pniBinary. * @member {Uint8Array} pniBinary * @memberof signalservice.ContactRecord * @instance */ ContactRecord.prototype.pniBinary = $util.newBuffer([]); // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * ContactRecord _avatarColor. * @member {"avatarColor"|undefined} _avatarColor * @memberof signalservice.ContactRecord * @instance */ Object.defineProperty(ContactRecord.prototype, "_avatarColor", { get: $util.oneOfGetter($oneOfFields = ["avatarColor"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified ContactRecord message. Does not implicitly {@link signalservice.ContactRecord.verify|verify} messages. * @function encode * @memberof signalservice.ContactRecord * @static * @param {signalservice.IContactRecord} message ContactRecord message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ContactRecord.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.ContactRecord.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.ContactRecord.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.aci != null && Object.hasOwnProperty.call(message, "aci")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.aci); if (message.e164 != null && Object.hasOwnProperty.call(message, "e164")) writer.uint32(/* id 2, wireType 2 =*/18).string(message.e164); if (message.profileKey != null && Object.hasOwnProperty.call(message, "profileKey")) writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.profileKey); if (message.identityKey != null && Object.hasOwnProperty.call(message, "identityKey")) writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.identityKey); if (message.identityState != null && Object.hasOwnProperty.call(message, "identityState")) writer.uint32(/* id 5, wireType 0 =*/40).int32(message.identityState); if (message.givenName != null && Object.hasOwnProperty.call(message, "givenName")) writer.uint32(/* id 6, wireType 2 =*/50).string(message.givenName); if (message.familyName != null && Object.hasOwnProperty.call(message, "familyName")) writer.uint32(/* id 7, wireType 2 =*/58).string(message.familyName); if (message.username != null && Object.hasOwnProperty.call(message, "username")) writer.uint32(/* id 8, wireType 2 =*/66).string(message.username); if (message.blocked != null && Object.hasOwnProperty.call(message, "blocked")) writer.uint32(/* id 9, wireType 0 =*/72).bool(message.blocked); if (message.whitelisted != null && Object.hasOwnProperty.call(message, "whitelisted")) writer.uint32(/* id 10, wireType 0 =*/80).bool(message.whitelisted); if (message.archived != null && Object.hasOwnProperty.call(message, "archived")) writer.uint32(/* id 11, wireType 0 =*/88).bool(message.archived); if (message.markedUnread != null && Object.hasOwnProperty.call(message, "markedUnread")) writer.uint32(/* id 12, wireType 0 =*/96).bool(message.markedUnread); if (message.mutedUntilTimestamp != null && Object.hasOwnProperty.call(message, "mutedUntilTimestamp")) writer.uint32(/* id 13, wireType 0 =*/104).uint64(message.mutedUntilTimestamp); if (message.hideStory != null && Object.hasOwnProperty.call(message, "hideStory")) writer.uint32(/* id 14, wireType 0 =*/112).bool(message.hideStory); if (message.pni != null && Object.hasOwnProperty.call(message, "pni")) writer.uint32(/* id 15, wireType 2 =*/122).string(message.pni); if (message.unregisteredAtTimestamp != null && Object.hasOwnProperty.call(message, "unregisteredAtTimestamp")) writer.uint32(/* id 16, wireType 0 =*/128).uint64(message.unregisteredAtTimestamp); if (message.systemGivenName != null && Object.hasOwnProperty.call(message, "systemGivenName")) writer.uint32(/* id 17, wireType 2 =*/138).string(message.systemGivenName); if (message.systemFamilyName != null && Object.hasOwnProperty.call(message, "systemFamilyName")) writer.uint32(/* id 18, wireType 2 =*/146).string(message.systemFamilyName); if (message.systemNickname != null && Object.hasOwnProperty.call(message, "systemNickname")) writer.uint32(/* id 19, wireType 2 =*/154).string(message.systemNickname); if (message.hidden != null && Object.hasOwnProperty.call(message, "hidden")) writer.uint32(/* id 20, wireType 0 =*/160).bool(message.hidden); if (message.pniSignatureVerified != null && Object.hasOwnProperty.call(message, "pniSignatureVerified")) writer.uint32(/* id 21, wireType 0 =*/168).bool(message.pniSignatureVerified); if (message.nickname != null && Object.hasOwnProperty.call(message, "nickname")) $root.signalservice.ContactRecord.Name.encode(message.nickname, writer.uint32(/* id 22, wireType 2 =*/178).fork()).ldelim(); if (message.note != null && Object.hasOwnProperty.call(message, "note")) writer.uint32(/* id 23, wireType 2 =*/186).string(message.note); if (message.avatarColor != null && Object.hasOwnProperty.call(message, "avatarColor")) writer.uint32(/* id 24, wireType 0 =*/192).int32(message.avatarColor); if (message.aciBinary != null && Object.hasOwnProperty.call(message, "aciBinary")) writer.uint32(/* id 25, wireType 2 =*/202).bytes(message.aciBinary); if (message.pniBinary != null && Object.hasOwnProperty.call(message, "pniBinary")) writer.uint32(/* id 26, wireType 2 =*/210).bytes(message.pniBinary); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified ContactRecord message, length delimited. Does not implicitly {@link signalservice.ContactRecord.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.ContactRecord * @static * @param {signalservice.IContactRecord} message ContactRecord message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ContactRecord.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a ContactRecord message from the specified reader or buffer. * @function decode * @memberof signalservice.ContactRecord * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.ContactRecord} ContactRecord * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ContactRecord.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.ContactRecord(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.aci = reader.string(); break; } case 2: { message.e164 = reader.string(); break; } case 15: { message.pni = reader.string(); break; } case 3: { message.profileKey = reader.bytes(); break; } case 4: { message.identityKey = reader.bytes(); break; } case 5: { message.identityState = reader.int32(); break; } case 6: { message.givenName = reader.string(); break; } case 7: { message.familyName = reader.string(); break; } case 8: { message.username = reader.string(); break; } case 9: { message.blocked = reader.bool(); break; } case 10: { message.whitelisted = reader.bool(); break; } case 11: { message.archived = reader.bool(); break; } case 12: { message.markedUnread = reader.bool(); break; } case 13: { message.mutedUntilTimestamp = reader.uint64(); break; } case 14: { message.hideStory = reader.bool(); break; } case 16: { message.unregisteredAtTimestamp = reader.uint64(); break; } case 17: { message.systemGivenName = reader.string(); break; } case 18: { message.systemFamilyName = reader.string(); break; } case 19: { message.systemNickname = reader.string(); break; } case 20: { message.hidden = reader.bool(); break; } case 21: { message.pniSignatureVerified = reader.bool(); break; } case 22: { message.nickname = $root.signalservice.ContactRecord.Name.decode(reader, reader.uint32()); break; } case 23: { message.note = reader.string(); break; } case 24: { message.avatarColor = reader.int32(); break; } case 25: { message.aciBinary = reader.bytes(); break; } case 26: { message.pniBinary = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a ContactRecord message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.ContactRecord * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.ContactRecord} ContactRecord * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ContactRecord.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * IdentityState enum. * @name signalservice.ContactRecord.IdentityState * @enum {number} * @property {number} DEFAULT=0 DEFAULT value * @property {number} VERIFIED=1 VERIFIED value * @property {number} UNVERIFIED=2 UNVERIFIED value */ ContactRecord.IdentityState = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "DEFAULT"] = 0; values[valuesById[1] = "VERIFIED"] = 1; values[valuesById[2] = "UNVERIFIED"] = 2; return values; })(); ContactRecord.Name = (function() { /** * Properties of a Name. * @memberof signalservice.ContactRecord * @interface IName * @property {string|null} [given] Name given * @property {string|null} [family] Name family */ /** * Constructs a new Name. * @memberof signalservice.ContactRecord * @classdesc Represents a Name. * @implements IName * @constructor * @param {signalservice.ContactRecord.IName=} [properties] Properties to set */ function Name(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Name given. * @member {string} given * @memberof signalservice.ContactRecord.Name * @instance */ Name.prototype.given = ""; /** * Name family. * @member {string} family * @memberof signalservice.ContactRecord.Name * @instance */ Name.prototype.family = ""; /** * Encodes the specified Name message. Does not implicitly {@link signalservice.ContactRecord.Name.verify|verify} messages. * @function encode * @memberof signalservice.ContactRecord.Name * @static * @param {signalservice.ContactRecord.IName} message Name message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Name.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.ContactRecord.Name.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.ContactRecord.Name.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.given != null && Object.hasOwnProperty.call(message, "given")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.given); if (message.family != null && Object.hasOwnProperty.call(message, "family")) writer.uint32(/* id 2, wireType 2 =*/18).string(message.family); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Name message, length delimited. Does not implicitly {@link signalservice.ContactRecord.Name.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.ContactRecord.Name * @static * @param {signalservice.ContactRecord.IName} message Name message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Name.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Name message from the specified reader or buffer. * @function decode * @memberof signalservice.ContactRecord.Name * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.ContactRecord.Name} Name * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Name.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.ContactRecord.Name(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.given = reader.string(); break; } case 2: { message.family = reader.string(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Name message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.ContactRecord.Name * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.ContactRecord.Name} Name * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Name.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return Name; })(); return ContactRecord; })(); signalservice.GroupV1Record = (function() { /** * Properties of a GroupV1Record. * @memberof signalservice * @interface IGroupV1Record * @property {Uint8Array|null} [id] GroupV1Record id */ /** * Constructs a new GroupV1Record. * @memberof signalservice * @classdesc Represents a GroupV1Record. * @implements IGroupV1Record * @constructor * @param {signalservice.IGroupV1Record=} [properties] Properties to set */ function GroupV1Record(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GroupV1Record id. * @member {Uint8Array} id * @memberof signalservice.GroupV1Record * @instance */ GroupV1Record.prototype.id = $util.newBuffer([]); /** * Encodes the specified GroupV1Record message. Does not implicitly {@link signalservice.GroupV1Record.verify|verify} messages. * @function encode * @memberof signalservice.GroupV1Record * @static * @param {signalservice.IGroupV1Record} message GroupV1Record message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupV1Record.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.GroupV1Record.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.GroupV1Record.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.id != null && Object.hasOwnProperty.call(message, "id")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.id); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupV1Record message, length delimited. Does not implicitly {@link signalservice.GroupV1Record.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.GroupV1Record * @static * @param {signalservice.IGroupV1Record} message GroupV1Record message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupV1Record.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupV1Record message from the specified reader or buffer. * @function decode * @memberof signalservice.GroupV1Record * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.GroupV1Record} GroupV1Record * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupV1Record.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.GroupV1Record(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.id = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupV1Record message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.GroupV1Record * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.GroupV1Record} GroupV1Record * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupV1Record.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return GroupV1Record; })(); signalservice.GroupV2Record = (function() { /** * Properties of a GroupV2Record. * @memberof signalservice * @interface IGroupV2Record * @property {Uint8Array|null} [masterKey] GroupV2Record masterKey * @property {boolean|null} [blocked] GroupV2Record blocked * @property {boolean|null} [whitelisted] GroupV2Record whitelisted * @property {boolean|null} [archived] GroupV2Record archived * @property {boolean|null} [markedUnread] GroupV2Record markedUnread * @property {Long|null} [mutedUntilTimestamp] GroupV2Record mutedUntilTimestamp * @property {boolean|null} [dontNotifyForMentionsIfMuted] GroupV2Record dontNotifyForMentionsIfMuted * @property {boolean|null} [hideStory] GroupV2Record hideStory * @property {signalservice.GroupV2Record.StorySendMode|null} [storySendMode] GroupV2Record storySendMode * @property {signalservice.AvatarColor|null} [avatarColor] GroupV2Record avatarColor */ /** * Constructs a new GroupV2Record. * @memberof signalservice * @classdesc Represents a GroupV2Record. * @implements IGroupV2Record * @constructor * @param {signalservice.IGroupV2Record=} [properties] Properties to set */ function GroupV2Record(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GroupV2Record masterKey. * @member {Uint8Array} masterKey * @memberof signalservice.GroupV2Record * @instance */ GroupV2Record.prototype.masterKey = $util.newBuffer([]); /** * GroupV2Record blocked. * @member {boolean} blocked * @memberof signalservice.GroupV2Record * @instance */ GroupV2Record.prototype.blocked = false; /** * GroupV2Record whitelisted. * @member {boolean} whitelisted * @memberof signalservice.GroupV2Record * @instance */ GroupV2Record.prototype.whitelisted = false; /** * GroupV2Record archived. * @member {boolean} archived * @memberof signalservice.GroupV2Record * @instance */ GroupV2Record.prototype.archived = false; /** * GroupV2Record markedUnread. * @member {boolean} markedUnread * @memberof signalservice.GroupV2Record * @instance */ GroupV2Record.prototype.markedUnread = false; /** * GroupV2Record mutedUntilTimestamp. * @member {Long} mutedUntilTimestamp * @memberof signalservice.GroupV2Record * @instance */ GroupV2Record.prototype.mutedUntilTimestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * GroupV2Record dontNotifyForMentionsIfMuted. * @member {boolean} dontNotifyForMentionsIfMuted * @memberof signalservice.GroupV2Record * @instance */ GroupV2Record.prototype.dontNotifyForMentionsIfMuted = false; /** * GroupV2Record hideStory. * @member {boolean} hideStory * @memberof signalservice.GroupV2Record * @instance */ GroupV2Record.prototype.hideStory = false; /** * GroupV2Record storySendMode. * @member {signalservice.GroupV2Record.StorySendMode} storySendMode * @memberof signalservice.GroupV2Record * @instance */ GroupV2Record.prototype.storySendMode = 0; /** * GroupV2Record avatarColor. * @member {signalservice.AvatarColor|null|undefined} avatarColor * @memberof signalservice.GroupV2Record * @instance */ GroupV2Record.prototype.avatarColor = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * GroupV2Record _avatarColor. * @member {"avatarColor"|undefined} _avatarColor * @memberof signalservice.GroupV2Record * @instance */ Object.defineProperty(GroupV2Record.prototype, "_avatarColor", { get: $util.oneOfGetter($oneOfFields = ["avatarColor"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified GroupV2Record message. Does not implicitly {@link signalservice.GroupV2Record.verify|verify} messages. * @function encode * @memberof signalservice.GroupV2Record * @static * @param {signalservice.IGroupV2Record} message GroupV2Record message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupV2Record.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.GroupV2Record.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.GroupV2Record.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.masterKey != null && Object.hasOwnProperty.call(message, "masterKey")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.masterKey); if (message.blocked != null && Object.hasOwnProperty.call(message, "blocked")) writer.uint32(/* id 2, wireType 0 =*/16).bool(message.blocked); if (message.whitelisted != null && Object.hasOwnProperty.call(message, "whitelisted")) writer.uint32(/* id 3, wireType 0 =*/24).bool(message.whitelisted); if (message.archived != null && Object.hasOwnProperty.call(message, "archived")) writer.uint32(/* id 4, wireType 0 =*/32).bool(message.archived); if (message.markedUnread != null && Object.hasOwnProperty.call(message, "markedUnread")) writer.uint32(/* id 5, wireType 0 =*/40).bool(message.markedUnread); if (message.mutedUntilTimestamp != null && Object.hasOwnProperty.call(message, "mutedUntilTimestamp")) writer.uint32(/* id 6, wireType 0 =*/48).uint64(message.mutedUntilTimestamp); if (message.dontNotifyForMentionsIfMuted != null && Object.hasOwnProperty.call(message, "dontNotifyForMentionsIfMuted")) writer.uint32(/* id 7, wireType 0 =*/56).bool(message.dontNotifyForMentionsIfMuted); if (message.hideStory != null && Object.hasOwnProperty.call(message, "hideStory")) writer.uint32(/* id 8, wireType 0 =*/64).bool(message.hideStory); if (message.storySendMode != null && Object.hasOwnProperty.call(message, "storySendMode")) writer.uint32(/* id 10, wireType 0 =*/80).int32(message.storySendMode); if (message.avatarColor != null && Object.hasOwnProperty.call(message, "avatarColor")) writer.uint32(/* id 11, wireType 0 =*/88).int32(message.avatarColor); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupV2Record message, length delimited. Does not implicitly {@link signalservice.GroupV2Record.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.GroupV2Record * @static * @param {signalservice.IGroupV2Record} message GroupV2Record message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupV2Record.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupV2Record message from the specified reader or buffer. * @function decode * @memberof signalservice.GroupV2Record * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.GroupV2Record} GroupV2Record * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupV2Record.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.GroupV2Record(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.masterKey = reader.bytes(); break; } case 2: { message.blocked = reader.bool(); break; } case 3: { message.whitelisted = reader.bool(); break; } case 4: { message.archived = reader.bool(); break; } case 5: { message.markedUnread = reader.bool(); break; } case 6: { message.mutedUntilTimestamp = reader.uint64(); break; } case 7: { message.dontNotifyForMentionsIfMuted = reader.bool(); break; } case 8: { message.hideStory = reader.bool(); break; } case 10: { message.storySendMode = reader.int32(); break; } case 11: { message.avatarColor = reader.int32(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupV2Record message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.GroupV2Record * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.GroupV2Record} GroupV2Record * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupV2Record.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * StorySendMode enum. * @name signalservice.GroupV2Record.StorySendMode * @enum {number} * @property {number} DEFAULT=0 DEFAULT value * @property {number} DISABLED=1 DISABLED value * @property {number} ENABLED=2 ENABLED value */ GroupV2Record.StorySendMode = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "DEFAULT"] = 0; values[valuesById[1] = "DISABLED"] = 1; values[valuesById[2] = "ENABLED"] = 2; return values; })(); return GroupV2Record; })(); signalservice.Payments = (function() { /** * Properties of a Payments. * @memberof signalservice * @interface IPayments * @property {boolean|null} [enabled] Payments enabled * @property {Uint8Array|null} [entropy] Payments entropy */ /** * Constructs a new Payments. * @memberof signalservice * @classdesc Represents a Payments. * @implements IPayments * @constructor * @param {signalservice.IPayments=} [properties] Properties to set */ function Payments(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Payments enabled. * @member {boolean} enabled * @memberof signalservice.Payments * @instance */ Payments.prototype.enabled = false; /** * Payments entropy. * @member {Uint8Array} entropy * @memberof signalservice.Payments * @instance */ Payments.prototype.entropy = $util.newBuffer([]); /** * Encodes the specified Payments message. Does not implicitly {@link signalservice.Payments.verify|verify} messages. * @function encode * @memberof signalservice.Payments * @static * @param {signalservice.IPayments} message Payments message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Payments.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.Payments.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.Payments.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.enabled != null && Object.hasOwnProperty.call(message, "enabled")) writer.uint32(/* id 1, wireType 0 =*/8).bool(message.enabled); if (message.entropy != null && Object.hasOwnProperty.call(message, "entropy")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.entropy); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Payments message, length delimited. Does not implicitly {@link signalservice.Payments.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.Payments * @static * @param {signalservice.IPayments} message Payments message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Payments.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Payments message from the specified reader or buffer. * @function decode * @memberof signalservice.Payments * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.Payments} Payments * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Payments.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.Payments(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.enabled = reader.bool(); break; } case 2: { message.entropy = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Payments message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.Payments * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.Payments} Payments * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Payments.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return Payments; })(); signalservice.AccountRecord = (function() { /** * Properties of an AccountRecord. * @memberof signalservice * @interface IAccountRecord * @property {Uint8Array|null} [profileKey] AccountRecord profileKey * @property {string|null} [givenName] AccountRecord givenName * @property {string|null} [familyName] AccountRecord familyName * @property {string|null} [avatarUrlPath] AccountRecord avatarUrlPath * @property {boolean|null} [noteToSelfArchived] AccountRecord noteToSelfArchived * @property {boolean|null} [readReceipts] AccountRecord readReceipts * @property {boolean|null} [sealedSenderIndicators] AccountRecord sealedSenderIndicators * @property {boolean|null} [typingIndicators] AccountRecord typingIndicators * @property {boolean|null} [noteToSelfMarkedUnread] AccountRecord noteToSelfMarkedUnread * @property {boolean|null} [linkPreviews] AccountRecord linkPreviews * @property {signalservice.AccountRecord.PhoneNumberSharingMode|null} [phoneNumberSharingMode] AccountRecord phoneNumberSharingMode * @property {boolean|null} [unlistedPhoneNumber] AccountRecord unlistedPhoneNumber * @property {Array.|null} [pinnedConversations] AccountRecord pinnedConversations * @property {boolean|null} [preferContactAvatars] AccountRecord preferContactAvatars * @property {number|null} [universalExpireTimer] AccountRecord universalExpireTimer * @property {Array.|null} [preferredReactionEmoji] AccountRecord preferredReactionEmoji * @property {Uint8Array|null} [donorSubscriberId] AccountRecord donorSubscriberId * @property {string|null} [donorSubscriberCurrencyCode] AccountRecord donorSubscriberCurrencyCode * @property {boolean|null} [displayBadgesOnProfile] AccountRecord displayBadgesOnProfile * @property {boolean|null} [donorSubscriptionManuallyCancelled] AccountRecord donorSubscriptionManuallyCancelled * @property {boolean|null} [keepMutedChatsArchived] AccountRecord keepMutedChatsArchived * @property {boolean|null} [hasSetMyStoriesPrivacy] AccountRecord hasSetMyStoriesPrivacy * @property {boolean|null} [hasViewedOnboardingStory] AccountRecord hasViewedOnboardingStory * @property {boolean|null} [storiesDisabled] AccountRecord storiesDisabled * @property {signalservice.OptionalBool|null} [storyViewReceiptsEnabled] AccountRecord storyViewReceiptsEnabled * @property {boolean|null} [hasSeenGroupStoryEducationSheet] AccountRecord hasSeenGroupStoryEducationSheet * @property {string|null} [username] AccountRecord username * @property {boolean|null} [hasCompletedUsernameOnboarding] AccountRecord hasCompletedUsernameOnboarding * @property {signalservice.AccountRecord.IUsernameLink|null} [usernameLink] AccountRecord usernameLink * @property {boolean|null} [hasBackup] AccountRecord hasBackup * @property {Long|null} [backupTier] AccountRecord backupTier * @property {signalservice.AccountRecord.IIAPSubscriberData|null} [backupSubscriberData] AccountRecord backupSubscriberData * @property {signalservice.AvatarColor|null} [avatarColor] AccountRecord avatarColor * @property {signalservice.AccountRecord.INotificationProfileManualOverride|null} [notificationProfileManualOverride] AccountRecord notificationProfileManualOverride * @property {boolean|null} [notificationProfileSyncDisabled] AccountRecord notificationProfileSyncDisabled * @property {boolean|null} [automaticKeyVerificationDisabled] AccountRecord automaticKeyVerificationDisabled */ /** * Constructs a new AccountRecord. * @memberof signalservice * @classdesc Represents an AccountRecord. * @implements IAccountRecord * @constructor * @param {signalservice.IAccountRecord=} [properties] Properties to set */ function AccountRecord(properties) { this.pinnedConversations = []; this.preferredReactionEmoji = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * AccountRecord profileKey. * @member {Uint8Array} profileKey * @memberof signalservice.AccountRecord * @instance */ AccountRecord.prototype.profileKey = $util.newBuffer([]); /** * AccountRecord givenName. * @member {string} givenName * @memberof signalservice.AccountRecord * @instance */ AccountRecord.prototype.givenName = ""; /** * AccountRecord familyName. * @member {string} familyName * @memberof signalservice.AccountRecord * @instance */ AccountRecord.prototype.familyName = ""; /** * AccountRecord avatarUrlPath. * @member {string} avatarUrlPath * @memberof signalservice.AccountRecord * @instance */ AccountRecord.prototype.avatarUrlPath = ""; /** * AccountRecord noteToSelfArchived. * @member {boolean} noteToSelfArchived * @memberof signalservice.AccountRecord * @instance */ AccountRecord.prototype.noteToSelfArchived = false; /** * AccountRecord readReceipts. * @member {boolean} readReceipts * @memberof signalservice.AccountRecord * @instance */ AccountRecord.prototype.readReceipts = false; /** * AccountRecord sealedSenderIndicators. * @member {boolean} sealedSenderIndicators * @memberof signalservice.AccountRecord * @instance */ AccountRecord.prototype.sealedSenderIndicators = false; /** * AccountRecord typingIndicators. * @member {boolean} typingIndicators * @memberof signalservice.AccountRecord * @instance */ AccountRecord.prototype.typingIndicators = false; /** * AccountRecord noteToSelfMarkedUnread. * @member {boolean} noteToSelfMarkedUnread * @memberof signalservice.AccountRecord * @instance */ AccountRecord.prototype.noteToSelfMarkedUnread = false; /** * AccountRecord linkPreviews. * @member {boolean} linkPreviews * @memberof signalservice.AccountRecord * @instance */ AccountRecord.prototype.linkPreviews = false; /** * AccountRecord phoneNumberSharingMode. * @member {signalservice.AccountRecord.PhoneNumberSharingMode} phoneNumberSharingMode * @memberof signalservice.AccountRecord * @instance */ AccountRecord.prototype.phoneNumberSharingMode = 0; /** * AccountRecord unlistedPhoneNumber. * @member {boolean} unlistedPhoneNumber * @memberof signalservice.AccountRecord * @instance */ AccountRecord.prototype.unlistedPhoneNumber = false; /** * AccountRecord pinnedConversations. * @member {Array.} pinnedConversations * @memberof signalservice.AccountRecord * @instance */ AccountRecord.prototype.pinnedConversations = $util.emptyArray; /** * AccountRecord preferContactAvatars. * @member {boolean} preferContactAvatars * @memberof signalservice.AccountRecord * @instance */ AccountRecord.prototype.preferContactAvatars = false; /** * AccountRecord universalExpireTimer. * @member {number} universalExpireTimer * @memberof signalservice.AccountRecord * @instance */ AccountRecord.prototype.universalExpireTimer = 0; /** * AccountRecord preferredReactionEmoji. * @member {Array.} preferredReactionEmoji * @memberof signalservice.AccountRecord * @instance */ AccountRecord.prototype.preferredReactionEmoji = $util.emptyArray; /** * AccountRecord donorSubscriberId. * @member {Uint8Array} donorSubscriberId * @memberof signalservice.AccountRecord * @instance */ AccountRecord.prototype.donorSubscriberId = $util.newBuffer([]); /** * AccountRecord donorSubscriberCurrencyCode. * @member {string} donorSubscriberCurrencyCode * @memberof signalservice.AccountRecord * @instance */ AccountRecord.prototype.donorSubscriberCurrencyCode = ""; /** * AccountRecord displayBadgesOnProfile. * @member {boolean} displayBadgesOnProfile * @memberof signalservice.AccountRecord * @instance */ AccountRecord.prototype.displayBadgesOnProfile = false; /** * AccountRecord donorSubscriptionManuallyCancelled. * @member {boolean} donorSubscriptionManuallyCancelled * @memberof signalservice.AccountRecord * @instance */ AccountRecord.prototype.donorSubscriptionManuallyCancelled = false; /** * AccountRecord keepMutedChatsArchived. * @member {boolean} keepMutedChatsArchived * @memberof signalservice.AccountRecord * @instance */ AccountRecord.prototype.keepMutedChatsArchived = false; /** * AccountRecord hasSetMyStoriesPrivacy. * @member {boolean} hasSetMyStoriesPrivacy * @memberof signalservice.AccountRecord * @instance */ AccountRecord.prototype.hasSetMyStoriesPrivacy = false; /** * AccountRecord hasViewedOnboardingStory. * @member {boolean} hasViewedOnboardingStory * @memberof signalservice.AccountRecord * @instance */ AccountRecord.prototype.hasViewedOnboardingStory = false; /** * AccountRecord storiesDisabled. * @member {boolean} storiesDisabled * @memberof signalservice.AccountRecord * @instance */ AccountRecord.prototype.storiesDisabled = false; /** * AccountRecord storyViewReceiptsEnabled. * @member {signalservice.OptionalBool} storyViewReceiptsEnabled * @memberof signalservice.AccountRecord * @instance */ AccountRecord.prototype.storyViewReceiptsEnabled = 0; /** * AccountRecord hasSeenGroupStoryEducationSheet. * @member {boolean} hasSeenGroupStoryEducationSheet * @memberof signalservice.AccountRecord * @instance */ AccountRecord.prototype.hasSeenGroupStoryEducationSheet = false; /** * AccountRecord username. * @member {string} username * @memberof signalservice.AccountRecord * @instance */ AccountRecord.prototype.username = ""; /** * AccountRecord hasCompletedUsernameOnboarding. * @member {boolean} hasCompletedUsernameOnboarding * @memberof signalservice.AccountRecord * @instance */ AccountRecord.prototype.hasCompletedUsernameOnboarding = false; /** * AccountRecord usernameLink. * @member {signalservice.AccountRecord.IUsernameLink|null|undefined} usernameLink * @memberof signalservice.AccountRecord * @instance */ AccountRecord.prototype.usernameLink = null; /** * AccountRecord hasBackup. * @member {boolean|null|undefined} hasBackup * @memberof signalservice.AccountRecord * @instance */ AccountRecord.prototype.hasBackup = null; /** * AccountRecord backupTier. * @member {Long|null|undefined} backupTier * @memberof signalservice.AccountRecord * @instance */ AccountRecord.prototype.backupTier = null; /** * AccountRecord backupSubscriberData. * @member {signalservice.AccountRecord.IIAPSubscriberData|null|undefined} backupSubscriberData * @memberof signalservice.AccountRecord * @instance */ AccountRecord.prototype.backupSubscriberData = null; /** * AccountRecord avatarColor. * @member {signalservice.AvatarColor|null|undefined} avatarColor * @memberof signalservice.AccountRecord * @instance */ AccountRecord.prototype.avatarColor = null; /** * AccountRecord notificationProfileManualOverride. * @member {signalservice.AccountRecord.INotificationProfileManualOverride|null|undefined} notificationProfileManualOverride * @memberof signalservice.AccountRecord * @instance */ AccountRecord.prototype.notificationProfileManualOverride = null; /** * AccountRecord notificationProfileSyncDisabled. * @member {boolean} notificationProfileSyncDisabled * @memberof signalservice.AccountRecord * @instance */ AccountRecord.prototype.notificationProfileSyncDisabled = false; /** * AccountRecord automaticKeyVerificationDisabled. * @member {boolean} automaticKeyVerificationDisabled * @memberof signalservice.AccountRecord * @instance */ AccountRecord.prototype.automaticKeyVerificationDisabled = false; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * AccountRecord _hasBackup. * @member {"hasBackup"|undefined} _hasBackup * @memberof signalservice.AccountRecord * @instance */ Object.defineProperty(AccountRecord.prototype, "_hasBackup", { get: $util.oneOfGetter($oneOfFields = ["hasBackup"]), set: $util.oneOfSetter($oneOfFields) }); /** * AccountRecord _backupTier. * @member {"backupTier"|undefined} _backupTier * @memberof signalservice.AccountRecord * @instance */ Object.defineProperty(AccountRecord.prototype, "_backupTier", { get: $util.oneOfGetter($oneOfFields = ["backupTier"]), set: $util.oneOfSetter($oneOfFields) }); /** * AccountRecord _avatarColor. * @member {"avatarColor"|undefined} _avatarColor * @memberof signalservice.AccountRecord * @instance */ Object.defineProperty(AccountRecord.prototype, "_avatarColor", { get: $util.oneOfGetter($oneOfFields = ["avatarColor"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified AccountRecord message. Does not implicitly {@link signalservice.AccountRecord.verify|verify} messages. * @function encode * @memberof signalservice.AccountRecord * @static * @param {signalservice.IAccountRecord} message AccountRecord message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ AccountRecord.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.AccountRecord.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.AccountRecord.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.profileKey != null && Object.hasOwnProperty.call(message, "profileKey")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.profileKey); if (message.givenName != null && Object.hasOwnProperty.call(message, "givenName")) writer.uint32(/* id 2, wireType 2 =*/18).string(message.givenName); if (message.familyName != null && Object.hasOwnProperty.call(message, "familyName")) writer.uint32(/* id 3, wireType 2 =*/26).string(message.familyName); if (message.avatarUrlPath != null && Object.hasOwnProperty.call(message, "avatarUrlPath")) writer.uint32(/* id 4, wireType 2 =*/34).string(message.avatarUrlPath); if (message.noteToSelfArchived != null && Object.hasOwnProperty.call(message, "noteToSelfArchived")) writer.uint32(/* id 5, wireType 0 =*/40).bool(message.noteToSelfArchived); if (message.readReceipts != null && Object.hasOwnProperty.call(message, "readReceipts")) writer.uint32(/* id 6, wireType 0 =*/48).bool(message.readReceipts); if (message.sealedSenderIndicators != null && Object.hasOwnProperty.call(message, "sealedSenderIndicators")) writer.uint32(/* id 7, wireType 0 =*/56).bool(message.sealedSenderIndicators); if (message.typingIndicators != null && Object.hasOwnProperty.call(message, "typingIndicators")) writer.uint32(/* id 8, wireType 0 =*/64).bool(message.typingIndicators); if (message.noteToSelfMarkedUnread != null && Object.hasOwnProperty.call(message, "noteToSelfMarkedUnread")) writer.uint32(/* id 10, wireType 0 =*/80).bool(message.noteToSelfMarkedUnread); if (message.linkPreviews != null && Object.hasOwnProperty.call(message, "linkPreviews")) writer.uint32(/* id 11, wireType 0 =*/88).bool(message.linkPreviews); if (message.phoneNumberSharingMode != null && Object.hasOwnProperty.call(message, "phoneNumberSharingMode")) writer.uint32(/* id 12, wireType 0 =*/96).int32(message.phoneNumberSharingMode); if (message.unlistedPhoneNumber != null && Object.hasOwnProperty.call(message, "unlistedPhoneNumber")) writer.uint32(/* id 13, wireType 0 =*/104).bool(message.unlistedPhoneNumber); if (message.pinnedConversations != null && message.pinnedConversations.length) for (var i = 0; i < message.pinnedConversations.length; ++i) $root.signalservice.AccountRecord.PinnedConversation.encode(message.pinnedConversations[i], writer.uint32(/* id 14, wireType 2 =*/114).fork()).ldelim(); if (message.preferContactAvatars != null && Object.hasOwnProperty.call(message, "preferContactAvatars")) writer.uint32(/* id 15, wireType 0 =*/120).bool(message.preferContactAvatars); if (message.universalExpireTimer != null && Object.hasOwnProperty.call(message, "universalExpireTimer")) writer.uint32(/* id 17, wireType 0 =*/136).uint32(message.universalExpireTimer); if (message.preferredReactionEmoji != null && message.preferredReactionEmoji.length) for (var i = 0; i < message.preferredReactionEmoji.length; ++i) writer.uint32(/* id 20, wireType 2 =*/162).string(message.preferredReactionEmoji[i]); if (message.donorSubscriberId != null && Object.hasOwnProperty.call(message, "donorSubscriberId")) writer.uint32(/* id 21, wireType 2 =*/170).bytes(message.donorSubscriberId); if (message.donorSubscriberCurrencyCode != null && Object.hasOwnProperty.call(message, "donorSubscriberCurrencyCode")) writer.uint32(/* id 22, wireType 2 =*/178).string(message.donorSubscriberCurrencyCode); if (message.displayBadgesOnProfile != null && Object.hasOwnProperty.call(message, "displayBadgesOnProfile")) writer.uint32(/* id 23, wireType 0 =*/184).bool(message.displayBadgesOnProfile); if (message.donorSubscriptionManuallyCancelled != null && Object.hasOwnProperty.call(message, "donorSubscriptionManuallyCancelled")) writer.uint32(/* id 24, wireType 0 =*/192).bool(message.donorSubscriptionManuallyCancelled); if (message.keepMutedChatsArchived != null && Object.hasOwnProperty.call(message, "keepMutedChatsArchived")) writer.uint32(/* id 25, wireType 0 =*/200).bool(message.keepMutedChatsArchived); if (message.hasSetMyStoriesPrivacy != null && Object.hasOwnProperty.call(message, "hasSetMyStoriesPrivacy")) writer.uint32(/* id 26, wireType 0 =*/208).bool(message.hasSetMyStoriesPrivacy); if (message.hasViewedOnboardingStory != null && Object.hasOwnProperty.call(message, "hasViewedOnboardingStory")) writer.uint32(/* id 27, wireType 0 =*/216).bool(message.hasViewedOnboardingStory); if (message.storiesDisabled != null && Object.hasOwnProperty.call(message, "storiesDisabled")) writer.uint32(/* id 29, wireType 0 =*/232).bool(message.storiesDisabled); if (message.storyViewReceiptsEnabled != null && Object.hasOwnProperty.call(message, "storyViewReceiptsEnabled")) writer.uint32(/* id 30, wireType 0 =*/240).int32(message.storyViewReceiptsEnabled); if (message.hasSeenGroupStoryEducationSheet != null && Object.hasOwnProperty.call(message, "hasSeenGroupStoryEducationSheet")) writer.uint32(/* id 32, wireType 0 =*/256).bool(message.hasSeenGroupStoryEducationSheet); if (message.username != null && Object.hasOwnProperty.call(message, "username")) writer.uint32(/* id 33, wireType 2 =*/266).string(message.username); if (message.hasCompletedUsernameOnboarding != null && Object.hasOwnProperty.call(message, "hasCompletedUsernameOnboarding")) writer.uint32(/* id 34, wireType 0 =*/272).bool(message.hasCompletedUsernameOnboarding); if (message.usernameLink != null && Object.hasOwnProperty.call(message, "usernameLink")) $root.signalservice.AccountRecord.UsernameLink.encode(message.usernameLink, writer.uint32(/* id 35, wireType 2 =*/282).fork()).ldelim(); if (message.hasBackup != null && Object.hasOwnProperty.call(message, "hasBackup")) writer.uint32(/* id 39, wireType 0 =*/312).bool(message.hasBackup); if (message.backupTier != null && Object.hasOwnProperty.call(message, "backupTier")) writer.uint32(/* id 40, wireType 0 =*/320).uint64(message.backupTier); if (message.backupSubscriberData != null && Object.hasOwnProperty.call(message, "backupSubscriberData")) $root.signalservice.AccountRecord.IAPSubscriberData.encode(message.backupSubscriberData, writer.uint32(/* id 41, wireType 2 =*/330).fork()).ldelim(); if (message.avatarColor != null && Object.hasOwnProperty.call(message, "avatarColor")) writer.uint32(/* id 42, wireType 0 =*/336).int32(message.avatarColor); if (message.notificationProfileManualOverride != null && Object.hasOwnProperty.call(message, "notificationProfileManualOverride")) $root.signalservice.AccountRecord.NotificationProfileManualOverride.encode(message.notificationProfileManualOverride, writer.uint32(/* id 44, wireType 2 =*/354).fork()).ldelim(); if (message.notificationProfileSyncDisabled != null && Object.hasOwnProperty.call(message, "notificationProfileSyncDisabled")) writer.uint32(/* id 45, wireType 0 =*/360).bool(message.notificationProfileSyncDisabled); if (message.automaticKeyVerificationDisabled != null && Object.hasOwnProperty.call(message, "automaticKeyVerificationDisabled")) writer.uint32(/* id 46, wireType 0 =*/368).bool(message.automaticKeyVerificationDisabled); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified AccountRecord message, length delimited. Does not implicitly {@link signalservice.AccountRecord.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.AccountRecord * @static * @param {signalservice.IAccountRecord} message AccountRecord message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ AccountRecord.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an AccountRecord message from the specified reader or buffer. * @function decode * @memberof signalservice.AccountRecord * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.AccountRecord} AccountRecord * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ AccountRecord.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.AccountRecord(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.profileKey = reader.bytes(); break; } case 2: { message.givenName = reader.string(); break; } case 3: { message.familyName = reader.string(); break; } case 4: { message.avatarUrlPath = reader.string(); break; } case 5: { message.noteToSelfArchived = reader.bool(); break; } case 6: { message.readReceipts = reader.bool(); break; } case 7: { message.sealedSenderIndicators = reader.bool(); break; } case 8: { message.typingIndicators = reader.bool(); break; } case 10: { message.noteToSelfMarkedUnread = reader.bool(); break; } case 11: { message.linkPreviews = reader.bool(); break; } case 12: { message.phoneNumberSharingMode = reader.int32(); break; } case 13: { message.unlistedPhoneNumber = reader.bool(); break; } case 14: { if (!(message.pinnedConversations && message.pinnedConversations.length)) message.pinnedConversations = []; message.pinnedConversations.push($root.signalservice.AccountRecord.PinnedConversation.decode(reader, reader.uint32())); break; } case 15: { message.preferContactAvatars = reader.bool(); break; } case 17: { message.universalExpireTimer = reader.uint32(); break; } case 20: { if (!(message.preferredReactionEmoji && message.preferredReactionEmoji.length)) message.preferredReactionEmoji = []; message.preferredReactionEmoji.push(reader.string()); break; } case 21: { message.donorSubscriberId = reader.bytes(); break; } case 22: { message.donorSubscriberCurrencyCode = reader.string(); break; } case 23: { message.displayBadgesOnProfile = reader.bool(); break; } case 24: { message.donorSubscriptionManuallyCancelled = reader.bool(); break; } case 25: { message.keepMutedChatsArchived = reader.bool(); break; } case 26: { message.hasSetMyStoriesPrivacy = reader.bool(); break; } case 27: { message.hasViewedOnboardingStory = reader.bool(); break; } case 29: { message.storiesDisabled = reader.bool(); break; } case 30: { message.storyViewReceiptsEnabled = reader.int32(); break; } case 32: { message.hasSeenGroupStoryEducationSheet = reader.bool(); break; } case 33: { message.username = reader.string(); break; } case 34: { message.hasCompletedUsernameOnboarding = reader.bool(); break; } case 35: { message.usernameLink = $root.signalservice.AccountRecord.UsernameLink.decode(reader, reader.uint32()); break; } case 39: { message.hasBackup = reader.bool(); break; } case 40: { message.backupTier = reader.uint64(); break; } case 41: { message.backupSubscriberData = $root.signalservice.AccountRecord.IAPSubscriberData.decode(reader, reader.uint32()); break; } case 42: { message.avatarColor = reader.int32(); break; } case 44: { message.notificationProfileManualOverride = $root.signalservice.AccountRecord.NotificationProfileManualOverride.decode(reader, reader.uint32()); break; } case 45: { message.notificationProfileSyncDisabled = reader.bool(); break; } case 46: { message.automaticKeyVerificationDisabled = reader.bool(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an AccountRecord message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.AccountRecord * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.AccountRecord} AccountRecord * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ AccountRecord.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * PhoneNumberSharingMode enum. * @name signalservice.AccountRecord.PhoneNumberSharingMode * @enum {number} * @property {number} UNKNOWN=0 UNKNOWN value * @property {number} EVERYBODY=1 EVERYBODY value * @property {number} NOBODY=2 NOBODY value */ AccountRecord.PhoneNumberSharingMode = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "UNKNOWN"] = 0; values[valuesById[1] = "EVERYBODY"] = 1; values[valuesById[2] = "NOBODY"] = 2; return values; })(); AccountRecord.PinnedConversation = (function() { /** * Properties of a PinnedConversation. * @memberof signalservice.AccountRecord * @interface IPinnedConversation * @property {signalservice.AccountRecord.PinnedConversation.IContact|null} [contact] PinnedConversation contact * @property {Uint8Array|null} [legacyGroupId] PinnedConversation legacyGroupId * @property {Uint8Array|null} [groupMasterKey] PinnedConversation groupMasterKey */ /** * Constructs a new PinnedConversation. * @memberof signalservice.AccountRecord * @classdesc Represents a PinnedConversation. * @implements IPinnedConversation * @constructor * @param {signalservice.AccountRecord.IPinnedConversation=} [properties] Properties to set */ function PinnedConversation(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * PinnedConversation contact. * @member {signalservice.AccountRecord.PinnedConversation.IContact|null|undefined} contact * @memberof signalservice.AccountRecord.PinnedConversation * @instance */ PinnedConversation.prototype.contact = null; /** * PinnedConversation legacyGroupId. * @member {Uint8Array|null|undefined} legacyGroupId * @memberof signalservice.AccountRecord.PinnedConversation * @instance */ PinnedConversation.prototype.legacyGroupId = null; /** * PinnedConversation groupMasterKey. * @member {Uint8Array|null|undefined} groupMasterKey * @memberof signalservice.AccountRecord.PinnedConversation * @instance */ PinnedConversation.prototype.groupMasterKey = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * PinnedConversation identifier. * @member {"contact"|"legacyGroupId"|"groupMasterKey"|undefined} identifier * @memberof signalservice.AccountRecord.PinnedConversation * @instance */ Object.defineProperty(PinnedConversation.prototype, "identifier", { get: $util.oneOfGetter($oneOfFields = ["contact", "legacyGroupId", "groupMasterKey"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified PinnedConversation message. Does not implicitly {@link signalservice.AccountRecord.PinnedConversation.verify|verify} messages. * @function encode * @memberof signalservice.AccountRecord.PinnedConversation * @static * @param {signalservice.AccountRecord.IPinnedConversation} message PinnedConversation message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ PinnedConversation.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.AccountRecord.PinnedConversation.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.AccountRecord.PinnedConversation.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.contact != null && Object.hasOwnProperty.call(message, "contact")) $root.signalservice.AccountRecord.PinnedConversation.Contact.encode(message.contact, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.legacyGroupId != null && Object.hasOwnProperty.call(message, "legacyGroupId")) writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.legacyGroupId); if (message.groupMasterKey != null && Object.hasOwnProperty.call(message, "groupMasterKey")) writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.groupMasterKey); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified PinnedConversation message, length delimited. Does not implicitly {@link signalservice.AccountRecord.PinnedConversation.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.AccountRecord.PinnedConversation * @static * @param {signalservice.AccountRecord.IPinnedConversation} message PinnedConversation message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ PinnedConversation.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a PinnedConversation message from the specified reader or buffer. * @function decode * @memberof signalservice.AccountRecord.PinnedConversation * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.AccountRecord.PinnedConversation} PinnedConversation * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ PinnedConversation.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.AccountRecord.PinnedConversation(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.contact = $root.signalservice.AccountRecord.PinnedConversation.Contact.decode(reader, reader.uint32()); break; } case 3: { message.legacyGroupId = reader.bytes(); break; } case 4: { message.groupMasterKey = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a PinnedConversation message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.AccountRecord.PinnedConversation * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.AccountRecord.PinnedConversation} PinnedConversation * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ PinnedConversation.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; PinnedConversation.Contact = (function() { /** * Properties of a Contact. * @memberof signalservice.AccountRecord.PinnedConversation * @interface IContact * @property {string|null} [serviceId] Contact serviceId * @property {string|null} [e164] Contact e164 * @property {Uint8Array|null} [serviceIdBinary] Contact serviceIdBinary */ /** * Constructs a new Contact. * @memberof signalservice.AccountRecord.PinnedConversation * @classdesc Represents a Contact. * @implements IContact * @constructor * @param {signalservice.AccountRecord.PinnedConversation.IContact=} [properties] Properties to set */ function Contact(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Contact serviceId. * @member {string} serviceId * @memberof signalservice.AccountRecord.PinnedConversation.Contact * @instance */ Contact.prototype.serviceId = ""; /** * Contact e164. * @member {string} e164 * @memberof signalservice.AccountRecord.PinnedConversation.Contact * @instance */ Contact.prototype.e164 = ""; /** * Contact serviceIdBinary. * @member {Uint8Array} serviceIdBinary * @memberof signalservice.AccountRecord.PinnedConversation.Contact * @instance */ Contact.prototype.serviceIdBinary = $util.newBuffer([]); /** * Encodes the specified Contact message. Does not implicitly {@link signalservice.AccountRecord.PinnedConversation.Contact.verify|verify} messages. * @function encode * @memberof signalservice.AccountRecord.PinnedConversation.Contact * @static * @param {signalservice.AccountRecord.PinnedConversation.IContact} message Contact message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Contact.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.AccountRecord.PinnedConversation.Contact.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.AccountRecord.PinnedConversation.Contact.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.serviceId != null && Object.hasOwnProperty.call(message, "serviceId")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.serviceId); if (message.e164 != null && Object.hasOwnProperty.call(message, "e164")) writer.uint32(/* id 2, wireType 2 =*/18).string(message.e164); if (message.serviceIdBinary != null && Object.hasOwnProperty.call(message, "serviceIdBinary")) writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.serviceIdBinary); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Contact message, length delimited. Does not implicitly {@link signalservice.AccountRecord.PinnedConversation.Contact.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.AccountRecord.PinnedConversation.Contact * @static * @param {signalservice.AccountRecord.PinnedConversation.IContact} message Contact message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Contact.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Contact message from the specified reader or buffer. * @function decode * @memberof signalservice.AccountRecord.PinnedConversation.Contact * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.AccountRecord.PinnedConversation.Contact} Contact * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Contact.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.AccountRecord.PinnedConversation.Contact(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.serviceId = reader.string(); break; } case 2: { message.e164 = reader.string(); break; } case 3: { message.serviceIdBinary = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Contact message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.AccountRecord.PinnedConversation.Contact * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.AccountRecord.PinnedConversation.Contact} Contact * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Contact.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return Contact; })(); return PinnedConversation; })(); AccountRecord.UsernameLink = (function() { /** * Properties of a UsernameLink. * @memberof signalservice.AccountRecord * @interface IUsernameLink * @property {Uint8Array|null} [entropy] UsernameLink entropy * @property {Uint8Array|null} [serverId] UsernameLink serverId * @property {signalservice.AccountRecord.UsernameLink.Color|null} [color] UsernameLink color */ /** * Constructs a new UsernameLink. * @memberof signalservice.AccountRecord * @classdesc Represents a UsernameLink. * @implements IUsernameLink * @constructor * @param {signalservice.AccountRecord.IUsernameLink=} [properties] Properties to set */ function UsernameLink(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * UsernameLink entropy. * @member {Uint8Array} entropy * @memberof signalservice.AccountRecord.UsernameLink * @instance */ UsernameLink.prototype.entropy = $util.newBuffer([]); /** * UsernameLink serverId. * @member {Uint8Array} serverId * @memberof signalservice.AccountRecord.UsernameLink * @instance */ UsernameLink.prototype.serverId = $util.newBuffer([]); /** * UsernameLink color. * @member {signalservice.AccountRecord.UsernameLink.Color} color * @memberof signalservice.AccountRecord.UsernameLink * @instance */ UsernameLink.prototype.color = 0; /** * Encodes the specified UsernameLink message. Does not implicitly {@link signalservice.AccountRecord.UsernameLink.verify|verify} messages. * @function encode * @memberof signalservice.AccountRecord.UsernameLink * @static * @param {signalservice.AccountRecord.IUsernameLink} message UsernameLink message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ UsernameLink.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.AccountRecord.UsernameLink.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.AccountRecord.UsernameLink.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.entropy != null && Object.hasOwnProperty.call(message, "entropy")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.entropy); if (message.serverId != null && Object.hasOwnProperty.call(message, "serverId")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.serverId); if (message.color != null && Object.hasOwnProperty.call(message, "color")) writer.uint32(/* id 3, wireType 0 =*/24).int32(message.color); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified UsernameLink message, length delimited. Does not implicitly {@link signalservice.AccountRecord.UsernameLink.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.AccountRecord.UsernameLink * @static * @param {signalservice.AccountRecord.IUsernameLink} message UsernameLink message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ UsernameLink.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a UsernameLink message from the specified reader or buffer. * @function decode * @memberof signalservice.AccountRecord.UsernameLink * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.AccountRecord.UsernameLink} UsernameLink * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ UsernameLink.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.AccountRecord.UsernameLink(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.entropy = reader.bytes(); break; } case 2: { message.serverId = reader.bytes(); break; } case 3: { message.color = reader.int32(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a UsernameLink message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.AccountRecord.UsernameLink * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.AccountRecord.UsernameLink} UsernameLink * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ UsernameLink.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * Color enum. * @name signalservice.AccountRecord.UsernameLink.Color * @enum {number} * @property {number} UNKNOWN=0 UNKNOWN value * @property {number} BLUE=1 BLUE value * @property {number} WHITE=2 WHITE value * @property {number} GREY=3 GREY value * @property {number} OLIVE=4 OLIVE value * @property {number} GREEN=5 GREEN value * @property {number} ORANGE=6 ORANGE value * @property {number} PINK=7 PINK value * @property {number} PURPLE=8 PURPLE value */ UsernameLink.Color = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "UNKNOWN"] = 0; values[valuesById[1] = "BLUE"] = 1; values[valuesById[2] = "WHITE"] = 2; values[valuesById[3] = "GREY"] = 3; values[valuesById[4] = "OLIVE"] = 4; values[valuesById[5] = "GREEN"] = 5; values[valuesById[6] = "ORANGE"] = 6; values[valuesById[7] = "PINK"] = 7; values[valuesById[8] = "PURPLE"] = 8; return values; })(); return UsernameLink; })(); AccountRecord.IAPSubscriberData = (function() { /** * Properties of a IAPSubscriberData. * @memberof signalservice.AccountRecord * @interface IIAPSubscriberData * @property {Uint8Array|null} [subscriberId] IAPSubscriberData subscriberId * @property {string|null} [purchaseToken] IAPSubscriberData purchaseToken * @property {Long|null} [originalTransactionId] IAPSubscriberData originalTransactionId */ /** * Constructs a new IAPSubscriberData. * @memberof signalservice.AccountRecord * @classdesc Represents a IAPSubscriberData. * @implements IIAPSubscriberData * @constructor * @param {signalservice.AccountRecord.IIAPSubscriberData=} [properties] Properties to set */ function IAPSubscriberData(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * IAPSubscriberData subscriberId. * @member {Uint8Array} subscriberId * @memberof signalservice.AccountRecord.IAPSubscriberData * @instance */ IAPSubscriberData.prototype.subscriberId = $util.newBuffer([]); /** * IAPSubscriberData purchaseToken. * @member {string|null|undefined} purchaseToken * @memberof signalservice.AccountRecord.IAPSubscriberData * @instance */ IAPSubscriberData.prototype.purchaseToken = null; /** * IAPSubscriberData originalTransactionId. * @member {Long|null|undefined} originalTransactionId * @memberof signalservice.AccountRecord.IAPSubscriberData * @instance */ IAPSubscriberData.prototype.originalTransactionId = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * IAPSubscriberData iapSubscriptionId. * @member {"purchaseToken"|"originalTransactionId"|undefined} iapSubscriptionId * @memberof signalservice.AccountRecord.IAPSubscriberData * @instance */ Object.defineProperty(IAPSubscriberData.prototype, "iapSubscriptionId", { get: $util.oneOfGetter($oneOfFields = ["purchaseToken", "originalTransactionId"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified IAPSubscriberData message. Does not implicitly {@link signalservice.AccountRecord.IAPSubscriberData.verify|verify} messages. * @function encode * @memberof signalservice.AccountRecord.IAPSubscriberData * @static * @param {signalservice.AccountRecord.IIAPSubscriberData} message IAPSubscriberData message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ IAPSubscriberData.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.AccountRecord.IAPSubscriberData.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.AccountRecord.IAPSubscriberData.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.subscriberId != null && Object.hasOwnProperty.call(message, "subscriberId")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.subscriberId); if (message.purchaseToken != null && Object.hasOwnProperty.call(message, "purchaseToken")) writer.uint32(/* id 2, wireType 2 =*/18).string(message.purchaseToken); if (message.originalTransactionId != null && Object.hasOwnProperty.call(message, "originalTransactionId")) writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.originalTransactionId); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified IAPSubscriberData message, length delimited. Does not implicitly {@link signalservice.AccountRecord.IAPSubscriberData.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.AccountRecord.IAPSubscriberData * @static * @param {signalservice.AccountRecord.IIAPSubscriberData} message IAPSubscriberData message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ IAPSubscriberData.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a IAPSubscriberData message from the specified reader or buffer. * @function decode * @memberof signalservice.AccountRecord.IAPSubscriberData * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.AccountRecord.IAPSubscriberData} IAPSubscriberData * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ IAPSubscriberData.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.AccountRecord.IAPSubscriberData(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.subscriberId = reader.bytes(); break; } case 2: { message.purchaseToken = reader.string(); break; } case 3: { message.originalTransactionId = reader.uint64(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a IAPSubscriberData message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.AccountRecord.IAPSubscriberData * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.AccountRecord.IAPSubscriberData} IAPSubscriberData * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ IAPSubscriberData.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return IAPSubscriberData; })(); AccountRecord.BackupTierHistory = (function() { /** * Properties of a BackupTierHistory. * @memberof signalservice.AccountRecord * @interface IBackupTierHistory * @property {Long|null} [backupTier] BackupTierHistory backupTier * @property {Long|null} [endedAtTimestamp] BackupTierHistory endedAtTimestamp */ /** * Constructs a new BackupTierHistory. * @memberof signalservice.AccountRecord * @classdesc Represents a BackupTierHistory. * @implements IBackupTierHistory * @constructor * @param {signalservice.AccountRecord.IBackupTierHistory=} [properties] Properties to set */ function BackupTierHistory(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * BackupTierHistory backupTier. * @member {Long|null|undefined} backupTier * @memberof signalservice.AccountRecord.BackupTierHistory * @instance */ BackupTierHistory.prototype.backupTier = null; /** * BackupTierHistory endedAtTimestamp. * @member {Long|null|undefined} endedAtTimestamp * @memberof signalservice.AccountRecord.BackupTierHistory * @instance */ BackupTierHistory.prototype.endedAtTimestamp = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * BackupTierHistory _backupTier. * @member {"backupTier"|undefined} _backupTier * @memberof signalservice.AccountRecord.BackupTierHistory * @instance */ Object.defineProperty(BackupTierHistory.prototype, "_backupTier", { get: $util.oneOfGetter($oneOfFields = ["backupTier"]), set: $util.oneOfSetter($oneOfFields) }); /** * BackupTierHistory _endedAtTimestamp. * @member {"endedAtTimestamp"|undefined} _endedAtTimestamp * @memberof signalservice.AccountRecord.BackupTierHistory * @instance */ Object.defineProperty(BackupTierHistory.prototype, "_endedAtTimestamp", { get: $util.oneOfGetter($oneOfFields = ["endedAtTimestamp"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified BackupTierHistory message. Does not implicitly {@link signalservice.AccountRecord.BackupTierHistory.verify|verify} messages. * @function encode * @memberof signalservice.AccountRecord.BackupTierHistory * @static * @param {signalservice.AccountRecord.IBackupTierHistory} message BackupTierHistory message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ BackupTierHistory.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.AccountRecord.BackupTierHistory.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.AccountRecord.BackupTierHistory.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.backupTier != null && Object.hasOwnProperty.call(message, "backupTier")) writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.backupTier); if (message.endedAtTimestamp != null && Object.hasOwnProperty.call(message, "endedAtTimestamp")) writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.endedAtTimestamp); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified BackupTierHistory message, length delimited. Does not implicitly {@link signalservice.AccountRecord.BackupTierHistory.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.AccountRecord.BackupTierHistory * @static * @param {signalservice.AccountRecord.IBackupTierHistory} message BackupTierHistory message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ BackupTierHistory.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a BackupTierHistory message from the specified reader or buffer. * @function decode * @memberof signalservice.AccountRecord.BackupTierHistory * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.AccountRecord.BackupTierHistory} BackupTierHistory * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ BackupTierHistory.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.AccountRecord.BackupTierHistory(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.backupTier = reader.uint64(); break; } case 2: { message.endedAtTimestamp = reader.uint64(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a BackupTierHistory message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.AccountRecord.BackupTierHistory * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.AccountRecord.BackupTierHistory} BackupTierHistory * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ BackupTierHistory.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return BackupTierHistory; })(); AccountRecord.NotificationProfileManualOverride = (function() { /** * Properties of a NotificationProfileManualOverride. * @memberof signalservice.AccountRecord * @interface INotificationProfileManualOverride * @property {Long|null} [disabledAtTimestampMs] NotificationProfileManualOverride disabledAtTimestampMs * @property {signalservice.AccountRecord.NotificationProfileManualOverride.IManuallyEnabled|null} [enabled] NotificationProfileManualOverride enabled */ /** * Constructs a new NotificationProfileManualOverride. * @memberof signalservice.AccountRecord * @classdesc Represents a NotificationProfileManualOverride. * @implements INotificationProfileManualOverride * @constructor * @param {signalservice.AccountRecord.INotificationProfileManualOverride=} [properties] Properties to set */ function NotificationProfileManualOverride(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * NotificationProfileManualOverride disabledAtTimestampMs. * @member {Long|null|undefined} disabledAtTimestampMs * @memberof signalservice.AccountRecord.NotificationProfileManualOverride * @instance */ NotificationProfileManualOverride.prototype.disabledAtTimestampMs = null; /** * NotificationProfileManualOverride enabled. * @member {signalservice.AccountRecord.NotificationProfileManualOverride.IManuallyEnabled|null|undefined} enabled * @memberof signalservice.AccountRecord.NotificationProfileManualOverride * @instance */ NotificationProfileManualOverride.prototype.enabled = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * NotificationProfileManualOverride override. * @member {"disabledAtTimestampMs"|"enabled"|undefined} override * @memberof signalservice.AccountRecord.NotificationProfileManualOverride * @instance */ Object.defineProperty(NotificationProfileManualOverride.prototype, "override", { get: $util.oneOfGetter($oneOfFields = ["disabledAtTimestampMs", "enabled"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified NotificationProfileManualOverride message. Does not implicitly {@link signalservice.AccountRecord.NotificationProfileManualOverride.verify|verify} messages. * @function encode * @memberof signalservice.AccountRecord.NotificationProfileManualOverride * @static * @param {signalservice.AccountRecord.INotificationProfileManualOverride} message NotificationProfileManualOverride message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ NotificationProfileManualOverride.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.AccountRecord.NotificationProfileManualOverride.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.AccountRecord.NotificationProfileManualOverride.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.disabledAtTimestampMs != null && Object.hasOwnProperty.call(message, "disabledAtTimestampMs")) writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.disabledAtTimestampMs); if (message.enabled != null && Object.hasOwnProperty.call(message, "enabled")) $root.signalservice.AccountRecord.NotificationProfileManualOverride.ManuallyEnabled.encode(message.enabled, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified NotificationProfileManualOverride message, length delimited. Does not implicitly {@link signalservice.AccountRecord.NotificationProfileManualOverride.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.AccountRecord.NotificationProfileManualOverride * @static * @param {signalservice.AccountRecord.INotificationProfileManualOverride} message NotificationProfileManualOverride message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ NotificationProfileManualOverride.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a NotificationProfileManualOverride message from the specified reader or buffer. * @function decode * @memberof signalservice.AccountRecord.NotificationProfileManualOverride * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.AccountRecord.NotificationProfileManualOverride} NotificationProfileManualOverride * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ NotificationProfileManualOverride.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.AccountRecord.NotificationProfileManualOverride(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.disabledAtTimestampMs = reader.uint64(); break; } case 2: { message.enabled = $root.signalservice.AccountRecord.NotificationProfileManualOverride.ManuallyEnabled.decode(reader, reader.uint32()); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a NotificationProfileManualOverride message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.AccountRecord.NotificationProfileManualOverride * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.AccountRecord.NotificationProfileManualOverride} NotificationProfileManualOverride * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ NotificationProfileManualOverride.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; NotificationProfileManualOverride.ManuallyEnabled = (function() { /** * Properties of a ManuallyEnabled. * @memberof signalservice.AccountRecord.NotificationProfileManualOverride * @interface IManuallyEnabled * @property {Uint8Array|null} [id] ManuallyEnabled id * @property {Long|null} [endAtTimestampMs] ManuallyEnabled endAtTimestampMs */ /** * Constructs a new ManuallyEnabled. * @memberof signalservice.AccountRecord.NotificationProfileManualOverride * @classdesc Represents a ManuallyEnabled. * @implements IManuallyEnabled * @constructor * @param {signalservice.AccountRecord.NotificationProfileManualOverride.IManuallyEnabled=} [properties] Properties to set */ function ManuallyEnabled(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * ManuallyEnabled id. * @member {Uint8Array} id * @memberof signalservice.AccountRecord.NotificationProfileManualOverride.ManuallyEnabled * @instance */ ManuallyEnabled.prototype.id = $util.newBuffer([]); /** * ManuallyEnabled endAtTimestampMs. * @member {Long} endAtTimestampMs * @memberof signalservice.AccountRecord.NotificationProfileManualOverride.ManuallyEnabled * @instance */ ManuallyEnabled.prototype.endAtTimestampMs = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * Encodes the specified ManuallyEnabled message. Does not implicitly {@link signalservice.AccountRecord.NotificationProfileManualOverride.ManuallyEnabled.verify|verify} messages. * @function encode * @memberof signalservice.AccountRecord.NotificationProfileManualOverride.ManuallyEnabled * @static * @param {signalservice.AccountRecord.NotificationProfileManualOverride.IManuallyEnabled} message ManuallyEnabled message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ManuallyEnabled.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.AccountRecord.NotificationProfileManualOverride.ManuallyEnabled.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.AccountRecord.NotificationProfileManualOverride.ManuallyEnabled.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.id != null && Object.hasOwnProperty.call(message, "id")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.id); if (message.endAtTimestampMs != null && Object.hasOwnProperty.call(message, "endAtTimestampMs")) writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.endAtTimestampMs); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified ManuallyEnabled message, length delimited. Does not implicitly {@link signalservice.AccountRecord.NotificationProfileManualOverride.ManuallyEnabled.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.AccountRecord.NotificationProfileManualOverride.ManuallyEnabled * @static * @param {signalservice.AccountRecord.NotificationProfileManualOverride.IManuallyEnabled} message ManuallyEnabled message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ManuallyEnabled.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a ManuallyEnabled message from the specified reader or buffer. * @function decode * @memberof signalservice.AccountRecord.NotificationProfileManualOverride.ManuallyEnabled * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.AccountRecord.NotificationProfileManualOverride.ManuallyEnabled} ManuallyEnabled * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ManuallyEnabled.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.AccountRecord.NotificationProfileManualOverride.ManuallyEnabled(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.id = reader.bytes(); break; } case 3: { message.endAtTimestampMs = reader.uint64(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a ManuallyEnabled message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.AccountRecord.NotificationProfileManualOverride.ManuallyEnabled * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.AccountRecord.NotificationProfileManualOverride.ManuallyEnabled} ManuallyEnabled * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ManuallyEnabled.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return ManuallyEnabled; })(); return NotificationProfileManualOverride; })(); return AccountRecord; })(); signalservice.StoryDistributionListRecord = (function() { /** * Properties of a StoryDistributionListRecord. * @memberof signalservice * @interface IStoryDistributionListRecord * @property {Uint8Array|null} [identifier] StoryDistributionListRecord identifier * @property {string|null} [name] StoryDistributionListRecord name * @property {Array.|null} [recipientServiceIds] StoryDistributionListRecord recipientServiceIds * @property {Long|null} [deletedAtTimestamp] StoryDistributionListRecord deletedAtTimestamp * @property {boolean|null} [allowsReplies] StoryDistributionListRecord allowsReplies * @property {boolean|null} [isBlockList] StoryDistributionListRecord isBlockList * @property {Array.|null} [recipientServiceIdsBinary] StoryDistributionListRecord recipientServiceIdsBinary */ /** * Constructs a new StoryDistributionListRecord. * @memberof signalservice * @classdesc Represents a StoryDistributionListRecord. * @implements IStoryDistributionListRecord * @constructor * @param {signalservice.IStoryDistributionListRecord=} [properties] Properties to set */ function StoryDistributionListRecord(properties) { this.recipientServiceIds = []; this.recipientServiceIdsBinary = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * StoryDistributionListRecord identifier. * @member {Uint8Array} identifier * @memberof signalservice.StoryDistributionListRecord * @instance */ StoryDistributionListRecord.prototype.identifier = $util.newBuffer([]); /** * StoryDistributionListRecord name. * @member {string} name * @memberof signalservice.StoryDistributionListRecord * @instance */ StoryDistributionListRecord.prototype.name = ""; /** * StoryDistributionListRecord recipientServiceIds. * @member {Array.} recipientServiceIds * @memberof signalservice.StoryDistributionListRecord * @instance */ StoryDistributionListRecord.prototype.recipientServiceIds = $util.emptyArray; /** * StoryDistributionListRecord deletedAtTimestamp. * @member {Long} deletedAtTimestamp * @memberof signalservice.StoryDistributionListRecord * @instance */ StoryDistributionListRecord.prototype.deletedAtTimestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * StoryDistributionListRecord allowsReplies. * @member {boolean} allowsReplies * @memberof signalservice.StoryDistributionListRecord * @instance */ StoryDistributionListRecord.prototype.allowsReplies = false; /** * StoryDistributionListRecord isBlockList. * @member {boolean} isBlockList * @memberof signalservice.StoryDistributionListRecord * @instance */ StoryDistributionListRecord.prototype.isBlockList = false; /** * StoryDistributionListRecord recipientServiceIdsBinary. * @member {Array.} recipientServiceIdsBinary * @memberof signalservice.StoryDistributionListRecord * @instance */ StoryDistributionListRecord.prototype.recipientServiceIdsBinary = $util.emptyArray; /** * Encodes the specified StoryDistributionListRecord message. Does not implicitly {@link signalservice.StoryDistributionListRecord.verify|verify} messages. * @function encode * @memberof signalservice.StoryDistributionListRecord * @static * @param {signalservice.IStoryDistributionListRecord} message StoryDistributionListRecord message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ StoryDistributionListRecord.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.StoryDistributionListRecord.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.StoryDistributionListRecord.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.identifier != null && Object.hasOwnProperty.call(message, "identifier")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.identifier); if (message.name != null && Object.hasOwnProperty.call(message, "name")) writer.uint32(/* id 2, wireType 2 =*/18).string(message.name); if (message.recipientServiceIds != null && message.recipientServiceIds.length) for (var i = 0; i < message.recipientServiceIds.length; ++i) writer.uint32(/* id 3, wireType 2 =*/26).string(message.recipientServiceIds[i]); if (message.deletedAtTimestamp != null && Object.hasOwnProperty.call(message, "deletedAtTimestamp")) writer.uint32(/* id 4, wireType 0 =*/32).uint64(message.deletedAtTimestamp); if (message.allowsReplies != null && Object.hasOwnProperty.call(message, "allowsReplies")) writer.uint32(/* id 5, wireType 0 =*/40).bool(message.allowsReplies); if (message.isBlockList != null && Object.hasOwnProperty.call(message, "isBlockList")) writer.uint32(/* id 6, wireType 0 =*/48).bool(message.isBlockList); if (message.recipientServiceIdsBinary != null && message.recipientServiceIdsBinary.length) for (var i = 0; i < message.recipientServiceIdsBinary.length; ++i) writer.uint32(/* id 7, wireType 2 =*/58).bytes(message.recipientServiceIdsBinary[i]); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified StoryDistributionListRecord message, length delimited. Does not implicitly {@link signalservice.StoryDistributionListRecord.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.StoryDistributionListRecord * @static * @param {signalservice.IStoryDistributionListRecord} message StoryDistributionListRecord message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ StoryDistributionListRecord.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a StoryDistributionListRecord message from the specified reader or buffer. * @function decode * @memberof signalservice.StoryDistributionListRecord * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.StoryDistributionListRecord} StoryDistributionListRecord * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ StoryDistributionListRecord.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.StoryDistributionListRecord(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.identifier = reader.bytes(); break; } case 2: { message.name = reader.string(); break; } case 3: { if (!(message.recipientServiceIds && message.recipientServiceIds.length)) message.recipientServiceIds = []; message.recipientServiceIds.push(reader.string()); break; } case 4: { message.deletedAtTimestamp = reader.uint64(); break; } case 5: { message.allowsReplies = reader.bool(); break; } case 6: { message.isBlockList = reader.bool(); break; } case 7: { if (!(message.recipientServiceIdsBinary && message.recipientServiceIdsBinary.length)) message.recipientServiceIdsBinary = []; message.recipientServiceIdsBinary.push(reader.bytes()); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a StoryDistributionListRecord message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.StoryDistributionListRecord * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.StoryDistributionListRecord} StoryDistributionListRecord * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ StoryDistributionListRecord.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return StoryDistributionListRecord; })(); signalservice.StickerPackRecord = (function() { /** * Properties of a StickerPackRecord. * @memberof signalservice * @interface IStickerPackRecord * @property {Uint8Array|null} [packId] StickerPackRecord packId * @property {Uint8Array|null} [packKey] StickerPackRecord packKey * @property {number|null} [position] StickerPackRecord position * @property {Long|null} [deletedAtTimestamp] StickerPackRecord deletedAtTimestamp */ /** * Constructs a new StickerPackRecord. * @memberof signalservice * @classdesc Represents a StickerPackRecord. * @implements IStickerPackRecord * @constructor * @param {signalservice.IStickerPackRecord=} [properties] Properties to set */ function StickerPackRecord(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * StickerPackRecord packId. * @member {Uint8Array} packId * @memberof signalservice.StickerPackRecord * @instance */ StickerPackRecord.prototype.packId = $util.newBuffer([]); /** * StickerPackRecord packKey. * @member {Uint8Array} packKey * @memberof signalservice.StickerPackRecord * @instance */ StickerPackRecord.prototype.packKey = $util.newBuffer([]); /** * StickerPackRecord position. * @member {number} position * @memberof signalservice.StickerPackRecord * @instance */ StickerPackRecord.prototype.position = 0; /** * StickerPackRecord deletedAtTimestamp. * @member {Long} deletedAtTimestamp * @memberof signalservice.StickerPackRecord * @instance */ StickerPackRecord.prototype.deletedAtTimestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * Encodes the specified StickerPackRecord message. Does not implicitly {@link signalservice.StickerPackRecord.verify|verify} messages. * @function encode * @memberof signalservice.StickerPackRecord * @static * @param {signalservice.IStickerPackRecord} message StickerPackRecord message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ StickerPackRecord.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.StickerPackRecord.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.StickerPackRecord.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.packId != null && Object.hasOwnProperty.call(message, "packId")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.packId); if (message.packKey != null && Object.hasOwnProperty.call(message, "packKey")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.packKey); if (message.position != null && Object.hasOwnProperty.call(message, "position")) writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.position); if (message.deletedAtTimestamp != null && Object.hasOwnProperty.call(message, "deletedAtTimestamp")) writer.uint32(/* id 4, wireType 0 =*/32).uint64(message.deletedAtTimestamp); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified StickerPackRecord message, length delimited. Does not implicitly {@link signalservice.StickerPackRecord.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.StickerPackRecord * @static * @param {signalservice.IStickerPackRecord} message StickerPackRecord message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ StickerPackRecord.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a StickerPackRecord message from the specified reader or buffer. * @function decode * @memberof signalservice.StickerPackRecord * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.StickerPackRecord} StickerPackRecord * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ StickerPackRecord.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.StickerPackRecord(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.packId = reader.bytes(); break; } case 2: { message.packKey = reader.bytes(); break; } case 3: { message.position = reader.uint32(); break; } case 4: { message.deletedAtTimestamp = reader.uint64(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a StickerPackRecord message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.StickerPackRecord * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.StickerPackRecord} StickerPackRecord * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ StickerPackRecord.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return StickerPackRecord; })(); signalservice.CallLinkRecord = (function() { /** * Properties of a CallLinkRecord. * @memberof signalservice * @interface ICallLinkRecord * @property {Uint8Array|null} [rootKey] CallLinkRecord rootKey * @property {Uint8Array|null} [adminPasskey] CallLinkRecord adminPasskey * @property {Long|null} [deletedAtTimestampMs] CallLinkRecord deletedAtTimestampMs * @property {Uint8Array|null} [epoch] CallLinkRecord epoch */ /** * Constructs a new CallLinkRecord. * @memberof signalservice * @classdesc Represents a CallLinkRecord. * @implements ICallLinkRecord * @constructor * @param {signalservice.ICallLinkRecord=} [properties] Properties to set */ function CallLinkRecord(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * CallLinkRecord rootKey. * @member {Uint8Array} rootKey * @memberof signalservice.CallLinkRecord * @instance */ CallLinkRecord.prototype.rootKey = $util.newBuffer([]); /** * CallLinkRecord adminPasskey. * @member {Uint8Array} adminPasskey * @memberof signalservice.CallLinkRecord * @instance */ CallLinkRecord.prototype.adminPasskey = $util.newBuffer([]); /** * CallLinkRecord deletedAtTimestampMs. * @member {Long} deletedAtTimestampMs * @memberof signalservice.CallLinkRecord * @instance */ CallLinkRecord.prototype.deletedAtTimestampMs = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * CallLinkRecord epoch. * @member {Uint8Array|null|undefined} epoch * @memberof signalservice.CallLinkRecord * @instance */ CallLinkRecord.prototype.epoch = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * CallLinkRecord _epoch. * @member {"epoch"|undefined} _epoch * @memberof signalservice.CallLinkRecord * @instance */ Object.defineProperty(CallLinkRecord.prototype, "_epoch", { get: $util.oneOfGetter($oneOfFields = ["epoch"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified CallLinkRecord message. Does not implicitly {@link signalservice.CallLinkRecord.verify|verify} messages. * @function encode * @memberof signalservice.CallLinkRecord * @static * @param {signalservice.ICallLinkRecord} message CallLinkRecord message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ CallLinkRecord.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.CallLinkRecord.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.CallLinkRecord.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.rootKey != null && Object.hasOwnProperty.call(message, "rootKey")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.rootKey); if (message.adminPasskey != null && Object.hasOwnProperty.call(message, "adminPasskey")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.adminPasskey); if (message.deletedAtTimestampMs != null && Object.hasOwnProperty.call(message, "deletedAtTimestampMs")) writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.deletedAtTimestampMs); if (message.epoch != null && Object.hasOwnProperty.call(message, "epoch")) writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.epoch); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified CallLinkRecord message, length delimited. Does not implicitly {@link signalservice.CallLinkRecord.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.CallLinkRecord * @static * @param {signalservice.ICallLinkRecord} message CallLinkRecord message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ CallLinkRecord.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a CallLinkRecord message from the specified reader or buffer. * @function decode * @memberof signalservice.CallLinkRecord * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.CallLinkRecord} CallLinkRecord * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ CallLinkRecord.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.CallLinkRecord(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.rootKey = reader.bytes(); break; } case 2: { message.adminPasskey = reader.bytes(); break; } case 3: { message.deletedAtTimestampMs = reader.uint64(); break; } case 4: { message.epoch = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a CallLinkRecord message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.CallLinkRecord * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.CallLinkRecord} CallLinkRecord * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ CallLinkRecord.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return CallLinkRecord; })(); signalservice.Recipient = (function() { /** * Properties of a Recipient. * @memberof signalservice * @interface IRecipient * @property {signalservice.Recipient.IContact|null} [contact] Recipient contact * @property {Uint8Array|null} [legacyGroupId] Recipient legacyGroupId * @property {Uint8Array|null} [groupMasterKey] Recipient groupMasterKey */ /** * Constructs a new Recipient. * @memberof signalservice * @classdesc Represents a Recipient. * @implements IRecipient * @constructor * @param {signalservice.IRecipient=} [properties] Properties to set */ function Recipient(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Recipient contact. * @member {signalservice.Recipient.IContact|null|undefined} contact * @memberof signalservice.Recipient * @instance */ Recipient.prototype.contact = null; /** * Recipient legacyGroupId. * @member {Uint8Array|null|undefined} legacyGroupId * @memberof signalservice.Recipient * @instance */ Recipient.prototype.legacyGroupId = null; /** * Recipient groupMasterKey. * @member {Uint8Array|null|undefined} groupMasterKey * @memberof signalservice.Recipient * @instance */ Recipient.prototype.groupMasterKey = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * Recipient identifier. * @member {"contact"|"legacyGroupId"|"groupMasterKey"|undefined} identifier * @memberof signalservice.Recipient * @instance */ Object.defineProperty(Recipient.prototype, "identifier", { get: $util.oneOfGetter($oneOfFields = ["contact", "legacyGroupId", "groupMasterKey"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified Recipient message. Does not implicitly {@link signalservice.Recipient.verify|verify} messages. * @function encode * @memberof signalservice.Recipient * @static * @param {signalservice.IRecipient} message Recipient message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Recipient.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.Recipient.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.Recipient.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.contact != null && Object.hasOwnProperty.call(message, "contact")) $root.signalservice.Recipient.Contact.encode(message.contact, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.legacyGroupId != null && Object.hasOwnProperty.call(message, "legacyGroupId")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.legacyGroupId); if (message.groupMasterKey != null && Object.hasOwnProperty.call(message, "groupMasterKey")) writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.groupMasterKey); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Recipient message, length delimited. Does not implicitly {@link signalservice.Recipient.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.Recipient * @static * @param {signalservice.IRecipient} message Recipient message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Recipient.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Recipient message from the specified reader or buffer. * @function decode * @memberof signalservice.Recipient * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.Recipient} Recipient * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Recipient.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.Recipient(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.contact = $root.signalservice.Recipient.Contact.decode(reader, reader.uint32()); break; } case 2: { message.legacyGroupId = reader.bytes(); break; } case 3: { message.groupMasterKey = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Recipient message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.Recipient * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.Recipient} Recipient * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Recipient.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; Recipient.Contact = (function() { /** * Properties of a Contact. * @memberof signalservice.Recipient * @interface IContact * @property {string|null} [serviceId] Contact serviceId * @property {string|null} [e164] Contact e164 * @property {Uint8Array|null} [serviceIdBinary] Contact serviceIdBinary */ /** * Constructs a new Contact. * @memberof signalservice.Recipient * @classdesc Represents a Contact. * @implements IContact * @constructor * @param {signalservice.Recipient.IContact=} [properties] Properties to set */ function Contact(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Contact serviceId. * @member {string} serviceId * @memberof signalservice.Recipient.Contact * @instance */ Contact.prototype.serviceId = ""; /** * Contact e164. * @member {string} e164 * @memberof signalservice.Recipient.Contact * @instance */ Contact.prototype.e164 = ""; /** * Contact serviceIdBinary. * @member {Uint8Array} serviceIdBinary * @memberof signalservice.Recipient.Contact * @instance */ Contact.prototype.serviceIdBinary = $util.newBuffer([]); /** * Encodes the specified Contact message. Does not implicitly {@link signalservice.Recipient.Contact.verify|verify} messages. * @function encode * @memberof signalservice.Recipient.Contact * @static * @param {signalservice.Recipient.IContact} message Contact message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Contact.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.Recipient.Contact.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.Recipient.Contact.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.serviceId != null && Object.hasOwnProperty.call(message, "serviceId")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.serviceId); if (message.e164 != null && Object.hasOwnProperty.call(message, "e164")) writer.uint32(/* id 2, wireType 2 =*/18).string(message.e164); if (message.serviceIdBinary != null && Object.hasOwnProperty.call(message, "serviceIdBinary")) writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.serviceIdBinary); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Contact message, length delimited. Does not implicitly {@link signalservice.Recipient.Contact.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.Recipient.Contact * @static * @param {signalservice.Recipient.IContact} message Contact message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Contact.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Contact message from the specified reader or buffer. * @function decode * @memberof signalservice.Recipient.Contact * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.Recipient.Contact} Contact * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Contact.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.Recipient.Contact(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.serviceId = reader.string(); break; } case 2: { message.e164 = reader.string(); break; } case 3: { message.serviceIdBinary = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Contact message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.Recipient.Contact * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.Recipient.Contact} Contact * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Contact.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return Contact; })(); return Recipient; })(); signalservice.ChatFolderRecord = (function() { /** * Properties of a ChatFolderRecord. * @memberof signalservice * @interface IChatFolderRecord * @property {Uint8Array|null} [id] ChatFolderRecord id * @property {string|null} [name] ChatFolderRecord name * @property {number|null} [position] ChatFolderRecord position * @property {boolean|null} [showOnlyUnread] ChatFolderRecord showOnlyUnread * @property {boolean|null} [showMutedChats] ChatFolderRecord showMutedChats * @property {boolean|null} [includeAllIndividualChats] ChatFolderRecord includeAllIndividualChats * @property {boolean|null} [includeAllGroupChats] ChatFolderRecord includeAllGroupChats * @property {signalservice.ChatFolderRecord.FolderType|null} [folderType] ChatFolderRecord folderType * @property {Array.|null} [includedRecipients] ChatFolderRecord includedRecipients * @property {Array.|null} [excludedRecipients] ChatFolderRecord excludedRecipients * @property {Long|null} [deletedAtTimestampMs] ChatFolderRecord deletedAtTimestampMs */ /** * Constructs a new ChatFolderRecord. * @memberof signalservice * @classdesc Represents a ChatFolderRecord. * @implements IChatFolderRecord * @constructor * @param {signalservice.IChatFolderRecord=} [properties] Properties to set */ function ChatFolderRecord(properties) { this.includedRecipients = []; this.excludedRecipients = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * ChatFolderRecord id. * @member {Uint8Array} id * @memberof signalservice.ChatFolderRecord * @instance */ ChatFolderRecord.prototype.id = $util.newBuffer([]); /** * ChatFolderRecord name. * @member {string} name * @memberof signalservice.ChatFolderRecord * @instance */ ChatFolderRecord.prototype.name = ""; /** * ChatFolderRecord position. * @member {number} position * @memberof signalservice.ChatFolderRecord * @instance */ ChatFolderRecord.prototype.position = 0; /** * ChatFolderRecord showOnlyUnread. * @member {boolean} showOnlyUnread * @memberof signalservice.ChatFolderRecord * @instance */ ChatFolderRecord.prototype.showOnlyUnread = false; /** * ChatFolderRecord showMutedChats. * @member {boolean} showMutedChats * @memberof signalservice.ChatFolderRecord * @instance */ ChatFolderRecord.prototype.showMutedChats = false; /** * ChatFolderRecord includeAllIndividualChats. * @member {boolean} includeAllIndividualChats * @memberof signalservice.ChatFolderRecord * @instance */ ChatFolderRecord.prototype.includeAllIndividualChats = false; /** * ChatFolderRecord includeAllGroupChats. * @member {boolean} includeAllGroupChats * @memberof signalservice.ChatFolderRecord * @instance */ ChatFolderRecord.prototype.includeAllGroupChats = false; /** * ChatFolderRecord folderType. * @member {signalservice.ChatFolderRecord.FolderType} folderType * @memberof signalservice.ChatFolderRecord * @instance */ ChatFolderRecord.prototype.folderType = 0; /** * ChatFolderRecord includedRecipients. * @member {Array.} includedRecipients * @memberof signalservice.ChatFolderRecord * @instance */ ChatFolderRecord.prototype.includedRecipients = $util.emptyArray; /** * ChatFolderRecord excludedRecipients. * @member {Array.} excludedRecipients * @memberof signalservice.ChatFolderRecord * @instance */ ChatFolderRecord.prototype.excludedRecipients = $util.emptyArray; /** * ChatFolderRecord deletedAtTimestampMs. * @member {Long} deletedAtTimestampMs * @memberof signalservice.ChatFolderRecord * @instance */ ChatFolderRecord.prototype.deletedAtTimestampMs = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * Encodes the specified ChatFolderRecord message. Does not implicitly {@link signalservice.ChatFolderRecord.verify|verify} messages. * @function encode * @memberof signalservice.ChatFolderRecord * @static * @param {signalservice.IChatFolderRecord} message ChatFolderRecord message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ChatFolderRecord.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.ChatFolderRecord.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.ChatFolderRecord.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.id != null && Object.hasOwnProperty.call(message, "id")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.id); if (message.name != null && Object.hasOwnProperty.call(message, "name")) writer.uint32(/* id 2, wireType 2 =*/18).string(message.name); if (message.position != null && Object.hasOwnProperty.call(message, "position")) writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.position); if (message.showOnlyUnread != null && Object.hasOwnProperty.call(message, "showOnlyUnread")) writer.uint32(/* id 4, wireType 0 =*/32).bool(message.showOnlyUnread); if (message.showMutedChats != null && Object.hasOwnProperty.call(message, "showMutedChats")) writer.uint32(/* id 5, wireType 0 =*/40).bool(message.showMutedChats); if (message.includeAllIndividualChats != null && Object.hasOwnProperty.call(message, "includeAllIndividualChats")) writer.uint32(/* id 6, wireType 0 =*/48).bool(message.includeAllIndividualChats); if (message.includeAllGroupChats != null && Object.hasOwnProperty.call(message, "includeAllGroupChats")) writer.uint32(/* id 7, wireType 0 =*/56).bool(message.includeAllGroupChats); if (message.folderType != null && Object.hasOwnProperty.call(message, "folderType")) writer.uint32(/* id 8, wireType 0 =*/64).int32(message.folderType); if (message.includedRecipients != null && message.includedRecipients.length) for (var i = 0; i < message.includedRecipients.length; ++i) $root.signalservice.Recipient.encode(message.includedRecipients[i], writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim(); if (message.excludedRecipients != null && message.excludedRecipients.length) for (var i = 0; i < message.excludedRecipients.length; ++i) $root.signalservice.Recipient.encode(message.excludedRecipients[i], writer.uint32(/* id 10, wireType 2 =*/82).fork()).ldelim(); if (message.deletedAtTimestampMs != null && Object.hasOwnProperty.call(message, "deletedAtTimestampMs")) writer.uint32(/* id 11, wireType 0 =*/88).uint64(message.deletedAtTimestampMs); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified ChatFolderRecord message, length delimited. Does not implicitly {@link signalservice.ChatFolderRecord.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.ChatFolderRecord * @static * @param {signalservice.IChatFolderRecord} message ChatFolderRecord message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ChatFolderRecord.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a ChatFolderRecord message from the specified reader or buffer. * @function decode * @memberof signalservice.ChatFolderRecord * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.ChatFolderRecord} ChatFolderRecord * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ChatFolderRecord.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.ChatFolderRecord(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.id = reader.bytes(); break; } case 2: { message.name = reader.string(); break; } case 3: { message.position = reader.uint32(); break; } case 4: { message.showOnlyUnread = reader.bool(); break; } case 5: { message.showMutedChats = reader.bool(); break; } case 6: { message.includeAllIndividualChats = reader.bool(); break; } case 7: { message.includeAllGroupChats = reader.bool(); break; } case 8: { message.folderType = reader.int32(); break; } case 9: { if (!(message.includedRecipients && message.includedRecipients.length)) message.includedRecipients = []; message.includedRecipients.push($root.signalservice.Recipient.decode(reader, reader.uint32())); break; } case 10: { if (!(message.excludedRecipients && message.excludedRecipients.length)) message.excludedRecipients = []; message.excludedRecipients.push($root.signalservice.Recipient.decode(reader, reader.uint32())); break; } case 11: { message.deletedAtTimestampMs = reader.uint64(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a ChatFolderRecord message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.ChatFolderRecord * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.ChatFolderRecord} ChatFolderRecord * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ChatFolderRecord.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * FolderType enum. * @name signalservice.ChatFolderRecord.FolderType * @enum {number} * @property {number} UNKNOWN=0 UNKNOWN value * @property {number} ALL=1 ALL value * @property {number} CUSTOM=2 CUSTOM value */ ChatFolderRecord.FolderType = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "UNKNOWN"] = 0; values[valuesById[1] = "ALL"] = 1; values[valuesById[2] = "CUSTOM"] = 2; return values; })(); return ChatFolderRecord; })(); signalservice.NotificationProfile = (function() { /** * Properties of a NotificationProfile. * @memberof signalservice * @interface INotificationProfile * @property {Uint8Array|null} [id] NotificationProfile id * @property {string|null} [name] NotificationProfile name * @property {string|null} [emoji] NotificationProfile emoji * @property {number|null} [color] NotificationProfile color * @property {Long|null} [createdAtMs] NotificationProfile createdAtMs * @property {boolean|null} [allowAllCalls] NotificationProfile allowAllCalls * @property {boolean|null} [allowAllMentions] NotificationProfile allowAllMentions * @property {Array.|null} [allowedMembers] NotificationProfile allowedMembers * @property {boolean|null} [scheduleEnabled] NotificationProfile scheduleEnabled * @property {number|null} [scheduleStartTime] NotificationProfile scheduleStartTime * @property {number|null} [scheduleEndTime] NotificationProfile scheduleEndTime * @property {Array.|null} [scheduleDaysEnabled] NotificationProfile scheduleDaysEnabled * @property {Long|null} [deletedAtTimestampMs] NotificationProfile deletedAtTimestampMs */ /** * Constructs a new NotificationProfile. * @memberof signalservice * @classdesc Represents a NotificationProfile. * @implements INotificationProfile * @constructor * @param {signalservice.INotificationProfile=} [properties] Properties to set */ function NotificationProfile(properties) { this.allowedMembers = []; this.scheduleDaysEnabled = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * NotificationProfile id. * @member {Uint8Array} id * @memberof signalservice.NotificationProfile * @instance */ NotificationProfile.prototype.id = $util.newBuffer([]); /** * NotificationProfile name. * @member {string} name * @memberof signalservice.NotificationProfile * @instance */ NotificationProfile.prototype.name = ""; /** * NotificationProfile emoji. * @member {string|null|undefined} emoji * @memberof signalservice.NotificationProfile * @instance */ NotificationProfile.prototype.emoji = null; /** * NotificationProfile color. * @member {number} color * @memberof signalservice.NotificationProfile * @instance */ NotificationProfile.prototype.color = 0; /** * NotificationProfile createdAtMs. * @member {Long} createdAtMs * @memberof signalservice.NotificationProfile * @instance */ NotificationProfile.prototype.createdAtMs = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * NotificationProfile allowAllCalls. * @member {boolean} allowAllCalls * @memberof signalservice.NotificationProfile * @instance */ NotificationProfile.prototype.allowAllCalls = false; /** * NotificationProfile allowAllMentions. * @member {boolean} allowAllMentions * @memberof signalservice.NotificationProfile * @instance */ NotificationProfile.prototype.allowAllMentions = false; /** * NotificationProfile allowedMembers. * @member {Array.} allowedMembers * @memberof signalservice.NotificationProfile * @instance */ NotificationProfile.prototype.allowedMembers = $util.emptyArray; /** * NotificationProfile scheduleEnabled. * @member {boolean} scheduleEnabled * @memberof signalservice.NotificationProfile * @instance */ NotificationProfile.prototype.scheduleEnabled = false; /** * NotificationProfile scheduleStartTime. * @member {number} scheduleStartTime * @memberof signalservice.NotificationProfile * @instance */ NotificationProfile.prototype.scheduleStartTime = 0; /** * NotificationProfile scheduleEndTime. * @member {number} scheduleEndTime * @memberof signalservice.NotificationProfile * @instance */ NotificationProfile.prototype.scheduleEndTime = 0; /** * NotificationProfile scheduleDaysEnabled. * @member {Array.} scheduleDaysEnabled * @memberof signalservice.NotificationProfile * @instance */ NotificationProfile.prototype.scheduleDaysEnabled = $util.emptyArray; /** * NotificationProfile deletedAtTimestampMs. * @member {Long} deletedAtTimestampMs * @memberof signalservice.NotificationProfile * @instance */ NotificationProfile.prototype.deletedAtTimestampMs = $util.Long ? $util.Long.fromBits(0,0,true) : 0; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * NotificationProfile _emoji. * @member {"emoji"|undefined} _emoji * @memberof signalservice.NotificationProfile * @instance */ Object.defineProperty(NotificationProfile.prototype, "_emoji", { get: $util.oneOfGetter($oneOfFields = ["emoji"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified NotificationProfile message. Does not implicitly {@link signalservice.NotificationProfile.verify|verify} messages. * @function encode * @memberof signalservice.NotificationProfile * @static * @param {signalservice.INotificationProfile} message NotificationProfile message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ NotificationProfile.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.NotificationProfile.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.NotificationProfile.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.id != null && Object.hasOwnProperty.call(message, "id")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.id); if (message.name != null && Object.hasOwnProperty.call(message, "name")) writer.uint32(/* id 2, wireType 2 =*/18).string(message.name); if (message.emoji != null && Object.hasOwnProperty.call(message, "emoji")) writer.uint32(/* id 3, wireType 2 =*/26).string(message.emoji); if (message.color != null && Object.hasOwnProperty.call(message, "color")) writer.uint32(/* id 4, wireType 5 =*/37).fixed32(message.color); if (message.createdAtMs != null && Object.hasOwnProperty.call(message, "createdAtMs")) writer.uint32(/* id 5, wireType 0 =*/40).uint64(message.createdAtMs); if (message.allowAllCalls != null && Object.hasOwnProperty.call(message, "allowAllCalls")) writer.uint32(/* id 6, wireType 0 =*/48).bool(message.allowAllCalls); if (message.allowAllMentions != null && Object.hasOwnProperty.call(message, "allowAllMentions")) writer.uint32(/* id 7, wireType 0 =*/56).bool(message.allowAllMentions); if (message.allowedMembers != null && message.allowedMembers.length) for (var i = 0; i < message.allowedMembers.length; ++i) $root.signalservice.Recipient.encode(message.allowedMembers[i], writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim(); if (message.scheduleEnabled != null && Object.hasOwnProperty.call(message, "scheduleEnabled")) writer.uint32(/* id 9, wireType 0 =*/72).bool(message.scheduleEnabled); if (message.scheduleStartTime != null && Object.hasOwnProperty.call(message, "scheduleStartTime")) writer.uint32(/* id 10, wireType 0 =*/80).uint32(message.scheduleStartTime); if (message.scheduleEndTime != null && Object.hasOwnProperty.call(message, "scheduleEndTime")) writer.uint32(/* id 11, wireType 0 =*/88).uint32(message.scheduleEndTime); if (message.scheduleDaysEnabled != null && message.scheduleDaysEnabled.length) { writer.uint32(/* id 12, wireType 2 =*/98).fork(); for (var i = 0; i < message.scheduleDaysEnabled.length; ++i) writer.int32(message.scheduleDaysEnabled[i]); writer.ldelim(); } if (message.deletedAtTimestampMs != null && Object.hasOwnProperty.call(message, "deletedAtTimestampMs")) writer.uint32(/* id 13, wireType 0 =*/104).uint64(message.deletedAtTimestampMs); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified NotificationProfile message, length delimited. Does not implicitly {@link signalservice.NotificationProfile.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.NotificationProfile * @static * @param {signalservice.INotificationProfile} message NotificationProfile message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ NotificationProfile.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a NotificationProfile message from the specified reader or buffer. * @function decode * @memberof signalservice.NotificationProfile * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.NotificationProfile} NotificationProfile * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ NotificationProfile.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.NotificationProfile(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.id = reader.bytes(); break; } case 2: { message.name = reader.string(); break; } case 3: { message.emoji = reader.string(); break; } case 4: { message.color = reader.fixed32(); break; } case 5: { message.createdAtMs = reader.uint64(); break; } case 6: { message.allowAllCalls = reader.bool(); break; } case 7: { message.allowAllMentions = reader.bool(); break; } case 8: { if (!(message.allowedMembers && message.allowedMembers.length)) message.allowedMembers = []; message.allowedMembers.push($root.signalservice.Recipient.decode(reader, reader.uint32())); break; } case 9: { message.scheduleEnabled = reader.bool(); break; } case 10: { message.scheduleStartTime = reader.uint32(); break; } case 11: { message.scheduleEndTime = reader.uint32(); break; } case 12: { if (!(message.scheduleDaysEnabled && message.scheduleDaysEnabled.length)) message.scheduleDaysEnabled = []; if ((tag & 7) === 2) { var end2 = reader.uint32() + reader.pos; while (reader.pos < end2) message.scheduleDaysEnabled.push(reader.int32()); } else message.scheduleDaysEnabled.push(reader.int32()); break; } case 13: { message.deletedAtTimestampMs = reader.uint64(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a NotificationProfile message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.NotificationProfile * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.NotificationProfile} NotificationProfile * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ NotificationProfile.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * DayOfWeek enum. * @name signalservice.NotificationProfile.DayOfWeek * @enum {number} * @property {number} UNKNOWN=0 UNKNOWN value * @property {number} MONDAY=1 MONDAY value * @property {number} TUESDAY=2 TUESDAY value * @property {number} WEDNESDAY=3 WEDNESDAY value * @property {number} THURSDAY=4 THURSDAY value * @property {number} FRIDAY=5 FRIDAY value * @property {number} SATURDAY=6 SATURDAY value * @property {number} SUNDAY=7 SUNDAY value */ NotificationProfile.DayOfWeek = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "UNKNOWN"] = 0; values[valuesById[1] = "MONDAY"] = 1; values[valuesById[2] = "TUESDAY"] = 2; values[valuesById[3] = "WEDNESDAY"] = 3; values[valuesById[4] = "THURSDAY"] = 4; values[valuesById[5] = "FRIDAY"] = 5; values[valuesById[6] = "SATURDAY"] = 6; values[valuesById[7] = "SUNDAY"] = 7; return values; })(); return NotificationProfile; })(); signalservice.StickerPack = (function() { /** * Properties of a StickerPack. * @memberof signalservice * @interface IStickerPack * @property {string|null} [title] StickerPack title * @property {string|null} [author] StickerPack author * @property {signalservice.StickerPack.ISticker|null} [cover] StickerPack cover * @property {Array.|null} [stickers] StickerPack stickers */ /** * Constructs a new StickerPack. * @memberof signalservice * @classdesc Represents a StickerPack. * @implements IStickerPack * @constructor * @param {signalservice.IStickerPack=} [properties] Properties to set */ function StickerPack(properties) { this.stickers = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * StickerPack title. * @member {string} title * @memberof signalservice.StickerPack * @instance */ StickerPack.prototype.title = ""; /** * StickerPack author. * @member {string} author * @memberof signalservice.StickerPack * @instance */ StickerPack.prototype.author = ""; /** * StickerPack cover. * @member {signalservice.StickerPack.ISticker|null|undefined} cover * @memberof signalservice.StickerPack * @instance */ StickerPack.prototype.cover = null; /** * StickerPack stickers. * @member {Array.} stickers * @memberof signalservice.StickerPack * @instance */ StickerPack.prototype.stickers = $util.emptyArray; /** * Encodes the specified StickerPack message. Does not implicitly {@link signalservice.StickerPack.verify|verify} messages. * @function encode * @memberof signalservice.StickerPack * @static * @param {signalservice.IStickerPack} message StickerPack message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ StickerPack.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.StickerPack.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.StickerPack.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.title != null && Object.hasOwnProperty.call(message, "title")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.title); if (message.author != null && Object.hasOwnProperty.call(message, "author")) writer.uint32(/* id 2, wireType 2 =*/18).string(message.author); if (message.cover != null && Object.hasOwnProperty.call(message, "cover")) $root.signalservice.StickerPack.Sticker.encode(message.cover, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); if (message.stickers != null && message.stickers.length) for (var i = 0; i < message.stickers.length; ++i) $root.signalservice.StickerPack.Sticker.encode(message.stickers[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified StickerPack message, length delimited. Does not implicitly {@link signalservice.StickerPack.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.StickerPack * @static * @param {signalservice.IStickerPack} message StickerPack message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ StickerPack.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a StickerPack message from the specified reader or buffer. * @function decode * @memberof signalservice.StickerPack * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.StickerPack} StickerPack * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ StickerPack.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.StickerPack(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.title = reader.string(); break; } case 2: { message.author = reader.string(); break; } case 3: { message.cover = $root.signalservice.StickerPack.Sticker.decode(reader, reader.uint32()); break; } case 4: { if (!(message.stickers && message.stickers.length)) message.stickers = []; message.stickers.push($root.signalservice.StickerPack.Sticker.decode(reader, reader.uint32())); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a StickerPack message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.StickerPack * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.StickerPack} StickerPack * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ StickerPack.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; StickerPack.Sticker = (function() { /** * Properties of a Sticker. * @memberof signalservice.StickerPack * @interface ISticker * @property {number|null} [id] Sticker id * @property {string|null} [emoji] Sticker emoji */ /** * Constructs a new Sticker. * @memberof signalservice.StickerPack * @classdesc Represents a Sticker. * @implements ISticker * @constructor * @param {signalservice.StickerPack.ISticker=} [properties] Properties to set */ function Sticker(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Sticker id. * @member {number} id * @memberof signalservice.StickerPack.Sticker * @instance */ Sticker.prototype.id = 0; /** * Sticker emoji. * @member {string} emoji * @memberof signalservice.StickerPack.Sticker * @instance */ Sticker.prototype.emoji = ""; /** * Encodes the specified Sticker message. Does not implicitly {@link signalservice.StickerPack.Sticker.verify|verify} messages. * @function encode * @memberof signalservice.StickerPack.Sticker * @static * @param {signalservice.StickerPack.ISticker} message Sticker message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Sticker.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.StickerPack.Sticker.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.StickerPack.Sticker.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.id != null && Object.hasOwnProperty.call(message, "id")) writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.id); if (message.emoji != null && Object.hasOwnProperty.call(message, "emoji")) writer.uint32(/* id 2, wireType 2 =*/18).string(message.emoji); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Sticker message, length delimited. Does not implicitly {@link signalservice.StickerPack.Sticker.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.StickerPack.Sticker * @static * @param {signalservice.StickerPack.ISticker} message Sticker message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Sticker.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Sticker message from the specified reader or buffer. * @function decode * @memberof signalservice.StickerPack.Sticker * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.StickerPack.Sticker} Sticker * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Sticker.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.StickerPack.Sticker(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.id = reader.uint32(); break; } case 2: { message.emoji = reader.string(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Sticker message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.StickerPack.Sticker * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.StickerPack.Sticker} Sticker * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Sticker.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return Sticker; })(); return StickerPack; })(); signalservice.WebSocketRequestMessage = (function() { /** * Properties of a WebSocketRequestMessage. * @memberof signalservice * @interface IWebSocketRequestMessage * @property {string|null} [verb] WebSocketRequestMessage verb * @property {string|null} [path] WebSocketRequestMessage path * @property {Uint8Array|null} [body] WebSocketRequestMessage body * @property {Array.|null} [headers] WebSocketRequestMessage headers * @property {Long|null} [id] WebSocketRequestMessage id */ /** * Constructs a new WebSocketRequestMessage. * @memberof signalservice * @classdesc Represents a WebSocketRequestMessage. * @implements IWebSocketRequestMessage * @constructor * @param {signalservice.IWebSocketRequestMessage=} [properties] Properties to set */ function WebSocketRequestMessage(properties) { this.headers = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * WebSocketRequestMessage verb. * @member {string} verb * @memberof signalservice.WebSocketRequestMessage * @instance */ WebSocketRequestMessage.prototype.verb = ""; /** * WebSocketRequestMessage path. * @member {string} path * @memberof signalservice.WebSocketRequestMessage * @instance */ WebSocketRequestMessage.prototype.path = ""; /** * WebSocketRequestMessage body. * @member {Uint8Array} body * @memberof signalservice.WebSocketRequestMessage * @instance */ WebSocketRequestMessage.prototype.body = $util.newBuffer([]); /** * WebSocketRequestMessage headers. * @member {Array.} headers * @memberof signalservice.WebSocketRequestMessage * @instance */ WebSocketRequestMessage.prototype.headers = $util.emptyArray; /** * WebSocketRequestMessage id. * @member {Long} id * @memberof signalservice.WebSocketRequestMessage * @instance */ WebSocketRequestMessage.prototype.id = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * Encodes the specified WebSocketRequestMessage message. Does not implicitly {@link signalservice.WebSocketRequestMessage.verify|verify} messages. * @function encode * @memberof signalservice.WebSocketRequestMessage * @static * @param {signalservice.IWebSocketRequestMessage} message WebSocketRequestMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ WebSocketRequestMessage.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.WebSocketRequestMessage.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.WebSocketRequestMessage.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.verb != null && Object.hasOwnProperty.call(message, "verb")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.verb); if (message.path != null && Object.hasOwnProperty.call(message, "path")) writer.uint32(/* id 2, wireType 2 =*/18).string(message.path); if (message.body != null && Object.hasOwnProperty.call(message, "body")) writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.body); if (message.id != null && Object.hasOwnProperty.call(message, "id")) writer.uint32(/* id 4, wireType 0 =*/32).uint64(message.id); if (message.headers != null && message.headers.length) for (var i = 0; i < message.headers.length; ++i) writer.uint32(/* id 5, wireType 2 =*/42).string(message.headers[i]); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified WebSocketRequestMessage message, length delimited. Does not implicitly {@link signalservice.WebSocketRequestMessage.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.WebSocketRequestMessage * @static * @param {signalservice.IWebSocketRequestMessage} message WebSocketRequestMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ WebSocketRequestMessage.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a WebSocketRequestMessage message from the specified reader or buffer. * @function decode * @memberof signalservice.WebSocketRequestMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.WebSocketRequestMessage} WebSocketRequestMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ WebSocketRequestMessage.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.WebSocketRequestMessage(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.verb = reader.string(); break; } case 2: { message.path = reader.string(); break; } case 3: { message.body = reader.bytes(); break; } case 5: { if (!(message.headers && message.headers.length)) message.headers = []; message.headers.push(reader.string()); break; } case 4: { message.id = reader.uint64(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a WebSocketRequestMessage message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.WebSocketRequestMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.WebSocketRequestMessage} WebSocketRequestMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ WebSocketRequestMessage.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return WebSocketRequestMessage; })(); signalservice.WebSocketResponseMessage = (function() { /** * Properties of a WebSocketResponseMessage. * @memberof signalservice * @interface IWebSocketResponseMessage * @property {Long|null} [id] WebSocketResponseMessage id * @property {number|null} [status] WebSocketResponseMessage status * @property {string|null} [message] WebSocketResponseMessage message * @property {Array.|null} [headers] WebSocketResponseMessage headers * @property {Uint8Array|null} [body] WebSocketResponseMessage body */ /** * Constructs a new WebSocketResponseMessage. * @memberof signalservice * @classdesc Represents a WebSocketResponseMessage. * @implements IWebSocketResponseMessage * @constructor * @param {signalservice.IWebSocketResponseMessage=} [properties] Properties to set */ function WebSocketResponseMessage(properties) { this.headers = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * WebSocketResponseMessage id. * @member {Long} id * @memberof signalservice.WebSocketResponseMessage * @instance */ WebSocketResponseMessage.prototype.id = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * WebSocketResponseMessage status. * @member {number} status * @memberof signalservice.WebSocketResponseMessage * @instance */ WebSocketResponseMessage.prototype.status = 0; /** * WebSocketResponseMessage message. * @member {string} message * @memberof signalservice.WebSocketResponseMessage * @instance */ WebSocketResponseMessage.prototype.message = ""; /** * WebSocketResponseMessage headers. * @member {Array.} headers * @memberof signalservice.WebSocketResponseMessage * @instance */ WebSocketResponseMessage.prototype.headers = $util.emptyArray; /** * WebSocketResponseMessage body. * @member {Uint8Array} body * @memberof signalservice.WebSocketResponseMessage * @instance */ WebSocketResponseMessage.prototype.body = $util.newBuffer([]); /** * Encodes the specified WebSocketResponseMessage message. Does not implicitly {@link signalservice.WebSocketResponseMessage.verify|verify} messages. * @function encode * @memberof signalservice.WebSocketResponseMessage * @static * @param {signalservice.IWebSocketResponseMessage} message WebSocketResponseMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ WebSocketResponseMessage.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.WebSocketResponseMessage.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.WebSocketResponseMessage.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.id != null && Object.hasOwnProperty.call(message, "id")) writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.id); if (message.status != null && Object.hasOwnProperty.call(message, "status")) writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.status); if (message.message != null && Object.hasOwnProperty.call(message, "message")) writer.uint32(/* id 3, wireType 2 =*/26).string(message.message); if (message.body != null && Object.hasOwnProperty.call(message, "body")) writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.body); if (message.headers != null && message.headers.length) for (var i = 0; i < message.headers.length; ++i) writer.uint32(/* id 5, wireType 2 =*/42).string(message.headers[i]); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified WebSocketResponseMessage message, length delimited. Does not implicitly {@link signalservice.WebSocketResponseMessage.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.WebSocketResponseMessage * @static * @param {signalservice.IWebSocketResponseMessage} message WebSocketResponseMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ WebSocketResponseMessage.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a WebSocketResponseMessage message from the specified reader or buffer. * @function decode * @memberof signalservice.WebSocketResponseMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.WebSocketResponseMessage} WebSocketResponseMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ WebSocketResponseMessage.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.WebSocketResponseMessage(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.id = reader.uint64(); break; } case 2: { message.status = reader.uint32(); break; } case 3: { message.message = reader.string(); break; } case 5: { if (!(message.headers && message.headers.length)) message.headers = []; message.headers.push(reader.string()); break; } case 4: { message.body = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a WebSocketResponseMessage message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.WebSocketResponseMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.WebSocketResponseMessage} WebSocketResponseMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ WebSocketResponseMessage.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return WebSocketResponseMessage; })(); signalservice.WebSocketMessage = (function() { /** * Properties of a WebSocketMessage. * @memberof signalservice * @interface IWebSocketMessage * @property {signalservice.WebSocketMessage.Type|null} [type] WebSocketMessage type * @property {signalservice.IWebSocketRequestMessage|null} [request] WebSocketMessage request * @property {signalservice.IWebSocketResponseMessage|null} [response] WebSocketMessage response */ /** * Constructs a new WebSocketMessage. * @memberof signalservice * @classdesc Represents a WebSocketMessage. * @implements IWebSocketMessage * @constructor * @param {signalservice.IWebSocketMessage=} [properties] Properties to set */ function WebSocketMessage(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * WebSocketMessage type. * @member {signalservice.WebSocketMessage.Type} type * @memberof signalservice.WebSocketMessage * @instance */ WebSocketMessage.prototype.type = 0; /** * WebSocketMessage request. * @member {signalservice.IWebSocketRequestMessage|null|undefined} request * @memberof signalservice.WebSocketMessage * @instance */ WebSocketMessage.prototype.request = null; /** * WebSocketMessage response. * @member {signalservice.IWebSocketResponseMessage|null|undefined} response * @memberof signalservice.WebSocketMessage * @instance */ WebSocketMessage.prototype.response = null; /** * Encodes the specified WebSocketMessage message. Does not implicitly {@link signalservice.WebSocketMessage.verify|verify} messages. * @function encode * @memberof signalservice.WebSocketMessage * @static * @param {signalservice.IWebSocketMessage} message WebSocketMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ WebSocketMessage.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalservice.WebSocketMessage.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalservice.WebSocketMessage.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.type != null && Object.hasOwnProperty.call(message, "type")) writer.uint32(/* id 1, wireType 0 =*/8).int32(message.type); if (message.request != null && Object.hasOwnProperty.call(message, "request")) $root.signalservice.WebSocketRequestMessage.encode(message.request, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); if (message.response != null && Object.hasOwnProperty.call(message, "response")) $root.signalservice.WebSocketResponseMessage.encode(message.response, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified WebSocketMessage message, length delimited. Does not implicitly {@link signalservice.WebSocketMessage.verify|verify} messages. * @function encodeDelimited * @memberof signalservice.WebSocketMessage * @static * @param {signalservice.IWebSocketMessage} message WebSocketMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ WebSocketMessage.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a WebSocketMessage message from the specified reader or buffer. * @function decode * @memberof signalservice.WebSocketMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalservice.WebSocketMessage} WebSocketMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ WebSocketMessage.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalservice.WebSocketMessage(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.type = reader.int32(); break; } case 2: { message.request = $root.signalservice.WebSocketRequestMessage.decode(reader, reader.uint32()); break; } case 3: { message.response = $root.signalservice.WebSocketResponseMessage.decode(reader, reader.uint32()); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a WebSocketMessage message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalservice.WebSocketMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalservice.WebSocketMessage} WebSocketMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ WebSocketMessage.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * Type enum. * @name signalservice.WebSocketMessage.Type * @enum {number} * @property {number} UNKNOWN=0 UNKNOWN value * @property {number} REQUEST=1 REQUEST value * @property {number} RESPONSE=2 RESPONSE value */ WebSocketMessage.Type = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "UNKNOWN"] = 0; values[valuesById[1] = "REQUEST"] = 1; values[valuesById[2] = "RESPONSE"] = 2; return values; })(); return WebSocketMessage; })(); return signalservice; })(); $root.signalbackups = (function() { /** * Namespace signalbackups. * @exports signalbackups * @namespace */ var signalbackups = {}; signalbackups.BackupInfo = (function() { /** * Properties of a BackupInfo. * @memberof signalbackups * @interface IBackupInfo * @property {Long|null} [version] BackupInfo version * @property {Long|null} [backupTimeMs] BackupInfo backupTimeMs * @property {Uint8Array|null} [mediaRootBackupKey] BackupInfo mediaRootBackupKey * @property {string|null} [currentAppVersion] BackupInfo currentAppVersion * @property {string|null} [firstAppVersion] BackupInfo firstAppVersion * @property {Uint8Array|null} [debugInfo] BackupInfo debugInfo */ /** * Constructs a new BackupInfo. * @memberof signalbackups * @classdesc Represents a BackupInfo. * @implements IBackupInfo * @constructor * @param {signalbackups.IBackupInfo=} [properties] Properties to set */ function BackupInfo(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * BackupInfo version. * @member {Long} version * @memberof signalbackups.BackupInfo * @instance */ BackupInfo.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * BackupInfo backupTimeMs. * @member {Long} backupTimeMs * @memberof signalbackups.BackupInfo * @instance */ BackupInfo.prototype.backupTimeMs = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * BackupInfo mediaRootBackupKey. * @member {Uint8Array} mediaRootBackupKey * @memberof signalbackups.BackupInfo * @instance */ BackupInfo.prototype.mediaRootBackupKey = $util.newBuffer([]); /** * BackupInfo currentAppVersion. * @member {string} currentAppVersion * @memberof signalbackups.BackupInfo * @instance */ BackupInfo.prototype.currentAppVersion = ""; /** * BackupInfo firstAppVersion. * @member {string} firstAppVersion * @memberof signalbackups.BackupInfo * @instance */ BackupInfo.prototype.firstAppVersion = ""; /** * BackupInfo debugInfo. * @member {Uint8Array} debugInfo * @memberof signalbackups.BackupInfo * @instance */ BackupInfo.prototype.debugInfo = $util.newBuffer([]); /** * Encodes the specified BackupInfo message. Does not implicitly {@link signalbackups.BackupInfo.verify|verify} messages. * @function encode * @memberof signalbackups.BackupInfo * @static * @param {signalbackups.IBackupInfo} message BackupInfo message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ BackupInfo.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.BackupInfo.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.BackupInfo.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.version != null && Object.hasOwnProperty.call(message, "version")) writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version); if (message.backupTimeMs != null && Object.hasOwnProperty.call(message, "backupTimeMs")) writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.backupTimeMs); if (message.mediaRootBackupKey != null && Object.hasOwnProperty.call(message, "mediaRootBackupKey")) writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.mediaRootBackupKey); if (message.currentAppVersion != null && Object.hasOwnProperty.call(message, "currentAppVersion")) writer.uint32(/* id 4, wireType 2 =*/34).string(message.currentAppVersion); if (message.firstAppVersion != null && Object.hasOwnProperty.call(message, "firstAppVersion")) writer.uint32(/* id 5, wireType 2 =*/42).string(message.firstAppVersion); if (message.debugInfo != null && Object.hasOwnProperty.call(message, "debugInfo")) writer.uint32(/* id 6, wireType 2 =*/50).bytes(message.debugInfo); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified BackupInfo message, length delimited. Does not implicitly {@link signalbackups.BackupInfo.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.BackupInfo * @static * @param {signalbackups.IBackupInfo} message BackupInfo message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ BackupInfo.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a BackupInfo message from the specified reader or buffer. * @function decode * @memberof signalbackups.BackupInfo * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.BackupInfo} BackupInfo * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ BackupInfo.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.BackupInfo(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.version = reader.uint64(); break; } case 2: { message.backupTimeMs = reader.uint64(); break; } case 3: { message.mediaRootBackupKey = reader.bytes(); break; } case 4: { message.currentAppVersion = reader.string(); break; } case 5: { message.firstAppVersion = reader.string(); break; } case 6: { message.debugInfo = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a BackupInfo message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.BackupInfo * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.BackupInfo} BackupInfo * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ BackupInfo.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return BackupInfo; })(); signalbackups.Frame = (function() { /** * Properties of a Frame. * @memberof signalbackups * @interface IFrame * @property {signalbackups.IAccountData|null} [account] Frame account * @property {signalbackups.IRecipient|null} [recipient] Frame recipient * @property {signalbackups.IChat|null} [chat] Frame chat * @property {signalbackups.IChatItem|null} [chatItem] Frame chatItem * @property {signalbackups.IStickerPack|null} [stickerPack] Frame stickerPack * @property {signalbackups.IAdHocCall|null} [adHocCall] Frame adHocCall * @property {signalbackups.INotificationProfile|null} [notificationProfile] Frame notificationProfile * @property {signalbackups.IChatFolder|null} [chatFolder] Frame chatFolder */ /** * Constructs a new Frame. * @memberof signalbackups * @classdesc Represents a Frame. * @implements IFrame * @constructor * @param {signalbackups.IFrame=} [properties] Properties to set */ function Frame(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Frame account. * @member {signalbackups.IAccountData|null|undefined} account * @memberof signalbackups.Frame * @instance */ Frame.prototype.account = null; /** * Frame recipient. * @member {signalbackups.IRecipient|null|undefined} recipient * @memberof signalbackups.Frame * @instance */ Frame.prototype.recipient = null; /** * Frame chat. * @member {signalbackups.IChat|null|undefined} chat * @memberof signalbackups.Frame * @instance */ Frame.prototype.chat = null; /** * Frame chatItem. * @member {signalbackups.IChatItem|null|undefined} chatItem * @memberof signalbackups.Frame * @instance */ Frame.prototype.chatItem = null; /** * Frame stickerPack. * @member {signalbackups.IStickerPack|null|undefined} stickerPack * @memberof signalbackups.Frame * @instance */ Frame.prototype.stickerPack = null; /** * Frame adHocCall. * @member {signalbackups.IAdHocCall|null|undefined} adHocCall * @memberof signalbackups.Frame * @instance */ Frame.prototype.adHocCall = null; /** * Frame notificationProfile. * @member {signalbackups.INotificationProfile|null|undefined} notificationProfile * @memberof signalbackups.Frame * @instance */ Frame.prototype.notificationProfile = null; /** * Frame chatFolder. * @member {signalbackups.IChatFolder|null|undefined} chatFolder * @memberof signalbackups.Frame * @instance */ Frame.prototype.chatFolder = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * Frame item. * @member {"account"|"recipient"|"chat"|"chatItem"|"stickerPack"|"adHocCall"|"notificationProfile"|"chatFolder"|undefined} item * @memberof signalbackups.Frame * @instance */ Object.defineProperty(Frame.prototype, "item", { get: $util.oneOfGetter($oneOfFields = ["account", "recipient", "chat", "chatItem", "stickerPack", "adHocCall", "notificationProfile", "chatFolder"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified Frame message. Does not implicitly {@link signalbackups.Frame.verify|verify} messages. * @function encode * @memberof signalbackups.Frame * @static * @param {signalbackups.IFrame} message Frame message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Frame.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.Frame.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.Frame.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.account != null && Object.hasOwnProperty.call(message, "account")) $root.signalbackups.AccountData.encode(message.account, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.recipient != null && Object.hasOwnProperty.call(message, "recipient")) $root.signalbackups.Recipient.encode(message.recipient, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); if (message.chat != null && Object.hasOwnProperty.call(message, "chat")) $root.signalbackups.Chat.encode(message.chat, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); if (message.chatItem != null && Object.hasOwnProperty.call(message, "chatItem")) $root.signalbackups.ChatItem.encode(message.chatItem, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); if (message.stickerPack != null && Object.hasOwnProperty.call(message, "stickerPack")) $root.signalbackups.StickerPack.encode(message.stickerPack, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); if (message.adHocCall != null && Object.hasOwnProperty.call(message, "adHocCall")) $root.signalbackups.AdHocCall.encode(message.adHocCall, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim(); if (message.notificationProfile != null && Object.hasOwnProperty.call(message, "notificationProfile")) $root.signalbackups.NotificationProfile.encode(message.notificationProfile, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim(); if (message.chatFolder != null && Object.hasOwnProperty.call(message, "chatFolder")) $root.signalbackups.ChatFolder.encode(message.chatFolder, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Frame message, length delimited. Does not implicitly {@link signalbackups.Frame.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.Frame * @static * @param {signalbackups.IFrame} message Frame message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Frame.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Frame message from the specified reader or buffer. * @function decode * @memberof signalbackups.Frame * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.Frame} Frame * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Frame.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.Frame(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.account = $root.signalbackups.AccountData.decode(reader, reader.uint32()); break; } case 2: { message.recipient = $root.signalbackups.Recipient.decode(reader, reader.uint32()); break; } case 3: { message.chat = $root.signalbackups.Chat.decode(reader, reader.uint32()); break; } case 4: { message.chatItem = $root.signalbackups.ChatItem.decode(reader, reader.uint32()); break; } case 5: { message.stickerPack = $root.signalbackups.StickerPack.decode(reader, reader.uint32()); break; } case 6: { message.adHocCall = $root.signalbackups.AdHocCall.decode(reader, reader.uint32()); break; } case 7: { message.notificationProfile = $root.signalbackups.NotificationProfile.decode(reader, reader.uint32()); break; } case 8: { message.chatFolder = $root.signalbackups.ChatFolder.decode(reader, reader.uint32()); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Frame message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.Frame * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.Frame} Frame * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Frame.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return Frame; })(); signalbackups.AccountData = (function() { /** * Properties of an AccountData. * @memberof signalbackups * @interface IAccountData * @property {Uint8Array|null} [profileKey] AccountData profileKey * @property {string|null} [username] AccountData username * @property {signalbackups.AccountData.IUsernameLink|null} [usernameLink] AccountData usernameLink * @property {string|null} [givenName] AccountData givenName * @property {string|null} [familyName] AccountData familyName * @property {string|null} [avatarUrlPath] AccountData avatarUrlPath * @property {signalbackups.AccountData.ISubscriberData|null} [donationSubscriberData] AccountData donationSubscriberData * @property {signalbackups.AccountData.IAccountSettings|null} [accountSettings] AccountData accountSettings * @property {signalbackups.AccountData.IIAPSubscriberData|null} [backupsSubscriberData] AccountData backupsSubscriberData * @property {string|null} [svrPin] AccountData svrPin * @property {signalbackups.AccountData.IAndroidSpecificSettings|null} [androidSpecificSettings] AccountData androidSpecificSettings * @property {string|null} [bioText] AccountData bioText * @property {string|null} [bioEmoji] AccountData bioEmoji * @property {Uint8Array|null} [keyTransparencyData] AccountData keyTransparencyData */ /** * Constructs a new AccountData. * @memberof signalbackups * @classdesc Represents an AccountData. * @implements IAccountData * @constructor * @param {signalbackups.IAccountData=} [properties] Properties to set */ function AccountData(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * AccountData profileKey. * @member {Uint8Array} profileKey * @memberof signalbackups.AccountData * @instance */ AccountData.prototype.profileKey = $util.newBuffer([]); /** * AccountData username. * @member {string|null|undefined} username * @memberof signalbackups.AccountData * @instance */ AccountData.prototype.username = null; /** * AccountData usernameLink. * @member {signalbackups.AccountData.IUsernameLink|null|undefined} usernameLink * @memberof signalbackups.AccountData * @instance */ AccountData.prototype.usernameLink = null; /** * AccountData givenName. * @member {string} givenName * @memberof signalbackups.AccountData * @instance */ AccountData.prototype.givenName = ""; /** * AccountData familyName. * @member {string} familyName * @memberof signalbackups.AccountData * @instance */ AccountData.prototype.familyName = ""; /** * AccountData avatarUrlPath. * @member {string} avatarUrlPath * @memberof signalbackups.AccountData * @instance */ AccountData.prototype.avatarUrlPath = ""; /** * AccountData donationSubscriberData. * @member {signalbackups.AccountData.ISubscriberData|null|undefined} donationSubscriberData * @memberof signalbackups.AccountData * @instance */ AccountData.prototype.donationSubscriberData = null; /** * AccountData accountSettings. * @member {signalbackups.AccountData.IAccountSettings|null|undefined} accountSettings * @memberof signalbackups.AccountData * @instance */ AccountData.prototype.accountSettings = null; /** * AccountData backupsSubscriberData. * @member {signalbackups.AccountData.IIAPSubscriberData|null|undefined} backupsSubscriberData * @memberof signalbackups.AccountData * @instance */ AccountData.prototype.backupsSubscriberData = null; /** * AccountData svrPin. * @member {string} svrPin * @memberof signalbackups.AccountData * @instance */ AccountData.prototype.svrPin = ""; /** * AccountData androidSpecificSettings. * @member {signalbackups.AccountData.IAndroidSpecificSettings|null|undefined} androidSpecificSettings * @memberof signalbackups.AccountData * @instance */ AccountData.prototype.androidSpecificSettings = null; /** * AccountData bioText. * @member {string} bioText * @memberof signalbackups.AccountData * @instance */ AccountData.prototype.bioText = ""; /** * AccountData bioEmoji. * @member {string} bioEmoji * @memberof signalbackups.AccountData * @instance */ AccountData.prototype.bioEmoji = ""; /** * AccountData keyTransparencyData. * @member {Uint8Array|null|undefined} keyTransparencyData * @memberof signalbackups.AccountData * @instance */ AccountData.prototype.keyTransparencyData = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * AccountData _username. * @member {"username"|undefined} _username * @memberof signalbackups.AccountData * @instance */ Object.defineProperty(AccountData.prototype, "_username", { get: $util.oneOfGetter($oneOfFields = ["username"]), set: $util.oneOfSetter($oneOfFields) }); /** * AccountData _keyTransparencyData. * @member {"keyTransparencyData"|undefined} _keyTransparencyData * @memberof signalbackups.AccountData * @instance */ Object.defineProperty(AccountData.prototype, "_keyTransparencyData", { get: $util.oneOfGetter($oneOfFields = ["keyTransparencyData"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified AccountData message. Does not implicitly {@link signalbackups.AccountData.verify|verify} messages. * @function encode * @memberof signalbackups.AccountData * @static * @param {signalbackups.IAccountData} message AccountData message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ AccountData.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.AccountData.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.AccountData.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.profileKey != null && Object.hasOwnProperty.call(message, "profileKey")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.profileKey); if (message.username != null && Object.hasOwnProperty.call(message, "username")) writer.uint32(/* id 2, wireType 2 =*/18).string(message.username); if (message.usernameLink != null && Object.hasOwnProperty.call(message, "usernameLink")) $root.signalbackups.AccountData.UsernameLink.encode(message.usernameLink, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); if (message.givenName != null && Object.hasOwnProperty.call(message, "givenName")) writer.uint32(/* id 4, wireType 2 =*/34).string(message.givenName); if (message.familyName != null && Object.hasOwnProperty.call(message, "familyName")) writer.uint32(/* id 5, wireType 2 =*/42).string(message.familyName); if (message.avatarUrlPath != null && Object.hasOwnProperty.call(message, "avatarUrlPath")) writer.uint32(/* id 6, wireType 2 =*/50).string(message.avatarUrlPath); if (message.donationSubscriberData != null && Object.hasOwnProperty.call(message, "donationSubscriberData")) $root.signalbackups.AccountData.SubscriberData.encode(message.donationSubscriberData, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim(); if (message.accountSettings != null && Object.hasOwnProperty.call(message, "accountSettings")) $root.signalbackups.AccountData.AccountSettings.encode(message.accountSettings, writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim(); if (message.backupsSubscriberData != null && Object.hasOwnProperty.call(message, "backupsSubscriberData")) $root.signalbackups.AccountData.IAPSubscriberData.encode(message.backupsSubscriberData, writer.uint32(/* id 10, wireType 2 =*/82).fork()).ldelim(); if (message.svrPin != null && Object.hasOwnProperty.call(message, "svrPin")) writer.uint32(/* id 11, wireType 2 =*/90).string(message.svrPin); if (message.androidSpecificSettings != null && Object.hasOwnProperty.call(message, "androidSpecificSettings")) $root.signalbackups.AccountData.AndroidSpecificSettings.encode(message.androidSpecificSettings, writer.uint32(/* id 12, wireType 2 =*/98).fork()).ldelim(); if (message.bioText != null && Object.hasOwnProperty.call(message, "bioText")) writer.uint32(/* id 13, wireType 2 =*/106).string(message.bioText); if (message.bioEmoji != null && Object.hasOwnProperty.call(message, "bioEmoji")) writer.uint32(/* id 14, wireType 2 =*/114).string(message.bioEmoji); if (message.keyTransparencyData != null && Object.hasOwnProperty.call(message, "keyTransparencyData")) writer.uint32(/* id 15, wireType 2 =*/122).bytes(message.keyTransparencyData); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified AccountData message, length delimited. Does not implicitly {@link signalbackups.AccountData.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.AccountData * @static * @param {signalbackups.IAccountData} message AccountData message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ AccountData.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an AccountData message from the specified reader or buffer. * @function decode * @memberof signalbackups.AccountData * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.AccountData} AccountData * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ AccountData.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.AccountData(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.profileKey = reader.bytes(); break; } case 2: { message.username = reader.string(); break; } case 3: { message.usernameLink = $root.signalbackups.AccountData.UsernameLink.decode(reader, reader.uint32()); break; } case 4: { message.givenName = reader.string(); break; } case 5: { message.familyName = reader.string(); break; } case 6: { message.avatarUrlPath = reader.string(); break; } case 7: { message.donationSubscriberData = $root.signalbackups.AccountData.SubscriberData.decode(reader, reader.uint32()); break; } case 9: { message.accountSettings = $root.signalbackups.AccountData.AccountSettings.decode(reader, reader.uint32()); break; } case 10: { message.backupsSubscriberData = $root.signalbackups.AccountData.IAPSubscriberData.decode(reader, reader.uint32()); break; } case 11: { message.svrPin = reader.string(); break; } case 12: { message.androidSpecificSettings = $root.signalbackups.AccountData.AndroidSpecificSettings.decode(reader, reader.uint32()); break; } case 13: { message.bioText = reader.string(); break; } case 14: { message.bioEmoji = reader.string(); break; } case 15: { message.keyTransparencyData = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an AccountData message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.AccountData * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.AccountData} AccountData * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ AccountData.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * PhoneNumberSharingMode enum. * @name signalbackups.AccountData.PhoneNumberSharingMode * @enum {number} * @property {number} UNKNOWN=0 UNKNOWN value * @property {number} EVERYBODY=1 EVERYBODY value * @property {number} NOBODY=2 NOBODY value */ AccountData.PhoneNumberSharingMode = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "UNKNOWN"] = 0; values[valuesById[1] = "EVERYBODY"] = 1; values[valuesById[2] = "NOBODY"] = 2; return values; })(); AccountData.UsernameLink = (function() { /** * Properties of a UsernameLink. * @memberof signalbackups.AccountData * @interface IUsernameLink * @property {Uint8Array|null} [entropy] UsernameLink entropy * @property {Uint8Array|null} [serverId] UsernameLink serverId * @property {signalbackups.AccountData.UsernameLink.Color|null} [color] UsernameLink color */ /** * Constructs a new UsernameLink. * @memberof signalbackups.AccountData * @classdesc Represents a UsernameLink. * @implements IUsernameLink * @constructor * @param {signalbackups.AccountData.IUsernameLink=} [properties] Properties to set */ function UsernameLink(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * UsernameLink entropy. * @member {Uint8Array} entropy * @memberof signalbackups.AccountData.UsernameLink * @instance */ UsernameLink.prototype.entropy = $util.newBuffer([]); /** * UsernameLink serverId. * @member {Uint8Array} serverId * @memberof signalbackups.AccountData.UsernameLink * @instance */ UsernameLink.prototype.serverId = $util.newBuffer([]); /** * UsernameLink color. * @member {signalbackups.AccountData.UsernameLink.Color} color * @memberof signalbackups.AccountData.UsernameLink * @instance */ UsernameLink.prototype.color = 0; /** * Encodes the specified UsernameLink message. Does not implicitly {@link signalbackups.AccountData.UsernameLink.verify|verify} messages. * @function encode * @memberof signalbackups.AccountData.UsernameLink * @static * @param {signalbackups.AccountData.IUsernameLink} message UsernameLink message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ UsernameLink.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.AccountData.UsernameLink.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.AccountData.UsernameLink.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.entropy != null && Object.hasOwnProperty.call(message, "entropy")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.entropy); if (message.serverId != null && Object.hasOwnProperty.call(message, "serverId")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.serverId); if (message.color != null && Object.hasOwnProperty.call(message, "color")) writer.uint32(/* id 3, wireType 0 =*/24).int32(message.color); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified UsernameLink message, length delimited. Does not implicitly {@link signalbackups.AccountData.UsernameLink.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.AccountData.UsernameLink * @static * @param {signalbackups.AccountData.IUsernameLink} message UsernameLink message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ UsernameLink.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a UsernameLink message from the specified reader or buffer. * @function decode * @memberof signalbackups.AccountData.UsernameLink * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.AccountData.UsernameLink} UsernameLink * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ UsernameLink.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.AccountData.UsernameLink(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.entropy = reader.bytes(); break; } case 2: { message.serverId = reader.bytes(); break; } case 3: { message.color = reader.int32(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a UsernameLink message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.AccountData.UsernameLink * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.AccountData.UsernameLink} UsernameLink * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ UsernameLink.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * Color enum. * @name signalbackups.AccountData.UsernameLink.Color * @enum {number} * @property {number} UNKNOWN=0 UNKNOWN value * @property {number} BLUE=1 BLUE value * @property {number} WHITE=2 WHITE value * @property {number} GREY=3 GREY value * @property {number} OLIVE=4 OLIVE value * @property {number} GREEN=5 GREEN value * @property {number} ORANGE=6 ORANGE value * @property {number} PINK=7 PINK value * @property {number} PURPLE=8 PURPLE value */ UsernameLink.Color = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "UNKNOWN"] = 0; values[valuesById[1] = "BLUE"] = 1; values[valuesById[2] = "WHITE"] = 2; values[valuesById[3] = "GREY"] = 3; values[valuesById[4] = "OLIVE"] = 4; values[valuesById[5] = "GREEN"] = 5; values[valuesById[6] = "ORANGE"] = 6; values[valuesById[7] = "PINK"] = 7; values[valuesById[8] = "PURPLE"] = 8; return values; })(); return UsernameLink; })(); /** * SentMediaQuality enum. * @name signalbackups.AccountData.SentMediaQuality * @enum {number} * @property {number} UNKNOWN_QUALITY=0 UNKNOWN_QUALITY value * @property {number} STANDARD=1 STANDARD value * @property {number} HIGH=2 HIGH value */ AccountData.SentMediaQuality = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "UNKNOWN_QUALITY"] = 0; values[valuesById[1] = "STANDARD"] = 1; values[valuesById[2] = "HIGH"] = 2; return values; })(); AccountData.AutoDownloadSettings = (function() { /** * Properties of an AutoDownloadSettings. * @memberof signalbackups.AccountData * @interface IAutoDownloadSettings * @property {signalbackups.AccountData.AutoDownloadSettings.AutoDownloadOption|null} [images] AutoDownloadSettings images * @property {signalbackups.AccountData.AutoDownloadSettings.AutoDownloadOption|null} [audio] AutoDownloadSettings audio * @property {signalbackups.AccountData.AutoDownloadSettings.AutoDownloadOption|null} [video] AutoDownloadSettings video * @property {signalbackups.AccountData.AutoDownloadSettings.AutoDownloadOption|null} [documents] AutoDownloadSettings documents */ /** * Constructs a new AutoDownloadSettings. * @memberof signalbackups.AccountData * @classdesc Represents an AutoDownloadSettings. * @implements IAutoDownloadSettings * @constructor * @param {signalbackups.AccountData.IAutoDownloadSettings=} [properties] Properties to set */ function AutoDownloadSettings(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * AutoDownloadSettings images. * @member {signalbackups.AccountData.AutoDownloadSettings.AutoDownloadOption} images * @memberof signalbackups.AccountData.AutoDownloadSettings * @instance */ AutoDownloadSettings.prototype.images = 0; /** * AutoDownloadSettings audio. * @member {signalbackups.AccountData.AutoDownloadSettings.AutoDownloadOption} audio * @memberof signalbackups.AccountData.AutoDownloadSettings * @instance */ AutoDownloadSettings.prototype.audio = 0; /** * AutoDownloadSettings video. * @member {signalbackups.AccountData.AutoDownloadSettings.AutoDownloadOption} video * @memberof signalbackups.AccountData.AutoDownloadSettings * @instance */ AutoDownloadSettings.prototype.video = 0; /** * AutoDownloadSettings documents. * @member {signalbackups.AccountData.AutoDownloadSettings.AutoDownloadOption} documents * @memberof signalbackups.AccountData.AutoDownloadSettings * @instance */ AutoDownloadSettings.prototype.documents = 0; /** * Encodes the specified AutoDownloadSettings message. Does not implicitly {@link signalbackups.AccountData.AutoDownloadSettings.verify|verify} messages. * @function encode * @memberof signalbackups.AccountData.AutoDownloadSettings * @static * @param {signalbackups.AccountData.IAutoDownloadSettings} message AutoDownloadSettings message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ AutoDownloadSettings.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.AccountData.AutoDownloadSettings.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.AccountData.AutoDownloadSettings.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.images != null && Object.hasOwnProperty.call(message, "images")) writer.uint32(/* id 1, wireType 0 =*/8).int32(message.images); if (message.audio != null && Object.hasOwnProperty.call(message, "audio")) writer.uint32(/* id 2, wireType 0 =*/16).int32(message.audio); if (message.video != null && Object.hasOwnProperty.call(message, "video")) writer.uint32(/* id 3, wireType 0 =*/24).int32(message.video); if (message.documents != null && Object.hasOwnProperty.call(message, "documents")) writer.uint32(/* id 4, wireType 0 =*/32).int32(message.documents); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified AutoDownloadSettings message, length delimited. Does not implicitly {@link signalbackups.AccountData.AutoDownloadSettings.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.AccountData.AutoDownloadSettings * @static * @param {signalbackups.AccountData.IAutoDownloadSettings} message AutoDownloadSettings message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ AutoDownloadSettings.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an AutoDownloadSettings message from the specified reader or buffer. * @function decode * @memberof signalbackups.AccountData.AutoDownloadSettings * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.AccountData.AutoDownloadSettings} AutoDownloadSettings * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ AutoDownloadSettings.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.AccountData.AutoDownloadSettings(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.images = reader.int32(); break; } case 2: { message.audio = reader.int32(); break; } case 3: { message.video = reader.int32(); break; } case 4: { message.documents = reader.int32(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an AutoDownloadSettings message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.AccountData.AutoDownloadSettings * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.AccountData.AutoDownloadSettings} AutoDownloadSettings * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ AutoDownloadSettings.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * AutoDownloadOption enum. * @name signalbackups.AccountData.AutoDownloadSettings.AutoDownloadOption * @enum {number} * @property {number} UNKNOWN=0 UNKNOWN value * @property {number} NEVER=1 NEVER value * @property {number} WIFI=2 WIFI value * @property {number} WIFI_AND_CELLULAR=3 WIFI_AND_CELLULAR value */ AutoDownloadSettings.AutoDownloadOption = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "UNKNOWN"] = 0; values[valuesById[1] = "NEVER"] = 1; values[valuesById[2] = "WIFI"] = 2; values[valuesById[3] = "WIFI_AND_CELLULAR"] = 3; return values; })(); return AutoDownloadSettings; })(); /** * AppTheme enum. * @name signalbackups.AccountData.AppTheme * @enum {number} * @property {number} UNKNOWN_APP_THEME=0 UNKNOWN_APP_THEME value * @property {number} SYSTEM=1 SYSTEM value * @property {number} LIGHT=2 LIGHT value * @property {number} DARK=3 DARK value */ AccountData.AppTheme = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "UNKNOWN_APP_THEME"] = 0; values[valuesById[1] = "SYSTEM"] = 1; values[valuesById[2] = "LIGHT"] = 2; values[valuesById[3] = "DARK"] = 3; return values; })(); /** * CallsUseLessDataSetting enum. * @name signalbackups.AccountData.CallsUseLessDataSetting * @enum {number} * @property {number} UNKNOWN_CALL_DATA_SETTING=0 UNKNOWN_CALL_DATA_SETTING value * @property {number} NEVER=1 NEVER value * @property {number} MOBILE_DATA_ONLY=2 MOBILE_DATA_ONLY value * @property {number} WIFI_AND_MOBILE_DATA=3 WIFI_AND_MOBILE_DATA value */ AccountData.CallsUseLessDataSetting = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "UNKNOWN_CALL_DATA_SETTING"] = 0; values[valuesById[1] = "NEVER"] = 1; values[valuesById[2] = "MOBILE_DATA_ONLY"] = 2; values[valuesById[3] = "WIFI_AND_MOBILE_DATA"] = 3; return values; })(); AccountData.AccountSettings = (function() { /** * Properties of an AccountSettings. * @memberof signalbackups.AccountData * @interface IAccountSettings * @property {boolean|null} [readReceipts] AccountSettings readReceipts * @property {boolean|null} [sealedSenderIndicators] AccountSettings sealedSenderIndicators * @property {boolean|null} [typingIndicators] AccountSettings typingIndicators * @property {boolean|null} [linkPreviews] AccountSettings linkPreviews * @property {boolean|null} [notDiscoverableByPhoneNumber] AccountSettings notDiscoverableByPhoneNumber * @property {boolean|null} [preferContactAvatars] AccountSettings preferContactAvatars * @property {number|null} [universalExpireTimerSeconds] AccountSettings universalExpireTimerSeconds * @property {Array.|null} [preferredReactionEmoji] AccountSettings preferredReactionEmoji * @property {boolean|null} [displayBadgesOnProfile] AccountSettings displayBadgesOnProfile * @property {boolean|null} [keepMutedChatsArchived] AccountSettings keepMutedChatsArchived * @property {boolean|null} [hasSetMyStoriesPrivacy] AccountSettings hasSetMyStoriesPrivacy * @property {boolean|null} [hasViewedOnboardingStory] AccountSettings hasViewedOnboardingStory * @property {boolean|null} [storiesDisabled] AccountSettings storiesDisabled * @property {boolean|null} [storyViewReceiptsEnabled] AccountSettings storyViewReceiptsEnabled * @property {boolean|null} [hasSeenGroupStoryEducationSheet] AccountSettings hasSeenGroupStoryEducationSheet * @property {boolean|null} [hasCompletedUsernameOnboarding] AccountSettings hasCompletedUsernameOnboarding * @property {signalbackups.AccountData.PhoneNumberSharingMode|null} [phoneNumberSharingMode] AccountSettings phoneNumberSharingMode * @property {signalbackups.IChatStyle|null} [defaultChatStyle] AccountSettings defaultChatStyle * @property {Array.|null} [customChatColors] AccountSettings customChatColors * @property {boolean|null} [optimizeOnDeviceStorage] AccountSettings optimizeOnDeviceStorage * @property {Long|null} [backupTier] AccountSettings backupTier * @property {signalbackups.AccountData.SentMediaQuality|null} [defaultSentMediaQuality] AccountSettings defaultSentMediaQuality * @property {signalbackups.AccountData.IAutoDownloadSettings|null} [autoDownloadSettings] AccountSettings autoDownloadSettings * @property {number|null} [screenLockTimeoutMinutes] AccountSettings screenLockTimeoutMinutes * @property {boolean|null} [pinReminders] AccountSettings pinReminders * @property {signalbackups.AccountData.AppTheme|null} [appTheme] AccountSettings appTheme * @property {signalbackups.AccountData.CallsUseLessDataSetting|null} [callsUseLessDataSetting] AccountSettings callsUseLessDataSetting * @property {boolean|null} [allowSealedSenderFromAnyone] AccountSettings allowSealedSenderFromAnyone * @property {boolean|null} [allowAutomaticKeyVerification] AccountSettings allowAutomaticKeyVerification */ /** * Constructs a new AccountSettings. * @memberof signalbackups.AccountData * @classdesc Represents an AccountSettings. * @implements IAccountSettings * @constructor * @param {signalbackups.AccountData.IAccountSettings=} [properties] Properties to set */ function AccountSettings(properties) { this.preferredReactionEmoji = []; this.customChatColors = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * AccountSettings readReceipts. * @member {boolean} readReceipts * @memberof signalbackups.AccountData.AccountSettings * @instance */ AccountSettings.prototype.readReceipts = false; /** * AccountSettings sealedSenderIndicators. * @member {boolean} sealedSenderIndicators * @memberof signalbackups.AccountData.AccountSettings * @instance */ AccountSettings.prototype.sealedSenderIndicators = false; /** * AccountSettings typingIndicators. * @member {boolean} typingIndicators * @memberof signalbackups.AccountData.AccountSettings * @instance */ AccountSettings.prototype.typingIndicators = false; /** * AccountSettings linkPreviews. * @member {boolean} linkPreviews * @memberof signalbackups.AccountData.AccountSettings * @instance */ AccountSettings.prototype.linkPreviews = false; /** * AccountSettings notDiscoverableByPhoneNumber. * @member {boolean} notDiscoverableByPhoneNumber * @memberof signalbackups.AccountData.AccountSettings * @instance */ AccountSettings.prototype.notDiscoverableByPhoneNumber = false; /** * AccountSettings preferContactAvatars. * @member {boolean} preferContactAvatars * @memberof signalbackups.AccountData.AccountSettings * @instance */ AccountSettings.prototype.preferContactAvatars = false; /** * AccountSettings universalExpireTimerSeconds. * @member {number} universalExpireTimerSeconds * @memberof signalbackups.AccountData.AccountSettings * @instance */ AccountSettings.prototype.universalExpireTimerSeconds = 0; /** * AccountSettings preferredReactionEmoji. * @member {Array.} preferredReactionEmoji * @memberof signalbackups.AccountData.AccountSettings * @instance */ AccountSettings.prototype.preferredReactionEmoji = $util.emptyArray; /** * AccountSettings displayBadgesOnProfile. * @member {boolean} displayBadgesOnProfile * @memberof signalbackups.AccountData.AccountSettings * @instance */ AccountSettings.prototype.displayBadgesOnProfile = false; /** * AccountSettings keepMutedChatsArchived. * @member {boolean} keepMutedChatsArchived * @memberof signalbackups.AccountData.AccountSettings * @instance */ AccountSettings.prototype.keepMutedChatsArchived = false; /** * AccountSettings hasSetMyStoriesPrivacy. * @member {boolean} hasSetMyStoriesPrivacy * @memberof signalbackups.AccountData.AccountSettings * @instance */ AccountSettings.prototype.hasSetMyStoriesPrivacy = false; /** * AccountSettings hasViewedOnboardingStory. * @member {boolean} hasViewedOnboardingStory * @memberof signalbackups.AccountData.AccountSettings * @instance */ AccountSettings.prototype.hasViewedOnboardingStory = false; /** * AccountSettings storiesDisabled. * @member {boolean} storiesDisabled * @memberof signalbackups.AccountData.AccountSettings * @instance */ AccountSettings.prototype.storiesDisabled = false; /** * AccountSettings storyViewReceiptsEnabled. * @member {boolean|null|undefined} storyViewReceiptsEnabled * @memberof signalbackups.AccountData.AccountSettings * @instance */ AccountSettings.prototype.storyViewReceiptsEnabled = null; /** * AccountSettings hasSeenGroupStoryEducationSheet. * @member {boolean} hasSeenGroupStoryEducationSheet * @memberof signalbackups.AccountData.AccountSettings * @instance */ AccountSettings.prototype.hasSeenGroupStoryEducationSheet = false; /** * AccountSettings hasCompletedUsernameOnboarding. * @member {boolean} hasCompletedUsernameOnboarding * @memberof signalbackups.AccountData.AccountSettings * @instance */ AccountSettings.prototype.hasCompletedUsernameOnboarding = false; /** * AccountSettings phoneNumberSharingMode. * @member {signalbackups.AccountData.PhoneNumberSharingMode} phoneNumberSharingMode * @memberof signalbackups.AccountData.AccountSettings * @instance */ AccountSettings.prototype.phoneNumberSharingMode = 0; /** * AccountSettings defaultChatStyle. * @member {signalbackups.IChatStyle|null|undefined} defaultChatStyle * @memberof signalbackups.AccountData.AccountSettings * @instance */ AccountSettings.prototype.defaultChatStyle = null; /** * AccountSettings customChatColors. * @member {Array.} customChatColors * @memberof signalbackups.AccountData.AccountSettings * @instance */ AccountSettings.prototype.customChatColors = $util.emptyArray; /** * AccountSettings optimizeOnDeviceStorage. * @member {boolean} optimizeOnDeviceStorage * @memberof signalbackups.AccountData.AccountSettings * @instance */ AccountSettings.prototype.optimizeOnDeviceStorage = false; /** * AccountSettings backupTier. * @member {Long|null|undefined} backupTier * @memberof signalbackups.AccountData.AccountSettings * @instance */ AccountSettings.prototype.backupTier = null; /** * AccountSettings defaultSentMediaQuality. * @member {signalbackups.AccountData.SentMediaQuality} defaultSentMediaQuality * @memberof signalbackups.AccountData.AccountSettings * @instance */ AccountSettings.prototype.defaultSentMediaQuality = 0; /** * AccountSettings autoDownloadSettings. * @member {signalbackups.AccountData.IAutoDownloadSettings|null|undefined} autoDownloadSettings * @memberof signalbackups.AccountData.AccountSettings * @instance */ AccountSettings.prototype.autoDownloadSettings = null; /** * AccountSettings screenLockTimeoutMinutes. * @member {number|null|undefined} screenLockTimeoutMinutes * @memberof signalbackups.AccountData.AccountSettings * @instance */ AccountSettings.prototype.screenLockTimeoutMinutes = null; /** * AccountSettings pinReminders. * @member {boolean|null|undefined} pinReminders * @memberof signalbackups.AccountData.AccountSettings * @instance */ AccountSettings.prototype.pinReminders = null; /** * AccountSettings appTheme. * @member {signalbackups.AccountData.AppTheme} appTheme * @memberof signalbackups.AccountData.AccountSettings * @instance */ AccountSettings.prototype.appTheme = 0; /** * AccountSettings callsUseLessDataSetting. * @member {signalbackups.AccountData.CallsUseLessDataSetting} callsUseLessDataSetting * @memberof signalbackups.AccountData.AccountSettings * @instance */ AccountSettings.prototype.callsUseLessDataSetting = 0; /** * AccountSettings allowSealedSenderFromAnyone. * @member {boolean} allowSealedSenderFromAnyone * @memberof signalbackups.AccountData.AccountSettings * @instance */ AccountSettings.prototype.allowSealedSenderFromAnyone = false; /** * AccountSettings allowAutomaticKeyVerification. * @member {boolean} allowAutomaticKeyVerification * @memberof signalbackups.AccountData.AccountSettings * @instance */ AccountSettings.prototype.allowAutomaticKeyVerification = false; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * AccountSettings _storyViewReceiptsEnabled. * @member {"storyViewReceiptsEnabled"|undefined} _storyViewReceiptsEnabled * @memberof signalbackups.AccountData.AccountSettings * @instance */ Object.defineProperty(AccountSettings.prototype, "_storyViewReceiptsEnabled", { get: $util.oneOfGetter($oneOfFields = ["storyViewReceiptsEnabled"]), set: $util.oneOfSetter($oneOfFields) }); /** * AccountSettings _backupTier. * @member {"backupTier"|undefined} _backupTier * @memberof signalbackups.AccountData.AccountSettings * @instance */ Object.defineProperty(AccountSettings.prototype, "_backupTier", { get: $util.oneOfGetter($oneOfFields = ["backupTier"]), set: $util.oneOfSetter($oneOfFields) }); /** * AccountSettings _screenLockTimeoutMinutes. * @member {"screenLockTimeoutMinutes"|undefined} _screenLockTimeoutMinutes * @memberof signalbackups.AccountData.AccountSettings * @instance */ Object.defineProperty(AccountSettings.prototype, "_screenLockTimeoutMinutes", { get: $util.oneOfGetter($oneOfFields = ["screenLockTimeoutMinutes"]), set: $util.oneOfSetter($oneOfFields) }); /** * AccountSettings _pinReminders. * @member {"pinReminders"|undefined} _pinReminders * @memberof signalbackups.AccountData.AccountSettings * @instance */ Object.defineProperty(AccountSettings.prototype, "_pinReminders", { get: $util.oneOfGetter($oneOfFields = ["pinReminders"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified AccountSettings message. Does not implicitly {@link signalbackups.AccountData.AccountSettings.verify|verify} messages. * @function encode * @memberof signalbackups.AccountData.AccountSettings * @static * @param {signalbackups.AccountData.IAccountSettings} message AccountSettings message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ AccountSettings.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.AccountData.AccountSettings.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.AccountData.AccountSettings.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.readReceipts != null && Object.hasOwnProperty.call(message, "readReceipts")) writer.uint32(/* id 1, wireType 0 =*/8).bool(message.readReceipts); if (message.sealedSenderIndicators != null && Object.hasOwnProperty.call(message, "sealedSenderIndicators")) writer.uint32(/* id 2, wireType 0 =*/16).bool(message.sealedSenderIndicators); if (message.typingIndicators != null && Object.hasOwnProperty.call(message, "typingIndicators")) writer.uint32(/* id 3, wireType 0 =*/24).bool(message.typingIndicators); if (message.linkPreviews != null && Object.hasOwnProperty.call(message, "linkPreviews")) writer.uint32(/* id 4, wireType 0 =*/32).bool(message.linkPreviews); if (message.notDiscoverableByPhoneNumber != null && Object.hasOwnProperty.call(message, "notDiscoverableByPhoneNumber")) writer.uint32(/* id 5, wireType 0 =*/40).bool(message.notDiscoverableByPhoneNumber); if (message.preferContactAvatars != null && Object.hasOwnProperty.call(message, "preferContactAvatars")) writer.uint32(/* id 6, wireType 0 =*/48).bool(message.preferContactAvatars); if (message.universalExpireTimerSeconds != null && Object.hasOwnProperty.call(message, "universalExpireTimerSeconds")) writer.uint32(/* id 7, wireType 0 =*/56).uint32(message.universalExpireTimerSeconds); if (message.preferredReactionEmoji != null && message.preferredReactionEmoji.length) for (var i = 0; i < message.preferredReactionEmoji.length; ++i) writer.uint32(/* id 8, wireType 2 =*/66).string(message.preferredReactionEmoji[i]); if (message.displayBadgesOnProfile != null && Object.hasOwnProperty.call(message, "displayBadgesOnProfile")) writer.uint32(/* id 9, wireType 0 =*/72).bool(message.displayBadgesOnProfile); if (message.keepMutedChatsArchived != null && Object.hasOwnProperty.call(message, "keepMutedChatsArchived")) writer.uint32(/* id 10, wireType 0 =*/80).bool(message.keepMutedChatsArchived); if (message.hasSetMyStoriesPrivacy != null && Object.hasOwnProperty.call(message, "hasSetMyStoriesPrivacy")) writer.uint32(/* id 11, wireType 0 =*/88).bool(message.hasSetMyStoriesPrivacy); if (message.hasViewedOnboardingStory != null && Object.hasOwnProperty.call(message, "hasViewedOnboardingStory")) writer.uint32(/* id 12, wireType 0 =*/96).bool(message.hasViewedOnboardingStory); if (message.storiesDisabled != null && Object.hasOwnProperty.call(message, "storiesDisabled")) writer.uint32(/* id 13, wireType 0 =*/104).bool(message.storiesDisabled); if (message.storyViewReceiptsEnabled != null && Object.hasOwnProperty.call(message, "storyViewReceiptsEnabled")) writer.uint32(/* id 14, wireType 0 =*/112).bool(message.storyViewReceiptsEnabled); if (message.hasSeenGroupStoryEducationSheet != null && Object.hasOwnProperty.call(message, "hasSeenGroupStoryEducationSheet")) writer.uint32(/* id 15, wireType 0 =*/120).bool(message.hasSeenGroupStoryEducationSheet); if (message.hasCompletedUsernameOnboarding != null && Object.hasOwnProperty.call(message, "hasCompletedUsernameOnboarding")) writer.uint32(/* id 16, wireType 0 =*/128).bool(message.hasCompletedUsernameOnboarding); if (message.phoneNumberSharingMode != null && Object.hasOwnProperty.call(message, "phoneNumberSharingMode")) writer.uint32(/* id 17, wireType 0 =*/136).int32(message.phoneNumberSharingMode); if (message.defaultChatStyle != null && Object.hasOwnProperty.call(message, "defaultChatStyle")) $root.signalbackups.ChatStyle.encode(message.defaultChatStyle, writer.uint32(/* id 18, wireType 2 =*/146).fork()).ldelim(); if (message.customChatColors != null && message.customChatColors.length) for (var i = 0; i < message.customChatColors.length; ++i) $root.signalbackups.ChatStyle.CustomChatColor.encode(message.customChatColors[i], writer.uint32(/* id 19, wireType 2 =*/154).fork()).ldelim(); if (message.optimizeOnDeviceStorage != null && Object.hasOwnProperty.call(message, "optimizeOnDeviceStorage")) writer.uint32(/* id 20, wireType 0 =*/160).bool(message.optimizeOnDeviceStorage); if (message.backupTier != null && Object.hasOwnProperty.call(message, "backupTier")) writer.uint32(/* id 21, wireType 0 =*/168).uint64(message.backupTier); if (message.defaultSentMediaQuality != null && Object.hasOwnProperty.call(message, "defaultSentMediaQuality")) writer.uint32(/* id 23, wireType 0 =*/184).int32(message.defaultSentMediaQuality); if (message.autoDownloadSettings != null && Object.hasOwnProperty.call(message, "autoDownloadSettings")) $root.signalbackups.AccountData.AutoDownloadSettings.encode(message.autoDownloadSettings, writer.uint32(/* id 24, wireType 2 =*/194).fork()).ldelim(); if (message.screenLockTimeoutMinutes != null && Object.hasOwnProperty.call(message, "screenLockTimeoutMinutes")) writer.uint32(/* id 26, wireType 0 =*/208).uint32(message.screenLockTimeoutMinutes); if (message.pinReminders != null && Object.hasOwnProperty.call(message, "pinReminders")) writer.uint32(/* id 27, wireType 0 =*/216).bool(message.pinReminders); if (message.appTheme != null && Object.hasOwnProperty.call(message, "appTheme")) writer.uint32(/* id 28, wireType 0 =*/224).int32(message.appTheme); if (message.callsUseLessDataSetting != null && Object.hasOwnProperty.call(message, "callsUseLessDataSetting")) writer.uint32(/* id 29, wireType 0 =*/232).int32(message.callsUseLessDataSetting); if (message.allowSealedSenderFromAnyone != null && Object.hasOwnProperty.call(message, "allowSealedSenderFromAnyone")) writer.uint32(/* id 30, wireType 0 =*/240).bool(message.allowSealedSenderFromAnyone); if (message.allowAutomaticKeyVerification != null && Object.hasOwnProperty.call(message, "allowAutomaticKeyVerification")) writer.uint32(/* id 31, wireType 0 =*/248).bool(message.allowAutomaticKeyVerification); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified AccountSettings message, length delimited. Does not implicitly {@link signalbackups.AccountData.AccountSettings.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.AccountData.AccountSettings * @static * @param {signalbackups.AccountData.IAccountSettings} message AccountSettings message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ AccountSettings.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an AccountSettings message from the specified reader or buffer. * @function decode * @memberof signalbackups.AccountData.AccountSettings * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.AccountData.AccountSettings} AccountSettings * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ AccountSettings.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.AccountData.AccountSettings(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.readReceipts = reader.bool(); break; } case 2: { message.sealedSenderIndicators = reader.bool(); break; } case 3: { message.typingIndicators = reader.bool(); break; } case 4: { message.linkPreviews = reader.bool(); break; } case 5: { message.notDiscoverableByPhoneNumber = reader.bool(); break; } case 6: { message.preferContactAvatars = reader.bool(); break; } case 7: { message.universalExpireTimerSeconds = reader.uint32(); break; } case 8: { if (!(message.preferredReactionEmoji && message.preferredReactionEmoji.length)) message.preferredReactionEmoji = []; message.preferredReactionEmoji.push(reader.string()); break; } case 9: { message.displayBadgesOnProfile = reader.bool(); break; } case 10: { message.keepMutedChatsArchived = reader.bool(); break; } case 11: { message.hasSetMyStoriesPrivacy = reader.bool(); break; } case 12: { message.hasViewedOnboardingStory = reader.bool(); break; } case 13: { message.storiesDisabled = reader.bool(); break; } case 14: { message.storyViewReceiptsEnabled = reader.bool(); break; } case 15: { message.hasSeenGroupStoryEducationSheet = reader.bool(); break; } case 16: { message.hasCompletedUsernameOnboarding = reader.bool(); break; } case 17: { message.phoneNumberSharingMode = reader.int32(); break; } case 18: { message.defaultChatStyle = $root.signalbackups.ChatStyle.decode(reader, reader.uint32()); break; } case 19: { if (!(message.customChatColors && message.customChatColors.length)) message.customChatColors = []; message.customChatColors.push($root.signalbackups.ChatStyle.CustomChatColor.decode(reader, reader.uint32())); break; } case 20: { message.optimizeOnDeviceStorage = reader.bool(); break; } case 21: { message.backupTier = reader.uint64(); break; } case 23: { message.defaultSentMediaQuality = reader.int32(); break; } case 24: { message.autoDownloadSettings = $root.signalbackups.AccountData.AutoDownloadSettings.decode(reader, reader.uint32()); break; } case 26: { message.screenLockTimeoutMinutes = reader.uint32(); break; } case 27: { message.pinReminders = reader.bool(); break; } case 28: { message.appTheme = reader.int32(); break; } case 29: { message.callsUseLessDataSetting = reader.int32(); break; } case 30: { message.allowSealedSenderFromAnyone = reader.bool(); break; } case 31: { message.allowAutomaticKeyVerification = reader.bool(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an AccountSettings message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.AccountData.AccountSettings * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.AccountData.AccountSettings} AccountSettings * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ AccountSettings.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return AccountSettings; })(); AccountData.SubscriberData = (function() { /** * Properties of a SubscriberData. * @memberof signalbackups.AccountData * @interface ISubscriberData * @property {Uint8Array|null} [subscriberId] SubscriberData subscriberId * @property {string|null} [currencyCode] SubscriberData currencyCode * @property {boolean|null} [manuallyCancelled] SubscriberData manuallyCancelled */ /** * Constructs a new SubscriberData. * @memberof signalbackups.AccountData * @classdesc Represents a SubscriberData. * @implements ISubscriberData * @constructor * @param {signalbackups.AccountData.ISubscriberData=} [properties] Properties to set */ function SubscriberData(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * SubscriberData subscriberId. * @member {Uint8Array} subscriberId * @memberof signalbackups.AccountData.SubscriberData * @instance */ SubscriberData.prototype.subscriberId = $util.newBuffer([]); /** * SubscriberData currencyCode. * @member {string} currencyCode * @memberof signalbackups.AccountData.SubscriberData * @instance */ SubscriberData.prototype.currencyCode = ""; /** * SubscriberData manuallyCancelled. * @member {boolean} manuallyCancelled * @memberof signalbackups.AccountData.SubscriberData * @instance */ SubscriberData.prototype.manuallyCancelled = false; /** * Encodes the specified SubscriberData message. Does not implicitly {@link signalbackups.AccountData.SubscriberData.verify|verify} messages. * @function encode * @memberof signalbackups.AccountData.SubscriberData * @static * @param {signalbackups.AccountData.ISubscriberData} message SubscriberData message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ SubscriberData.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.AccountData.SubscriberData.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.AccountData.SubscriberData.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.subscriberId != null && Object.hasOwnProperty.call(message, "subscriberId")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.subscriberId); if (message.currencyCode != null && Object.hasOwnProperty.call(message, "currencyCode")) writer.uint32(/* id 2, wireType 2 =*/18).string(message.currencyCode); if (message.manuallyCancelled != null && Object.hasOwnProperty.call(message, "manuallyCancelled")) writer.uint32(/* id 3, wireType 0 =*/24).bool(message.manuallyCancelled); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified SubscriberData message, length delimited. Does not implicitly {@link signalbackups.AccountData.SubscriberData.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.AccountData.SubscriberData * @static * @param {signalbackups.AccountData.ISubscriberData} message SubscriberData message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ SubscriberData.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a SubscriberData message from the specified reader or buffer. * @function decode * @memberof signalbackups.AccountData.SubscriberData * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.AccountData.SubscriberData} SubscriberData * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ SubscriberData.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.AccountData.SubscriberData(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.subscriberId = reader.bytes(); break; } case 2: { message.currencyCode = reader.string(); break; } case 3: { message.manuallyCancelled = reader.bool(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a SubscriberData message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.AccountData.SubscriberData * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.AccountData.SubscriberData} SubscriberData * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ SubscriberData.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return SubscriberData; })(); AccountData.IAPSubscriberData = (function() { /** * Properties of a IAPSubscriberData. * @memberof signalbackups.AccountData * @interface IIAPSubscriberData * @property {Uint8Array|null} [subscriberId] IAPSubscriberData subscriberId * @property {string|null} [purchaseToken] IAPSubscriberData purchaseToken * @property {Long|null} [originalTransactionId] IAPSubscriberData originalTransactionId */ /** * Constructs a new IAPSubscriberData. * @memberof signalbackups.AccountData * @classdesc Represents a IAPSubscriberData. * @implements IIAPSubscriberData * @constructor * @param {signalbackups.AccountData.IIAPSubscriberData=} [properties] Properties to set */ function IAPSubscriberData(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * IAPSubscriberData subscriberId. * @member {Uint8Array} subscriberId * @memberof signalbackups.AccountData.IAPSubscriberData * @instance */ IAPSubscriberData.prototype.subscriberId = $util.newBuffer([]); /** * IAPSubscriberData purchaseToken. * @member {string|null|undefined} purchaseToken * @memberof signalbackups.AccountData.IAPSubscriberData * @instance */ IAPSubscriberData.prototype.purchaseToken = null; /** * IAPSubscriberData originalTransactionId. * @member {Long|null|undefined} originalTransactionId * @memberof signalbackups.AccountData.IAPSubscriberData * @instance */ IAPSubscriberData.prototype.originalTransactionId = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * IAPSubscriberData iapSubscriptionId. * @member {"purchaseToken"|"originalTransactionId"|undefined} iapSubscriptionId * @memberof signalbackups.AccountData.IAPSubscriberData * @instance */ Object.defineProperty(IAPSubscriberData.prototype, "iapSubscriptionId", { get: $util.oneOfGetter($oneOfFields = ["purchaseToken", "originalTransactionId"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified IAPSubscriberData message. Does not implicitly {@link signalbackups.AccountData.IAPSubscriberData.verify|verify} messages. * @function encode * @memberof signalbackups.AccountData.IAPSubscriberData * @static * @param {signalbackups.AccountData.IIAPSubscriberData} message IAPSubscriberData message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ IAPSubscriberData.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.AccountData.IAPSubscriberData.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.AccountData.IAPSubscriberData.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.subscriberId != null && Object.hasOwnProperty.call(message, "subscriberId")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.subscriberId); if (message.purchaseToken != null && Object.hasOwnProperty.call(message, "purchaseToken")) writer.uint32(/* id 2, wireType 2 =*/18).string(message.purchaseToken); if (message.originalTransactionId != null && Object.hasOwnProperty.call(message, "originalTransactionId")) writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.originalTransactionId); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified IAPSubscriberData message, length delimited. Does not implicitly {@link signalbackups.AccountData.IAPSubscriberData.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.AccountData.IAPSubscriberData * @static * @param {signalbackups.AccountData.IIAPSubscriberData} message IAPSubscriberData message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ IAPSubscriberData.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a IAPSubscriberData message from the specified reader or buffer. * @function decode * @memberof signalbackups.AccountData.IAPSubscriberData * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.AccountData.IAPSubscriberData} IAPSubscriberData * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ IAPSubscriberData.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.AccountData.IAPSubscriberData(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.subscriberId = reader.bytes(); break; } case 2: { message.purchaseToken = reader.string(); break; } case 3: { message.originalTransactionId = reader.uint64(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a IAPSubscriberData message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.AccountData.IAPSubscriberData * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.AccountData.IAPSubscriberData} IAPSubscriberData * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ IAPSubscriberData.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return IAPSubscriberData; })(); AccountData.AndroidSpecificSettings = (function() { /** * Properties of an AndroidSpecificSettings. * @memberof signalbackups.AccountData * @interface IAndroidSpecificSettings * @property {boolean|null} [useSystemEmoji] AndroidSpecificSettings useSystemEmoji * @property {boolean|null} [screenshotSecurity] AndroidSpecificSettings screenshotSecurity * @property {signalbackups.AccountData.AndroidSpecificSettings.NavigationBarSize|null} [navigationBarSize] AndroidSpecificSettings navigationBarSize */ /** * Constructs a new AndroidSpecificSettings. * @memberof signalbackups.AccountData * @classdesc Represents an AndroidSpecificSettings. * @implements IAndroidSpecificSettings * @constructor * @param {signalbackups.AccountData.IAndroidSpecificSettings=} [properties] Properties to set */ function AndroidSpecificSettings(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * AndroidSpecificSettings useSystemEmoji. * @member {boolean} useSystemEmoji * @memberof signalbackups.AccountData.AndroidSpecificSettings * @instance */ AndroidSpecificSettings.prototype.useSystemEmoji = false; /** * AndroidSpecificSettings screenshotSecurity. * @member {boolean} screenshotSecurity * @memberof signalbackups.AccountData.AndroidSpecificSettings * @instance */ AndroidSpecificSettings.prototype.screenshotSecurity = false; /** * AndroidSpecificSettings navigationBarSize. * @member {signalbackups.AccountData.AndroidSpecificSettings.NavigationBarSize} navigationBarSize * @memberof signalbackups.AccountData.AndroidSpecificSettings * @instance */ AndroidSpecificSettings.prototype.navigationBarSize = 0; /** * Encodes the specified AndroidSpecificSettings message. Does not implicitly {@link signalbackups.AccountData.AndroidSpecificSettings.verify|verify} messages. * @function encode * @memberof signalbackups.AccountData.AndroidSpecificSettings * @static * @param {signalbackups.AccountData.IAndroidSpecificSettings} message AndroidSpecificSettings message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ AndroidSpecificSettings.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.AccountData.AndroidSpecificSettings.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.AccountData.AndroidSpecificSettings.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.useSystemEmoji != null && Object.hasOwnProperty.call(message, "useSystemEmoji")) writer.uint32(/* id 1, wireType 0 =*/8).bool(message.useSystemEmoji); if (message.screenshotSecurity != null && Object.hasOwnProperty.call(message, "screenshotSecurity")) writer.uint32(/* id 2, wireType 0 =*/16).bool(message.screenshotSecurity); if (message.navigationBarSize != null && Object.hasOwnProperty.call(message, "navigationBarSize")) writer.uint32(/* id 3, wireType 0 =*/24).int32(message.navigationBarSize); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified AndroidSpecificSettings message, length delimited. Does not implicitly {@link signalbackups.AccountData.AndroidSpecificSettings.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.AccountData.AndroidSpecificSettings * @static * @param {signalbackups.AccountData.IAndroidSpecificSettings} message AndroidSpecificSettings message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ AndroidSpecificSettings.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an AndroidSpecificSettings message from the specified reader or buffer. * @function decode * @memberof signalbackups.AccountData.AndroidSpecificSettings * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.AccountData.AndroidSpecificSettings} AndroidSpecificSettings * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ AndroidSpecificSettings.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.AccountData.AndroidSpecificSettings(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.useSystemEmoji = reader.bool(); break; } case 2: { message.screenshotSecurity = reader.bool(); break; } case 3: { message.navigationBarSize = reader.int32(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an AndroidSpecificSettings message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.AccountData.AndroidSpecificSettings * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.AccountData.AndroidSpecificSettings} AndroidSpecificSettings * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ AndroidSpecificSettings.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * NavigationBarSize enum. * @name signalbackups.AccountData.AndroidSpecificSettings.NavigationBarSize * @enum {number} * @property {number} UNKNOWN_BAR_SIZE=0 UNKNOWN_BAR_SIZE value * @property {number} NORMAL=1 NORMAL value * @property {number} COMPACT=2 COMPACT value */ AndroidSpecificSettings.NavigationBarSize = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "UNKNOWN_BAR_SIZE"] = 0; values[valuesById[1] = "NORMAL"] = 1; values[valuesById[2] = "COMPACT"] = 2; return values; })(); return AndroidSpecificSettings; })(); return AccountData; })(); signalbackups.Recipient = (function() { /** * Properties of a Recipient. * @memberof signalbackups * @interface IRecipient * @property {Long|null} [id] Recipient id * @property {signalbackups.IContact|null} [contact] Recipient contact * @property {signalbackups.IGroup|null} [group] Recipient group * @property {signalbackups.IDistributionListItem|null} [distributionList] Recipient distributionList * @property {signalbackups.ISelf|null} [self] Recipient self * @property {signalbackups.IReleaseNotes|null} [releaseNotes] Recipient releaseNotes * @property {signalbackups.ICallLink|null} [callLink] Recipient callLink */ /** * Constructs a new Recipient. * @memberof signalbackups * @classdesc Represents a Recipient. * @implements IRecipient * @constructor * @param {signalbackups.IRecipient=} [properties] Properties to set */ function Recipient(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Recipient id. * @member {Long} id * @memberof signalbackups.Recipient * @instance */ Recipient.prototype.id = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * Recipient contact. * @member {signalbackups.IContact|null|undefined} contact * @memberof signalbackups.Recipient * @instance */ Recipient.prototype.contact = null; /** * Recipient group. * @member {signalbackups.IGroup|null|undefined} group * @memberof signalbackups.Recipient * @instance */ Recipient.prototype.group = null; /** * Recipient distributionList. * @member {signalbackups.IDistributionListItem|null|undefined} distributionList * @memberof signalbackups.Recipient * @instance */ Recipient.prototype.distributionList = null; /** * Recipient self. * @member {signalbackups.ISelf|null|undefined} self * @memberof signalbackups.Recipient * @instance */ Recipient.prototype.self = null; /** * Recipient releaseNotes. * @member {signalbackups.IReleaseNotes|null|undefined} releaseNotes * @memberof signalbackups.Recipient * @instance */ Recipient.prototype.releaseNotes = null; /** * Recipient callLink. * @member {signalbackups.ICallLink|null|undefined} callLink * @memberof signalbackups.Recipient * @instance */ Recipient.prototype.callLink = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * Recipient destination. * @member {"contact"|"group"|"distributionList"|"self"|"releaseNotes"|"callLink"|undefined} destination * @memberof signalbackups.Recipient * @instance */ Object.defineProperty(Recipient.prototype, "destination", { get: $util.oneOfGetter($oneOfFields = ["contact", "group", "distributionList", "self", "releaseNotes", "callLink"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified Recipient message. Does not implicitly {@link signalbackups.Recipient.verify|verify} messages. * @function encode * @memberof signalbackups.Recipient * @static * @param {signalbackups.IRecipient} message Recipient message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Recipient.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.Recipient.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.Recipient.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.id != null && Object.hasOwnProperty.call(message, "id")) writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.id); if (message.contact != null && Object.hasOwnProperty.call(message, "contact")) $root.signalbackups.Contact.encode(message.contact, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); if (message.group != null && Object.hasOwnProperty.call(message, "group")) $root.signalbackups.Group.encode(message.group, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); if (message.distributionList != null && Object.hasOwnProperty.call(message, "distributionList")) $root.signalbackups.DistributionListItem.encode(message.distributionList, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); if (message.self != null && Object.hasOwnProperty.call(message, "self")) $root.signalbackups.Self.encode(message.self, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); if (message.releaseNotes != null && Object.hasOwnProperty.call(message, "releaseNotes")) $root.signalbackups.ReleaseNotes.encode(message.releaseNotes, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim(); if (message.callLink != null && Object.hasOwnProperty.call(message, "callLink")) $root.signalbackups.CallLink.encode(message.callLink, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Recipient message, length delimited. Does not implicitly {@link signalbackups.Recipient.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.Recipient * @static * @param {signalbackups.IRecipient} message Recipient message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Recipient.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Recipient message from the specified reader or buffer. * @function decode * @memberof signalbackups.Recipient * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.Recipient} Recipient * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Recipient.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.Recipient(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.id = reader.uint64(); break; } case 2: { message.contact = $root.signalbackups.Contact.decode(reader, reader.uint32()); break; } case 3: { message.group = $root.signalbackups.Group.decode(reader, reader.uint32()); break; } case 4: { message.distributionList = $root.signalbackups.DistributionListItem.decode(reader, reader.uint32()); break; } case 5: { message.self = $root.signalbackups.Self.decode(reader, reader.uint32()); break; } case 6: { message.releaseNotes = $root.signalbackups.ReleaseNotes.decode(reader, reader.uint32()); break; } case 7: { message.callLink = $root.signalbackups.CallLink.decode(reader, reader.uint32()); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Recipient message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.Recipient * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.Recipient} Recipient * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Recipient.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return Recipient; })(); /** * AvatarColor enum. * @name signalbackups.AvatarColor * @enum {number} * @property {number} A100=0 A100 value * @property {number} A110=1 A110 value * @property {number} A120=2 A120 value * @property {number} A130=3 A130 value * @property {number} A140=4 A140 value * @property {number} A150=5 A150 value * @property {number} A160=6 A160 value * @property {number} A170=7 A170 value * @property {number} A180=8 A180 value * @property {number} A190=9 A190 value * @property {number} A200=10 A200 value * @property {number} A210=11 A210 value */ signalbackups.AvatarColor = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "A100"] = 0; values[valuesById[1] = "A110"] = 1; values[valuesById[2] = "A120"] = 2; values[valuesById[3] = "A130"] = 3; values[valuesById[4] = "A140"] = 4; values[valuesById[5] = "A150"] = 5; values[valuesById[6] = "A160"] = 6; values[valuesById[7] = "A170"] = 7; values[valuesById[8] = "A180"] = 8; values[valuesById[9] = "A190"] = 9; values[valuesById[10] = "A200"] = 10; values[valuesById[11] = "A210"] = 11; return values; })(); signalbackups.Contact = (function() { /** * Properties of a Contact. * @memberof signalbackups * @interface IContact * @property {Uint8Array|null} [aci] Contact aci * @property {Uint8Array|null} [pni] Contact pni * @property {string|null} [username] Contact username * @property {Long|null} [e164] Contact e164 * @property {boolean|null} [blocked] Contact blocked * @property {signalbackups.Contact.Visibility|null} [visibility] Contact visibility * @property {signalbackups.Contact.IRegistered|null} [registered] Contact registered * @property {signalbackups.Contact.INotRegistered|null} [notRegistered] Contact notRegistered * @property {Uint8Array|null} [profileKey] Contact profileKey * @property {boolean|null} [profileSharing] Contact profileSharing * @property {string|null} [profileGivenName] Contact profileGivenName * @property {string|null} [profileFamilyName] Contact profileFamilyName * @property {boolean|null} [hideStory] Contact hideStory * @property {Uint8Array|null} [identityKey] Contact identityKey * @property {signalbackups.Contact.IdentityState|null} [identityState] Contact identityState * @property {signalbackups.Contact.IName|null} [nickname] Contact nickname * @property {string|null} [note] Contact note * @property {string|null} [systemGivenName] Contact systemGivenName * @property {string|null} [systemFamilyName] Contact systemFamilyName * @property {string|null} [systemNickname] Contact systemNickname * @property {signalbackups.AvatarColor|null} [avatarColor] Contact avatarColor * @property {Uint8Array|null} [keyTransparencyData] Contact keyTransparencyData */ /** * Constructs a new Contact. * @memberof signalbackups * @classdesc Represents a Contact. * @implements IContact * @constructor * @param {signalbackups.IContact=} [properties] Properties to set */ function Contact(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Contact aci. * @member {Uint8Array|null|undefined} aci * @memberof signalbackups.Contact * @instance */ Contact.prototype.aci = null; /** * Contact pni. * @member {Uint8Array|null|undefined} pni * @memberof signalbackups.Contact * @instance */ Contact.prototype.pni = null; /** * Contact username. * @member {string|null|undefined} username * @memberof signalbackups.Contact * @instance */ Contact.prototype.username = null; /** * Contact e164. * @member {Long|null|undefined} e164 * @memberof signalbackups.Contact * @instance */ Contact.prototype.e164 = null; /** * Contact blocked. * @member {boolean} blocked * @memberof signalbackups.Contact * @instance */ Contact.prototype.blocked = false; /** * Contact visibility. * @member {signalbackups.Contact.Visibility} visibility * @memberof signalbackups.Contact * @instance */ Contact.prototype.visibility = 0; /** * Contact registered. * @member {signalbackups.Contact.IRegistered|null|undefined} registered * @memberof signalbackups.Contact * @instance */ Contact.prototype.registered = null; /** * Contact notRegistered. * @member {signalbackups.Contact.INotRegistered|null|undefined} notRegistered * @memberof signalbackups.Contact * @instance */ Contact.prototype.notRegistered = null; /** * Contact profileKey. * @member {Uint8Array|null|undefined} profileKey * @memberof signalbackups.Contact * @instance */ Contact.prototype.profileKey = null; /** * Contact profileSharing. * @member {boolean} profileSharing * @memberof signalbackups.Contact * @instance */ Contact.prototype.profileSharing = false; /** * Contact profileGivenName. * @member {string|null|undefined} profileGivenName * @memberof signalbackups.Contact * @instance */ Contact.prototype.profileGivenName = null; /** * Contact profileFamilyName. * @member {string|null|undefined} profileFamilyName * @memberof signalbackups.Contact * @instance */ Contact.prototype.profileFamilyName = null; /** * Contact hideStory. * @member {boolean} hideStory * @memberof signalbackups.Contact * @instance */ Contact.prototype.hideStory = false; /** * Contact identityKey. * @member {Uint8Array|null|undefined} identityKey * @memberof signalbackups.Contact * @instance */ Contact.prototype.identityKey = null; /** * Contact identityState. * @member {signalbackups.Contact.IdentityState} identityState * @memberof signalbackups.Contact * @instance */ Contact.prototype.identityState = 0; /** * Contact nickname. * @member {signalbackups.Contact.IName|null|undefined} nickname * @memberof signalbackups.Contact * @instance */ Contact.prototype.nickname = null; /** * Contact note. * @member {string} note * @memberof signalbackups.Contact * @instance */ Contact.prototype.note = ""; /** * Contact systemGivenName. * @member {string} systemGivenName * @memberof signalbackups.Contact * @instance */ Contact.prototype.systemGivenName = ""; /** * Contact systemFamilyName. * @member {string} systemFamilyName * @memberof signalbackups.Contact * @instance */ Contact.prototype.systemFamilyName = ""; /** * Contact systemNickname. * @member {string} systemNickname * @memberof signalbackups.Contact * @instance */ Contact.prototype.systemNickname = ""; /** * Contact avatarColor. * @member {signalbackups.AvatarColor|null|undefined} avatarColor * @memberof signalbackups.Contact * @instance */ Contact.prototype.avatarColor = null; /** * Contact keyTransparencyData. * @member {Uint8Array|null|undefined} keyTransparencyData * @memberof signalbackups.Contact * @instance */ Contact.prototype.keyTransparencyData = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * Contact _aci. * @member {"aci"|undefined} _aci * @memberof signalbackups.Contact * @instance */ Object.defineProperty(Contact.prototype, "_aci", { get: $util.oneOfGetter($oneOfFields = ["aci"]), set: $util.oneOfSetter($oneOfFields) }); /** * Contact _pni. * @member {"pni"|undefined} _pni * @memberof signalbackups.Contact * @instance */ Object.defineProperty(Contact.prototype, "_pni", { get: $util.oneOfGetter($oneOfFields = ["pni"]), set: $util.oneOfSetter($oneOfFields) }); /** * Contact _username. * @member {"username"|undefined} _username * @memberof signalbackups.Contact * @instance */ Object.defineProperty(Contact.prototype, "_username", { get: $util.oneOfGetter($oneOfFields = ["username"]), set: $util.oneOfSetter($oneOfFields) }); /** * Contact _e164. * @member {"e164"|undefined} _e164 * @memberof signalbackups.Contact * @instance */ Object.defineProperty(Contact.prototype, "_e164", { get: $util.oneOfGetter($oneOfFields = ["e164"]), set: $util.oneOfSetter($oneOfFields) }); /** * Contact registration. * @member {"registered"|"notRegistered"|undefined} registration * @memberof signalbackups.Contact * @instance */ Object.defineProperty(Contact.prototype, "registration", { get: $util.oneOfGetter($oneOfFields = ["registered", "notRegistered"]), set: $util.oneOfSetter($oneOfFields) }); /** * Contact _profileKey. * @member {"profileKey"|undefined} _profileKey * @memberof signalbackups.Contact * @instance */ Object.defineProperty(Contact.prototype, "_profileKey", { get: $util.oneOfGetter($oneOfFields = ["profileKey"]), set: $util.oneOfSetter($oneOfFields) }); /** * Contact _profileGivenName. * @member {"profileGivenName"|undefined} _profileGivenName * @memberof signalbackups.Contact * @instance */ Object.defineProperty(Contact.prototype, "_profileGivenName", { get: $util.oneOfGetter($oneOfFields = ["profileGivenName"]), set: $util.oneOfSetter($oneOfFields) }); /** * Contact _profileFamilyName. * @member {"profileFamilyName"|undefined} _profileFamilyName * @memberof signalbackups.Contact * @instance */ Object.defineProperty(Contact.prototype, "_profileFamilyName", { get: $util.oneOfGetter($oneOfFields = ["profileFamilyName"]), set: $util.oneOfSetter($oneOfFields) }); /** * Contact _identityKey. * @member {"identityKey"|undefined} _identityKey * @memberof signalbackups.Contact * @instance */ Object.defineProperty(Contact.prototype, "_identityKey", { get: $util.oneOfGetter($oneOfFields = ["identityKey"]), set: $util.oneOfSetter($oneOfFields) }); /** * Contact _avatarColor. * @member {"avatarColor"|undefined} _avatarColor * @memberof signalbackups.Contact * @instance */ Object.defineProperty(Contact.prototype, "_avatarColor", { get: $util.oneOfGetter($oneOfFields = ["avatarColor"]), set: $util.oneOfSetter($oneOfFields) }); /** * Contact _keyTransparencyData. * @member {"keyTransparencyData"|undefined} _keyTransparencyData * @memberof signalbackups.Contact * @instance */ Object.defineProperty(Contact.prototype, "_keyTransparencyData", { get: $util.oneOfGetter($oneOfFields = ["keyTransparencyData"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified Contact message. Does not implicitly {@link signalbackups.Contact.verify|verify} messages. * @function encode * @memberof signalbackups.Contact * @static * @param {signalbackups.IContact} message Contact message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Contact.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.Contact.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.Contact.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.aci != null && Object.hasOwnProperty.call(message, "aci")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.aci); if (message.pni != null && Object.hasOwnProperty.call(message, "pni")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.pni); if (message.username != null && Object.hasOwnProperty.call(message, "username")) writer.uint32(/* id 3, wireType 2 =*/26).string(message.username); if (message.e164 != null && Object.hasOwnProperty.call(message, "e164")) writer.uint32(/* id 4, wireType 0 =*/32).uint64(message.e164); if (message.blocked != null && Object.hasOwnProperty.call(message, "blocked")) writer.uint32(/* id 5, wireType 0 =*/40).bool(message.blocked); if (message.visibility != null && Object.hasOwnProperty.call(message, "visibility")) writer.uint32(/* id 6, wireType 0 =*/48).int32(message.visibility); if (message.registered != null && Object.hasOwnProperty.call(message, "registered")) $root.signalbackups.Contact.Registered.encode(message.registered, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim(); if (message.notRegistered != null && Object.hasOwnProperty.call(message, "notRegistered")) $root.signalbackups.Contact.NotRegistered.encode(message.notRegistered, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim(); if (message.profileKey != null && Object.hasOwnProperty.call(message, "profileKey")) writer.uint32(/* id 9, wireType 2 =*/74).bytes(message.profileKey); if (message.profileSharing != null && Object.hasOwnProperty.call(message, "profileSharing")) writer.uint32(/* id 10, wireType 0 =*/80).bool(message.profileSharing); if (message.profileGivenName != null && Object.hasOwnProperty.call(message, "profileGivenName")) writer.uint32(/* id 11, wireType 2 =*/90).string(message.profileGivenName); if (message.profileFamilyName != null && Object.hasOwnProperty.call(message, "profileFamilyName")) writer.uint32(/* id 12, wireType 2 =*/98).string(message.profileFamilyName); if (message.hideStory != null && Object.hasOwnProperty.call(message, "hideStory")) writer.uint32(/* id 13, wireType 0 =*/104).bool(message.hideStory); if (message.identityKey != null && Object.hasOwnProperty.call(message, "identityKey")) writer.uint32(/* id 14, wireType 2 =*/114).bytes(message.identityKey); if (message.identityState != null && Object.hasOwnProperty.call(message, "identityState")) writer.uint32(/* id 15, wireType 0 =*/120).int32(message.identityState); if (message.nickname != null && Object.hasOwnProperty.call(message, "nickname")) $root.signalbackups.Contact.Name.encode(message.nickname, writer.uint32(/* id 16, wireType 2 =*/130).fork()).ldelim(); if (message.note != null && Object.hasOwnProperty.call(message, "note")) writer.uint32(/* id 17, wireType 2 =*/138).string(message.note); if (message.systemGivenName != null && Object.hasOwnProperty.call(message, "systemGivenName")) writer.uint32(/* id 18, wireType 2 =*/146).string(message.systemGivenName); if (message.systemFamilyName != null && Object.hasOwnProperty.call(message, "systemFamilyName")) writer.uint32(/* id 19, wireType 2 =*/154).string(message.systemFamilyName); if (message.systemNickname != null && Object.hasOwnProperty.call(message, "systemNickname")) writer.uint32(/* id 20, wireType 2 =*/162).string(message.systemNickname); if (message.avatarColor != null && Object.hasOwnProperty.call(message, "avatarColor")) writer.uint32(/* id 21, wireType 0 =*/168).int32(message.avatarColor); if (message.keyTransparencyData != null && Object.hasOwnProperty.call(message, "keyTransparencyData")) writer.uint32(/* id 22, wireType 2 =*/178).bytes(message.keyTransparencyData); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Contact message, length delimited. Does not implicitly {@link signalbackups.Contact.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.Contact * @static * @param {signalbackups.IContact} message Contact message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Contact.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Contact message from the specified reader or buffer. * @function decode * @memberof signalbackups.Contact * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.Contact} Contact * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Contact.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.Contact(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.aci = reader.bytes(); break; } case 2: { message.pni = reader.bytes(); break; } case 3: { message.username = reader.string(); break; } case 4: { message.e164 = reader.uint64(); break; } case 5: { message.blocked = reader.bool(); break; } case 6: { message.visibility = reader.int32(); break; } case 7: { message.registered = $root.signalbackups.Contact.Registered.decode(reader, reader.uint32()); break; } case 8: { message.notRegistered = $root.signalbackups.Contact.NotRegistered.decode(reader, reader.uint32()); break; } case 9: { message.profileKey = reader.bytes(); break; } case 10: { message.profileSharing = reader.bool(); break; } case 11: { message.profileGivenName = reader.string(); break; } case 12: { message.profileFamilyName = reader.string(); break; } case 13: { message.hideStory = reader.bool(); break; } case 14: { message.identityKey = reader.bytes(); break; } case 15: { message.identityState = reader.int32(); break; } case 16: { message.nickname = $root.signalbackups.Contact.Name.decode(reader, reader.uint32()); break; } case 17: { message.note = reader.string(); break; } case 18: { message.systemGivenName = reader.string(); break; } case 19: { message.systemFamilyName = reader.string(); break; } case 20: { message.systemNickname = reader.string(); break; } case 21: { message.avatarColor = reader.int32(); break; } case 22: { message.keyTransparencyData = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Contact message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.Contact * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.Contact} Contact * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Contact.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * IdentityState enum. * @name signalbackups.Contact.IdentityState * @enum {number} * @property {number} DEFAULT=0 DEFAULT value * @property {number} VERIFIED=1 VERIFIED value * @property {number} UNVERIFIED=2 UNVERIFIED value */ Contact.IdentityState = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "DEFAULT"] = 0; values[valuesById[1] = "VERIFIED"] = 1; values[valuesById[2] = "UNVERIFIED"] = 2; return values; })(); Contact.Registered = (function() { /** * Properties of a Registered. * @memberof signalbackups.Contact * @interface IRegistered */ /** * Constructs a new Registered. * @memberof signalbackups.Contact * @classdesc Represents a Registered. * @implements IRegistered * @constructor * @param {signalbackups.Contact.IRegistered=} [properties] Properties to set */ function Registered(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Encodes the specified Registered message. Does not implicitly {@link signalbackups.Contact.Registered.verify|verify} messages. * @function encode * @memberof signalbackups.Contact.Registered * @static * @param {signalbackups.Contact.IRegistered} message Registered message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Registered.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.Contact.Registered.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.Contact.Registered.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Registered message, length delimited. Does not implicitly {@link signalbackups.Contact.Registered.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.Contact.Registered * @static * @param {signalbackups.Contact.IRegistered} message Registered message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Registered.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Registered message from the specified reader or buffer. * @function decode * @memberof signalbackups.Contact.Registered * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.Contact.Registered} Registered * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Registered.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.Contact.Registered(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Registered message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.Contact.Registered * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.Contact.Registered} Registered * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Registered.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return Registered; })(); Contact.NotRegistered = (function() { /** * Properties of a NotRegistered. * @memberof signalbackups.Contact * @interface INotRegistered * @property {Long|null} [unregisteredTimestamp] NotRegistered unregisteredTimestamp */ /** * Constructs a new NotRegistered. * @memberof signalbackups.Contact * @classdesc Represents a NotRegistered. * @implements INotRegistered * @constructor * @param {signalbackups.Contact.INotRegistered=} [properties] Properties to set */ function NotRegistered(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * NotRegistered unregisteredTimestamp. * @member {Long} unregisteredTimestamp * @memberof signalbackups.Contact.NotRegistered * @instance */ NotRegistered.prototype.unregisteredTimestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * Encodes the specified NotRegistered message. Does not implicitly {@link signalbackups.Contact.NotRegistered.verify|verify} messages. * @function encode * @memberof signalbackups.Contact.NotRegistered * @static * @param {signalbackups.Contact.INotRegistered} message NotRegistered message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ NotRegistered.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.Contact.NotRegistered.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.Contact.NotRegistered.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.unregisteredTimestamp != null && Object.hasOwnProperty.call(message, "unregisteredTimestamp")) writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.unregisteredTimestamp); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified NotRegistered message, length delimited. Does not implicitly {@link signalbackups.Contact.NotRegistered.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.Contact.NotRegistered * @static * @param {signalbackups.Contact.INotRegistered} message NotRegistered message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ NotRegistered.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a NotRegistered message from the specified reader or buffer. * @function decode * @memberof signalbackups.Contact.NotRegistered * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.Contact.NotRegistered} NotRegistered * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ NotRegistered.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.Contact.NotRegistered(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.unregisteredTimestamp = reader.uint64(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a NotRegistered message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.Contact.NotRegistered * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.Contact.NotRegistered} NotRegistered * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ NotRegistered.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return NotRegistered; })(); /** * Visibility enum. * @name signalbackups.Contact.Visibility * @enum {number} * @property {number} VISIBLE=0 VISIBLE value * @property {number} HIDDEN=1 HIDDEN value * @property {number} HIDDEN_MESSAGE_REQUEST=2 HIDDEN_MESSAGE_REQUEST value */ Contact.Visibility = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "VISIBLE"] = 0; values[valuesById[1] = "HIDDEN"] = 1; values[valuesById[2] = "HIDDEN_MESSAGE_REQUEST"] = 2; return values; })(); Contact.Name = (function() { /** * Properties of a Name. * @memberof signalbackups.Contact * @interface IName * @property {string|null} [given] Name given * @property {string|null} [family] Name family */ /** * Constructs a new Name. * @memberof signalbackups.Contact * @classdesc Represents a Name. * @implements IName * @constructor * @param {signalbackups.Contact.IName=} [properties] Properties to set */ function Name(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Name given. * @member {string} given * @memberof signalbackups.Contact.Name * @instance */ Name.prototype.given = ""; /** * Name family. * @member {string} family * @memberof signalbackups.Contact.Name * @instance */ Name.prototype.family = ""; /** * Encodes the specified Name message. Does not implicitly {@link signalbackups.Contact.Name.verify|verify} messages. * @function encode * @memberof signalbackups.Contact.Name * @static * @param {signalbackups.Contact.IName} message Name message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Name.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.Contact.Name.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.Contact.Name.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.given != null && Object.hasOwnProperty.call(message, "given")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.given); if (message.family != null && Object.hasOwnProperty.call(message, "family")) writer.uint32(/* id 2, wireType 2 =*/18).string(message.family); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Name message, length delimited. Does not implicitly {@link signalbackups.Contact.Name.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.Contact.Name * @static * @param {signalbackups.Contact.IName} message Name message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Name.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Name message from the specified reader or buffer. * @function decode * @memberof signalbackups.Contact.Name * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.Contact.Name} Name * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Name.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.Contact.Name(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.given = reader.string(); break; } case 2: { message.family = reader.string(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Name message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.Contact.Name * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.Contact.Name} Name * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Name.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return Name; })(); return Contact; })(); signalbackups.Group = (function() { /** * Properties of a Group. * @memberof signalbackups * @interface IGroup * @property {Uint8Array|null} [masterKey] Group masterKey * @property {boolean|null} [whitelisted] Group whitelisted * @property {boolean|null} [hideStory] Group hideStory * @property {signalbackups.Group.StorySendMode|null} [storySendMode] Group storySendMode * @property {signalbackups.Group.IGroupSnapshot|null} [snapshot] Group snapshot * @property {boolean|null} [blocked] Group blocked * @property {signalbackups.AvatarColor|null} [avatarColor] Group avatarColor */ /** * Constructs a new Group. * @memberof signalbackups * @classdesc Represents a Group. * @implements IGroup * @constructor * @param {signalbackups.IGroup=} [properties] Properties to set */ function Group(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Group masterKey. * @member {Uint8Array} masterKey * @memberof signalbackups.Group * @instance */ Group.prototype.masterKey = $util.newBuffer([]); /** * Group whitelisted. * @member {boolean} whitelisted * @memberof signalbackups.Group * @instance */ Group.prototype.whitelisted = false; /** * Group hideStory. * @member {boolean} hideStory * @memberof signalbackups.Group * @instance */ Group.prototype.hideStory = false; /** * Group storySendMode. * @member {signalbackups.Group.StorySendMode} storySendMode * @memberof signalbackups.Group * @instance */ Group.prototype.storySendMode = 0; /** * Group snapshot. * @member {signalbackups.Group.IGroupSnapshot|null|undefined} snapshot * @memberof signalbackups.Group * @instance */ Group.prototype.snapshot = null; /** * Group blocked. * @member {boolean} blocked * @memberof signalbackups.Group * @instance */ Group.prototype.blocked = false; /** * Group avatarColor. * @member {signalbackups.AvatarColor|null|undefined} avatarColor * @memberof signalbackups.Group * @instance */ Group.prototype.avatarColor = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * Group _avatarColor. * @member {"avatarColor"|undefined} _avatarColor * @memberof signalbackups.Group * @instance */ Object.defineProperty(Group.prototype, "_avatarColor", { get: $util.oneOfGetter($oneOfFields = ["avatarColor"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified Group message. Does not implicitly {@link signalbackups.Group.verify|verify} messages. * @function encode * @memberof signalbackups.Group * @static * @param {signalbackups.IGroup} message Group message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Group.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.Group.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.Group.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.masterKey != null && Object.hasOwnProperty.call(message, "masterKey")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.masterKey); if (message.whitelisted != null && Object.hasOwnProperty.call(message, "whitelisted")) writer.uint32(/* id 2, wireType 0 =*/16).bool(message.whitelisted); if (message.hideStory != null && Object.hasOwnProperty.call(message, "hideStory")) writer.uint32(/* id 3, wireType 0 =*/24).bool(message.hideStory); if (message.storySendMode != null && Object.hasOwnProperty.call(message, "storySendMode")) writer.uint32(/* id 4, wireType 0 =*/32).int32(message.storySendMode); if (message.snapshot != null && Object.hasOwnProperty.call(message, "snapshot")) $root.signalbackups.Group.GroupSnapshot.encode(message.snapshot, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); if (message.blocked != null && Object.hasOwnProperty.call(message, "blocked")) writer.uint32(/* id 6, wireType 0 =*/48).bool(message.blocked); if (message.avatarColor != null && Object.hasOwnProperty.call(message, "avatarColor")) writer.uint32(/* id 7, wireType 0 =*/56).int32(message.avatarColor); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Group message, length delimited. Does not implicitly {@link signalbackups.Group.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.Group * @static * @param {signalbackups.IGroup} message Group message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Group.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Group message from the specified reader or buffer. * @function decode * @memberof signalbackups.Group * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.Group} Group * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Group.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.Group(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.masterKey = reader.bytes(); break; } case 2: { message.whitelisted = reader.bool(); break; } case 3: { message.hideStory = reader.bool(); break; } case 4: { message.storySendMode = reader.int32(); break; } case 5: { message.snapshot = $root.signalbackups.Group.GroupSnapshot.decode(reader, reader.uint32()); break; } case 6: { message.blocked = reader.bool(); break; } case 7: { message.avatarColor = reader.int32(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Group message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.Group * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.Group} Group * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Group.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * StorySendMode enum. * @name signalbackups.Group.StorySendMode * @enum {number} * @property {number} DEFAULT=0 DEFAULT value * @property {number} DISABLED=1 DISABLED value * @property {number} ENABLED=2 ENABLED value */ Group.StorySendMode = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "DEFAULT"] = 0; values[valuesById[1] = "DISABLED"] = 1; values[valuesById[2] = "ENABLED"] = 2; return values; })(); Group.GroupSnapshot = (function() { /** * Properties of a GroupSnapshot. * @memberof signalbackups.Group * @interface IGroupSnapshot * @property {signalbackups.Group.IGroupAttributeBlob|null} [title] GroupSnapshot title * @property {signalbackups.Group.IGroupAttributeBlob|null} [description] GroupSnapshot description * @property {string|null} [avatarUrl] GroupSnapshot avatarUrl * @property {signalbackups.Group.IGroupAttributeBlob|null} [disappearingMessagesTimer] GroupSnapshot disappearingMessagesTimer * @property {signalbackups.Group.IAccessControl|null} [accessControl] GroupSnapshot accessControl * @property {number|null} [version] GroupSnapshot version * @property {Array.|null} [members] GroupSnapshot members * @property {Array.|null} [membersPendingProfileKey] GroupSnapshot membersPendingProfileKey * @property {Array.|null} [membersPendingAdminApproval] GroupSnapshot membersPendingAdminApproval * @property {Uint8Array|null} [inviteLinkPassword] GroupSnapshot inviteLinkPassword * @property {boolean|null} [announcementsOnly] GroupSnapshot announcementsOnly * @property {Array.|null} [membersBanned] GroupSnapshot membersBanned */ /** * Constructs a new GroupSnapshot. * @memberof signalbackups.Group * @classdesc Represents a GroupSnapshot. * @implements IGroupSnapshot * @constructor * @param {signalbackups.Group.IGroupSnapshot=} [properties] Properties to set */ function GroupSnapshot(properties) { this.members = []; this.membersPendingProfileKey = []; this.membersPendingAdminApproval = []; this.membersBanned = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GroupSnapshot title. * @member {signalbackups.Group.IGroupAttributeBlob|null|undefined} title * @memberof signalbackups.Group.GroupSnapshot * @instance */ GroupSnapshot.prototype.title = null; /** * GroupSnapshot description. * @member {signalbackups.Group.IGroupAttributeBlob|null|undefined} description * @memberof signalbackups.Group.GroupSnapshot * @instance */ GroupSnapshot.prototype.description = null; /** * GroupSnapshot avatarUrl. * @member {string} avatarUrl * @memberof signalbackups.Group.GroupSnapshot * @instance */ GroupSnapshot.prototype.avatarUrl = ""; /** * GroupSnapshot disappearingMessagesTimer. * @member {signalbackups.Group.IGroupAttributeBlob|null|undefined} disappearingMessagesTimer * @memberof signalbackups.Group.GroupSnapshot * @instance */ GroupSnapshot.prototype.disappearingMessagesTimer = null; /** * GroupSnapshot accessControl. * @member {signalbackups.Group.IAccessControl|null|undefined} accessControl * @memberof signalbackups.Group.GroupSnapshot * @instance */ GroupSnapshot.prototype.accessControl = null; /** * GroupSnapshot version. * @member {number} version * @memberof signalbackups.Group.GroupSnapshot * @instance */ GroupSnapshot.prototype.version = 0; /** * GroupSnapshot members. * @member {Array.} members * @memberof signalbackups.Group.GroupSnapshot * @instance */ GroupSnapshot.prototype.members = $util.emptyArray; /** * GroupSnapshot membersPendingProfileKey. * @member {Array.} membersPendingProfileKey * @memberof signalbackups.Group.GroupSnapshot * @instance */ GroupSnapshot.prototype.membersPendingProfileKey = $util.emptyArray; /** * GroupSnapshot membersPendingAdminApproval. * @member {Array.} membersPendingAdminApproval * @memberof signalbackups.Group.GroupSnapshot * @instance */ GroupSnapshot.prototype.membersPendingAdminApproval = $util.emptyArray; /** * GroupSnapshot inviteLinkPassword. * @member {Uint8Array} inviteLinkPassword * @memberof signalbackups.Group.GroupSnapshot * @instance */ GroupSnapshot.prototype.inviteLinkPassword = $util.newBuffer([]); /** * GroupSnapshot announcementsOnly. * @member {boolean} announcementsOnly * @memberof signalbackups.Group.GroupSnapshot * @instance */ GroupSnapshot.prototype.announcementsOnly = false; /** * GroupSnapshot membersBanned. * @member {Array.} membersBanned * @memberof signalbackups.Group.GroupSnapshot * @instance */ GroupSnapshot.prototype.membersBanned = $util.emptyArray; /** * Encodes the specified GroupSnapshot message. Does not implicitly {@link signalbackups.Group.GroupSnapshot.verify|verify} messages. * @function encode * @memberof signalbackups.Group.GroupSnapshot * @static * @param {signalbackups.Group.IGroupSnapshot} message GroupSnapshot message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupSnapshot.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.Group.GroupSnapshot.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.Group.GroupSnapshot.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.title != null && Object.hasOwnProperty.call(message, "title")) $root.signalbackups.Group.GroupAttributeBlob.encode(message.title, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); if (message.avatarUrl != null && Object.hasOwnProperty.call(message, "avatarUrl")) writer.uint32(/* id 3, wireType 2 =*/26).string(message.avatarUrl); if (message.disappearingMessagesTimer != null && Object.hasOwnProperty.call(message, "disappearingMessagesTimer")) $root.signalbackups.Group.GroupAttributeBlob.encode(message.disappearingMessagesTimer, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); if (message.accessControl != null && Object.hasOwnProperty.call(message, "accessControl")) $root.signalbackups.Group.AccessControl.encode(message.accessControl, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); if (message.version != null && Object.hasOwnProperty.call(message, "version")) writer.uint32(/* id 6, wireType 0 =*/48).uint32(message.version); if (message.members != null && message.members.length) for (var i = 0; i < message.members.length; ++i) $root.signalbackups.Group.Member.encode(message.members[i], writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim(); if (message.membersPendingProfileKey != null && message.membersPendingProfileKey.length) for (var i = 0; i < message.membersPendingProfileKey.length; ++i) $root.signalbackups.Group.MemberPendingProfileKey.encode(message.membersPendingProfileKey[i], writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim(); if (message.membersPendingAdminApproval != null && message.membersPendingAdminApproval.length) for (var i = 0; i < message.membersPendingAdminApproval.length; ++i) $root.signalbackups.Group.MemberPendingAdminApproval.encode(message.membersPendingAdminApproval[i], writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim(); if (message.inviteLinkPassword != null && Object.hasOwnProperty.call(message, "inviteLinkPassword")) writer.uint32(/* id 10, wireType 2 =*/82).bytes(message.inviteLinkPassword); if (message.description != null && Object.hasOwnProperty.call(message, "description")) $root.signalbackups.Group.GroupAttributeBlob.encode(message.description, writer.uint32(/* id 11, wireType 2 =*/90).fork()).ldelim(); if (message.announcementsOnly != null && Object.hasOwnProperty.call(message, "announcementsOnly")) writer.uint32(/* id 12, wireType 0 =*/96).bool(message.announcementsOnly); if (message.membersBanned != null && message.membersBanned.length) for (var i = 0; i < message.membersBanned.length; ++i) $root.signalbackups.Group.MemberBanned.encode(message.membersBanned[i], writer.uint32(/* id 13, wireType 2 =*/106).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupSnapshot message, length delimited. Does not implicitly {@link signalbackups.Group.GroupSnapshot.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.Group.GroupSnapshot * @static * @param {signalbackups.Group.IGroupSnapshot} message GroupSnapshot message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupSnapshot.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupSnapshot message from the specified reader or buffer. * @function decode * @memberof signalbackups.Group.GroupSnapshot * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.Group.GroupSnapshot} GroupSnapshot * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupSnapshot.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.Group.GroupSnapshot(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 2: { message.title = $root.signalbackups.Group.GroupAttributeBlob.decode(reader, reader.uint32()); break; } case 11: { message.description = $root.signalbackups.Group.GroupAttributeBlob.decode(reader, reader.uint32()); break; } case 3: { message.avatarUrl = reader.string(); break; } case 4: { message.disappearingMessagesTimer = $root.signalbackups.Group.GroupAttributeBlob.decode(reader, reader.uint32()); break; } case 5: { message.accessControl = $root.signalbackups.Group.AccessControl.decode(reader, reader.uint32()); break; } case 6: { message.version = reader.uint32(); break; } case 7: { if (!(message.members && message.members.length)) message.members = []; message.members.push($root.signalbackups.Group.Member.decode(reader, reader.uint32())); break; } case 8: { if (!(message.membersPendingProfileKey && message.membersPendingProfileKey.length)) message.membersPendingProfileKey = []; message.membersPendingProfileKey.push($root.signalbackups.Group.MemberPendingProfileKey.decode(reader, reader.uint32())); break; } case 9: { if (!(message.membersPendingAdminApproval && message.membersPendingAdminApproval.length)) message.membersPendingAdminApproval = []; message.membersPendingAdminApproval.push($root.signalbackups.Group.MemberPendingAdminApproval.decode(reader, reader.uint32())); break; } case 10: { message.inviteLinkPassword = reader.bytes(); break; } case 12: { message.announcementsOnly = reader.bool(); break; } case 13: { if (!(message.membersBanned && message.membersBanned.length)) message.membersBanned = []; message.membersBanned.push($root.signalbackups.Group.MemberBanned.decode(reader, reader.uint32())); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupSnapshot message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.Group.GroupSnapshot * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.Group.GroupSnapshot} GroupSnapshot * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupSnapshot.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return GroupSnapshot; })(); Group.GroupAttributeBlob = (function() { /** * Properties of a GroupAttributeBlob. * @memberof signalbackups.Group * @interface IGroupAttributeBlob * @property {string|null} [title] GroupAttributeBlob title * @property {Uint8Array|null} [avatar] GroupAttributeBlob avatar * @property {number|null} [disappearingMessagesDuration] GroupAttributeBlob disappearingMessagesDuration * @property {string|null} [descriptionText] GroupAttributeBlob descriptionText */ /** * Constructs a new GroupAttributeBlob. * @memberof signalbackups.Group * @classdesc Represents a GroupAttributeBlob. * @implements IGroupAttributeBlob * @constructor * @param {signalbackups.Group.IGroupAttributeBlob=} [properties] Properties to set */ function GroupAttributeBlob(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GroupAttributeBlob title. * @member {string|null|undefined} title * @memberof signalbackups.Group.GroupAttributeBlob * @instance */ GroupAttributeBlob.prototype.title = null; /** * GroupAttributeBlob avatar. * @member {Uint8Array|null|undefined} avatar * @memberof signalbackups.Group.GroupAttributeBlob * @instance */ GroupAttributeBlob.prototype.avatar = null; /** * GroupAttributeBlob disappearingMessagesDuration. * @member {number|null|undefined} disappearingMessagesDuration * @memberof signalbackups.Group.GroupAttributeBlob * @instance */ GroupAttributeBlob.prototype.disappearingMessagesDuration = null; /** * GroupAttributeBlob descriptionText. * @member {string|null|undefined} descriptionText * @memberof signalbackups.Group.GroupAttributeBlob * @instance */ GroupAttributeBlob.prototype.descriptionText = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * GroupAttributeBlob content. * @member {"title"|"avatar"|"disappearingMessagesDuration"|"descriptionText"|undefined} content * @memberof signalbackups.Group.GroupAttributeBlob * @instance */ Object.defineProperty(GroupAttributeBlob.prototype, "content", { get: $util.oneOfGetter($oneOfFields = ["title", "avatar", "disappearingMessagesDuration", "descriptionText"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified GroupAttributeBlob message. Does not implicitly {@link signalbackups.Group.GroupAttributeBlob.verify|verify} messages. * @function encode * @memberof signalbackups.Group.GroupAttributeBlob * @static * @param {signalbackups.Group.IGroupAttributeBlob} message GroupAttributeBlob message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupAttributeBlob.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.Group.GroupAttributeBlob.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.Group.GroupAttributeBlob.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.title != null && Object.hasOwnProperty.call(message, "title")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.title); if (message.avatar != null && Object.hasOwnProperty.call(message, "avatar")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.avatar); if (message.disappearingMessagesDuration != null && Object.hasOwnProperty.call(message, "disappearingMessagesDuration")) writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.disappearingMessagesDuration); if (message.descriptionText != null && Object.hasOwnProperty.call(message, "descriptionText")) writer.uint32(/* id 4, wireType 2 =*/34).string(message.descriptionText); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupAttributeBlob message, length delimited. Does not implicitly {@link signalbackups.Group.GroupAttributeBlob.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.Group.GroupAttributeBlob * @static * @param {signalbackups.Group.IGroupAttributeBlob} message GroupAttributeBlob message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupAttributeBlob.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupAttributeBlob message from the specified reader or buffer. * @function decode * @memberof signalbackups.Group.GroupAttributeBlob * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.Group.GroupAttributeBlob} GroupAttributeBlob * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupAttributeBlob.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.Group.GroupAttributeBlob(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.title = reader.string(); break; } case 2: { message.avatar = reader.bytes(); break; } case 3: { message.disappearingMessagesDuration = reader.uint32(); break; } case 4: { message.descriptionText = reader.string(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupAttributeBlob message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.Group.GroupAttributeBlob * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.Group.GroupAttributeBlob} GroupAttributeBlob * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupAttributeBlob.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return GroupAttributeBlob; })(); Group.Member = (function() { /** * Properties of a Member. * @memberof signalbackups.Group * @interface IMember * @property {Uint8Array|null} [userId] Member userId * @property {signalbackups.Group.Member.Role|null} [role] Member role * @property {number|null} [joinedAtVersion] Member joinedAtVersion * @property {string|null} [labelEmoji] Member labelEmoji * @property {string|null} [labelString] Member labelString */ /** * Constructs a new Member. * @memberof signalbackups.Group * @classdesc Represents a Member. * @implements IMember * @constructor * @param {signalbackups.Group.IMember=} [properties] Properties to set */ function Member(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Member userId. * @member {Uint8Array} userId * @memberof signalbackups.Group.Member * @instance */ Member.prototype.userId = $util.newBuffer([]); /** * Member role. * @member {signalbackups.Group.Member.Role} role * @memberof signalbackups.Group.Member * @instance */ Member.prototype.role = 0; /** * Member joinedAtVersion. * @member {number} joinedAtVersion * @memberof signalbackups.Group.Member * @instance */ Member.prototype.joinedAtVersion = 0; /** * Member labelEmoji. * @member {string} labelEmoji * @memberof signalbackups.Group.Member * @instance */ Member.prototype.labelEmoji = ""; /** * Member labelString. * @member {string} labelString * @memberof signalbackups.Group.Member * @instance */ Member.prototype.labelString = ""; /** * Encodes the specified Member message. Does not implicitly {@link signalbackups.Group.Member.verify|verify} messages. * @function encode * @memberof signalbackups.Group.Member * @static * @param {signalbackups.Group.IMember} message Member message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Member.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.Group.Member.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.Group.Member.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.userId != null && Object.hasOwnProperty.call(message, "userId")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.userId); if (message.role != null && Object.hasOwnProperty.call(message, "role")) writer.uint32(/* id 2, wireType 0 =*/16).int32(message.role); if (message.joinedAtVersion != null && Object.hasOwnProperty.call(message, "joinedAtVersion")) writer.uint32(/* id 5, wireType 0 =*/40).uint32(message.joinedAtVersion); if (message.labelEmoji != null && Object.hasOwnProperty.call(message, "labelEmoji")) writer.uint32(/* id 6, wireType 2 =*/50).string(message.labelEmoji); if (message.labelString != null && Object.hasOwnProperty.call(message, "labelString")) writer.uint32(/* id 7, wireType 2 =*/58).string(message.labelString); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Member message, length delimited. Does not implicitly {@link signalbackups.Group.Member.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.Group.Member * @static * @param {signalbackups.Group.IMember} message Member message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Member.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Member message from the specified reader or buffer. * @function decode * @memberof signalbackups.Group.Member * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.Group.Member} Member * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Member.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.Group.Member(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.userId = reader.bytes(); break; } case 2: { message.role = reader.int32(); break; } case 5: { message.joinedAtVersion = reader.uint32(); break; } case 6: { message.labelEmoji = reader.string(); break; } case 7: { message.labelString = reader.string(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Member message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.Group.Member * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.Group.Member} Member * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Member.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * Role enum. * @name signalbackups.Group.Member.Role * @enum {number} * @property {number} UNKNOWN=0 UNKNOWN value * @property {number} DEFAULT=1 DEFAULT value * @property {number} ADMINISTRATOR=2 ADMINISTRATOR value */ Member.Role = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "UNKNOWN"] = 0; values[valuesById[1] = "DEFAULT"] = 1; values[valuesById[2] = "ADMINISTRATOR"] = 2; return values; })(); return Member; })(); Group.MemberPendingProfileKey = (function() { /** * Properties of a MemberPendingProfileKey. * @memberof signalbackups.Group * @interface IMemberPendingProfileKey * @property {signalbackups.Group.IMember|null} [member] MemberPendingProfileKey member * @property {Uint8Array|null} [addedByUserId] MemberPendingProfileKey addedByUserId * @property {Long|null} [timestamp] MemberPendingProfileKey timestamp */ /** * Constructs a new MemberPendingProfileKey. * @memberof signalbackups.Group * @classdesc Represents a MemberPendingProfileKey. * @implements IMemberPendingProfileKey * @constructor * @param {signalbackups.Group.IMemberPendingProfileKey=} [properties] Properties to set */ function MemberPendingProfileKey(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * MemberPendingProfileKey member. * @member {signalbackups.Group.IMember|null|undefined} member * @memberof signalbackups.Group.MemberPendingProfileKey * @instance */ MemberPendingProfileKey.prototype.member = null; /** * MemberPendingProfileKey addedByUserId. * @member {Uint8Array} addedByUserId * @memberof signalbackups.Group.MemberPendingProfileKey * @instance */ MemberPendingProfileKey.prototype.addedByUserId = $util.newBuffer([]); /** * MemberPendingProfileKey timestamp. * @member {Long} timestamp * @memberof signalbackups.Group.MemberPendingProfileKey * @instance */ MemberPendingProfileKey.prototype.timestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * Encodes the specified MemberPendingProfileKey message. Does not implicitly {@link signalbackups.Group.MemberPendingProfileKey.verify|verify} messages. * @function encode * @memberof signalbackups.Group.MemberPendingProfileKey * @static * @param {signalbackups.Group.IMemberPendingProfileKey} message MemberPendingProfileKey message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ MemberPendingProfileKey.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.Group.MemberPendingProfileKey.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.Group.MemberPendingProfileKey.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.member != null && Object.hasOwnProperty.call(message, "member")) $root.signalbackups.Group.Member.encode(message.member, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.addedByUserId != null && Object.hasOwnProperty.call(message, "addedByUserId")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.addedByUserId); if (message.timestamp != null && Object.hasOwnProperty.call(message, "timestamp")) writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.timestamp); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified MemberPendingProfileKey message, length delimited. Does not implicitly {@link signalbackups.Group.MemberPendingProfileKey.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.Group.MemberPendingProfileKey * @static * @param {signalbackups.Group.IMemberPendingProfileKey} message MemberPendingProfileKey message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ MemberPendingProfileKey.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a MemberPendingProfileKey message from the specified reader or buffer. * @function decode * @memberof signalbackups.Group.MemberPendingProfileKey * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.Group.MemberPendingProfileKey} MemberPendingProfileKey * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ MemberPendingProfileKey.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.Group.MemberPendingProfileKey(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.member = $root.signalbackups.Group.Member.decode(reader, reader.uint32()); break; } case 2: { message.addedByUserId = reader.bytes(); break; } case 3: { message.timestamp = reader.uint64(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a MemberPendingProfileKey message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.Group.MemberPendingProfileKey * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.Group.MemberPendingProfileKey} MemberPendingProfileKey * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ MemberPendingProfileKey.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return MemberPendingProfileKey; })(); Group.MemberPendingAdminApproval = (function() { /** * Properties of a MemberPendingAdminApproval. * @memberof signalbackups.Group * @interface IMemberPendingAdminApproval * @property {Uint8Array|null} [userId] MemberPendingAdminApproval userId * @property {Long|null} [timestamp] MemberPendingAdminApproval timestamp */ /** * Constructs a new MemberPendingAdminApproval. * @memberof signalbackups.Group * @classdesc Represents a MemberPendingAdminApproval. * @implements IMemberPendingAdminApproval * @constructor * @param {signalbackups.Group.IMemberPendingAdminApproval=} [properties] Properties to set */ function MemberPendingAdminApproval(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * MemberPendingAdminApproval userId. * @member {Uint8Array} userId * @memberof signalbackups.Group.MemberPendingAdminApproval * @instance */ MemberPendingAdminApproval.prototype.userId = $util.newBuffer([]); /** * MemberPendingAdminApproval timestamp. * @member {Long} timestamp * @memberof signalbackups.Group.MemberPendingAdminApproval * @instance */ MemberPendingAdminApproval.prototype.timestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * Encodes the specified MemberPendingAdminApproval message. Does not implicitly {@link signalbackups.Group.MemberPendingAdminApproval.verify|verify} messages. * @function encode * @memberof signalbackups.Group.MemberPendingAdminApproval * @static * @param {signalbackups.Group.IMemberPendingAdminApproval} message MemberPendingAdminApproval message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ MemberPendingAdminApproval.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.Group.MemberPendingAdminApproval.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.Group.MemberPendingAdminApproval.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.userId != null && Object.hasOwnProperty.call(message, "userId")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.userId); if (message.timestamp != null && Object.hasOwnProperty.call(message, "timestamp")) writer.uint32(/* id 4, wireType 0 =*/32).uint64(message.timestamp); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified MemberPendingAdminApproval message, length delimited. Does not implicitly {@link signalbackups.Group.MemberPendingAdminApproval.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.Group.MemberPendingAdminApproval * @static * @param {signalbackups.Group.IMemberPendingAdminApproval} message MemberPendingAdminApproval message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ MemberPendingAdminApproval.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a MemberPendingAdminApproval message from the specified reader or buffer. * @function decode * @memberof signalbackups.Group.MemberPendingAdminApproval * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.Group.MemberPendingAdminApproval} MemberPendingAdminApproval * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ MemberPendingAdminApproval.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.Group.MemberPendingAdminApproval(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.userId = reader.bytes(); break; } case 4: { message.timestamp = reader.uint64(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a MemberPendingAdminApproval message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.Group.MemberPendingAdminApproval * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.Group.MemberPendingAdminApproval} MemberPendingAdminApproval * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ MemberPendingAdminApproval.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return MemberPendingAdminApproval; })(); Group.MemberBanned = (function() { /** * Properties of a MemberBanned. * @memberof signalbackups.Group * @interface IMemberBanned * @property {Uint8Array|null} [userId] MemberBanned userId * @property {Long|null} [timestamp] MemberBanned timestamp */ /** * Constructs a new MemberBanned. * @memberof signalbackups.Group * @classdesc Represents a MemberBanned. * @implements IMemberBanned * @constructor * @param {signalbackups.Group.IMemberBanned=} [properties] Properties to set */ function MemberBanned(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * MemberBanned userId. * @member {Uint8Array} userId * @memberof signalbackups.Group.MemberBanned * @instance */ MemberBanned.prototype.userId = $util.newBuffer([]); /** * MemberBanned timestamp. * @member {Long} timestamp * @memberof signalbackups.Group.MemberBanned * @instance */ MemberBanned.prototype.timestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * Encodes the specified MemberBanned message. Does not implicitly {@link signalbackups.Group.MemberBanned.verify|verify} messages. * @function encode * @memberof signalbackups.Group.MemberBanned * @static * @param {signalbackups.Group.IMemberBanned} message MemberBanned message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ MemberBanned.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.Group.MemberBanned.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.Group.MemberBanned.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.userId != null && Object.hasOwnProperty.call(message, "userId")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.userId); if (message.timestamp != null && Object.hasOwnProperty.call(message, "timestamp")) writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.timestamp); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified MemberBanned message, length delimited. Does not implicitly {@link signalbackups.Group.MemberBanned.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.Group.MemberBanned * @static * @param {signalbackups.Group.IMemberBanned} message MemberBanned message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ MemberBanned.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a MemberBanned message from the specified reader or buffer. * @function decode * @memberof signalbackups.Group.MemberBanned * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.Group.MemberBanned} MemberBanned * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ MemberBanned.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.Group.MemberBanned(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.userId = reader.bytes(); break; } case 2: { message.timestamp = reader.uint64(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a MemberBanned message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.Group.MemberBanned * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.Group.MemberBanned} MemberBanned * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ MemberBanned.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return MemberBanned; })(); Group.AccessControl = (function() { /** * Properties of an AccessControl. * @memberof signalbackups.Group * @interface IAccessControl * @property {signalbackups.Group.AccessControl.AccessRequired|null} [attributes] AccessControl attributes * @property {signalbackups.Group.AccessControl.AccessRequired|null} [members] AccessControl members * @property {signalbackups.Group.AccessControl.AccessRequired|null} [addFromInviteLink] AccessControl addFromInviteLink */ /** * Constructs a new AccessControl. * @memberof signalbackups.Group * @classdesc Represents an AccessControl. * @implements IAccessControl * @constructor * @param {signalbackups.Group.IAccessControl=} [properties] Properties to set */ function AccessControl(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * AccessControl attributes. * @member {signalbackups.Group.AccessControl.AccessRequired} attributes * @memberof signalbackups.Group.AccessControl * @instance */ AccessControl.prototype.attributes = 0; /** * AccessControl members. * @member {signalbackups.Group.AccessControl.AccessRequired} members * @memberof signalbackups.Group.AccessControl * @instance */ AccessControl.prototype.members = 0; /** * AccessControl addFromInviteLink. * @member {signalbackups.Group.AccessControl.AccessRequired} addFromInviteLink * @memberof signalbackups.Group.AccessControl * @instance */ AccessControl.prototype.addFromInviteLink = 0; /** * Encodes the specified AccessControl message. Does not implicitly {@link signalbackups.Group.AccessControl.verify|verify} messages. * @function encode * @memberof signalbackups.Group.AccessControl * @static * @param {signalbackups.Group.IAccessControl} message AccessControl message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ AccessControl.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.Group.AccessControl.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.Group.AccessControl.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.attributes != null && Object.hasOwnProperty.call(message, "attributes")) writer.uint32(/* id 1, wireType 0 =*/8).int32(message.attributes); if (message.members != null && Object.hasOwnProperty.call(message, "members")) writer.uint32(/* id 2, wireType 0 =*/16).int32(message.members); if (message.addFromInviteLink != null && Object.hasOwnProperty.call(message, "addFromInviteLink")) writer.uint32(/* id 3, wireType 0 =*/24).int32(message.addFromInviteLink); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified AccessControl message, length delimited. Does not implicitly {@link signalbackups.Group.AccessControl.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.Group.AccessControl * @static * @param {signalbackups.Group.IAccessControl} message AccessControl message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ AccessControl.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an AccessControl message from the specified reader or buffer. * @function decode * @memberof signalbackups.Group.AccessControl * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.Group.AccessControl} AccessControl * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ AccessControl.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.Group.AccessControl(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.attributes = reader.int32(); break; } case 2: { message.members = reader.int32(); break; } case 3: { message.addFromInviteLink = reader.int32(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an AccessControl message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.Group.AccessControl * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.Group.AccessControl} AccessControl * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ AccessControl.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * AccessRequired enum. * @name signalbackups.Group.AccessControl.AccessRequired * @enum {number} * @property {number} UNKNOWN=0 UNKNOWN value * @property {number} ANY=1 ANY value * @property {number} MEMBER=2 MEMBER value * @property {number} ADMINISTRATOR=3 ADMINISTRATOR value * @property {number} UNSATISFIABLE=4 UNSATISFIABLE value */ AccessControl.AccessRequired = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "UNKNOWN"] = 0; values[valuesById[1] = "ANY"] = 1; values[valuesById[2] = "MEMBER"] = 2; values[valuesById[3] = "ADMINISTRATOR"] = 3; values[valuesById[4] = "UNSATISFIABLE"] = 4; return values; })(); return AccessControl; })(); return Group; })(); signalbackups.Self = (function() { /** * Properties of a Self. * @memberof signalbackups * @interface ISelf * @property {signalbackups.AvatarColor|null} [avatarColor] Self avatarColor */ /** * Constructs a new Self. * @memberof signalbackups * @classdesc Represents a Self. * @implements ISelf * @constructor * @param {signalbackups.ISelf=} [properties] Properties to set */ function Self(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Self avatarColor. * @member {signalbackups.AvatarColor|null|undefined} avatarColor * @memberof signalbackups.Self * @instance */ Self.prototype.avatarColor = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * Self _avatarColor. * @member {"avatarColor"|undefined} _avatarColor * @memberof signalbackups.Self * @instance */ Object.defineProperty(Self.prototype, "_avatarColor", { get: $util.oneOfGetter($oneOfFields = ["avatarColor"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified Self message. Does not implicitly {@link signalbackups.Self.verify|verify} messages. * @function encode * @memberof signalbackups.Self * @static * @param {signalbackups.ISelf} message Self message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Self.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.Self.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.Self.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.avatarColor != null && Object.hasOwnProperty.call(message, "avatarColor")) writer.uint32(/* id 1, wireType 0 =*/8).int32(message.avatarColor); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Self message, length delimited. Does not implicitly {@link signalbackups.Self.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.Self * @static * @param {signalbackups.ISelf} message Self message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Self.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Self message from the specified reader or buffer. * @function decode * @memberof signalbackups.Self * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.Self} Self * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Self.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.Self(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.avatarColor = reader.int32(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Self message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.Self * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.Self} Self * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Self.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return Self; })(); signalbackups.ReleaseNotes = (function() { /** * Properties of a ReleaseNotes. * @memberof signalbackups * @interface IReleaseNotes */ /** * Constructs a new ReleaseNotes. * @memberof signalbackups * @classdesc Represents a ReleaseNotes. * @implements IReleaseNotes * @constructor * @param {signalbackups.IReleaseNotes=} [properties] Properties to set */ function ReleaseNotes(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Encodes the specified ReleaseNotes message. Does not implicitly {@link signalbackups.ReleaseNotes.verify|verify} messages. * @function encode * @memberof signalbackups.ReleaseNotes * @static * @param {signalbackups.IReleaseNotes} message ReleaseNotes message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ReleaseNotes.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.ReleaseNotes.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.ReleaseNotes.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified ReleaseNotes message, length delimited. Does not implicitly {@link signalbackups.ReleaseNotes.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.ReleaseNotes * @static * @param {signalbackups.IReleaseNotes} message ReleaseNotes message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ReleaseNotes.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a ReleaseNotes message from the specified reader or buffer. * @function decode * @memberof signalbackups.ReleaseNotes * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.ReleaseNotes} ReleaseNotes * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ReleaseNotes.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.ReleaseNotes(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a ReleaseNotes message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.ReleaseNotes * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.ReleaseNotes} ReleaseNotes * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ReleaseNotes.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return ReleaseNotes; })(); signalbackups.Chat = (function() { /** * Properties of a Chat. * @memberof signalbackups * @interface IChat * @property {Long|null} [id] Chat id * @property {Long|null} [recipientId] Chat recipientId * @property {boolean|null} [archived] Chat archived * @property {number|null} [pinnedOrder] Chat pinnedOrder * @property {Long|null} [expirationTimerMs] Chat expirationTimerMs * @property {Long|null} [muteUntilMs] Chat muteUntilMs * @property {boolean|null} [markedUnread] Chat markedUnread * @property {boolean|null} [dontNotifyForMentionsIfMuted] Chat dontNotifyForMentionsIfMuted * @property {signalbackups.IChatStyle|null} [style] Chat style * @property {number|null} [expireTimerVersion] Chat expireTimerVersion */ /** * Constructs a new Chat. * @memberof signalbackups * @classdesc Represents a Chat. * @implements IChat * @constructor * @param {signalbackups.IChat=} [properties] Properties to set */ function Chat(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Chat id. * @member {Long} id * @memberof signalbackups.Chat * @instance */ Chat.prototype.id = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * Chat recipientId. * @member {Long} recipientId * @memberof signalbackups.Chat * @instance */ Chat.prototype.recipientId = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * Chat archived. * @member {boolean} archived * @memberof signalbackups.Chat * @instance */ Chat.prototype.archived = false; /** * Chat pinnedOrder. * @member {number|null|undefined} pinnedOrder * @memberof signalbackups.Chat * @instance */ Chat.prototype.pinnedOrder = null; /** * Chat expirationTimerMs. * @member {Long|null|undefined} expirationTimerMs * @memberof signalbackups.Chat * @instance */ Chat.prototype.expirationTimerMs = null; /** * Chat muteUntilMs. * @member {Long|null|undefined} muteUntilMs * @memberof signalbackups.Chat * @instance */ Chat.prototype.muteUntilMs = null; /** * Chat markedUnread. * @member {boolean} markedUnread * @memberof signalbackups.Chat * @instance */ Chat.prototype.markedUnread = false; /** * Chat dontNotifyForMentionsIfMuted. * @member {boolean} dontNotifyForMentionsIfMuted * @memberof signalbackups.Chat * @instance */ Chat.prototype.dontNotifyForMentionsIfMuted = false; /** * Chat style. * @member {signalbackups.IChatStyle|null|undefined} style * @memberof signalbackups.Chat * @instance */ Chat.prototype.style = null; /** * Chat expireTimerVersion. * @member {number} expireTimerVersion * @memberof signalbackups.Chat * @instance */ Chat.prototype.expireTimerVersion = 0; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * Chat _pinnedOrder. * @member {"pinnedOrder"|undefined} _pinnedOrder * @memberof signalbackups.Chat * @instance */ Object.defineProperty(Chat.prototype, "_pinnedOrder", { get: $util.oneOfGetter($oneOfFields = ["pinnedOrder"]), set: $util.oneOfSetter($oneOfFields) }); /** * Chat _expirationTimerMs. * @member {"expirationTimerMs"|undefined} _expirationTimerMs * @memberof signalbackups.Chat * @instance */ Object.defineProperty(Chat.prototype, "_expirationTimerMs", { get: $util.oneOfGetter($oneOfFields = ["expirationTimerMs"]), set: $util.oneOfSetter($oneOfFields) }); /** * Chat _muteUntilMs. * @member {"muteUntilMs"|undefined} _muteUntilMs * @memberof signalbackups.Chat * @instance */ Object.defineProperty(Chat.prototype, "_muteUntilMs", { get: $util.oneOfGetter($oneOfFields = ["muteUntilMs"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified Chat message. Does not implicitly {@link signalbackups.Chat.verify|verify} messages. * @function encode * @memberof signalbackups.Chat * @static * @param {signalbackups.IChat} message Chat message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Chat.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.Chat.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.Chat.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.id != null && Object.hasOwnProperty.call(message, "id")) writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.id); if (message.recipientId != null && Object.hasOwnProperty.call(message, "recipientId")) writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.recipientId); if (message.archived != null && Object.hasOwnProperty.call(message, "archived")) writer.uint32(/* id 3, wireType 0 =*/24).bool(message.archived); if (message.pinnedOrder != null && Object.hasOwnProperty.call(message, "pinnedOrder")) writer.uint32(/* id 4, wireType 0 =*/32).uint32(message.pinnedOrder); if (message.expirationTimerMs != null && Object.hasOwnProperty.call(message, "expirationTimerMs")) writer.uint32(/* id 5, wireType 0 =*/40).uint64(message.expirationTimerMs); if (message.muteUntilMs != null && Object.hasOwnProperty.call(message, "muteUntilMs")) writer.uint32(/* id 6, wireType 0 =*/48).uint64(message.muteUntilMs); if (message.markedUnread != null && Object.hasOwnProperty.call(message, "markedUnread")) writer.uint32(/* id 7, wireType 0 =*/56).bool(message.markedUnread); if (message.dontNotifyForMentionsIfMuted != null && Object.hasOwnProperty.call(message, "dontNotifyForMentionsIfMuted")) writer.uint32(/* id 8, wireType 0 =*/64).bool(message.dontNotifyForMentionsIfMuted); if (message.style != null && Object.hasOwnProperty.call(message, "style")) $root.signalbackups.ChatStyle.encode(message.style, writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim(); if (message.expireTimerVersion != null && Object.hasOwnProperty.call(message, "expireTimerVersion")) writer.uint32(/* id 10, wireType 0 =*/80).uint32(message.expireTimerVersion); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Chat message, length delimited. Does not implicitly {@link signalbackups.Chat.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.Chat * @static * @param {signalbackups.IChat} message Chat message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Chat.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Chat message from the specified reader or buffer. * @function decode * @memberof signalbackups.Chat * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.Chat} Chat * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Chat.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.Chat(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.id = reader.uint64(); break; } case 2: { message.recipientId = reader.uint64(); break; } case 3: { message.archived = reader.bool(); break; } case 4: { message.pinnedOrder = reader.uint32(); break; } case 5: { message.expirationTimerMs = reader.uint64(); break; } case 6: { message.muteUntilMs = reader.uint64(); break; } case 7: { message.markedUnread = reader.bool(); break; } case 8: { message.dontNotifyForMentionsIfMuted = reader.bool(); break; } case 9: { message.style = $root.signalbackups.ChatStyle.decode(reader, reader.uint32()); break; } case 10: { message.expireTimerVersion = reader.uint32(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Chat message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.Chat * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.Chat} Chat * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Chat.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return Chat; })(); signalbackups.CallLink = (function() { /** * Properties of a CallLink. * @memberof signalbackups * @interface ICallLink * @property {Uint8Array|null} [rootKey] CallLink rootKey * @property {Uint8Array|null} [adminKey] CallLink adminKey * @property {string|null} [name] CallLink name * @property {signalbackups.CallLink.Restrictions|null} [restrictions] CallLink restrictions * @property {Long|null} [expirationMs] CallLink expirationMs * @property {Uint8Array|null} [epoch] CallLink epoch */ /** * Constructs a new CallLink. * @memberof signalbackups * @classdesc Call Links have some associated data including a call, but unlike other recipients * are not tied to threads because they do not have messages associated with them. * * note: * - room id can be derived from the root key * - the presence of an admin key means this user is a call admin * @implements ICallLink * @constructor * @param {signalbackups.ICallLink=} [properties] Properties to set */ function CallLink(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * CallLink rootKey. * @member {Uint8Array} rootKey * @memberof signalbackups.CallLink * @instance */ CallLink.prototype.rootKey = $util.newBuffer([]); /** * CallLink adminKey. * @member {Uint8Array|null|undefined} adminKey * @memberof signalbackups.CallLink * @instance */ CallLink.prototype.adminKey = null; /** * CallLink name. * @member {string} name * @memberof signalbackups.CallLink * @instance */ CallLink.prototype.name = ""; /** * CallLink restrictions. * @member {signalbackups.CallLink.Restrictions} restrictions * @memberof signalbackups.CallLink * @instance */ CallLink.prototype.restrictions = 0; /** * CallLink expirationMs. * @member {Long} expirationMs * @memberof signalbackups.CallLink * @instance */ CallLink.prototype.expirationMs = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * CallLink epoch. * @member {Uint8Array|null|undefined} epoch * @memberof signalbackups.CallLink * @instance */ CallLink.prototype.epoch = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * CallLink _adminKey. * @member {"adminKey"|undefined} _adminKey * @memberof signalbackups.CallLink * @instance */ Object.defineProperty(CallLink.prototype, "_adminKey", { get: $util.oneOfGetter($oneOfFields = ["adminKey"]), set: $util.oneOfSetter($oneOfFields) }); /** * CallLink _epoch. * @member {"epoch"|undefined} _epoch * @memberof signalbackups.CallLink * @instance */ Object.defineProperty(CallLink.prototype, "_epoch", { get: $util.oneOfGetter($oneOfFields = ["epoch"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified CallLink message. Does not implicitly {@link signalbackups.CallLink.verify|verify} messages. * @function encode * @memberof signalbackups.CallLink * @static * @param {signalbackups.ICallLink} message CallLink message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ CallLink.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.CallLink.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.CallLink.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.rootKey != null && Object.hasOwnProperty.call(message, "rootKey")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.rootKey); if (message.adminKey != null && Object.hasOwnProperty.call(message, "adminKey")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.adminKey); if (message.name != null && Object.hasOwnProperty.call(message, "name")) writer.uint32(/* id 3, wireType 2 =*/26).string(message.name); if (message.restrictions != null && Object.hasOwnProperty.call(message, "restrictions")) writer.uint32(/* id 4, wireType 0 =*/32).int32(message.restrictions); if (message.expirationMs != null && Object.hasOwnProperty.call(message, "expirationMs")) writer.uint32(/* id 5, wireType 0 =*/40).uint64(message.expirationMs); if (message.epoch != null && Object.hasOwnProperty.call(message, "epoch")) writer.uint32(/* id 6, wireType 2 =*/50).bytes(message.epoch); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified CallLink message, length delimited. Does not implicitly {@link signalbackups.CallLink.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.CallLink * @static * @param {signalbackups.ICallLink} message CallLink message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ CallLink.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a CallLink message from the specified reader or buffer. * @function decode * @memberof signalbackups.CallLink * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.CallLink} CallLink * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ CallLink.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.CallLink(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.rootKey = reader.bytes(); break; } case 2: { message.adminKey = reader.bytes(); break; } case 3: { message.name = reader.string(); break; } case 4: { message.restrictions = reader.int32(); break; } case 5: { message.expirationMs = reader.uint64(); break; } case 6: { message.epoch = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a CallLink message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.CallLink * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.CallLink} CallLink * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ CallLink.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * Restrictions enum. * @name signalbackups.CallLink.Restrictions * @enum {number} * @property {number} UNKNOWN=0 UNKNOWN value * @property {number} NONE=1 NONE value * @property {number} ADMIN_APPROVAL=2 ADMIN_APPROVAL value */ CallLink.Restrictions = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "UNKNOWN"] = 0; values[valuesById[1] = "NONE"] = 1; values[valuesById[2] = "ADMIN_APPROVAL"] = 2; return values; })(); return CallLink; })(); signalbackups.AdHocCall = (function() { /** * Properties of an AdHocCall. * @memberof signalbackups * @interface IAdHocCall * @property {Long|null} [callId] AdHocCall callId * @property {Long|null} [recipientId] AdHocCall recipientId * @property {signalbackups.AdHocCall.State|null} [state] AdHocCall state * @property {Long|null} [callTimestamp] AdHocCall callTimestamp */ /** * Constructs a new AdHocCall. * @memberof signalbackups * @classdesc Represents an AdHocCall. * @implements IAdHocCall * @constructor * @param {signalbackups.IAdHocCall=} [properties] Properties to set */ function AdHocCall(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * AdHocCall callId. * @member {Long} callId * @memberof signalbackups.AdHocCall * @instance */ AdHocCall.prototype.callId = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * AdHocCall recipientId. * @member {Long} recipientId * @memberof signalbackups.AdHocCall * @instance */ AdHocCall.prototype.recipientId = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * AdHocCall state. * @member {signalbackups.AdHocCall.State} state * @memberof signalbackups.AdHocCall * @instance */ AdHocCall.prototype.state = 0; /** * AdHocCall callTimestamp. * @member {Long} callTimestamp * @memberof signalbackups.AdHocCall * @instance */ AdHocCall.prototype.callTimestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * Encodes the specified AdHocCall message. Does not implicitly {@link signalbackups.AdHocCall.verify|verify} messages. * @function encode * @memberof signalbackups.AdHocCall * @static * @param {signalbackups.IAdHocCall} message AdHocCall message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ AdHocCall.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.AdHocCall.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.AdHocCall.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.callId != null && Object.hasOwnProperty.call(message, "callId")) writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.callId); if (message.recipientId != null && Object.hasOwnProperty.call(message, "recipientId")) writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.recipientId); if (message.state != null && Object.hasOwnProperty.call(message, "state")) writer.uint32(/* id 3, wireType 0 =*/24).int32(message.state); if (message.callTimestamp != null && Object.hasOwnProperty.call(message, "callTimestamp")) writer.uint32(/* id 4, wireType 0 =*/32).uint64(message.callTimestamp); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified AdHocCall message, length delimited. Does not implicitly {@link signalbackups.AdHocCall.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.AdHocCall * @static * @param {signalbackups.IAdHocCall} message AdHocCall message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ AdHocCall.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an AdHocCall message from the specified reader or buffer. * @function decode * @memberof signalbackups.AdHocCall * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.AdHocCall} AdHocCall * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ AdHocCall.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.AdHocCall(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.callId = reader.uint64(); break; } case 2: { message.recipientId = reader.uint64(); break; } case 3: { message.state = reader.int32(); break; } case 4: { message.callTimestamp = reader.uint64(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an AdHocCall message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.AdHocCall * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.AdHocCall} AdHocCall * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ AdHocCall.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * State enum. * @name signalbackups.AdHocCall.State * @enum {number} * @property {number} UNKNOWN_STATE=0 UNKNOWN_STATE value * @property {number} GENERIC=1 GENERIC value */ AdHocCall.State = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "UNKNOWN_STATE"] = 0; values[valuesById[1] = "GENERIC"] = 1; return values; })(); return AdHocCall; })(); signalbackups.DistributionListItem = (function() { /** * Properties of a DistributionListItem. * @memberof signalbackups * @interface IDistributionListItem * @property {Uint8Array|null} [distributionId] DistributionListItem distributionId * @property {Long|null} [deletionTimestamp] DistributionListItem deletionTimestamp * @property {signalbackups.IDistributionList|null} [distributionList] DistributionListItem distributionList */ /** * Constructs a new DistributionListItem. * @memberof signalbackups * @classdesc Represents a DistributionListItem. * @implements IDistributionListItem * @constructor * @param {signalbackups.IDistributionListItem=} [properties] Properties to set */ function DistributionListItem(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * DistributionListItem distributionId. * @member {Uint8Array} distributionId * @memberof signalbackups.DistributionListItem * @instance */ DistributionListItem.prototype.distributionId = $util.newBuffer([]); /** * DistributionListItem deletionTimestamp. * @member {Long|null|undefined} deletionTimestamp * @memberof signalbackups.DistributionListItem * @instance */ DistributionListItem.prototype.deletionTimestamp = null; /** * DistributionListItem distributionList. * @member {signalbackups.IDistributionList|null|undefined} distributionList * @memberof signalbackups.DistributionListItem * @instance */ DistributionListItem.prototype.distributionList = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * DistributionListItem item. * @member {"deletionTimestamp"|"distributionList"|undefined} item * @memberof signalbackups.DistributionListItem * @instance */ Object.defineProperty(DistributionListItem.prototype, "item", { get: $util.oneOfGetter($oneOfFields = ["deletionTimestamp", "distributionList"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified DistributionListItem message. Does not implicitly {@link signalbackups.DistributionListItem.verify|verify} messages. * @function encode * @memberof signalbackups.DistributionListItem * @static * @param {signalbackups.IDistributionListItem} message DistributionListItem message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ DistributionListItem.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.DistributionListItem.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.DistributionListItem.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.distributionId != null && Object.hasOwnProperty.call(message, "distributionId")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.distributionId); if (message.deletionTimestamp != null && Object.hasOwnProperty.call(message, "deletionTimestamp")) writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.deletionTimestamp); if (message.distributionList != null && Object.hasOwnProperty.call(message, "distributionList")) $root.signalbackups.DistributionList.encode(message.distributionList, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified DistributionListItem message, length delimited. Does not implicitly {@link signalbackups.DistributionListItem.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.DistributionListItem * @static * @param {signalbackups.IDistributionListItem} message DistributionListItem message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ DistributionListItem.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a DistributionListItem message from the specified reader or buffer. * @function decode * @memberof signalbackups.DistributionListItem * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.DistributionListItem} DistributionListItem * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ DistributionListItem.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.DistributionListItem(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.distributionId = reader.bytes(); break; } case 2: { message.deletionTimestamp = reader.uint64(); break; } case 3: { message.distributionList = $root.signalbackups.DistributionList.decode(reader, reader.uint32()); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a DistributionListItem message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.DistributionListItem * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.DistributionListItem} DistributionListItem * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ DistributionListItem.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return DistributionListItem; })(); signalbackups.DistributionList = (function() { /** * Properties of a DistributionList. * @memberof signalbackups * @interface IDistributionList * @property {string|null} [name] DistributionList name * @property {boolean|null} [allowReplies] DistributionList allowReplies * @property {signalbackups.DistributionList.PrivacyMode|null} [privacyMode] DistributionList privacyMode * @property {Array.|null} [memberRecipientIds] DistributionList memberRecipientIds */ /** * Constructs a new DistributionList. * @memberof signalbackups * @classdesc Represents a DistributionList. * @implements IDistributionList * @constructor * @param {signalbackups.IDistributionList=} [properties] Properties to set */ function DistributionList(properties) { this.memberRecipientIds = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * DistributionList name. * @member {string} name * @memberof signalbackups.DistributionList * @instance */ DistributionList.prototype.name = ""; /** * DistributionList allowReplies. * @member {boolean} allowReplies * @memberof signalbackups.DistributionList * @instance */ DistributionList.prototype.allowReplies = false; /** * DistributionList privacyMode. * @member {signalbackups.DistributionList.PrivacyMode} privacyMode * @memberof signalbackups.DistributionList * @instance */ DistributionList.prototype.privacyMode = 0; /** * DistributionList memberRecipientIds. * @member {Array.} memberRecipientIds * @memberof signalbackups.DistributionList * @instance */ DistributionList.prototype.memberRecipientIds = $util.emptyArray; /** * Encodes the specified DistributionList message. Does not implicitly {@link signalbackups.DistributionList.verify|verify} messages. * @function encode * @memberof signalbackups.DistributionList * @static * @param {signalbackups.IDistributionList} message DistributionList message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ DistributionList.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.DistributionList.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.DistributionList.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.name != null && Object.hasOwnProperty.call(message, "name")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.name); if (message.allowReplies != null && Object.hasOwnProperty.call(message, "allowReplies")) writer.uint32(/* id 2, wireType 0 =*/16).bool(message.allowReplies); if (message.privacyMode != null && Object.hasOwnProperty.call(message, "privacyMode")) writer.uint32(/* id 3, wireType 0 =*/24).int32(message.privacyMode); if (message.memberRecipientIds != null && message.memberRecipientIds.length) { writer.uint32(/* id 4, wireType 2 =*/34).fork(); for (var i = 0; i < message.memberRecipientIds.length; ++i) writer.uint64(message.memberRecipientIds[i]); writer.ldelim(); } for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified DistributionList message, length delimited. Does not implicitly {@link signalbackups.DistributionList.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.DistributionList * @static * @param {signalbackups.IDistributionList} message DistributionList message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ DistributionList.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a DistributionList message from the specified reader or buffer. * @function decode * @memberof signalbackups.DistributionList * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.DistributionList} DistributionList * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ DistributionList.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.DistributionList(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.name = reader.string(); break; } case 2: { message.allowReplies = reader.bool(); break; } case 3: { message.privacyMode = reader.int32(); break; } case 4: { if (!(message.memberRecipientIds && message.memberRecipientIds.length)) message.memberRecipientIds = []; if ((tag & 7) === 2) { var end2 = reader.uint32() + reader.pos; while (reader.pos < end2) message.memberRecipientIds.push(reader.uint64()); } else message.memberRecipientIds.push(reader.uint64()); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a DistributionList message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.DistributionList * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.DistributionList} DistributionList * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ DistributionList.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * PrivacyMode enum. * @name signalbackups.DistributionList.PrivacyMode * @enum {number} * @property {number} UNKNOWN=0 UNKNOWN value * @property {number} ONLY_WITH=1 ONLY_WITH value * @property {number} ALL_EXCEPT=2 ALL_EXCEPT value * @property {number} ALL=3 ALL value */ DistributionList.PrivacyMode = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "UNKNOWN"] = 0; values[valuesById[1] = "ONLY_WITH"] = 1; values[valuesById[2] = "ALL_EXCEPT"] = 2; values[valuesById[3] = "ALL"] = 3; return values; })(); return DistributionList; })(); signalbackups.ChatItem = (function() { /** * Properties of a ChatItem. * @memberof signalbackups * @interface IChatItem * @property {Long|null} [chatId] ChatItem chatId * @property {Long|null} [authorId] ChatItem authorId * @property {Long|null} [dateSent] ChatItem dateSent * @property {Long|null} [expireStartDate] ChatItem expireStartDate * @property {Long|null} [expiresInMs] ChatItem expiresInMs * @property {Array.|null} [revisions] ChatItem revisions * @property {boolean|null} [sms] ChatItem sms * @property {signalbackups.ChatItem.IIncomingMessageDetails|null} [incoming] ChatItem incoming * @property {signalbackups.ChatItem.IOutgoingMessageDetails|null} [outgoing] ChatItem outgoing * @property {signalbackups.ChatItem.IDirectionlessMessageDetails|null} [directionless] ChatItem directionless * @property {signalbackups.IStandardMessage|null} [standardMessage] ChatItem standardMessage * @property {signalbackups.IContactMessage|null} [contactMessage] ChatItem contactMessage * @property {signalbackups.IStickerMessage|null} [stickerMessage] ChatItem stickerMessage * @property {signalbackups.IRemoteDeletedMessage|null} [remoteDeletedMessage] ChatItem remoteDeletedMessage * @property {signalbackups.IChatUpdateMessage|null} [updateMessage] ChatItem updateMessage * @property {signalbackups.IPaymentNotification|null} [paymentNotification] ChatItem paymentNotification * @property {signalbackups.IGiftBadge|null} [giftBadge] ChatItem giftBadge * @property {signalbackups.IViewOnceMessage|null} [viewOnceMessage] ChatItem viewOnceMessage * @property {signalbackups.IDirectStoryReplyMessage|null} [directStoryReplyMessage] ChatItem directStoryReplyMessage * @property {signalbackups.IPoll|null} [poll] ChatItem poll * @property {signalbackups.ChatItem.IPinDetails|null} [pinDetails] ChatItem pinDetails */ /** * Constructs a new ChatItem. * @memberof signalbackups * @classdesc Represents a ChatItem. * @implements IChatItem * @constructor * @param {signalbackups.IChatItem=} [properties] Properties to set */ function ChatItem(properties) { this.revisions = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * ChatItem chatId. * @member {Long} chatId * @memberof signalbackups.ChatItem * @instance */ ChatItem.prototype.chatId = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * ChatItem authorId. * @member {Long} authorId * @memberof signalbackups.ChatItem * @instance */ ChatItem.prototype.authorId = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * ChatItem dateSent. * @member {Long} dateSent * @memberof signalbackups.ChatItem * @instance */ ChatItem.prototype.dateSent = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * ChatItem expireStartDate. * @member {Long|null|undefined} expireStartDate * @memberof signalbackups.ChatItem * @instance */ ChatItem.prototype.expireStartDate = null; /** * ChatItem expiresInMs. * @member {Long|null|undefined} expiresInMs * @memberof signalbackups.ChatItem * @instance */ ChatItem.prototype.expiresInMs = null; /** * ChatItem revisions. * @member {Array.} revisions * @memberof signalbackups.ChatItem * @instance */ ChatItem.prototype.revisions = $util.emptyArray; /** * ChatItem sms. * @member {boolean} sms * @memberof signalbackups.ChatItem * @instance */ ChatItem.prototype.sms = false; /** * ChatItem incoming. * @member {signalbackups.ChatItem.IIncomingMessageDetails|null|undefined} incoming * @memberof signalbackups.ChatItem * @instance */ ChatItem.prototype.incoming = null; /** * ChatItem outgoing. * @member {signalbackups.ChatItem.IOutgoingMessageDetails|null|undefined} outgoing * @memberof signalbackups.ChatItem * @instance */ ChatItem.prototype.outgoing = null; /** * ChatItem directionless. * @member {signalbackups.ChatItem.IDirectionlessMessageDetails|null|undefined} directionless * @memberof signalbackups.ChatItem * @instance */ ChatItem.prototype.directionless = null; /** * ChatItem standardMessage. * @member {signalbackups.IStandardMessage|null|undefined} standardMessage * @memberof signalbackups.ChatItem * @instance */ ChatItem.prototype.standardMessage = null; /** * ChatItem contactMessage. * @member {signalbackups.IContactMessage|null|undefined} contactMessage * @memberof signalbackups.ChatItem * @instance */ ChatItem.prototype.contactMessage = null; /** * ChatItem stickerMessage. * @member {signalbackups.IStickerMessage|null|undefined} stickerMessage * @memberof signalbackups.ChatItem * @instance */ ChatItem.prototype.stickerMessage = null; /** * ChatItem remoteDeletedMessage. * @member {signalbackups.IRemoteDeletedMessage|null|undefined} remoteDeletedMessage * @memberof signalbackups.ChatItem * @instance */ ChatItem.prototype.remoteDeletedMessage = null; /** * ChatItem updateMessage. * @member {signalbackups.IChatUpdateMessage|null|undefined} updateMessage * @memberof signalbackups.ChatItem * @instance */ ChatItem.prototype.updateMessage = null; /** * ChatItem paymentNotification. * @member {signalbackups.IPaymentNotification|null|undefined} paymentNotification * @memberof signalbackups.ChatItem * @instance */ ChatItem.prototype.paymentNotification = null; /** * ChatItem giftBadge. * @member {signalbackups.IGiftBadge|null|undefined} giftBadge * @memberof signalbackups.ChatItem * @instance */ ChatItem.prototype.giftBadge = null; /** * ChatItem viewOnceMessage. * @member {signalbackups.IViewOnceMessage|null|undefined} viewOnceMessage * @memberof signalbackups.ChatItem * @instance */ ChatItem.prototype.viewOnceMessage = null; /** * ChatItem directStoryReplyMessage. * @member {signalbackups.IDirectStoryReplyMessage|null|undefined} directStoryReplyMessage * @memberof signalbackups.ChatItem * @instance */ ChatItem.prototype.directStoryReplyMessage = null; /** * ChatItem poll. * @member {signalbackups.IPoll|null|undefined} poll * @memberof signalbackups.ChatItem * @instance */ ChatItem.prototype.poll = null; /** * ChatItem pinDetails. * @member {signalbackups.ChatItem.IPinDetails|null|undefined} pinDetails * @memberof signalbackups.ChatItem * @instance */ ChatItem.prototype.pinDetails = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * ChatItem _expireStartDate. * @member {"expireStartDate"|undefined} _expireStartDate * @memberof signalbackups.ChatItem * @instance */ Object.defineProperty(ChatItem.prototype, "_expireStartDate", { get: $util.oneOfGetter($oneOfFields = ["expireStartDate"]), set: $util.oneOfSetter($oneOfFields) }); /** * ChatItem _expiresInMs. * @member {"expiresInMs"|undefined} _expiresInMs * @memberof signalbackups.ChatItem * @instance */ Object.defineProperty(ChatItem.prototype, "_expiresInMs", { get: $util.oneOfGetter($oneOfFields = ["expiresInMs"]), set: $util.oneOfSetter($oneOfFields) }); /** * ChatItem directionalDetails. * @member {"incoming"|"outgoing"|"directionless"|undefined} directionalDetails * @memberof signalbackups.ChatItem * @instance */ Object.defineProperty(ChatItem.prototype, "directionalDetails", { get: $util.oneOfGetter($oneOfFields = ["incoming", "outgoing", "directionless"]), set: $util.oneOfSetter($oneOfFields) }); /** * ChatItem item. * @member {"standardMessage"|"contactMessage"|"stickerMessage"|"remoteDeletedMessage"|"updateMessage"|"paymentNotification"|"giftBadge"|"viewOnceMessage"|"directStoryReplyMessage"|"poll"|undefined} item * @memberof signalbackups.ChatItem * @instance */ Object.defineProperty(ChatItem.prototype, "item", { get: $util.oneOfGetter($oneOfFields = ["standardMessage", "contactMessage", "stickerMessage", "remoteDeletedMessage", "updateMessage", "paymentNotification", "giftBadge", "viewOnceMessage", "directStoryReplyMessage", "poll"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified ChatItem message. Does not implicitly {@link signalbackups.ChatItem.verify|verify} messages. * @function encode * @memberof signalbackups.ChatItem * @static * @param {signalbackups.IChatItem} message ChatItem message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ChatItem.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.ChatItem.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.ChatItem.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.chatId != null && Object.hasOwnProperty.call(message, "chatId")) writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.chatId); if (message.authorId != null && Object.hasOwnProperty.call(message, "authorId")) writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.authorId); if (message.dateSent != null && Object.hasOwnProperty.call(message, "dateSent")) writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.dateSent); if (message.expireStartDate != null && Object.hasOwnProperty.call(message, "expireStartDate")) writer.uint32(/* id 4, wireType 0 =*/32).uint64(message.expireStartDate); if (message.expiresInMs != null && Object.hasOwnProperty.call(message, "expiresInMs")) writer.uint32(/* id 5, wireType 0 =*/40).uint64(message.expiresInMs); if (message.revisions != null && message.revisions.length) for (var i = 0; i < message.revisions.length; ++i) $root.signalbackups.ChatItem.encode(message.revisions[i], writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim(); if (message.sms != null && Object.hasOwnProperty.call(message, "sms")) writer.uint32(/* id 7, wireType 0 =*/56).bool(message.sms); if (message.incoming != null && Object.hasOwnProperty.call(message, "incoming")) $root.signalbackups.ChatItem.IncomingMessageDetails.encode(message.incoming, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim(); if (message.outgoing != null && Object.hasOwnProperty.call(message, "outgoing")) $root.signalbackups.ChatItem.OutgoingMessageDetails.encode(message.outgoing, writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim(); if (message.directionless != null && Object.hasOwnProperty.call(message, "directionless")) $root.signalbackups.ChatItem.DirectionlessMessageDetails.encode(message.directionless, writer.uint32(/* id 10, wireType 2 =*/82).fork()).ldelim(); if (message.standardMessage != null && Object.hasOwnProperty.call(message, "standardMessage")) $root.signalbackups.StandardMessage.encode(message.standardMessage, writer.uint32(/* id 11, wireType 2 =*/90).fork()).ldelim(); if (message.contactMessage != null && Object.hasOwnProperty.call(message, "contactMessage")) $root.signalbackups.ContactMessage.encode(message.contactMessage, writer.uint32(/* id 12, wireType 2 =*/98).fork()).ldelim(); if (message.stickerMessage != null && Object.hasOwnProperty.call(message, "stickerMessage")) $root.signalbackups.StickerMessage.encode(message.stickerMessage, writer.uint32(/* id 13, wireType 2 =*/106).fork()).ldelim(); if (message.remoteDeletedMessage != null && Object.hasOwnProperty.call(message, "remoteDeletedMessage")) $root.signalbackups.RemoteDeletedMessage.encode(message.remoteDeletedMessage, writer.uint32(/* id 14, wireType 2 =*/114).fork()).ldelim(); if (message.updateMessage != null && Object.hasOwnProperty.call(message, "updateMessage")) $root.signalbackups.ChatUpdateMessage.encode(message.updateMessage, writer.uint32(/* id 15, wireType 2 =*/122).fork()).ldelim(); if (message.paymentNotification != null && Object.hasOwnProperty.call(message, "paymentNotification")) $root.signalbackups.PaymentNotification.encode(message.paymentNotification, writer.uint32(/* id 16, wireType 2 =*/130).fork()).ldelim(); if (message.giftBadge != null && Object.hasOwnProperty.call(message, "giftBadge")) $root.signalbackups.GiftBadge.encode(message.giftBadge, writer.uint32(/* id 17, wireType 2 =*/138).fork()).ldelim(); if (message.viewOnceMessage != null && Object.hasOwnProperty.call(message, "viewOnceMessage")) $root.signalbackups.ViewOnceMessage.encode(message.viewOnceMessage, writer.uint32(/* id 18, wireType 2 =*/146).fork()).ldelim(); if (message.directStoryReplyMessage != null && Object.hasOwnProperty.call(message, "directStoryReplyMessage")) $root.signalbackups.DirectStoryReplyMessage.encode(message.directStoryReplyMessage, writer.uint32(/* id 19, wireType 2 =*/154).fork()).ldelim(); if (message.poll != null && Object.hasOwnProperty.call(message, "poll")) $root.signalbackups.Poll.encode(message.poll, writer.uint32(/* id 20, wireType 2 =*/162).fork()).ldelim(); if (message.pinDetails != null && Object.hasOwnProperty.call(message, "pinDetails")) $root.signalbackups.ChatItem.PinDetails.encode(message.pinDetails, writer.uint32(/* id 21, wireType 2 =*/170).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified ChatItem message, length delimited. Does not implicitly {@link signalbackups.ChatItem.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.ChatItem * @static * @param {signalbackups.IChatItem} message ChatItem message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ChatItem.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a ChatItem message from the specified reader or buffer. * @function decode * @memberof signalbackups.ChatItem * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.ChatItem} ChatItem * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ChatItem.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.ChatItem(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.chatId = reader.uint64(); break; } case 2: { message.authorId = reader.uint64(); break; } case 3: { message.dateSent = reader.uint64(); break; } case 4: { message.expireStartDate = reader.uint64(); break; } case 5: { message.expiresInMs = reader.uint64(); break; } case 6: { if (!(message.revisions && message.revisions.length)) message.revisions = []; message.revisions.push($root.signalbackups.ChatItem.decode(reader, reader.uint32())); break; } case 7: { message.sms = reader.bool(); break; } case 8: { message.incoming = $root.signalbackups.ChatItem.IncomingMessageDetails.decode(reader, reader.uint32()); break; } case 9: { message.outgoing = $root.signalbackups.ChatItem.OutgoingMessageDetails.decode(reader, reader.uint32()); break; } case 10: { message.directionless = $root.signalbackups.ChatItem.DirectionlessMessageDetails.decode(reader, reader.uint32()); break; } case 11: { message.standardMessage = $root.signalbackups.StandardMessage.decode(reader, reader.uint32()); break; } case 12: { message.contactMessage = $root.signalbackups.ContactMessage.decode(reader, reader.uint32()); break; } case 13: { message.stickerMessage = $root.signalbackups.StickerMessage.decode(reader, reader.uint32()); break; } case 14: { message.remoteDeletedMessage = $root.signalbackups.RemoteDeletedMessage.decode(reader, reader.uint32()); break; } case 15: { message.updateMessage = $root.signalbackups.ChatUpdateMessage.decode(reader, reader.uint32()); break; } case 16: { message.paymentNotification = $root.signalbackups.PaymentNotification.decode(reader, reader.uint32()); break; } case 17: { message.giftBadge = $root.signalbackups.GiftBadge.decode(reader, reader.uint32()); break; } case 18: { message.viewOnceMessage = $root.signalbackups.ViewOnceMessage.decode(reader, reader.uint32()); break; } case 19: { message.directStoryReplyMessage = $root.signalbackups.DirectStoryReplyMessage.decode(reader, reader.uint32()); break; } case 20: { message.poll = $root.signalbackups.Poll.decode(reader, reader.uint32()); break; } case 21: { message.pinDetails = $root.signalbackups.ChatItem.PinDetails.decode(reader, reader.uint32()); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a ChatItem message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.ChatItem * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.ChatItem} ChatItem * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ChatItem.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; ChatItem.IncomingMessageDetails = (function() { /** * Properties of an IncomingMessageDetails. * @memberof signalbackups.ChatItem * @interface IIncomingMessageDetails * @property {Long|null} [dateReceived] IncomingMessageDetails dateReceived * @property {Long|null} [dateServerSent] IncomingMessageDetails dateServerSent * @property {boolean|null} [read] IncomingMessageDetails read * @property {boolean|null} [sealedSender] IncomingMessageDetails sealedSender */ /** * Constructs a new IncomingMessageDetails. * @memberof signalbackups.ChatItem * @classdesc Represents an IncomingMessageDetails. * @implements IIncomingMessageDetails * @constructor * @param {signalbackups.ChatItem.IIncomingMessageDetails=} [properties] Properties to set */ function IncomingMessageDetails(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * IncomingMessageDetails dateReceived. * @member {Long} dateReceived * @memberof signalbackups.ChatItem.IncomingMessageDetails * @instance */ IncomingMessageDetails.prototype.dateReceived = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * IncomingMessageDetails dateServerSent. * @member {Long|null|undefined} dateServerSent * @memberof signalbackups.ChatItem.IncomingMessageDetails * @instance */ IncomingMessageDetails.prototype.dateServerSent = null; /** * IncomingMessageDetails read. * @member {boolean} read * @memberof signalbackups.ChatItem.IncomingMessageDetails * @instance */ IncomingMessageDetails.prototype.read = false; /** * IncomingMessageDetails sealedSender. * @member {boolean} sealedSender * @memberof signalbackups.ChatItem.IncomingMessageDetails * @instance */ IncomingMessageDetails.prototype.sealedSender = false; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * IncomingMessageDetails _dateServerSent. * @member {"dateServerSent"|undefined} _dateServerSent * @memberof signalbackups.ChatItem.IncomingMessageDetails * @instance */ Object.defineProperty(IncomingMessageDetails.prototype, "_dateServerSent", { get: $util.oneOfGetter($oneOfFields = ["dateServerSent"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified IncomingMessageDetails message. Does not implicitly {@link signalbackups.ChatItem.IncomingMessageDetails.verify|verify} messages. * @function encode * @memberof signalbackups.ChatItem.IncomingMessageDetails * @static * @param {signalbackups.ChatItem.IIncomingMessageDetails} message IncomingMessageDetails message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ IncomingMessageDetails.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.ChatItem.IncomingMessageDetails.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.ChatItem.IncomingMessageDetails.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.dateReceived != null && Object.hasOwnProperty.call(message, "dateReceived")) writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.dateReceived); if (message.dateServerSent != null && Object.hasOwnProperty.call(message, "dateServerSent")) writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.dateServerSent); if (message.read != null && Object.hasOwnProperty.call(message, "read")) writer.uint32(/* id 3, wireType 0 =*/24).bool(message.read); if (message.sealedSender != null && Object.hasOwnProperty.call(message, "sealedSender")) writer.uint32(/* id 4, wireType 0 =*/32).bool(message.sealedSender); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified IncomingMessageDetails message, length delimited. Does not implicitly {@link signalbackups.ChatItem.IncomingMessageDetails.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.ChatItem.IncomingMessageDetails * @static * @param {signalbackups.ChatItem.IIncomingMessageDetails} message IncomingMessageDetails message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ IncomingMessageDetails.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an IncomingMessageDetails message from the specified reader or buffer. * @function decode * @memberof signalbackups.ChatItem.IncomingMessageDetails * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.ChatItem.IncomingMessageDetails} IncomingMessageDetails * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ IncomingMessageDetails.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.ChatItem.IncomingMessageDetails(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.dateReceived = reader.uint64(); break; } case 2: { message.dateServerSent = reader.uint64(); break; } case 3: { message.read = reader.bool(); break; } case 4: { message.sealedSender = reader.bool(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an IncomingMessageDetails message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.ChatItem.IncomingMessageDetails * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.ChatItem.IncomingMessageDetails} IncomingMessageDetails * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ IncomingMessageDetails.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return IncomingMessageDetails; })(); ChatItem.OutgoingMessageDetails = (function() { /** * Properties of an OutgoingMessageDetails. * @memberof signalbackups.ChatItem * @interface IOutgoingMessageDetails * @property {Array.|null} [sendStatus] OutgoingMessageDetails sendStatus * @property {Long|null} [dateReceived] OutgoingMessageDetails dateReceived */ /** * Constructs a new OutgoingMessageDetails. * @memberof signalbackups.ChatItem * @classdesc Represents an OutgoingMessageDetails. * @implements IOutgoingMessageDetails * @constructor * @param {signalbackups.ChatItem.IOutgoingMessageDetails=} [properties] Properties to set */ function OutgoingMessageDetails(properties) { this.sendStatus = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * OutgoingMessageDetails sendStatus. * @member {Array.} sendStatus * @memberof signalbackups.ChatItem.OutgoingMessageDetails * @instance */ OutgoingMessageDetails.prototype.sendStatus = $util.emptyArray; /** * OutgoingMessageDetails dateReceived. * @member {Long} dateReceived * @memberof signalbackups.ChatItem.OutgoingMessageDetails * @instance */ OutgoingMessageDetails.prototype.dateReceived = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * Encodes the specified OutgoingMessageDetails message. Does not implicitly {@link signalbackups.ChatItem.OutgoingMessageDetails.verify|verify} messages. * @function encode * @memberof signalbackups.ChatItem.OutgoingMessageDetails * @static * @param {signalbackups.ChatItem.IOutgoingMessageDetails} message OutgoingMessageDetails message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ OutgoingMessageDetails.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.ChatItem.OutgoingMessageDetails.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.ChatItem.OutgoingMessageDetails.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.sendStatus != null && message.sendStatus.length) for (var i = 0; i < message.sendStatus.length; ++i) $root.signalbackups.SendStatus.encode(message.sendStatus[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.dateReceived != null && Object.hasOwnProperty.call(message, "dateReceived")) writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.dateReceived); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified OutgoingMessageDetails message, length delimited. Does not implicitly {@link signalbackups.ChatItem.OutgoingMessageDetails.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.ChatItem.OutgoingMessageDetails * @static * @param {signalbackups.ChatItem.IOutgoingMessageDetails} message OutgoingMessageDetails message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ OutgoingMessageDetails.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an OutgoingMessageDetails message from the specified reader or buffer. * @function decode * @memberof signalbackups.ChatItem.OutgoingMessageDetails * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.ChatItem.OutgoingMessageDetails} OutgoingMessageDetails * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ OutgoingMessageDetails.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.ChatItem.OutgoingMessageDetails(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { if (!(message.sendStatus && message.sendStatus.length)) message.sendStatus = []; message.sendStatus.push($root.signalbackups.SendStatus.decode(reader, reader.uint32())); break; } case 2: { message.dateReceived = reader.uint64(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an OutgoingMessageDetails message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.ChatItem.OutgoingMessageDetails * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.ChatItem.OutgoingMessageDetails} OutgoingMessageDetails * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ OutgoingMessageDetails.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return OutgoingMessageDetails; })(); ChatItem.DirectionlessMessageDetails = (function() { /** * Properties of a DirectionlessMessageDetails. * @memberof signalbackups.ChatItem * @interface IDirectionlessMessageDetails */ /** * Constructs a new DirectionlessMessageDetails. * @memberof signalbackups.ChatItem * @classdesc Represents a DirectionlessMessageDetails. * @implements IDirectionlessMessageDetails * @constructor * @param {signalbackups.ChatItem.IDirectionlessMessageDetails=} [properties] Properties to set */ function DirectionlessMessageDetails(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Encodes the specified DirectionlessMessageDetails message. Does not implicitly {@link signalbackups.ChatItem.DirectionlessMessageDetails.verify|verify} messages. * @function encode * @memberof signalbackups.ChatItem.DirectionlessMessageDetails * @static * @param {signalbackups.ChatItem.IDirectionlessMessageDetails} message DirectionlessMessageDetails message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ DirectionlessMessageDetails.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.ChatItem.DirectionlessMessageDetails.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.ChatItem.DirectionlessMessageDetails.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified DirectionlessMessageDetails message, length delimited. Does not implicitly {@link signalbackups.ChatItem.DirectionlessMessageDetails.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.ChatItem.DirectionlessMessageDetails * @static * @param {signalbackups.ChatItem.IDirectionlessMessageDetails} message DirectionlessMessageDetails message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ DirectionlessMessageDetails.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a DirectionlessMessageDetails message from the specified reader or buffer. * @function decode * @memberof signalbackups.ChatItem.DirectionlessMessageDetails * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.ChatItem.DirectionlessMessageDetails} DirectionlessMessageDetails * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ DirectionlessMessageDetails.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.ChatItem.DirectionlessMessageDetails(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a DirectionlessMessageDetails message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.ChatItem.DirectionlessMessageDetails * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.ChatItem.DirectionlessMessageDetails} DirectionlessMessageDetails * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ DirectionlessMessageDetails.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return DirectionlessMessageDetails; })(); ChatItem.PinDetails = (function() { /** * Properties of a PinDetails. * @memberof signalbackups.ChatItem * @interface IPinDetails * @property {Long|null} [pinnedAtTimestamp] PinDetails pinnedAtTimestamp * @property {Long|null} [pinExpiresAtTimestamp] PinDetails pinExpiresAtTimestamp * @property {boolean|null} [pinNeverExpires] PinDetails pinNeverExpires */ /** * Constructs a new PinDetails. * @memberof signalbackups.ChatItem * @classdesc Represents a PinDetails. * @implements IPinDetails * @constructor * @param {signalbackups.ChatItem.IPinDetails=} [properties] Properties to set */ function PinDetails(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * PinDetails pinnedAtTimestamp. * @member {Long} pinnedAtTimestamp * @memberof signalbackups.ChatItem.PinDetails * @instance */ PinDetails.prototype.pinnedAtTimestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * PinDetails pinExpiresAtTimestamp. * @member {Long|null|undefined} pinExpiresAtTimestamp * @memberof signalbackups.ChatItem.PinDetails * @instance */ PinDetails.prototype.pinExpiresAtTimestamp = null; /** * PinDetails pinNeverExpires. * @member {boolean|null|undefined} pinNeverExpires * @memberof signalbackups.ChatItem.PinDetails * @instance */ PinDetails.prototype.pinNeverExpires = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * PinDetails pinExpiry. * @member {"pinExpiresAtTimestamp"|"pinNeverExpires"|undefined} pinExpiry * @memberof signalbackups.ChatItem.PinDetails * @instance */ Object.defineProperty(PinDetails.prototype, "pinExpiry", { get: $util.oneOfGetter($oneOfFields = ["pinExpiresAtTimestamp", "pinNeverExpires"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified PinDetails message. Does not implicitly {@link signalbackups.ChatItem.PinDetails.verify|verify} messages. * @function encode * @memberof signalbackups.ChatItem.PinDetails * @static * @param {signalbackups.ChatItem.IPinDetails} message PinDetails message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ PinDetails.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.ChatItem.PinDetails.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.ChatItem.PinDetails.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.pinnedAtTimestamp != null && Object.hasOwnProperty.call(message, "pinnedAtTimestamp")) writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.pinnedAtTimestamp); if (message.pinExpiresAtTimestamp != null && Object.hasOwnProperty.call(message, "pinExpiresAtTimestamp")) writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.pinExpiresAtTimestamp); if (message.pinNeverExpires != null && Object.hasOwnProperty.call(message, "pinNeverExpires")) writer.uint32(/* id 3, wireType 0 =*/24).bool(message.pinNeverExpires); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified PinDetails message, length delimited. Does not implicitly {@link signalbackups.ChatItem.PinDetails.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.ChatItem.PinDetails * @static * @param {signalbackups.ChatItem.IPinDetails} message PinDetails message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ PinDetails.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a PinDetails message from the specified reader or buffer. * @function decode * @memberof signalbackups.ChatItem.PinDetails * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.ChatItem.PinDetails} PinDetails * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ PinDetails.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.ChatItem.PinDetails(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.pinnedAtTimestamp = reader.uint64(); break; } case 2: { message.pinExpiresAtTimestamp = reader.uint64(); break; } case 3: { message.pinNeverExpires = reader.bool(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a PinDetails message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.ChatItem.PinDetails * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.ChatItem.PinDetails} PinDetails * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ PinDetails.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return PinDetails; })(); return ChatItem; })(); signalbackups.SendStatus = (function() { /** * Properties of a SendStatus. * @memberof signalbackups * @interface ISendStatus * @property {Long|null} [recipientId] SendStatus recipientId * @property {Long|null} [timestamp] SendStatus timestamp * @property {signalbackups.SendStatus.IPending|null} [pending] SendStatus pending * @property {signalbackups.SendStatus.ISent|null} [sent] SendStatus sent * @property {signalbackups.SendStatus.IDelivered|null} [delivered] SendStatus delivered * @property {signalbackups.SendStatus.IRead|null} [read] SendStatus read * @property {signalbackups.SendStatus.IViewed|null} [viewed] SendStatus viewed * @property {signalbackups.SendStatus.ISkipped|null} [skipped] SendStatus skipped * @property {signalbackups.SendStatus.IFailed|null} [failed] SendStatus failed */ /** * Constructs a new SendStatus. * @memberof signalbackups * @classdesc Represents a SendStatus. * @implements ISendStatus * @constructor * @param {signalbackups.ISendStatus=} [properties] Properties to set */ function SendStatus(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * SendStatus recipientId. * @member {Long} recipientId * @memberof signalbackups.SendStatus * @instance */ SendStatus.prototype.recipientId = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * SendStatus timestamp. * @member {Long} timestamp * @memberof signalbackups.SendStatus * @instance */ SendStatus.prototype.timestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * SendStatus pending. * @member {signalbackups.SendStatus.IPending|null|undefined} pending * @memberof signalbackups.SendStatus * @instance */ SendStatus.prototype.pending = null; /** * SendStatus sent. * @member {signalbackups.SendStatus.ISent|null|undefined} sent * @memberof signalbackups.SendStatus * @instance */ SendStatus.prototype.sent = null; /** * SendStatus delivered. * @member {signalbackups.SendStatus.IDelivered|null|undefined} delivered * @memberof signalbackups.SendStatus * @instance */ SendStatus.prototype.delivered = null; /** * SendStatus read. * @member {signalbackups.SendStatus.IRead|null|undefined} read * @memberof signalbackups.SendStatus * @instance */ SendStatus.prototype.read = null; /** * SendStatus viewed. * @member {signalbackups.SendStatus.IViewed|null|undefined} viewed * @memberof signalbackups.SendStatus * @instance */ SendStatus.prototype.viewed = null; /** * SendStatus skipped. * @member {signalbackups.SendStatus.ISkipped|null|undefined} skipped * @memberof signalbackups.SendStatus * @instance */ SendStatus.prototype.skipped = null; /** * SendStatus failed. * @member {signalbackups.SendStatus.IFailed|null|undefined} failed * @memberof signalbackups.SendStatus * @instance */ SendStatus.prototype.failed = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * SendStatus deliveryStatus. * @member {"pending"|"sent"|"delivered"|"read"|"viewed"|"skipped"|"failed"|undefined} deliveryStatus * @memberof signalbackups.SendStatus * @instance */ Object.defineProperty(SendStatus.prototype, "deliveryStatus", { get: $util.oneOfGetter($oneOfFields = ["pending", "sent", "delivered", "read", "viewed", "skipped", "failed"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified SendStatus message. Does not implicitly {@link signalbackups.SendStatus.verify|verify} messages. * @function encode * @memberof signalbackups.SendStatus * @static * @param {signalbackups.ISendStatus} message SendStatus message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ SendStatus.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.SendStatus.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.SendStatus.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.recipientId != null && Object.hasOwnProperty.call(message, "recipientId")) writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.recipientId); if (message.timestamp != null && Object.hasOwnProperty.call(message, "timestamp")) writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.timestamp); if (message.pending != null && Object.hasOwnProperty.call(message, "pending")) $root.signalbackups.SendStatus.Pending.encode(message.pending, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); if (message.sent != null && Object.hasOwnProperty.call(message, "sent")) $root.signalbackups.SendStatus.Sent.encode(message.sent, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); if (message.delivered != null && Object.hasOwnProperty.call(message, "delivered")) $root.signalbackups.SendStatus.Delivered.encode(message.delivered, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); if (message.read != null && Object.hasOwnProperty.call(message, "read")) $root.signalbackups.SendStatus.Read.encode(message.read, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim(); if (message.viewed != null && Object.hasOwnProperty.call(message, "viewed")) $root.signalbackups.SendStatus.Viewed.encode(message.viewed, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim(); if (message.skipped != null && Object.hasOwnProperty.call(message, "skipped")) $root.signalbackups.SendStatus.Skipped.encode(message.skipped, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim(); if (message.failed != null && Object.hasOwnProperty.call(message, "failed")) $root.signalbackups.SendStatus.Failed.encode(message.failed, writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified SendStatus message, length delimited. Does not implicitly {@link signalbackups.SendStatus.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.SendStatus * @static * @param {signalbackups.ISendStatus} message SendStatus message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ SendStatus.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a SendStatus message from the specified reader or buffer. * @function decode * @memberof signalbackups.SendStatus * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.SendStatus} SendStatus * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ SendStatus.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.SendStatus(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.recipientId = reader.uint64(); break; } case 2: { message.timestamp = reader.uint64(); break; } case 3: { message.pending = $root.signalbackups.SendStatus.Pending.decode(reader, reader.uint32()); break; } case 4: { message.sent = $root.signalbackups.SendStatus.Sent.decode(reader, reader.uint32()); break; } case 5: { message.delivered = $root.signalbackups.SendStatus.Delivered.decode(reader, reader.uint32()); break; } case 6: { message.read = $root.signalbackups.SendStatus.Read.decode(reader, reader.uint32()); break; } case 7: { message.viewed = $root.signalbackups.SendStatus.Viewed.decode(reader, reader.uint32()); break; } case 8: { message.skipped = $root.signalbackups.SendStatus.Skipped.decode(reader, reader.uint32()); break; } case 9: { message.failed = $root.signalbackups.SendStatus.Failed.decode(reader, reader.uint32()); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a SendStatus message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.SendStatus * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.SendStatus} SendStatus * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ SendStatus.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; SendStatus.Pending = (function() { /** * Properties of a Pending. * @memberof signalbackups.SendStatus * @interface IPending */ /** * Constructs a new Pending. * @memberof signalbackups.SendStatus * @classdesc Represents a Pending. * @implements IPending * @constructor * @param {signalbackups.SendStatus.IPending=} [properties] Properties to set */ function Pending(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Encodes the specified Pending message. Does not implicitly {@link signalbackups.SendStatus.Pending.verify|verify} messages. * @function encode * @memberof signalbackups.SendStatus.Pending * @static * @param {signalbackups.SendStatus.IPending} message Pending message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Pending.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.SendStatus.Pending.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.SendStatus.Pending.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Pending message, length delimited. Does not implicitly {@link signalbackups.SendStatus.Pending.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.SendStatus.Pending * @static * @param {signalbackups.SendStatus.IPending} message Pending message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Pending.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Pending message from the specified reader or buffer. * @function decode * @memberof signalbackups.SendStatus.Pending * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.SendStatus.Pending} Pending * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Pending.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.SendStatus.Pending(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Pending message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.SendStatus.Pending * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.SendStatus.Pending} Pending * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Pending.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return Pending; })(); SendStatus.Sent = (function() { /** * Properties of a Sent. * @memberof signalbackups.SendStatus * @interface ISent * @property {boolean|null} [sealedSender] Sent sealedSender */ /** * Constructs a new Sent. * @memberof signalbackups.SendStatus * @classdesc Represents a Sent. * @implements ISent * @constructor * @param {signalbackups.SendStatus.ISent=} [properties] Properties to set */ function Sent(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Sent sealedSender. * @member {boolean} sealedSender * @memberof signalbackups.SendStatus.Sent * @instance */ Sent.prototype.sealedSender = false; /** * Encodes the specified Sent message. Does not implicitly {@link signalbackups.SendStatus.Sent.verify|verify} messages. * @function encode * @memberof signalbackups.SendStatus.Sent * @static * @param {signalbackups.SendStatus.ISent} message Sent message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Sent.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.SendStatus.Sent.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.SendStatus.Sent.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.sealedSender != null && Object.hasOwnProperty.call(message, "sealedSender")) writer.uint32(/* id 1, wireType 0 =*/8).bool(message.sealedSender); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Sent message, length delimited. Does not implicitly {@link signalbackups.SendStatus.Sent.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.SendStatus.Sent * @static * @param {signalbackups.SendStatus.ISent} message Sent message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Sent.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Sent message from the specified reader or buffer. * @function decode * @memberof signalbackups.SendStatus.Sent * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.SendStatus.Sent} Sent * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Sent.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.SendStatus.Sent(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.sealedSender = reader.bool(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Sent message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.SendStatus.Sent * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.SendStatus.Sent} Sent * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Sent.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return Sent; })(); SendStatus.Delivered = (function() { /** * Properties of a Delivered. * @memberof signalbackups.SendStatus * @interface IDelivered * @property {boolean|null} [sealedSender] Delivered sealedSender */ /** * Constructs a new Delivered. * @memberof signalbackups.SendStatus * @classdesc Represents a Delivered. * @implements IDelivered * @constructor * @param {signalbackups.SendStatus.IDelivered=} [properties] Properties to set */ function Delivered(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Delivered sealedSender. * @member {boolean} sealedSender * @memberof signalbackups.SendStatus.Delivered * @instance */ Delivered.prototype.sealedSender = false; /** * Encodes the specified Delivered message. Does not implicitly {@link signalbackups.SendStatus.Delivered.verify|verify} messages. * @function encode * @memberof signalbackups.SendStatus.Delivered * @static * @param {signalbackups.SendStatus.IDelivered} message Delivered message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Delivered.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.SendStatus.Delivered.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.SendStatus.Delivered.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.sealedSender != null && Object.hasOwnProperty.call(message, "sealedSender")) writer.uint32(/* id 1, wireType 0 =*/8).bool(message.sealedSender); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Delivered message, length delimited. Does not implicitly {@link signalbackups.SendStatus.Delivered.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.SendStatus.Delivered * @static * @param {signalbackups.SendStatus.IDelivered} message Delivered message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Delivered.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Delivered message from the specified reader or buffer. * @function decode * @memberof signalbackups.SendStatus.Delivered * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.SendStatus.Delivered} Delivered * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Delivered.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.SendStatus.Delivered(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.sealedSender = reader.bool(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Delivered message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.SendStatus.Delivered * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.SendStatus.Delivered} Delivered * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Delivered.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return Delivered; })(); SendStatus.Read = (function() { /** * Properties of a Read. * @memberof signalbackups.SendStatus * @interface IRead * @property {boolean|null} [sealedSender] Read sealedSender */ /** * Constructs a new Read. * @memberof signalbackups.SendStatus * @classdesc Represents a Read. * @implements IRead * @constructor * @param {signalbackups.SendStatus.IRead=} [properties] Properties to set */ function Read(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Read sealedSender. * @member {boolean} sealedSender * @memberof signalbackups.SendStatus.Read * @instance */ Read.prototype.sealedSender = false; /** * Encodes the specified Read message. Does not implicitly {@link signalbackups.SendStatus.Read.verify|verify} messages. * @function encode * @memberof signalbackups.SendStatus.Read * @static * @param {signalbackups.SendStatus.IRead} message Read message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Read.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.SendStatus.Read.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.SendStatus.Read.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.sealedSender != null && Object.hasOwnProperty.call(message, "sealedSender")) writer.uint32(/* id 1, wireType 0 =*/8).bool(message.sealedSender); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Read message, length delimited. Does not implicitly {@link signalbackups.SendStatus.Read.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.SendStatus.Read * @static * @param {signalbackups.SendStatus.IRead} message Read message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Read.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Read message from the specified reader or buffer. * @function decode * @memberof signalbackups.SendStatus.Read * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.SendStatus.Read} Read * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Read.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.SendStatus.Read(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.sealedSender = reader.bool(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Read message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.SendStatus.Read * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.SendStatus.Read} Read * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Read.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return Read; })(); SendStatus.Viewed = (function() { /** * Properties of a Viewed. * @memberof signalbackups.SendStatus * @interface IViewed * @property {boolean|null} [sealedSender] Viewed sealedSender */ /** * Constructs a new Viewed. * @memberof signalbackups.SendStatus * @classdesc Represents a Viewed. * @implements IViewed * @constructor * @param {signalbackups.SendStatus.IViewed=} [properties] Properties to set */ function Viewed(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Viewed sealedSender. * @member {boolean} sealedSender * @memberof signalbackups.SendStatus.Viewed * @instance */ Viewed.prototype.sealedSender = false; /** * Encodes the specified Viewed message. Does not implicitly {@link signalbackups.SendStatus.Viewed.verify|verify} messages. * @function encode * @memberof signalbackups.SendStatus.Viewed * @static * @param {signalbackups.SendStatus.IViewed} message Viewed message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Viewed.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.SendStatus.Viewed.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.SendStatus.Viewed.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.sealedSender != null && Object.hasOwnProperty.call(message, "sealedSender")) writer.uint32(/* id 1, wireType 0 =*/8).bool(message.sealedSender); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Viewed message, length delimited. Does not implicitly {@link signalbackups.SendStatus.Viewed.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.SendStatus.Viewed * @static * @param {signalbackups.SendStatus.IViewed} message Viewed message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Viewed.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Viewed message from the specified reader or buffer. * @function decode * @memberof signalbackups.SendStatus.Viewed * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.SendStatus.Viewed} Viewed * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Viewed.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.SendStatus.Viewed(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.sealedSender = reader.bool(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Viewed message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.SendStatus.Viewed * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.SendStatus.Viewed} Viewed * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Viewed.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return Viewed; })(); SendStatus.Skipped = (function() { /** * Properties of a Skipped. * @memberof signalbackups.SendStatus * @interface ISkipped */ /** * Constructs a new Skipped. * @memberof signalbackups.SendStatus * @classdesc Represents a Skipped. * @implements ISkipped * @constructor * @param {signalbackups.SendStatus.ISkipped=} [properties] Properties to set */ function Skipped(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Encodes the specified Skipped message. Does not implicitly {@link signalbackups.SendStatus.Skipped.verify|verify} messages. * @function encode * @memberof signalbackups.SendStatus.Skipped * @static * @param {signalbackups.SendStatus.ISkipped} message Skipped message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Skipped.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.SendStatus.Skipped.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.SendStatus.Skipped.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Skipped message, length delimited. Does not implicitly {@link signalbackups.SendStatus.Skipped.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.SendStatus.Skipped * @static * @param {signalbackups.SendStatus.ISkipped} message Skipped message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Skipped.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Skipped message from the specified reader or buffer. * @function decode * @memberof signalbackups.SendStatus.Skipped * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.SendStatus.Skipped} Skipped * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Skipped.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.SendStatus.Skipped(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Skipped message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.SendStatus.Skipped * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.SendStatus.Skipped} Skipped * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Skipped.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return Skipped; })(); SendStatus.Failed = (function() { /** * Properties of a Failed. * @memberof signalbackups.SendStatus * @interface IFailed * @property {signalbackups.SendStatus.Failed.FailureReason|null} [reason] Failed reason */ /** * Constructs a new Failed. * @memberof signalbackups.SendStatus * @classdesc Represents a Failed. * @implements IFailed * @constructor * @param {signalbackups.SendStatus.IFailed=} [properties] Properties to set */ function Failed(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Failed reason. * @member {signalbackups.SendStatus.Failed.FailureReason} reason * @memberof signalbackups.SendStatus.Failed * @instance */ Failed.prototype.reason = 0; /** * Encodes the specified Failed message. Does not implicitly {@link signalbackups.SendStatus.Failed.verify|verify} messages. * @function encode * @memberof signalbackups.SendStatus.Failed * @static * @param {signalbackups.SendStatus.IFailed} message Failed message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Failed.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.SendStatus.Failed.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.SendStatus.Failed.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.reason != null && Object.hasOwnProperty.call(message, "reason")) writer.uint32(/* id 1, wireType 0 =*/8).int32(message.reason); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Failed message, length delimited. Does not implicitly {@link signalbackups.SendStatus.Failed.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.SendStatus.Failed * @static * @param {signalbackups.SendStatus.IFailed} message Failed message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Failed.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Failed message from the specified reader or buffer. * @function decode * @memberof signalbackups.SendStatus.Failed * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.SendStatus.Failed} Failed * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Failed.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.SendStatus.Failed(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.reason = reader.int32(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Failed message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.SendStatus.Failed * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.SendStatus.Failed} Failed * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Failed.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * FailureReason enum. * @name signalbackups.SendStatus.Failed.FailureReason * @enum {number} * @property {number} UNKNOWN=0 UNKNOWN value * @property {number} NETWORK=1 NETWORK value * @property {number} IDENTITY_KEY_MISMATCH=2 IDENTITY_KEY_MISMATCH value */ Failed.FailureReason = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "UNKNOWN"] = 0; values[valuesById[1] = "NETWORK"] = 1; values[valuesById[2] = "IDENTITY_KEY_MISMATCH"] = 2; return values; })(); return Failed; })(); return SendStatus; })(); signalbackups.Text = (function() { /** * Properties of a Text. * @memberof signalbackups * @interface IText * @property {string|null} [body] Text body * @property {Array.|null} [bodyRanges] Text bodyRanges */ /** * Constructs a new Text. * @memberof signalbackups * @classdesc Represents a Text. * @implements IText * @constructor * @param {signalbackups.IText=} [properties] Properties to set */ function Text(properties) { this.bodyRanges = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Text body. * @member {string} body * @memberof signalbackups.Text * @instance */ Text.prototype.body = ""; /** * Text bodyRanges. * @member {Array.} bodyRanges * @memberof signalbackups.Text * @instance */ Text.prototype.bodyRanges = $util.emptyArray; /** * Encodes the specified Text message. Does not implicitly {@link signalbackups.Text.verify|verify} messages. * @function encode * @memberof signalbackups.Text * @static * @param {signalbackups.IText} message Text message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Text.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.Text.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.Text.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.body != null && Object.hasOwnProperty.call(message, "body")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.body); if (message.bodyRanges != null && message.bodyRanges.length) for (var i = 0; i < message.bodyRanges.length; ++i) $root.signalbackups.BodyRange.encode(message.bodyRanges[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Text message, length delimited. Does not implicitly {@link signalbackups.Text.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.Text * @static * @param {signalbackups.IText} message Text message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Text.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Text message from the specified reader or buffer. * @function decode * @memberof signalbackups.Text * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.Text} Text * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Text.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.Text(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.body = reader.string(); break; } case 2: { if (!(message.bodyRanges && message.bodyRanges.length)) message.bodyRanges = []; message.bodyRanges.push($root.signalbackups.BodyRange.decode(reader, reader.uint32())); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Text message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.Text * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.Text} Text * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Text.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return Text; })(); signalbackups.StandardMessage = (function() { /** * Properties of a StandardMessage. * @memberof signalbackups * @interface IStandardMessage * @property {signalbackups.IQuote|null} [quote] StandardMessage quote * @property {signalbackups.IText|null} [text] StandardMessage text * @property {Array.|null} [attachments] StandardMessage attachments * @property {Array.|null} [linkPreview] StandardMessage linkPreview * @property {signalbackups.IFilePointer|null} [longText] StandardMessage longText * @property {Array.|null} [reactions] StandardMessage reactions */ /** * Constructs a new StandardMessage. * @memberof signalbackups * @classdesc Represents a StandardMessage. * @implements IStandardMessage * @constructor * @param {signalbackups.IStandardMessage=} [properties] Properties to set */ function StandardMessage(properties) { this.attachments = []; this.linkPreview = []; this.reactions = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * StandardMessage quote. * @member {signalbackups.IQuote|null|undefined} quote * @memberof signalbackups.StandardMessage * @instance */ StandardMessage.prototype.quote = null; /** * StandardMessage text. * @member {signalbackups.IText|null|undefined} text * @memberof signalbackups.StandardMessage * @instance */ StandardMessage.prototype.text = null; /** * StandardMessage attachments. * @member {Array.} attachments * @memberof signalbackups.StandardMessage * @instance */ StandardMessage.prototype.attachments = $util.emptyArray; /** * StandardMessage linkPreview. * @member {Array.} linkPreview * @memberof signalbackups.StandardMessage * @instance */ StandardMessage.prototype.linkPreview = $util.emptyArray; /** * StandardMessage longText. * @member {signalbackups.IFilePointer|null|undefined} longText * @memberof signalbackups.StandardMessage * @instance */ StandardMessage.prototype.longText = null; /** * StandardMessage reactions. * @member {Array.} reactions * @memberof signalbackups.StandardMessage * @instance */ StandardMessage.prototype.reactions = $util.emptyArray; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * StandardMessage _quote. * @member {"quote"|undefined} _quote * @memberof signalbackups.StandardMessage * @instance */ Object.defineProperty(StandardMessage.prototype, "_quote", { get: $util.oneOfGetter($oneOfFields = ["quote"]), set: $util.oneOfSetter($oneOfFields) }); /** * StandardMessage _text. * @member {"text"|undefined} _text * @memberof signalbackups.StandardMessage * @instance */ Object.defineProperty(StandardMessage.prototype, "_text", { get: $util.oneOfGetter($oneOfFields = ["text"]), set: $util.oneOfSetter($oneOfFields) }); /** * StandardMessage _longText. * @member {"longText"|undefined} _longText * @memberof signalbackups.StandardMessage * @instance */ Object.defineProperty(StandardMessage.prototype, "_longText", { get: $util.oneOfGetter($oneOfFields = ["longText"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified StandardMessage message. Does not implicitly {@link signalbackups.StandardMessage.verify|verify} messages. * @function encode * @memberof signalbackups.StandardMessage * @static * @param {signalbackups.IStandardMessage} message StandardMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ StandardMessage.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.StandardMessage.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.StandardMessage.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.quote != null && Object.hasOwnProperty.call(message, "quote")) $root.signalbackups.Quote.encode(message.quote, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.text != null && Object.hasOwnProperty.call(message, "text")) $root.signalbackups.Text.encode(message.text, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); if (message.attachments != null && message.attachments.length) for (var i = 0; i < message.attachments.length; ++i) $root.signalbackups.MessageAttachment.encode(message.attachments[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); if (message.linkPreview != null && message.linkPreview.length) for (var i = 0; i < message.linkPreview.length; ++i) $root.signalbackups.LinkPreview.encode(message.linkPreview[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); if (message.longText != null && Object.hasOwnProperty.call(message, "longText")) $root.signalbackups.FilePointer.encode(message.longText, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); if (message.reactions != null && message.reactions.length) for (var i = 0; i < message.reactions.length; ++i) $root.signalbackups.Reaction.encode(message.reactions[i], writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified StandardMessage message, length delimited. Does not implicitly {@link signalbackups.StandardMessage.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.StandardMessage * @static * @param {signalbackups.IStandardMessage} message StandardMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ StandardMessage.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a StandardMessage message from the specified reader or buffer. * @function decode * @memberof signalbackups.StandardMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.StandardMessage} StandardMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ StandardMessage.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.StandardMessage(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.quote = $root.signalbackups.Quote.decode(reader, reader.uint32()); break; } case 2: { message.text = $root.signalbackups.Text.decode(reader, reader.uint32()); break; } case 3: { if (!(message.attachments && message.attachments.length)) message.attachments = []; message.attachments.push($root.signalbackups.MessageAttachment.decode(reader, reader.uint32())); break; } case 4: { if (!(message.linkPreview && message.linkPreview.length)) message.linkPreview = []; message.linkPreview.push($root.signalbackups.LinkPreview.decode(reader, reader.uint32())); break; } case 5: { message.longText = $root.signalbackups.FilePointer.decode(reader, reader.uint32()); break; } case 6: { if (!(message.reactions && message.reactions.length)) message.reactions = []; message.reactions.push($root.signalbackups.Reaction.decode(reader, reader.uint32())); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a StandardMessage message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.StandardMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.StandardMessage} StandardMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ StandardMessage.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return StandardMessage; })(); signalbackups.ContactMessage = (function() { /** * Properties of a ContactMessage. * @memberof signalbackups * @interface IContactMessage * @property {signalbackups.IContactAttachment|null} [contact] ContactMessage contact * @property {Array.|null} [reactions] ContactMessage reactions */ /** * Constructs a new ContactMessage. * @memberof signalbackups * @classdesc Represents a ContactMessage. * @implements IContactMessage * @constructor * @param {signalbackups.IContactMessage=} [properties] Properties to set */ function ContactMessage(properties) { this.reactions = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * ContactMessage contact. * @member {signalbackups.IContactAttachment|null|undefined} contact * @memberof signalbackups.ContactMessage * @instance */ ContactMessage.prototype.contact = null; /** * ContactMessage reactions. * @member {Array.} reactions * @memberof signalbackups.ContactMessage * @instance */ ContactMessage.prototype.reactions = $util.emptyArray; /** * Encodes the specified ContactMessage message. Does not implicitly {@link signalbackups.ContactMessage.verify|verify} messages. * @function encode * @memberof signalbackups.ContactMessage * @static * @param {signalbackups.IContactMessage} message ContactMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ContactMessage.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.ContactMessage.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.ContactMessage.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.contact != null && Object.hasOwnProperty.call(message, "contact")) $root.signalbackups.ContactAttachment.encode(message.contact, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.reactions != null && message.reactions.length) for (var i = 0; i < message.reactions.length; ++i) $root.signalbackups.Reaction.encode(message.reactions[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified ContactMessage message, length delimited. Does not implicitly {@link signalbackups.ContactMessage.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.ContactMessage * @static * @param {signalbackups.IContactMessage} message ContactMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ContactMessage.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a ContactMessage message from the specified reader or buffer. * @function decode * @memberof signalbackups.ContactMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.ContactMessage} ContactMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ContactMessage.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.ContactMessage(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.contact = $root.signalbackups.ContactAttachment.decode(reader, reader.uint32()); break; } case 2: { if (!(message.reactions && message.reactions.length)) message.reactions = []; message.reactions.push($root.signalbackups.Reaction.decode(reader, reader.uint32())); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a ContactMessage message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.ContactMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.ContactMessage} ContactMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ContactMessage.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return ContactMessage; })(); signalbackups.DirectStoryReplyMessage = (function() { /** * Properties of a DirectStoryReplyMessage. * @memberof signalbackups * @interface IDirectStoryReplyMessage * @property {signalbackups.DirectStoryReplyMessage.ITextReply|null} [textReply] DirectStoryReplyMessage textReply * @property {string|null} [emoji] DirectStoryReplyMessage emoji * @property {Array.|null} [reactions] DirectStoryReplyMessage reactions */ /** * Constructs a new DirectStoryReplyMessage. * @memberof signalbackups * @classdesc Represents a DirectStoryReplyMessage. * @implements IDirectStoryReplyMessage * @constructor * @param {signalbackups.IDirectStoryReplyMessage=} [properties] Properties to set */ function DirectStoryReplyMessage(properties) { this.reactions = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * DirectStoryReplyMessage textReply. * @member {signalbackups.DirectStoryReplyMessage.ITextReply|null|undefined} textReply * @memberof signalbackups.DirectStoryReplyMessage * @instance */ DirectStoryReplyMessage.prototype.textReply = null; /** * DirectStoryReplyMessage emoji. * @member {string|null|undefined} emoji * @memberof signalbackups.DirectStoryReplyMessage * @instance */ DirectStoryReplyMessage.prototype.emoji = null; /** * DirectStoryReplyMessage reactions. * @member {Array.} reactions * @memberof signalbackups.DirectStoryReplyMessage * @instance */ DirectStoryReplyMessage.prototype.reactions = $util.emptyArray; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * DirectStoryReplyMessage reply. * @member {"textReply"|"emoji"|undefined} reply * @memberof signalbackups.DirectStoryReplyMessage * @instance */ Object.defineProperty(DirectStoryReplyMessage.prototype, "reply", { get: $util.oneOfGetter($oneOfFields = ["textReply", "emoji"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified DirectStoryReplyMessage message. Does not implicitly {@link signalbackups.DirectStoryReplyMessage.verify|verify} messages. * @function encode * @memberof signalbackups.DirectStoryReplyMessage * @static * @param {signalbackups.IDirectStoryReplyMessage} message DirectStoryReplyMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ DirectStoryReplyMessage.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.DirectStoryReplyMessage.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.DirectStoryReplyMessage.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.textReply != null && Object.hasOwnProperty.call(message, "textReply")) $root.signalbackups.DirectStoryReplyMessage.TextReply.encode(message.textReply, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.emoji != null && Object.hasOwnProperty.call(message, "emoji")) writer.uint32(/* id 2, wireType 2 =*/18).string(message.emoji); if (message.reactions != null && message.reactions.length) for (var i = 0; i < message.reactions.length; ++i) $root.signalbackups.Reaction.encode(message.reactions[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified DirectStoryReplyMessage message, length delimited. Does not implicitly {@link signalbackups.DirectStoryReplyMessage.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.DirectStoryReplyMessage * @static * @param {signalbackups.IDirectStoryReplyMessage} message DirectStoryReplyMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ DirectStoryReplyMessage.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a DirectStoryReplyMessage message from the specified reader or buffer. * @function decode * @memberof signalbackups.DirectStoryReplyMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.DirectStoryReplyMessage} DirectStoryReplyMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ DirectStoryReplyMessage.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.DirectStoryReplyMessage(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.textReply = $root.signalbackups.DirectStoryReplyMessage.TextReply.decode(reader, reader.uint32()); break; } case 2: { message.emoji = reader.string(); break; } case 3: { if (!(message.reactions && message.reactions.length)) message.reactions = []; message.reactions.push($root.signalbackups.Reaction.decode(reader, reader.uint32())); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a DirectStoryReplyMessage message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.DirectStoryReplyMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.DirectStoryReplyMessage} DirectStoryReplyMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ DirectStoryReplyMessage.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; DirectStoryReplyMessage.TextReply = (function() { /** * Properties of a TextReply. * @memberof signalbackups.DirectStoryReplyMessage * @interface ITextReply * @property {signalbackups.IText|null} [text] TextReply text * @property {signalbackups.IFilePointer|null} [longText] TextReply longText */ /** * Constructs a new TextReply. * @memberof signalbackups.DirectStoryReplyMessage * @classdesc Represents a TextReply. * @implements ITextReply * @constructor * @param {signalbackups.DirectStoryReplyMessage.ITextReply=} [properties] Properties to set */ function TextReply(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * TextReply text. * @member {signalbackups.IText|null|undefined} text * @memberof signalbackups.DirectStoryReplyMessage.TextReply * @instance */ TextReply.prototype.text = null; /** * TextReply longText. * @member {signalbackups.IFilePointer|null|undefined} longText * @memberof signalbackups.DirectStoryReplyMessage.TextReply * @instance */ TextReply.prototype.longText = null; /** * Encodes the specified TextReply message. Does not implicitly {@link signalbackups.DirectStoryReplyMessage.TextReply.verify|verify} messages. * @function encode * @memberof signalbackups.DirectStoryReplyMessage.TextReply * @static * @param {signalbackups.DirectStoryReplyMessage.ITextReply} message TextReply message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ TextReply.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.DirectStoryReplyMessage.TextReply.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.DirectStoryReplyMessage.TextReply.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.text != null && Object.hasOwnProperty.call(message, "text")) $root.signalbackups.Text.encode(message.text, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.longText != null && Object.hasOwnProperty.call(message, "longText")) $root.signalbackups.FilePointer.encode(message.longText, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified TextReply message, length delimited. Does not implicitly {@link signalbackups.DirectStoryReplyMessage.TextReply.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.DirectStoryReplyMessage.TextReply * @static * @param {signalbackups.DirectStoryReplyMessage.ITextReply} message TextReply message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ TextReply.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a TextReply message from the specified reader or buffer. * @function decode * @memberof signalbackups.DirectStoryReplyMessage.TextReply * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.DirectStoryReplyMessage.TextReply} TextReply * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ TextReply.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.DirectStoryReplyMessage.TextReply(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.text = $root.signalbackups.Text.decode(reader, reader.uint32()); break; } case 2: { message.longText = $root.signalbackups.FilePointer.decode(reader, reader.uint32()); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a TextReply message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.DirectStoryReplyMessage.TextReply * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.DirectStoryReplyMessage.TextReply} TextReply * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ TextReply.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return TextReply; })(); return DirectStoryReplyMessage; })(); signalbackups.PaymentNotification = (function() { /** * Properties of a PaymentNotification. * @memberof signalbackups * @interface IPaymentNotification * @property {string|null} [amountMob] PaymentNotification amountMob * @property {string|null} [feeMob] PaymentNotification feeMob * @property {string|null} [note] PaymentNotification note * @property {signalbackups.PaymentNotification.ITransactionDetails|null} [transactionDetails] PaymentNotification transactionDetails */ /** * Constructs a new PaymentNotification. * @memberof signalbackups * @classdesc Represents a PaymentNotification. * @implements IPaymentNotification * @constructor * @param {signalbackups.IPaymentNotification=} [properties] Properties to set */ function PaymentNotification(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * PaymentNotification amountMob. * @member {string|null|undefined} amountMob * @memberof signalbackups.PaymentNotification * @instance */ PaymentNotification.prototype.amountMob = null; /** * PaymentNotification feeMob. * @member {string|null|undefined} feeMob * @memberof signalbackups.PaymentNotification * @instance */ PaymentNotification.prototype.feeMob = null; /** * PaymentNotification note. * @member {string|null|undefined} note * @memberof signalbackups.PaymentNotification * @instance */ PaymentNotification.prototype.note = null; /** * PaymentNotification transactionDetails. * @member {signalbackups.PaymentNotification.ITransactionDetails|null|undefined} transactionDetails * @memberof signalbackups.PaymentNotification * @instance */ PaymentNotification.prototype.transactionDetails = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * PaymentNotification _amountMob. * @member {"amountMob"|undefined} _amountMob * @memberof signalbackups.PaymentNotification * @instance */ Object.defineProperty(PaymentNotification.prototype, "_amountMob", { get: $util.oneOfGetter($oneOfFields = ["amountMob"]), set: $util.oneOfSetter($oneOfFields) }); /** * PaymentNotification _feeMob. * @member {"feeMob"|undefined} _feeMob * @memberof signalbackups.PaymentNotification * @instance */ Object.defineProperty(PaymentNotification.prototype, "_feeMob", { get: $util.oneOfGetter($oneOfFields = ["feeMob"]), set: $util.oneOfSetter($oneOfFields) }); /** * PaymentNotification _note. * @member {"note"|undefined} _note * @memberof signalbackups.PaymentNotification * @instance */ Object.defineProperty(PaymentNotification.prototype, "_note", { get: $util.oneOfGetter($oneOfFields = ["note"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified PaymentNotification message. Does not implicitly {@link signalbackups.PaymentNotification.verify|verify} messages. * @function encode * @memberof signalbackups.PaymentNotification * @static * @param {signalbackups.IPaymentNotification} message PaymentNotification message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ PaymentNotification.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.PaymentNotification.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.PaymentNotification.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.amountMob != null && Object.hasOwnProperty.call(message, "amountMob")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.amountMob); if (message.feeMob != null && Object.hasOwnProperty.call(message, "feeMob")) writer.uint32(/* id 2, wireType 2 =*/18).string(message.feeMob); if (message.note != null && Object.hasOwnProperty.call(message, "note")) writer.uint32(/* id 3, wireType 2 =*/26).string(message.note); if (message.transactionDetails != null && Object.hasOwnProperty.call(message, "transactionDetails")) $root.signalbackups.PaymentNotification.TransactionDetails.encode(message.transactionDetails, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified PaymentNotification message, length delimited. Does not implicitly {@link signalbackups.PaymentNotification.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.PaymentNotification * @static * @param {signalbackups.IPaymentNotification} message PaymentNotification message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ PaymentNotification.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a PaymentNotification message from the specified reader or buffer. * @function decode * @memberof signalbackups.PaymentNotification * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.PaymentNotification} PaymentNotification * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ PaymentNotification.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.PaymentNotification(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.amountMob = reader.string(); break; } case 2: { message.feeMob = reader.string(); break; } case 3: { message.note = reader.string(); break; } case 4: { message.transactionDetails = $root.signalbackups.PaymentNotification.TransactionDetails.decode(reader, reader.uint32()); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a PaymentNotification message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.PaymentNotification * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.PaymentNotification} PaymentNotification * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ PaymentNotification.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; PaymentNotification.TransactionDetails = (function() { /** * Properties of a TransactionDetails. * @memberof signalbackups.PaymentNotification * @interface ITransactionDetails * @property {signalbackups.PaymentNotification.TransactionDetails.ITransaction|null} [transaction] TransactionDetails transaction * @property {signalbackups.PaymentNotification.TransactionDetails.IFailedTransaction|null} [failedTransaction] TransactionDetails failedTransaction */ /** * Constructs a new TransactionDetails. * @memberof signalbackups.PaymentNotification * @classdesc Represents a TransactionDetails. * @implements ITransactionDetails * @constructor * @param {signalbackups.PaymentNotification.ITransactionDetails=} [properties] Properties to set */ function TransactionDetails(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * TransactionDetails transaction. * @member {signalbackups.PaymentNotification.TransactionDetails.ITransaction|null|undefined} transaction * @memberof signalbackups.PaymentNotification.TransactionDetails * @instance */ TransactionDetails.prototype.transaction = null; /** * TransactionDetails failedTransaction. * @member {signalbackups.PaymentNotification.TransactionDetails.IFailedTransaction|null|undefined} failedTransaction * @memberof signalbackups.PaymentNotification.TransactionDetails * @instance */ TransactionDetails.prototype.failedTransaction = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * TransactionDetails payment. * @member {"transaction"|"failedTransaction"|undefined} payment * @memberof signalbackups.PaymentNotification.TransactionDetails * @instance */ Object.defineProperty(TransactionDetails.prototype, "payment", { get: $util.oneOfGetter($oneOfFields = ["transaction", "failedTransaction"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified TransactionDetails message. Does not implicitly {@link signalbackups.PaymentNotification.TransactionDetails.verify|verify} messages. * @function encode * @memberof signalbackups.PaymentNotification.TransactionDetails * @static * @param {signalbackups.PaymentNotification.ITransactionDetails} message TransactionDetails message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ TransactionDetails.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.PaymentNotification.TransactionDetails.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.PaymentNotification.TransactionDetails.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.transaction != null && Object.hasOwnProperty.call(message, "transaction")) $root.signalbackups.PaymentNotification.TransactionDetails.Transaction.encode(message.transaction, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.failedTransaction != null && Object.hasOwnProperty.call(message, "failedTransaction")) $root.signalbackups.PaymentNotification.TransactionDetails.FailedTransaction.encode(message.failedTransaction, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified TransactionDetails message, length delimited. Does not implicitly {@link signalbackups.PaymentNotification.TransactionDetails.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.PaymentNotification.TransactionDetails * @static * @param {signalbackups.PaymentNotification.ITransactionDetails} message TransactionDetails message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ TransactionDetails.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a TransactionDetails message from the specified reader or buffer. * @function decode * @memberof signalbackups.PaymentNotification.TransactionDetails * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.PaymentNotification.TransactionDetails} TransactionDetails * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ TransactionDetails.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.PaymentNotification.TransactionDetails(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.transaction = $root.signalbackups.PaymentNotification.TransactionDetails.Transaction.decode(reader, reader.uint32()); break; } case 2: { message.failedTransaction = $root.signalbackups.PaymentNotification.TransactionDetails.FailedTransaction.decode(reader, reader.uint32()); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a TransactionDetails message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.PaymentNotification.TransactionDetails * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.PaymentNotification.TransactionDetails} TransactionDetails * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ TransactionDetails.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; TransactionDetails.MobileCoinTxoIdentification = (function() { /** * Properties of a MobileCoinTxoIdentification. * @memberof signalbackups.PaymentNotification.TransactionDetails * @interface IMobileCoinTxoIdentification * @property {Array.|null} [publicKey] MobileCoinTxoIdentification publicKey * @property {Array.|null} [keyImages] MobileCoinTxoIdentification keyImages */ /** * Constructs a new MobileCoinTxoIdentification. * @memberof signalbackups.PaymentNotification.TransactionDetails * @classdesc Represents a MobileCoinTxoIdentification. * @implements IMobileCoinTxoIdentification * @constructor * @param {signalbackups.PaymentNotification.TransactionDetails.IMobileCoinTxoIdentification=} [properties] Properties to set */ function MobileCoinTxoIdentification(properties) { this.publicKey = []; this.keyImages = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * MobileCoinTxoIdentification publicKey. * @member {Array.} publicKey * @memberof signalbackups.PaymentNotification.TransactionDetails.MobileCoinTxoIdentification * @instance */ MobileCoinTxoIdentification.prototype.publicKey = $util.emptyArray; /** * MobileCoinTxoIdentification keyImages. * @member {Array.} keyImages * @memberof signalbackups.PaymentNotification.TransactionDetails.MobileCoinTxoIdentification * @instance */ MobileCoinTxoIdentification.prototype.keyImages = $util.emptyArray; /** * Encodes the specified MobileCoinTxoIdentification message. Does not implicitly {@link signalbackups.PaymentNotification.TransactionDetails.MobileCoinTxoIdentification.verify|verify} messages. * @function encode * @memberof signalbackups.PaymentNotification.TransactionDetails.MobileCoinTxoIdentification * @static * @param {signalbackups.PaymentNotification.TransactionDetails.IMobileCoinTxoIdentification} message MobileCoinTxoIdentification message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ MobileCoinTxoIdentification.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.PaymentNotification.TransactionDetails.MobileCoinTxoIdentification.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.PaymentNotification.TransactionDetails.MobileCoinTxoIdentification.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.publicKey != null && message.publicKey.length) for (var i = 0; i < message.publicKey.length; ++i) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.publicKey[i]); if (message.keyImages != null && message.keyImages.length) for (var i = 0; i < message.keyImages.length; ++i) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.keyImages[i]); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified MobileCoinTxoIdentification message, length delimited. Does not implicitly {@link signalbackups.PaymentNotification.TransactionDetails.MobileCoinTxoIdentification.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.PaymentNotification.TransactionDetails.MobileCoinTxoIdentification * @static * @param {signalbackups.PaymentNotification.TransactionDetails.IMobileCoinTxoIdentification} message MobileCoinTxoIdentification message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ MobileCoinTxoIdentification.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a MobileCoinTxoIdentification message from the specified reader or buffer. * @function decode * @memberof signalbackups.PaymentNotification.TransactionDetails.MobileCoinTxoIdentification * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.PaymentNotification.TransactionDetails.MobileCoinTxoIdentification} MobileCoinTxoIdentification * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ MobileCoinTxoIdentification.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.PaymentNotification.TransactionDetails.MobileCoinTxoIdentification(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { if (!(message.publicKey && message.publicKey.length)) message.publicKey = []; message.publicKey.push(reader.bytes()); break; } case 2: { if (!(message.keyImages && message.keyImages.length)) message.keyImages = []; message.keyImages.push(reader.bytes()); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a MobileCoinTxoIdentification message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.PaymentNotification.TransactionDetails.MobileCoinTxoIdentification * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.PaymentNotification.TransactionDetails.MobileCoinTxoIdentification} MobileCoinTxoIdentification * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ MobileCoinTxoIdentification.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return MobileCoinTxoIdentification; })(); TransactionDetails.FailedTransaction = (function() { /** * Properties of a FailedTransaction. * @memberof signalbackups.PaymentNotification.TransactionDetails * @interface IFailedTransaction * @property {signalbackups.PaymentNotification.TransactionDetails.FailedTransaction.FailureReason|null} [reason] FailedTransaction reason */ /** * Constructs a new FailedTransaction. * @memberof signalbackups.PaymentNotification.TransactionDetails * @classdesc Represents a FailedTransaction. * @implements IFailedTransaction * @constructor * @param {signalbackups.PaymentNotification.TransactionDetails.IFailedTransaction=} [properties] Properties to set */ function FailedTransaction(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * FailedTransaction reason. * @member {signalbackups.PaymentNotification.TransactionDetails.FailedTransaction.FailureReason} reason * @memberof signalbackups.PaymentNotification.TransactionDetails.FailedTransaction * @instance */ FailedTransaction.prototype.reason = 0; /** * Encodes the specified FailedTransaction message. Does not implicitly {@link signalbackups.PaymentNotification.TransactionDetails.FailedTransaction.verify|verify} messages. * @function encode * @memberof signalbackups.PaymentNotification.TransactionDetails.FailedTransaction * @static * @param {signalbackups.PaymentNotification.TransactionDetails.IFailedTransaction} message FailedTransaction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ FailedTransaction.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.PaymentNotification.TransactionDetails.FailedTransaction.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.PaymentNotification.TransactionDetails.FailedTransaction.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.reason != null && Object.hasOwnProperty.call(message, "reason")) writer.uint32(/* id 1, wireType 0 =*/8).int32(message.reason); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified FailedTransaction message, length delimited. Does not implicitly {@link signalbackups.PaymentNotification.TransactionDetails.FailedTransaction.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.PaymentNotification.TransactionDetails.FailedTransaction * @static * @param {signalbackups.PaymentNotification.TransactionDetails.IFailedTransaction} message FailedTransaction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ FailedTransaction.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a FailedTransaction message from the specified reader or buffer. * @function decode * @memberof signalbackups.PaymentNotification.TransactionDetails.FailedTransaction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.PaymentNotification.TransactionDetails.FailedTransaction} FailedTransaction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ FailedTransaction.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.PaymentNotification.TransactionDetails.FailedTransaction(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.reason = reader.int32(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a FailedTransaction message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.PaymentNotification.TransactionDetails.FailedTransaction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.PaymentNotification.TransactionDetails.FailedTransaction} FailedTransaction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ FailedTransaction.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * FailureReason enum. * @name signalbackups.PaymentNotification.TransactionDetails.FailedTransaction.FailureReason * @enum {number} * @property {number} GENERIC=0 GENERIC value * @property {number} NETWORK=1 NETWORK value * @property {number} INSUFFICIENT_FUNDS=2 INSUFFICIENT_FUNDS value */ FailedTransaction.FailureReason = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "GENERIC"] = 0; values[valuesById[1] = "NETWORK"] = 1; values[valuesById[2] = "INSUFFICIENT_FUNDS"] = 2; return values; })(); return FailedTransaction; })(); TransactionDetails.Transaction = (function() { /** * Properties of a Transaction. * @memberof signalbackups.PaymentNotification.TransactionDetails * @interface ITransaction * @property {signalbackups.PaymentNotification.TransactionDetails.Transaction.Status|null} [status] Transaction status * @property {signalbackups.PaymentNotification.TransactionDetails.IMobileCoinTxoIdentification|null} [mobileCoinIdentification] Transaction mobileCoinIdentification * @property {Long|null} [timestamp] Transaction timestamp * @property {Long|null} [blockIndex] Transaction blockIndex * @property {Long|null} [blockTimestamp] Transaction blockTimestamp * @property {Uint8Array|null} [transaction] Transaction transaction * @property {Uint8Array|null} [receipt] Transaction receipt */ /** * Constructs a new Transaction. * @memberof signalbackups.PaymentNotification.TransactionDetails * @classdesc Represents a Transaction. * @implements ITransaction * @constructor * @param {signalbackups.PaymentNotification.TransactionDetails.ITransaction=} [properties] Properties to set */ function Transaction(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Transaction status. * @member {signalbackups.PaymentNotification.TransactionDetails.Transaction.Status} status * @memberof signalbackups.PaymentNotification.TransactionDetails.Transaction * @instance */ Transaction.prototype.status = 0; /** * Transaction mobileCoinIdentification. * @member {signalbackups.PaymentNotification.TransactionDetails.IMobileCoinTxoIdentification|null|undefined} mobileCoinIdentification * @memberof signalbackups.PaymentNotification.TransactionDetails.Transaction * @instance */ Transaction.prototype.mobileCoinIdentification = null; /** * Transaction timestamp. * @member {Long|null|undefined} timestamp * @memberof signalbackups.PaymentNotification.TransactionDetails.Transaction * @instance */ Transaction.prototype.timestamp = null; /** * Transaction blockIndex. * @member {Long|null|undefined} blockIndex * @memberof signalbackups.PaymentNotification.TransactionDetails.Transaction * @instance */ Transaction.prototype.blockIndex = null; /** * Transaction blockTimestamp. * @member {Long|null|undefined} blockTimestamp * @memberof signalbackups.PaymentNotification.TransactionDetails.Transaction * @instance */ Transaction.prototype.blockTimestamp = null; /** * Transaction transaction. * @member {Uint8Array|null|undefined} transaction * @memberof signalbackups.PaymentNotification.TransactionDetails.Transaction * @instance */ Transaction.prototype.transaction = null; /** * Transaction receipt. * @member {Uint8Array|null|undefined} receipt * @memberof signalbackups.PaymentNotification.TransactionDetails.Transaction * @instance */ Transaction.prototype.receipt = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * Transaction _timestamp. * @member {"timestamp"|undefined} _timestamp * @memberof signalbackups.PaymentNotification.TransactionDetails.Transaction * @instance */ Object.defineProperty(Transaction.prototype, "_timestamp", { get: $util.oneOfGetter($oneOfFields = ["timestamp"]), set: $util.oneOfSetter($oneOfFields) }); /** * Transaction _blockIndex. * @member {"blockIndex"|undefined} _blockIndex * @memberof signalbackups.PaymentNotification.TransactionDetails.Transaction * @instance */ Object.defineProperty(Transaction.prototype, "_blockIndex", { get: $util.oneOfGetter($oneOfFields = ["blockIndex"]), set: $util.oneOfSetter($oneOfFields) }); /** * Transaction _blockTimestamp. * @member {"blockTimestamp"|undefined} _blockTimestamp * @memberof signalbackups.PaymentNotification.TransactionDetails.Transaction * @instance */ Object.defineProperty(Transaction.prototype, "_blockTimestamp", { get: $util.oneOfGetter($oneOfFields = ["blockTimestamp"]), set: $util.oneOfSetter($oneOfFields) }); /** * Transaction _transaction. * @member {"transaction"|undefined} _transaction * @memberof signalbackups.PaymentNotification.TransactionDetails.Transaction * @instance */ Object.defineProperty(Transaction.prototype, "_transaction", { get: $util.oneOfGetter($oneOfFields = ["transaction"]), set: $util.oneOfSetter($oneOfFields) }); /** * Transaction _receipt. * @member {"receipt"|undefined} _receipt * @memberof signalbackups.PaymentNotification.TransactionDetails.Transaction * @instance */ Object.defineProperty(Transaction.prototype, "_receipt", { get: $util.oneOfGetter($oneOfFields = ["receipt"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified Transaction message. Does not implicitly {@link signalbackups.PaymentNotification.TransactionDetails.Transaction.verify|verify} messages. * @function encode * @memberof signalbackups.PaymentNotification.TransactionDetails.Transaction * @static * @param {signalbackups.PaymentNotification.TransactionDetails.ITransaction} message Transaction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Transaction.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.PaymentNotification.TransactionDetails.Transaction.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.PaymentNotification.TransactionDetails.Transaction.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.status != null && Object.hasOwnProperty.call(message, "status")) writer.uint32(/* id 1, wireType 0 =*/8).int32(message.status); if (message.mobileCoinIdentification != null && Object.hasOwnProperty.call(message, "mobileCoinIdentification")) $root.signalbackups.PaymentNotification.TransactionDetails.MobileCoinTxoIdentification.encode(message.mobileCoinIdentification, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); if (message.timestamp != null && Object.hasOwnProperty.call(message, "timestamp")) writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.timestamp); if (message.blockIndex != null && Object.hasOwnProperty.call(message, "blockIndex")) writer.uint32(/* id 4, wireType 0 =*/32).uint64(message.blockIndex); if (message.blockTimestamp != null && Object.hasOwnProperty.call(message, "blockTimestamp")) writer.uint32(/* id 5, wireType 0 =*/40).uint64(message.blockTimestamp); if (message.transaction != null && Object.hasOwnProperty.call(message, "transaction")) writer.uint32(/* id 6, wireType 2 =*/50).bytes(message.transaction); if (message.receipt != null && Object.hasOwnProperty.call(message, "receipt")) writer.uint32(/* id 7, wireType 2 =*/58).bytes(message.receipt); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Transaction message, length delimited. Does not implicitly {@link signalbackups.PaymentNotification.TransactionDetails.Transaction.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.PaymentNotification.TransactionDetails.Transaction * @static * @param {signalbackups.PaymentNotification.TransactionDetails.ITransaction} message Transaction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Transaction.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Transaction message from the specified reader or buffer. * @function decode * @memberof signalbackups.PaymentNotification.TransactionDetails.Transaction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.PaymentNotification.TransactionDetails.Transaction} Transaction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Transaction.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.PaymentNotification.TransactionDetails.Transaction(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.status = reader.int32(); break; } case 2: { message.mobileCoinIdentification = $root.signalbackups.PaymentNotification.TransactionDetails.MobileCoinTxoIdentification.decode(reader, reader.uint32()); break; } case 3: { message.timestamp = reader.uint64(); break; } case 4: { message.blockIndex = reader.uint64(); break; } case 5: { message.blockTimestamp = reader.uint64(); break; } case 6: { message.transaction = reader.bytes(); break; } case 7: { message.receipt = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Transaction message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.PaymentNotification.TransactionDetails.Transaction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.PaymentNotification.TransactionDetails.Transaction} Transaction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Transaction.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * Status enum. * @name signalbackups.PaymentNotification.TransactionDetails.Transaction.Status * @enum {number} * @property {number} INITIAL=0 INITIAL value * @property {number} SUBMITTED=1 SUBMITTED value * @property {number} SUCCESSFUL=2 SUCCESSFUL value */ Transaction.Status = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "INITIAL"] = 0; values[valuesById[1] = "SUBMITTED"] = 1; values[valuesById[2] = "SUCCESSFUL"] = 2; return values; })(); return Transaction; })(); return TransactionDetails; })(); return PaymentNotification; })(); signalbackups.GiftBadge = (function() { /** * Properties of a GiftBadge. * @memberof signalbackups * @interface IGiftBadge * @property {Uint8Array|null} [receiptCredentialPresentation] GiftBadge receiptCredentialPresentation * @property {signalbackups.GiftBadge.State|null} [state] GiftBadge state */ /** * Constructs a new GiftBadge. * @memberof signalbackups * @classdesc Represents a GiftBadge. * @implements IGiftBadge * @constructor * @param {signalbackups.IGiftBadge=} [properties] Properties to set */ function GiftBadge(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GiftBadge receiptCredentialPresentation. * @member {Uint8Array} receiptCredentialPresentation * @memberof signalbackups.GiftBadge * @instance */ GiftBadge.prototype.receiptCredentialPresentation = $util.newBuffer([]); /** * GiftBadge state. * @member {signalbackups.GiftBadge.State} state * @memberof signalbackups.GiftBadge * @instance */ GiftBadge.prototype.state = 0; /** * Encodes the specified GiftBadge message. Does not implicitly {@link signalbackups.GiftBadge.verify|verify} messages. * @function encode * @memberof signalbackups.GiftBadge * @static * @param {signalbackups.IGiftBadge} message GiftBadge message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GiftBadge.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.GiftBadge.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.GiftBadge.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.receiptCredentialPresentation != null && Object.hasOwnProperty.call(message, "receiptCredentialPresentation")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.receiptCredentialPresentation); if (message.state != null && Object.hasOwnProperty.call(message, "state")) writer.uint32(/* id 2, wireType 0 =*/16).int32(message.state); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GiftBadge message, length delimited. Does not implicitly {@link signalbackups.GiftBadge.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.GiftBadge * @static * @param {signalbackups.IGiftBadge} message GiftBadge message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GiftBadge.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GiftBadge message from the specified reader or buffer. * @function decode * @memberof signalbackups.GiftBadge * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.GiftBadge} GiftBadge * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GiftBadge.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.GiftBadge(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.receiptCredentialPresentation = reader.bytes(); break; } case 2: { message.state = reader.int32(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GiftBadge message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.GiftBadge * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.GiftBadge} GiftBadge * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GiftBadge.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * State enum. * @name signalbackups.GiftBadge.State * @enum {number} * @property {number} UNOPENED=0 UNOPENED value * @property {number} OPENED=1 OPENED value * @property {number} REDEEMED=2 REDEEMED value * @property {number} FAILED=3 FAILED value */ GiftBadge.State = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "UNOPENED"] = 0; values[valuesById[1] = "OPENED"] = 1; values[valuesById[2] = "REDEEMED"] = 2; values[valuesById[3] = "FAILED"] = 3; return values; })(); return GiftBadge; })(); signalbackups.ViewOnceMessage = (function() { /** * Properties of a ViewOnceMessage. * @memberof signalbackups * @interface IViewOnceMessage * @property {signalbackups.IMessageAttachment|null} [attachment] ViewOnceMessage attachment * @property {Array.|null} [reactions] ViewOnceMessage reactions */ /** * Constructs a new ViewOnceMessage. * @memberof signalbackups * @classdesc Represents a ViewOnceMessage. * @implements IViewOnceMessage * @constructor * @param {signalbackups.IViewOnceMessage=} [properties] Properties to set */ function ViewOnceMessage(properties) { this.reactions = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * ViewOnceMessage attachment. * @member {signalbackups.IMessageAttachment|null|undefined} attachment * @memberof signalbackups.ViewOnceMessage * @instance */ ViewOnceMessage.prototype.attachment = null; /** * ViewOnceMessage reactions. * @member {Array.} reactions * @memberof signalbackups.ViewOnceMessage * @instance */ ViewOnceMessage.prototype.reactions = $util.emptyArray; /** * Encodes the specified ViewOnceMessage message. Does not implicitly {@link signalbackups.ViewOnceMessage.verify|verify} messages. * @function encode * @memberof signalbackups.ViewOnceMessage * @static * @param {signalbackups.IViewOnceMessage} message ViewOnceMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ViewOnceMessage.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.ViewOnceMessage.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.ViewOnceMessage.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.attachment != null && Object.hasOwnProperty.call(message, "attachment")) $root.signalbackups.MessageAttachment.encode(message.attachment, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.reactions != null && message.reactions.length) for (var i = 0; i < message.reactions.length; ++i) $root.signalbackups.Reaction.encode(message.reactions[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified ViewOnceMessage message, length delimited. Does not implicitly {@link signalbackups.ViewOnceMessage.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.ViewOnceMessage * @static * @param {signalbackups.IViewOnceMessage} message ViewOnceMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ViewOnceMessage.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a ViewOnceMessage message from the specified reader or buffer. * @function decode * @memberof signalbackups.ViewOnceMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.ViewOnceMessage} ViewOnceMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ViewOnceMessage.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.ViewOnceMessage(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.attachment = $root.signalbackups.MessageAttachment.decode(reader, reader.uint32()); break; } case 2: { if (!(message.reactions && message.reactions.length)) message.reactions = []; message.reactions.push($root.signalbackups.Reaction.decode(reader, reader.uint32())); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a ViewOnceMessage message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.ViewOnceMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.ViewOnceMessage} ViewOnceMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ViewOnceMessage.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return ViewOnceMessage; })(); signalbackups.ContactAttachment = (function() { /** * Properties of a ContactAttachment. * @memberof signalbackups * @interface IContactAttachment * @property {signalbackups.ContactAttachment.IName|null} [name] ContactAttachment name * @property {Array.|null} [number] ContactAttachment number * @property {Array.|null} [email] ContactAttachment email * @property {Array.|null} [address] ContactAttachment address * @property {signalbackups.IFilePointer|null} [avatar] ContactAttachment avatar * @property {string|null} [organization] ContactAttachment organization */ /** * Constructs a new ContactAttachment. * @memberof signalbackups * @classdesc Represents a ContactAttachment. * @implements IContactAttachment * @constructor * @param {signalbackups.IContactAttachment=} [properties] Properties to set */ function ContactAttachment(properties) { this.number = []; this.email = []; this.address = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * ContactAttachment name. * @member {signalbackups.ContactAttachment.IName|null|undefined} name * @memberof signalbackups.ContactAttachment * @instance */ ContactAttachment.prototype.name = null; /** * ContactAttachment number. * @member {Array.} number * @memberof signalbackups.ContactAttachment * @instance */ ContactAttachment.prototype.number = $util.emptyArray; /** * ContactAttachment email. * @member {Array.} email * @memberof signalbackups.ContactAttachment * @instance */ ContactAttachment.prototype.email = $util.emptyArray; /** * ContactAttachment address. * @member {Array.} address * @memberof signalbackups.ContactAttachment * @instance */ ContactAttachment.prototype.address = $util.emptyArray; /** * ContactAttachment avatar. * @member {signalbackups.IFilePointer|null|undefined} avatar * @memberof signalbackups.ContactAttachment * @instance */ ContactAttachment.prototype.avatar = null; /** * ContactAttachment organization. * @member {string} organization * @memberof signalbackups.ContactAttachment * @instance */ ContactAttachment.prototype.organization = ""; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * ContactAttachment _name. * @member {"name"|undefined} _name * @memberof signalbackups.ContactAttachment * @instance */ Object.defineProperty(ContactAttachment.prototype, "_name", { get: $util.oneOfGetter($oneOfFields = ["name"]), set: $util.oneOfSetter($oneOfFields) }); /** * ContactAttachment _avatar. * @member {"avatar"|undefined} _avatar * @memberof signalbackups.ContactAttachment * @instance */ Object.defineProperty(ContactAttachment.prototype, "_avatar", { get: $util.oneOfGetter($oneOfFields = ["avatar"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified ContactAttachment message. Does not implicitly {@link signalbackups.ContactAttachment.verify|verify} messages. * @function encode * @memberof signalbackups.ContactAttachment * @static * @param {signalbackups.IContactAttachment} message ContactAttachment message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ContactAttachment.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.ContactAttachment.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.ContactAttachment.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.name != null && Object.hasOwnProperty.call(message, "name")) $root.signalbackups.ContactAttachment.Name.encode(message.name, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.number != null && message.number.length) for (var i = 0; i < message.number.length; ++i) $root.signalbackups.ContactAttachment.Phone.encode(message.number[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); if (message.email != null && message.email.length) for (var i = 0; i < message.email.length; ++i) $root.signalbackups.ContactAttachment.Email.encode(message.email[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); if (message.address != null && message.address.length) for (var i = 0; i < message.address.length; ++i) $root.signalbackups.ContactAttachment.PostalAddress.encode(message.address[i], writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); if (message.avatar != null && Object.hasOwnProperty.call(message, "avatar")) $root.signalbackups.FilePointer.encode(message.avatar, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim(); if (message.organization != null && Object.hasOwnProperty.call(message, "organization")) writer.uint32(/* id 7, wireType 2 =*/58).string(message.organization); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified ContactAttachment message, length delimited. Does not implicitly {@link signalbackups.ContactAttachment.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.ContactAttachment * @static * @param {signalbackups.IContactAttachment} message ContactAttachment message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ContactAttachment.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a ContactAttachment message from the specified reader or buffer. * @function decode * @memberof signalbackups.ContactAttachment * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.ContactAttachment} ContactAttachment * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ContactAttachment.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.ContactAttachment(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.name = $root.signalbackups.ContactAttachment.Name.decode(reader, reader.uint32()); break; } case 3: { if (!(message.number && message.number.length)) message.number = []; message.number.push($root.signalbackups.ContactAttachment.Phone.decode(reader, reader.uint32())); break; } case 4: { if (!(message.email && message.email.length)) message.email = []; message.email.push($root.signalbackups.ContactAttachment.Email.decode(reader, reader.uint32())); break; } case 5: { if (!(message.address && message.address.length)) message.address = []; message.address.push($root.signalbackups.ContactAttachment.PostalAddress.decode(reader, reader.uint32())); break; } case 6: { message.avatar = $root.signalbackups.FilePointer.decode(reader, reader.uint32()); break; } case 7: { message.organization = reader.string(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a ContactAttachment message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.ContactAttachment * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.ContactAttachment} ContactAttachment * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ContactAttachment.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; ContactAttachment.Name = (function() { /** * Properties of a Name. * @memberof signalbackups.ContactAttachment * @interface IName * @property {string|null} [givenName] Name givenName * @property {string|null} [familyName] Name familyName * @property {string|null} [prefix] Name prefix * @property {string|null} [suffix] Name suffix * @property {string|null} [middleName] Name middleName * @property {string|null} [nickname] Name nickname */ /** * Constructs a new Name. * @memberof signalbackups.ContactAttachment * @classdesc Represents a Name. * @implements IName * @constructor * @param {signalbackups.ContactAttachment.IName=} [properties] Properties to set */ function Name(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Name givenName. * @member {string} givenName * @memberof signalbackups.ContactAttachment.Name * @instance */ Name.prototype.givenName = ""; /** * Name familyName. * @member {string} familyName * @memberof signalbackups.ContactAttachment.Name * @instance */ Name.prototype.familyName = ""; /** * Name prefix. * @member {string} prefix * @memberof signalbackups.ContactAttachment.Name * @instance */ Name.prototype.prefix = ""; /** * Name suffix. * @member {string} suffix * @memberof signalbackups.ContactAttachment.Name * @instance */ Name.prototype.suffix = ""; /** * Name middleName. * @member {string} middleName * @memberof signalbackups.ContactAttachment.Name * @instance */ Name.prototype.middleName = ""; /** * Name nickname. * @member {string} nickname * @memberof signalbackups.ContactAttachment.Name * @instance */ Name.prototype.nickname = ""; /** * Encodes the specified Name message. Does not implicitly {@link signalbackups.ContactAttachment.Name.verify|verify} messages. * @function encode * @memberof signalbackups.ContactAttachment.Name * @static * @param {signalbackups.ContactAttachment.IName} message Name message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Name.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.ContactAttachment.Name.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.ContactAttachment.Name.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.givenName != null && Object.hasOwnProperty.call(message, "givenName")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.givenName); if (message.familyName != null && Object.hasOwnProperty.call(message, "familyName")) writer.uint32(/* id 2, wireType 2 =*/18).string(message.familyName); if (message.prefix != null && Object.hasOwnProperty.call(message, "prefix")) writer.uint32(/* id 3, wireType 2 =*/26).string(message.prefix); if (message.suffix != null && Object.hasOwnProperty.call(message, "suffix")) writer.uint32(/* id 4, wireType 2 =*/34).string(message.suffix); if (message.middleName != null && Object.hasOwnProperty.call(message, "middleName")) writer.uint32(/* id 5, wireType 2 =*/42).string(message.middleName); if (message.nickname != null && Object.hasOwnProperty.call(message, "nickname")) writer.uint32(/* id 6, wireType 2 =*/50).string(message.nickname); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Name message, length delimited. Does not implicitly {@link signalbackups.ContactAttachment.Name.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.ContactAttachment.Name * @static * @param {signalbackups.ContactAttachment.IName} message Name message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Name.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Name message from the specified reader or buffer. * @function decode * @memberof signalbackups.ContactAttachment.Name * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.ContactAttachment.Name} Name * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Name.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.ContactAttachment.Name(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.givenName = reader.string(); break; } case 2: { message.familyName = reader.string(); break; } case 3: { message.prefix = reader.string(); break; } case 4: { message.suffix = reader.string(); break; } case 5: { message.middleName = reader.string(); break; } case 6: { message.nickname = reader.string(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Name message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.ContactAttachment.Name * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.ContactAttachment.Name} Name * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Name.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return Name; })(); ContactAttachment.Phone = (function() { /** * Properties of a Phone. * @memberof signalbackups.ContactAttachment * @interface IPhone * @property {string|null} [value] Phone value * @property {signalbackups.ContactAttachment.Phone.Type|null} [type] Phone type * @property {string|null} [label] Phone label */ /** * Constructs a new Phone. * @memberof signalbackups.ContactAttachment * @classdesc Represents a Phone. * @implements IPhone * @constructor * @param {signalbackups.ContactAttachment.IPhone=} [properties] Properties to set */ function Phone(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Phone value. * @member {string} value * @memberof signalbackups.ContactAttachment.Phone * @instance */ Phone.prototype.value = ""; /** * Phone type. * @member {signalbackups.ContactAttachment.Phone.Type} type * @memberof signalbackups.ContactAttachment.Phone * @instance */ Phone.prototype.type = 0; /** * Phone label. * @member {string} label * @memberof signalbackups.ContactAttachment.Phone * @instance */ Phone.prototype.label = ""; /** * Encodes the specified Phone message. Does not implicitly {@link signalbackups.ContactAttachment.Phone.verify|verify} messages. * @function encode * @memberof signalbackups.ContactAttachment.Phone * @static * @param {signalbackups.ContactAttachment.IPhone} message Phone message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Phone.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.ContactAttachment.Phone.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.ContactAttachment.Phone.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.value != null && Object.hasOwnProperty.call(message, "value")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.value); if (message.type != null && Object.hasOwnProperty.call(message, "type")) writer.uint32(/* id 2, wireType 0 =*/16).int32(message.type); if (message.label != null && Object.hasOwnProperty.call(message, "label")) writer.uint32(/* id 3, wireType 2 =*/26).string(message.label); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Phone message, length delimited. Does not implicitly {@link signalbackups.ContactAttachment.Phone.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.ContactAttachment.Phone * @static * @param {signalbackups.ContactAttachment.IPhone} message Phone message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Phone.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Phone message from the specified reader or buffer. * @function decode * @memberof signalbackups.ContactAttachment.Phone * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.ContactAttachment.Phone} Phone * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Phone.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.ContactAttachment.Phone(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.value = reader.string(); break; } case 2: { message.type = reader.int32(); break; } case 3: { message.label = reader.string(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Phone message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.ContactAttachment.Phone * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.ContactAttachment.Phone} Phone * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Phone.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * Type enum. * @name signalbackups.ContactAttachment.Phone.Type * @enum {number} * @property {number} UNKNOWN=0 UNKNOWN value * @property {number} HOME=1 HOME value * @property {number} MOBILE=2 MOBILE value * @property {number} WORK=3 WORK value * @property {number} CUSTOM=4 CUSTOM value */ Phone.Type = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "UNKNOWN"] = 0; values[valuesById[1] = "HOME"] = 1; values[valuesById[2] = "MOBILE"] = 2; values[valuesById[3] = "WORK"] = 3; values[valuesById[4] = "CUSTOM"] = 4; return values; })(); return Phone; })(); ContactAttachment.Email = (function() { /** * Properties of an Email. * @memberof signalbackups.ContactAttachment * @interface IEmail * @property {string|null} [value] Email value * @property {signalbackups.ContactAttachment.Email.Type|null} [type] Email type * @property {string|null} [label] Email label */ /** * Constructs a new Email. * @memberof signalbackups.ContactAttachment * @classdesc Represents an Email. * @implements IEmail * @constructor * @param {signalbackups.ContactAttachment.IEmail=} [properties] Properties to set */ function Email(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Email value. * @member {string} value * @memberof signalbackups.ContactAttachment.Email * @instance */ Email.prototype.value = ""; /** * Email type. * @member {signalbackups.ContactAttachment.Email.Type} type * @memberof signalbackups.ContactAttachment.Email * @instance */ Email.prototype.type = 0; /** * Email label. * @member {string} label * @memberof signalbackups.ContactAttachment.Email * @instance */ Email.prototype.label = ""; /** * Encodes the specified Email message. Does not implicitly {@link signalbackups.ContactAttachment.Email.verify|verify} messages. * @function encode * @memberof signalbackups.ContactAttachment.Email * @static * @param {signalbackups.ContactAttachment.IEmail} message Email message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Email.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.ContactAttachment.Email.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.ContactAttachment.Email.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.value != null && Object.hasOwnProperty.call(message, "value")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.value); if (message.type != null && Object.hasOwnProperty.call(message, "type")) writer.uint32(/* id 2, wireType 0 =*/16).int32(message.type); if (message.label != null && Object.hasOwnProperty.call(message, "label")) writer.uint32(/* id 3, wireType 2 =*/26).string(message.label); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Email message, length delimited. Does not implicitly {@link signalbackups.ContactAttachment.Email.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.ContactAttachment.Email * @static * @param {signalbackups.ContactAttachment.IEmail} message Email message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Email.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an Email message from the specified reader or buffer. * @function decode * @memberof signalbackups.ContactAttachment.Email * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.ContactAttachment.Email} Email * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Email.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.ContactAttachment.Email(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.value = reader.string(); break; } case 2: { message.type = reader.int32(); break; } case 3: { message.label = reader.string(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an Email message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.ContactAttachment.Email * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.ContactAttachment.Email} Email * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Email.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * Type enum. * @name signalbackups.ContactAttachment.Email.Type * @enum {number} * @property {number} UNKNOWN=0 UNKNOWN value * @property {number} HOME=1 HOME value * @property {number} MOBILE=2 MOBILE value * @property {number} WORK=3 WORK value * @property {number} CUSTOM=4 CUSTOM value */ Email.Type = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "UNKNOWN"] = 0; values[valuesById[1] = "HOME"] = 1; values[valuesById[2] = "MOBILE"] = 2; values[valuesById[3] = "WORK"] = 3; values[valuesById[4] = "CUSTOM"] = 4; return values; })(); return Email; })(); ContactAttachment.PostalAddress = (function() { /** * Properties of a PostalAddress. * @memberof signalbackups.ContactAttachment * @interface IPostalAddress * @property {signalbackups.ContactAttachment.PostalAddress.Type|null} [type] PostalAddress type * @property {string|null} [label] PostalAddress label * @property {string|null} [street] PostalAddress street * @property {string|null} [pobox] PostalAddress pobox * @property {string|null} [neighborhood] PostalAddress neighborhood * @property {string|null} [city] PostalAddress city * @property {string|null} [region] PostalAddress region * @property {string|null} [postcode] PostalAddress postcode * @property {string|null} [country] PostalAddress country */ /** * Constructs a new PostalAddress. * @memberof signalbackups.ContactAttachment * @classdesc Represents a PostalAddress. * @implements IPostalAddress * @constructor * @param {signalbackups.ContactAttachment.IPostalAddress=} [properties] Properties to set */ function PostalAddress(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * PostalAddress type. * @member {signalbackups.ContactAttachment.PostalAddress.Type} type * @memberof signalbackups.ContactAttachment.PostalAddress * @instance */ PostalAddress.prototype.type = 0; /** * PostalAddress label. * @member {string} label * @memberof signalbackups.ContactAttachment.PostalAddress * @instance */ PostalAddress.prototype.label = ""; /** * PostalAddress street. * @member {string} street * @memberof signalbackups.ContactAttachment.PostalAddress * @instance */ PostalAddress.prototype.street = ""; /** * PostalAddress pobox. * @member {string} pobox * @memberof signalbackups.ContactAttachment.PostalAddress * @instance */ PostalAddress.prototype.pobox = ""; /** * PostalAddress neighborhood. * @member {string} neighborhood * @memberof signalbackups.ContactAttachment.PostalAddress * @instance */ PostalAddress.prototype.neighborhood = ""; /** * PostalAddress city. * @member {string} city * @memberof signalbackups.ContactAttachment.PostalAddress * @instance */ PostalAddress.prototype.city = ""; /** * PostalAddress region. * @member {string} region * @memberof signalbackups.ContactAttachment.PostalAddress * @instance */ PostalAddress.prototype.region = ""; /** * PostalAddress postcode. * @member {string} postcode * @memberof signalbackups.ContactAttachment.PostalAddress * @instance */ PostalAddress.prototype.postcode = ""; /** * PostalAddress country. * @member {string} country * @memberof signalbackups.ContactAttachment.PostalAddress * @instance */ PostalAddress.prototype.country = ""; /** * Encodes the specified PostalAddress message. Does not implicitly {@link signalbackups.ContactAttachment.PostalAddress.verify|verify} messages. * @function encode * @memberof signalbackups.ContactAttachment.PostalAddress * @static * @param {signalbackups.ContactAttachment.IPostalAddress} message PostalAddress message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ PostalAddress.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.ContactAttachment.PostalAddress.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.ContactAttachment.PostalAddress.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.type != null && Object.hasOwnProperty.call(message, "type")) writer.uint32(/* id 1, wireType 0 =*/8).int32(message.type); if (message.label != null && Object.hasOwnProperty.call(message, "label")) writer.uint32(/* id 2, wireType 2 =*/18).string(message.label); if (message.street != null && Object.hasOwnProperty.call(message, "street")) writer.uint32(/* id 3, wireType 2 =*/26).string(message.street); if (message.pobox != null && Object.hasOwnProperty.call(message, "pobox")) writer.uint32(/* id 4, wireType 2 =*/34).string(message.pobox); if (message.neighborhood != null && Object.hasOwnProperty.call(message, "neighborhood")) writer.uint32(/* id 5, wireType 2 =*/42).string(message.neighborhood); if (message.city != null && Object.hasOwnProperty.call(message, "city")) writer.uint32(/* id 6, wireType 2 =*/50).string(message.city); if (message.region != null && Object.hasOwnProperty.call(message, "region")) writer.uint32(/* id 7, wireType 2 =*/58).string(message.region); if (message.postcode != null && Object.hasOwnProperty.call(message, "postcode")) writer.uint32(/* id 8, wireType 2 =*/66).string(message.postcode); if (message.country != null && Object.hasOwnProperty.call(message, "country")) writer.uint32(/* id 9, wireType 2 =*/74).string(message.country); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified PostalAddress message, length delimited. Does not implicitly {@link signalbackups.ContactAttachment.PostalAddress.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.ContactAttachment.PostalAddress * @static * @param {signalbackups.ContactAttachment.IPostalAddress} message PostalAddress message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ PostalAddress.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a PostalAddress message from the specified reader or buffer. * @function decode * @memberof signalbackups.ContactAttachment.PostalAddress * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.ContactAttachment.PostalAddress} PostalAddress * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ PostalAddress.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.ContactAttachment.PostalAddress(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.type = reader.int32(); break; } case 2: { message.label = reader.string(); break; } case 3: { message.street = reader.string(); break; } case 4: { message.pobox = reader.string(); break; } case 5: { message.neighborhood = reader.string(); break; } case 6: { message.city = reader.string(); break; } case 7: { message.region = reader.string(); break; } case 8: { message.postcode = reader.string(); break; } case 9: { message.country = reader.string(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a PostalAddress message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.ContactAttachment.PostalAddress * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.ContactAttachment.PostalAddress} PostalAddress * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ PostalAddress.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * Type enum. * @name signalbackups.ContactAttachment.PostalAddress.Type * @enum {number} * @property {number} UNKNOWN=0 UNKNOWN value * @property {number} HOME=1 HOME value * @property {number} WORK=2 WORK value * @property {number} CUSTOM=3 CUSTOM value */ PostalAddress.Type = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "UNKNOWN"] = 0; values[valuesById[1] = "HOME"] = 1; values[valuesById[2] = "WORK"] = 2; values[valuesById[3] = "CUSTOM"] = 3; return values; })(); return PostalAddress; })(); return ContactAttachment; })(); signalbackups.StickerMessage = (function() { /** * Properties of a StickerMessage. * @memberof signalbackups * @interface IStickerMessage * @property {signalbackups.ISticker|null} [sticker] StickerMessage sticker * @property {Array.|null} [reactions] StickerMessage reactions */ /** * Constructs a new StickerMessage. * @memberof signalbackups * @classdesc Represents a StickerMessage. * @implements IStickerMessage * @constructor * @param {signalbackups.IStickerMessage=} [properties] Properties to set */ function StickerMessage(properties) { this.reactions = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * StickerMessage sticker. * @member {signalbackups.ISticker|null|undefined} sticker * @memberof signalbackups.StickerMessage * @instance */ StickerMessage.prototype.sticker = null; /** * StickerMessage reactions. * @member {Array.} reactions * @memberof signalbackups.StickerMessage * @instance */ StickerMessage.prototype.reactions = $util.emptyArray; /** * Encodes the specified StickerMessage message. Does not implicitly {@link signalbackups.StickerMessage.verify|verify} messages. * @function encode * @memberof signalbackups.StickerMessage * @static * @param {signalbackups.IStickerMessage} message StickerMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ StickerMessage.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.StickerMessage.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.StickerMessage.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.sticker != null && Object.hasOwnProperty.call(message, "sticker")) $root.signalbackups.Sticker.encode(message.sticker, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.reactions != null && message.reactions.length) for (var i = 0; i < message.reactions.length; ++i) $root.signalbackups.Reaction.encode(message.reactions[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified StickerMessage message, length delimited. Does not implicitly {@link signalbackups.StickerMessage.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.StickerMessage * @static * @param {signalbackups.IStickerMessage} message StickerMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ StickerMessage.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a StickerMessage message from the specified reader or buffer. * @function decode * @memberof signalbackups.StickerMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.StickerMessage} StickerMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ StickerMessage.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.StickerMessage(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.sticker = $root.signalbackups.Sticker.decode(reader, reader.uint32()); break; } case 2: { if (!(message.reactions && message.reactions.length)) message.reactions = []; message.reactions.push($root.signalbackups.Reaction.decode(reader, reader.uint32())); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a StickerMessage message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.StickerMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.StickerMessage} StickerMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ StickerMessage.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return StickerMessage; })(); signalbackups.RemoteDeletedMessage = (function() { /** * Properties of a RemoteDeletedMessage. * @memberof signalbackups * @interface IRemoteDeletedMessage */ /** * Constructs a new RemoteDeletedMessage. * @memberof signalbackups * @classdesc Represents a RemoteDeletedMessage. * @implements IRemoteDeletedMessage * @constructor * @param {signalbackups.IRemoteDeletedMessage=} [properties] Properties to set */ function RemoteDeletedMessage(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Encodes the specified RemoteDeletedMessage message. Does not implicitly {@link signalbackups.RemoteDeletedMessage.verify|verify} messages. * @function encode * @memberof signalbackups.RemoteDeletedMessage * @static * @param {signalbackups.IRemoteDeletedMessage} message RemoteDeletedMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ RemoteDeletedMessage.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.RemoteDeletedMessage.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.RemoteDeletedMessage.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified RemoteDeletedMessage message, length delimited. Does not implicitly {@link signalbackups.RemoteDeletedMessage.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.RemoteDeletedMessage * @static * @param {signalbackups.IRemoteDeletedMessage} message RemoteDeletedMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ RemoteDeletedMessage.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a RemoteDeletedMessage message from the specified reader or buffer. * @function decode * @memberof signalbackups.RemoteDeletedMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.RemoteDeletedMessage} RemoteDeletedMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ RemoteDeletedMessage.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.RemoteDeletedMessage(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a RemoteDeletedMessage message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.RemoteDeletedMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.RemoteDeletedMessage} RemoteDeletedMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ RemoteDeletedMessage.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return RemoteDeletedMessage; })(); signalbackups.Sticker = (function() { /** * Properties of a Sticker. * @memberof signalbackups * @interface ISticker * @property {Uint8Array|null} [packId] Sticker packId * @property {Uint8Array|null} [packKey] Sticker packKey * @property {number|null} [stickerId] Sticker stickerId * @property {string|null} [emoji] Sticker emoji * @property {signalbackups.IFilePointer|null} [data] Sticker data */ /** * Constructs a new Sticker. * @memberof signalbackups * @classdesc Represents a Sticker. * @implements ISticker * @constructor * @param {signalbackups.ISticker=} [properties] Properties to set */ function Sticker(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Sticker packId. * @member {Uint8Array} packId * @memberof signalbackups.Sticker * @instance */ Sticker.prototype.packId = $util.newBuffer([]); /** * Sticker packKey. * @member {Uint8Array} packKey * @memberof signalbackups.Sticker * @instance */ Sticker.prototype.packKey = $util.newBuffer([]); /** * Sticker stickerId. * @member {number} stickerId * @memberof signalbackups.Sticker * @instance */ Sticker.prototype.stickerId = 0; /** * Sticker emoji. * @member {string|null|undefined} emoji * @memberof signalbackups.Sticker * @instance */ Sticker.prototype.emoji = null; /** * Sticker data. * @member {signalbackups.IFilePointer|null|undefined} data * @memberof signalbackups.Sticker * @instance */ Sticker.prototype.data = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * Sticker _emoji. * @member {"emoji"|undefined} _emoji * @memberof signalbackups.Sticker * @instance */ Object.defineProperty(Sticker.prototype, "_emoji", { get: $util.oneOfGetter($oneOfFields = ["emoji"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified Sticker message. Does not implicitly {@link signalbackups.Sticker.verify|verify} messages. * @function encode * @memberof signalbackups.Sticker * @static * @param {signalbackups.ISticker} message Sticker message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Sticker.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.Sticker.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.Sticker.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.packId != null && Object.hasOwnProperty.call(message, "packId")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.packId); if (message.packKey != null && Object.hasOwnProperty.call(message, "packKey")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.packKey); if (message.stickerId != null && Object.hasOwnProperty.call(message, "stickerId")) writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.stickerId); if (message.emoji != null && Object.hasOwnProperty.call(message, "emoji")) writer.uint32(/* id 4, wireType 2 =*/34).string(message.emoji); if (message.data != null && Object.hasOwnProperty.call(message, "data")) $root.signalbackups.FilePointer.encode(message.data, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Sticker message, length delimited. Does not implicitly {@link signalbackups.Sticker.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.Sticker * @static * @param {signalbackups.ISticker} message Sticker message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Sticker.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Sticker message from the specified reader or buffer. * @function decode * @memberof signalbackups.Sticker * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.Sticker} Sticker * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Sticker.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.Sticker(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.packId = reader.bytes(); break; } case 2: { message.packKey = reader.bytes(); break; } case 3: { message.stickerId = reader.uint32(); break; } case 4: { message.emoji = reader.string(); break; } case 5: { message.data = $root.signalbackups.FilePointer.decode(reader, reader.uint32()); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Sticker message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.Sticker * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.Sticker} Sticker * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Sticker.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return Sticker; })(); signalbackups.LinkPreview = (function() { /** * Properties of a LinkPreview. * @memberof signalbackups * @interface ILinkPreview * @property {string|null} [url] LinkPreview url * @property {string|null} [title] LinkPreview title * @property {signalbackups.IFilePointer|null} [image] LinkPreview image * @property {string|null} [description] LinkPreview description * @property {Long|null} [date] LinkPreview date */ /** * Constructs a new LinkPreview. * @memberof signalbackups * @classdesc Represents a LinkPreview. * @implements ILinkPreview * @constructor * @param {signalbackups.ILinkPreview=} [properties] Properties to set */ function LinkPreview(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * LinkPreview url. * @member {string} url * @memberof signalbackups.LinkPreview * @instance */ LinkPreview.prototype.url = ""; /** * LinkPreview title. * @member {string|null|undefined} title * @memberof signalbackups.LinkPreview * @instance */ LinkPreview.prototype.title = null; /** * LinkPreview image. * @member {signalbackups.IFilePointer|null|undefined} image * @memberof signalbackups.LinkPreview * @instance */ LinkPreview.prototype.image = null; /** * LinkPreview description. * @member {string|null|undefined} description * @memberof signalbackups.LinkPreview * @instance */ LinkPreview.prototype.description = null; /** * LinkPreview date. * @member {Long|null|undefined} date * @memberof signalbackups.LinkPreview * @instance */ LinkPreview.prototype.date = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * LinkPreview _title. * @member {"title"|undefined} _title * @memberof signalbackups.LinkPreview * @instance */ Object.defineProperty(LinkPreview.prototype, "_title", { get: $util.oneOfGetter($oneOfFields = ["title"]), set: $util.oneOfSetter($oneOfFields) }); /** * LinkPreview _image. * @member {"image"|undefined} _image * @memberof signalbackups.LinkPreview * @instance */ Object.defineProperty(LinkPreview.prototype, "_image", { get: $util.oneOfGetter($oneOfFields = ["image"]), set: $util.oneOfSetter($oneOfFields) }); /** * LinkPreview _description. * @member {"description"|undefined} _description * @memberof signalbackups.LinkPreview * @instance */ Object.defineProperty(LinkPreview.prototype, "_description", { get: $util.oneOfGetter($oneOfFields = ["description"]), set: $util.oneOfSetter($oneOfFields) }); /** * LinkPreview _date. * @member {"date"|undefined} _date * @memberof signalbackups.LinkPreview * @instance */ Object.defineProperty(LinkPreview.prototype, "_date", { get: $util.oneOfGetter($oneOfFields = ["date"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified LinkPreview message. Does not implicitly {@link signalbackups.LinkPreview.verify|verify} messages. * @function encode * @memberof signalbackups.LinkPreview * @static * @param {signalbackups.ILinkPreview} message LinkPreview message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ LinkPreview.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.LinkPreview.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.LinkPreview.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.url != null && Object.hasOwnProperty.call(message, "url")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.url); if (message.title != null && Object.hasOwnProperty.call(message, "title")) writer.uint32(/* id 2, wireType 2 =*/18).string(message.title); if (message.image != null && Object.hasOwnProperty.call(message, "image")) $root.signalbackups.FilePointer.encode(message.image, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); if (message.description != null && Object.hasOwnProperty.call(message, "description")) writer.uint32(/* id 4, wireType 2 =*/34).string(message.description); if (message.date != null && Object.hasOwnProperty.call(message, "date")) writer.uint32(/* id 5, wireType 0 =*/40).uint64(message.date); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified LinkPreview message, length delimited. Does not implicitly {@link signalbackups.LinkPreview.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.LinkPreview * @static * @param {signalbackups.ILinkPreview} message LinkPreview message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ LinkPreview.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a LinkPreview message from the specified reader or buffer. * @function decode * @memberof signalbackups.LinkPreview * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.LinkPreview} LinkPreview * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ LinkPreview.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.LinkPreview(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.url = reader.string(); break; } case 2: { message.title = reader.string(); break; } case 3: { message.image = $root.signalbackups.FilePointer.decode(reader, reader.uint32()); break; } case 4: { message.description = reader.string(); break; } case 5: { message.date = reader.uint64(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a LinkPreview message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.LinkPreview * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.LinkPreview} LinkPreview * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ LinkPreview.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return LinkPreview; })(); signalbackups.MessageAttachment = (function() { /** * Properties of a MessageAttachment. * @memberof signalbackups * @interface IMessageAttachment * @property {signalbackups.IFilePointer|null} [pointer] MessageAttachment pointer * @property {signalbackups.MessageAttachment.Flag|null} [flag] MessageAttachment flag * @property {boolean|null} [wasDownloaded] MessageAttachment wasDownloaded * @property {Uint8Array|null} [clientUuid] MessageAttachment clientUuid */ /** * Constructs a new MessageAttachment. * @memberof signalbackups * @classdesc Represents a MessageAttachment. * @implements IMessageAttachment * @constructor * @param {signalbackups.IMessageAttachment=} [properties] Properties to set */ function MessageAttachment(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * MessageAttachment pointer. * @member {signalbackups.IFilePointer|null|undefined} pointer * @memberof signalbackups.MessageAttachment * @instance */ MessageAttachment.prototype.pointer = null; /** * MessageAttachment flag. * @member {signalbackups.MessageAttachment.Flag} flag * @memberof signalbackups.MessageAttachment * @instance */ MessageAttachment.prototype.flag = 0; /** * MessageAttachment wasDownloaded. * @member {boolean} wasDownloaded * @memberof signalbackups.MessageAttachment * @instance */ MessageAttachment.prototype.wasDownloaded = false; /** * MessageAttachment clientUuid. * @member {Uint8Array|null|undefined} clientUuid * @memberof signalbackups.MessageAttachment * @instance */ MessageAttachment.prototype.clientUuid = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * MessageAttachment _clientUuid. * @member {"clientUuid"|undefined} _clientUuid * @memberof signalbackups.MessageAttachment * @instance */ Object.defineProperty(MessageAttachment.prototype, "_clientUuid", { get: $util.oneOfGetter($oneOfFields = ["clientUuid"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified MessageAttachment message. Does not implicitly {@link signalbackups.MessageAttachment.verify|verify} messages. * @function encode * @memberof signalbackups.MessageAttachment * @static * @param {signalbackups.IMessageAttachment} message MessageAttachment message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ MessageAttachment.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.MessageAttachment.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.MessageAttachment.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.pointer != null && Object.hasOwnProperty.call(message, "pointer")) $root.signalbackups.FilePointer.encode(message.pointer, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.flag != null && Object.hasOwnProperty.call(message, "flag")) writer.uint32(/* id 2, wireType 0 =*/16).int32(message.flag); if (message.wasDownloaded != null && Object.hasOwnProperty.call(message, "wasDownloaded")) writer.uint32(/* id 3, wireType 0 =*/24).bool(message.wasDownloaded); if (message.clientUuid != null && Object.hasOwnProperty.call(message, "clientUuid")) writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.clientUuid); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified MessageAttachment message, length delimited. Does not implicitly {@link signalbackups.MessageAttachment.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.MessageAttachment * @static * @param {signalbackups.IMessageAttachment} message MessageAttachment message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ MessageAttachment.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a MessageAttachment message from the specified reader or buffer. * @function decode * @memberof signalbackups.MessageAttachment * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.MessageAttachment} MessageAttachment * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ MessageAttachment.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.MessageAttachment(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.pointer = $root.signalbackups.FilePointer.decode(reader, reader.uint32()); break; } case 2: { message.flag = reader.int32(); break; } case 3: { message.wasDownloaded = reader.bool(); break; } case 4: { message.clientUuid = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a MessageAttachment message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.MessageAttachment * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.MessageAttachment} MessageAttachment * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ MessageAttachment.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * Flag enum. * @name signalbackups.MessageAttachment.Flag * @enum {number} * @property {number} NONE=0 NONE value * @property {number} VOICE_MESSAGE=1 VOICE_MESSAGE value * @property {number} BORDERLESS=2 BORDERLESS value * @property {number} GIF=3 GIF value */ MessageAttachment.Flag = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "NONE"] = 0; values[valuesById[1] = "VOICE_MESSAGE"] = 1; values[valuesById[2] = "BORDERLESS"] = 2; values[valuesById[3] = "GIF"] = 3; return values; })(); return MessageAttachment; })(); signalbackups.FilePointer = (function() { /** * Properties of a FilePointer. * @memberof signalbackups * @interface IFilePointer * @property {string|null} [contentType] FilePointer contentType * @property {Uint8Array|null} [incrementalMac] FilePointer incrementalMac * @property {number|null} [incrementalMacChunkSize] FilePointer incrementalMacChunkSize * @property {string|null} [fileName] FilePointer fileName * @property {number|null} [width] FilePointer width * @property {number|null} [height] FilePointer height * @property {string|null} [caption] FilePointer caption * @property {string|null} [blurHash] FilePointer blurHash * @property {signalbackups.FilePointer.ILocatorInfo|null} [locatorInfo] FilePointer locatorInfo */ /** * Constructs a new FilePointer. * @memberof signalbackups * @classdesc Represents a FilePointer. * @implements IFilePointer * @constructor * @param {signalbackups.IFilePointer=} [properties] Properties to set */ function FilePointer(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * FilePointer contentType. * @member {string|null|undefined} contentType * @memberof signalbackups.FilePointer * @instance */ FilePointer.prototype.contentType = null; /** * FilePointer incrementalMac. * @member {Uint8Array|null|undefined} incrementalMac * @memberof signalbackups.FilePointer * @instance */ FilePointer.prototype.incrementalMac = null; /** * FilePointer incrementalMacChunkSize. * @member {number|null|undefined} incrementalMacChunkSize * @memberof signalbackups.FilePointer * @instance */ FilePointer.prototype.incrementalMacChunkSize = null; /** * FilePointer fileName. * @member {string|null|undefined} fileName * @memberof signalbackups.FilePointer * @instance */ FilePointer.prototype.fileName = null; /** * FilePointer width. * @member {number|null|undefined} width * @memberof signalbackups.FilePointer * @instance */ FilePointer.prototype.width = null; /** * FilePointer height. * @member {number|null|undefined} height * @memberof signalbackups.FilePointer * @instance */ FilePointer.prototype.height = null; /** * FilePointer caption. * @member {string|null|undefined} caption * @memberof signalbackups.FilePointer * @instance */ FilePointer.prototype.caption = null; /** * FilePointer blurHash. * @member {string|null|undefined} blurHash * @memberof signalbackups.FilePointer * @instance */ FilePointer.prototype.blurHash = null; /** * FilePointer locatorInfo. * @member {signalbackups.FilePointer.ILocatorInfo|null|undefined} locatorInfo * @memberof signalbackups.FilePointer * @instance */ FilePointer.prototype.locatorInfo = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * FilePointer _contentType. * @member {"contentType"|undefined} _contentType * @memberof signalbackups.FilePointer * @instance */ Object.defineProperty(FilePointer.prototype, "_contentType", { get: $util.oneOfGetter($oneOfFields = ["contentType"]), set: $util.oneOfSetter($oneOfFields) }); /** * FilePointer _incrementalMac. * @member {"incrementalMac"|undefined} _incrementalMac * @memberof signalbackups.FilePointer * @instance */ Object.defineProperty(FilePointer.prototype, "_incrementalMac", { get: $util.oneOfGetter($oneOfFields = ["incrementalMac"]), set: $util.oneOfSetter($oneOfFields) }); /** * FilePointer _incrementalMacChunkSize. * @member {"incrementalMacChunkSize"|undefined} _incrementalMacChunkSize * @memberof signalbackups.FilePointer * @instance */ Object.defineProperty(FilePointer.prototype, "_incrementalMacChunkSize", { get: $util.oneOfGetter($oneOfFields = ["incrementalMacChunkSize"]), set: $util.oneOfSetter($oneOfFields) }); /** * FilePointer _fileName. * @member {"fileName"|undefined} _fileName * @memberof signalbackups.FilePointer * @instance */ Object.defineProperty(FilePointer.prototype, "_fileName", { get: $util.oneOfGetter($oneOfFields = ["fileName"]), set: $util.oneOfSetter($oneOfFields) }); /** * FilePointer _width. * @member {"width"|undefined} _width * @memberof signalbackups.FilePointer * @instance */ Object.defineProperty(FilePointer.prototype, "_width", { get: $util.oneOfGetter($oneOfFields = ["width"]), set: $util.oneOfSetter($oneOfFields) }); /** * FilePointer _height. * @member {"height"|undefined} _height * @memberof signalbackups.FilePointer * @instance */ Object.defineProperty(FilePointer.prototype, "_height", { get: $util.oneOfGetter($oneOfFields = ["height"]), set: $util.oneOfSetter($oneOfFields) }); /** * FilePointer _caption. * @member {"caption"|undefined} _caption * @memberof signalbackups.FilePointer * @instance */ Object.defineProperty(FilePointer.prototype, "_caption", { get: $util.oneOfGetter($oneOfFields = ["caption"]), set: $util.oneOfSetter($oneOfFields) }); /** * FilePointer _blurHash. * @member {"blurHash"|undefined} _blurHash * @memberof signalbackups.FilePointer * @instance */ Object.defineProperty(FilePointer.prototype, "_blurHash", { get: $util.oneOfGetter($oneOfFields = ["blurHash"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified FilePointer message. Does not implicitly {@link signalbackups.FilePointer.verify|verify} messages. * @function encode * @memberof signalbackups.FilePointer * @static * @param {signalbackups.IFilePointer} message FilePointer message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ FilePointer.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.FilePointer.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.FilePointer.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.contentType != null && Object.hasOwnProperty.call(message, "contentType")) writer.uint32(/* id 4, wireType 2 =*/34).string(message.contentType); if (message.incrementalMac != null && Object.hasOwnProperty.call(message, "incrementalMac")) writer.uint32(/* id 5, wireType 2 =*/42).bytes(message.incrementalMac); if (message.incrementalMacChunkSize != null && Object.hasOwnProperty.call(message, "incrementalMacChunkSize")) writer.uint32(/* id 6, wireType 0 =*/48).uint32(message.incrementalMacChunkSize); if (message.fileName != null && Object.hasOwnProperty.call(message, "fileName")) writer.uint32(/* id 7, wireType 2 =*/58).string(message.fileName); if (message.width != null && Object.hasOwnProperty.call(message, "width")) writer.uint32(/* id 8, wireType 0 =*/64).uint32(message.width); if (message.height != null && Object.hasOwnProperty.call(message, "height")) writer.uint32(/* id 9, wireType 0 =*/72).uint32(message.height); if (message.caption != null && Object.hasOwnProperty.call(message, "caption")) writer.uint32(/* id 10, wireType 2 =*/82).string(message.caption); if (message.blurHash != null && Object.hasOwnProperty.call(message, "blurHash")) writer.uint32(/* id 11, wireType 2 =*/90).string(message.blurHash); if (message.locatorInfo != null && Object.hasOwnProperty.call(message, "locatorInfo")) $root.signalbackups.FilePointer.LocatorInfo.encode(message.locatorInfo, writer.uint32(/* id 13, wireType 2 =*/106).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified FilePointer message, length delimited. Does not implicitly {@link signalbackups.FilePointer.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.FilePointer * @static * @param {signalbackups.IFilePointer} message FilePointer message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ FilePointer.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a FilePointer message from the specified reader or buffer. * @function decode * @memberof signalbackups.FilePointer * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.FilePointer} FilePointer * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ FilePointer.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.FilePointer(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 4: { message.contentType = reader.string(); break; } case 5: { message.incrementalMac = reader.bytes(); break; } case 6: { message.incrementalMacChunkSize = reader.uint32(); break; } case 7: { message.fileName = reader.string(); break; } case 8: { message.width = reader.uint32(); break; } case 9: { message.height = reader.uint32(); break; } case 10: { message.caption = reader.string(); break; } case 11: { message.blurHash = reader.string(); break; } case 13: { message.locatorInfo = $root.signalbackups.FilePointer.LocatorInfo.decode(reader, reader.uint32()); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a FilePointer message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.FilePointer * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.FilePointer} FilePointer * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ FilePointer.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; FilePointer.LocatorInfo = (function() { /** * Properties of a LocatorInfo. * @memberof signalbackups.FilePointer * @interface ILocatorInfo * @property {Uint8Array|null} [key] LocatorInfo key * @property {Uint8Array|null} [plaintextHash] LocatorInfo plaintextHash * @property {Uint8Array|null} [encryptedDigest] LocatorInfo encryptedDigest * @property {number|null} [size] LocatorInfo size * @property {string|null} [transitCdnKey] LocatorInfo transitCdnKey * @property {number|null} [transitCdnNumber] LocatorInfo transitCdnNumber * @property {Long|null} [transitTierUploadTimestamp] LocatorInfo transitTierUploadTimestamp * @property {number|null} [mediaTierCdnNumber] LocatorInfo mediaTierCdnNumber * @property {Uint8Array|null} [localKey] LocatorInfo localKey */ /** * Constructs a new LocatorInfo. * @memberof signalbackups.FilePointer * @classdesc Represents a LocatorInfo. * @implements ILocatorInfo * @constructor * @param {signalbackups.FilePointer.ILocatorInfo=} [properties] Properties to set */ function LocatorInfo(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * LocatorInfo key. * @member {Uint8Array} key * @memberof signalbackups.FilePointer.LocatorInfo * @instance */ LocatorInfo.prototype.key = $util.newBuffer([]); /** * LocatorInfo plaintextHash. * @member {Uint8Array|null|undefined} plaintextHash * @memberof signalbackups.FilePointer.LocatorInfo * @instance */ LocatorInfo.prototype.plaintextHash = null; /** * LocatorInfo encryptedDigest. * @member {Uint8Array|null|undefined} encryptedDigest * @memberof signalbackups.FilePointer.LocatorInfo * @instance */ LocatorInfo.prototype.encryptedDigest = null; /** * LocatorInfo size. * @member {number} size * @memberof signalbackups.FilePointer.LocatorInfo * @instance */ LocatorInfo.prototype.size = 0; /** * LocatorInfo transitCdnKey. * @member {string|null|undefined} transitCdnKey * @memberof signalbackups.FilePointer.LocatorInfo * @instance */ LocatorInfo.prototype.transitCdnKey = null; /** * LocatorInfo transitCdnNumber. * @member {number|null|undefined} transitCdnNumber * @memberof signalbackups.FilePointer.LocatorInfo * @instance */ LocatorInfo.prototype.transitCdnNumber = null; /** * LocatorInfo transitTierUploadTimestamp. * @member {Long|null|undefined} transitTierUploadTimestamp * @memberof signalbackups.FilePointer.LocatorInfo * @instance */ LocatorInfo.prototype.transitTierUploadTimestamp = null; /** * LocatorInfo mediaTierCdnNumber. * @member {number|null|undefined} mediaTierCdnNumber * @memberof signalbackups.FilePointer.LocatorInfo * @instance */ LocatorInfo.prototype.mediaTierCdnNumber = null; /** * LocatorInfo localKey. * @member {Uint8Array|null|undefined} localKey * @memberof signalbackups.FilePointer.LocatorInfo * @instance */ LocatorInfo.prototype.localKey = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * LocatorInfo integrityCheck. * @member {"plaintextHash"|"encryptedDigest"|undefined} integrityCheck * @memberof signalbackups.FilePointer.LocatorInfo * @instance */ Object.defineProperty(LocatorInfo.prototype, "integrityCheck", { get: $util.oneOfGetter($oneOfFields = ["plaintextHash", "encryptedDigest"]), set: $util.oneOfSetter($oneOfFields) }); /** * LocatorInfo _transitCdnKey. * @member {"transitCdnKey"|undefined} _transitCdnKey * @memberof signalbackups.FilePointer.LocatorInfo * @instance */ Object.defineProperty(LocatorInfo.prototype, "_transitCdnKey", { get: $util.oneOfGetter($oneOfFields = ["transitCdnKey"]), set: $util.oneOfSetter($oneOfFields) }); /** * LocatorInfo _transitCdnNumber. * @member {"transitCdnNumber"|undefined} _transitCdnNumber * @memberof signalbackups.FilePointer.LocatorInfo * @instance */ Object.defineProperty(LocatorInfo.prototype, "_transitCdnNumber", { get: $util.oneOfGetter($oneOfFields = ["transitCdnNumber"]), set: $util.oneOfSetter($oneOfFields) }); /** * LocatorInfo _transitTierUploadTimestamp. * @member {"transitTierUploadTimestamp"|undefined} _transitTierUploadTimestamp * @memberof signalbackups.FilePointer.LocatorInfo * @instance */ Object.defineProperty(LocatorInfo.prototype, "_transitTierUploadTimestamp", { get: $util.oneOfGetter($oneOfFields = ["transitTierUploadTimestamp"]), set: $util.oneOfSetter($oneOfFields) }); /** * LocatorInfo _mediaTierCdnNumber. * @member {"mediaTierCdnNumber"|undefined} _mediaTierCdnNumber * @memberof signalbackups.FilePointer.LocatorInfo * @instance */ Object.defineProperty(LocatorInfo.prototype, "_mediaTierCdnNumber", { get: $util.oneOfGetter($oneOfFields = ["mediaTierCdnNumber"]), set: $util.oneOfSetter($oneOfFields) }); /** * LocatorInfo _localKey. * @member {"localKey"|undefined} _localKey * @memberof signalbackups.FilePointer.LocatorInfo * @instance */ Object.defineProperty(LocatorInfo.prototype, "_localKey", { get: $util.oneOfGetter($oneOfFields = ["localKey"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified LocatorInfo message. Does not implicitly {@link signalbackups.FilePointer.LocatorInfo.verify|verify} messages. * @function encode * @memberof signalbackups.FilePointer.LocatorInfo * @static * @param {signalbackups.FilePointer.ILocatorInfo} message LocatorInfo message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ LocatorInfo.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.FilePointer.LocatorInfo.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.FilePointer.LocatorInfo.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.key != null && Object.hasOwnProperty.call(message, "key")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.key); if (message.size != null && Object.hasOwnProperty.call(message, "size")) writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.size); if (message.transitCdnKey != null && Object.hasOwnProperty.call(message, "transitCdnKey")) writer.uint32(/* id 4, wireType 2 =*/34).string(message.transitCdnKey); if (message.transitCdnNumber != null && Object.hasOwnProperty.call(message, "transitCdnNumber")) writer.uint32(/* id 5, wireType 0 =*/40).uint32(message.transitCdnNumber); if (message.transitTierUploadTimestamp != null && Object.hasOwnProperty.call(message, "transitTierUploadTimestamp")) writer.uint32(/* id 6, wireType 0 =*/48).uint64(message.transitTierUploadTimestamp); if (message.mediaTierCdnNumber != null && Object.hasOwnProperty.call(message, "mediaTierCdnNumber")) writer.uint32(/* id 7, wireType 0 =*/56).uint32(message.mediaTierCdnNumber); if (message.localKey != null && Object.hasOwnProperty.call(message, "localKey")) writer.uint32(/* id 9, wireType 2 =*/74).bytes(message.localKey); if (message.plaintextHash != null && Object.hasOwnProperty.call(message, "plaintextHash")) writer.uint32(/* id 10, wireType 2 =*/82).bytes(message.plaintextHash); if (message.encryptedDigest != null && Object.hasOwnProperty.call(message, "encryptedDigest")) writer.uint32(/* id 11, wireType 2 =*/90).bytes(message.encryptedDigest); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified LocatorInfo message, length delimited. Does not implicitly {@link signalbackups.FilePointer.LocatorInfo.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.FilePointer.LocatorInfo * @static * @param {signalbackups.FilePointer.ILocatorInfo} message LocatorInfo message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ LocatorInfo.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a LocatorInfo message from the specified reader or buffer. * @function decode * @memberof signalbackups.FilePointer.LocatorInfo * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.FilePointer.LocatorInfo} LocatorInfo * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ LocatorInfo.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.FilePointer.LocatorInfo(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.key = reader.bytes(); break; } case 10: { message.plaintextHash = reader.bytes(); break; } case 11: { message.encryptedDigest = reader.bytes(); break; } case 3: { message.size = reader.uint32(); break; } case 4: { message.transitCdnKey = reader.string(); break; } case 5: { message.transitCdnNumber = reader.uint32(); break; } case 6: { message.transitTierUploadTimestamp = reader.uint64(); break; } case 7: { message.mediaTierCdnNumber = reader.uint32(); break; } case 9: { message.localKey = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a LocatorInfo message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.FilePointer.LocatorInfo * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.FilePointer.LocatorInfo} LocatorInfo * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ LocatorInfo.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return LocatorInfo; })(); return FilePointer; })(); signalbackups.Quote = (function() { /** * Properties of a Quote. * @memberof signalbackups * @interface IQuote * @property {Long|null} [targetSentTimestamp] Quote targetSentTimestamp * @property {Long|null} [authorId] Quote authorId * @property {signalbackups.IText|null} [text] Quote text * @property {Array.|null} [attachments] Quote attachments * @property {signalbackups.Quote.Type|null} [type] Quote type */ /** * Constructs a new Quote. * @memberof signalbackups * @classdesc Represents a Quote. * @implements IQuote * @constructor * @param {signalbackups.IQuote=} [properties] Properties to set */ function Quote(properties) { this.attachments = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Quote targetSentTimestamp. * @member {Long|null|undefined} targetSentTimestamp * @memberof signalbackups.Quote * @instance */ Quote.prototype.targetSentTimestamp = null; /** * Quote authorId. * @member {Long} authorId * @memberof signalbackups.Quote * @instance */ Quote.prototype.authorId = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * Quote text. * @member {signalbackups.IText|null|undefined} text * @memberof signalbackups.Quote * @instance */ Quote.prototype.text = null; /** * Quote attachments. * @member {Array.} attachments * @memberof signalbackups.Quote * @instance */ Quote.prototype.attachments = $util.emptyArray; /** * Quote type. * @member {signalbackups.Quote.Type} type * @memberof signalbackups.Quote * @instance */ Quote.prototype.type = 0; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * Quote _targetSentTimestamp. * @member {"targetSentTimestamp"|undefined} _targetSentTimestamp * @memberof signalbackups.Quote * @instance */ Object.defineProperty(Quote.prototype, "_targetSentTimestamp", { get: $util.oneOfGetter($oneOfFields = ["targetSentTimestamp"]), set: $util.oneOfSetter($oneOfFields) }); /** * Quote _text. * @member {"text"|undefined} _text * @memberof signalbackups.Quote * @instance */ Object.defineProperty(Quote.prototype, "_text", { get: $util.oneOfGetter($oneOfFields = ["text"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified Quote message. Does not implicitly {@link signalbackups.Quote.verify|verify} messages. * @function encode * @memberof signalbackups.Quote * @static * @param {signalbackups.IQuote} message Quote message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Quote.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.Quote.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.Quote.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.targetSentTimestamp != null && Object.hasOwnProperty.call(message, "targetSentTimestamp")) writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.targetSentTimestamp); if (message.authorId != null && Object.hasOwnProperty.call(message, "authorId")) writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.authorId); if (message.text != null && Object.hasOwnProperty.call(message, "text")) $root.signalbackups.Text.encode(message.text, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); if (message.attachments != null && message.attachments.length) for (var i = 0; i < message.attachments.length; ++i) $root.signalbackups.Quote.QuotedAttachment.encode(message.attachments[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); if (message.type != null && Object.hasOwnProperty.call(message, "type")) writer.uint32(/* id 5, wireType 0 =*/40).int32(message.type); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Quote message, length delimited. Does not implicitly {@link signalbackups.Quote.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.Quote * @static * @param {signalbackups.IQuote} message Quote message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Quote.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Quote message from the specified reader or buffer. * @function decode * @memberof signalbackups.Quote * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.Quote} Quote * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Quote.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.Quote(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.targetSentTimestamp = reader.uint64(); break; } case 2: { message.authorId = reader.uint64(); break; } case 3: { message.text = $root.signalbackups.Text.decode(reader, reader.uint32()); break; } case 4: { if (!(message.attachments && message.attachments.length)) message.attachments = []; message.attachments.push($root.signalbackups.Quote.QuotedAttachment.decode(reader, reader.uint32())); break; } case 5: { message.type = reader.int32(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Quote message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.Quote * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.Quote} Quote * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Quote.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * Type enum. * @name signalbackups.Quote.Type * @enum {number} * @property {number} UNKNOWN=0 UNKNOWN value * @property {number} NORMAL=1 NORMAL value * @property {number} GIFT_BADGE=2 GIFT_BADGE value * @property {number} VIEW_ONCE=3 VIEW_ONCE value * @property {number} POLL=4 POLL value */ Quote.Type = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "UNKNOWN"] = 0; values[valuesById[1] = "NORMAL"] = 1; values[valuesById[2] = "GIFT_BADGE"] = 2; values[valuesById[3] = "VIEW_ONCE"] = 3; values[valuesById[4] = "POLL"] = 4; return values; })(); Quote.QuotedAttachment = (function() { /** * Properties of a QuotedAttachment. * @memberof signalbackups.Quote * @interface IQuotedAttachment * @property {string|null} [contentType] QuotedAttachment contentType * @property {string|null} [fileName] QuotedAttachment fileName * @property {signalbackups.IMessageAttachment|null} [thumbnail] QuotedAttachment thumbnail */ /** * Constructs a new QuotedAttachment. * @memberof signalbackups.Quote * @classdesc Represents a QuotedAttachment. * @implements IQuotedAttachment * @constructor * @param {signalbackups.Quote.IQuotedAttachment=} [properties] Properties to set */ function QuotedAttachment(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * QuotedAttachment contentType. * @member {string|null|undefined} contentType * @memberof signalbackups.Quote.QuotedAttachment * @instance */ QuotedAttachment.prototype.contentType = null; /** * QuotedAttachment fileName. * @member {string|null|undefined} fileName * @memberof signalbackups.Quote.QuotedAttachment * @instance */ QuotedAttachment.prototype.fileName = null; /** * QuotedAttachment thumbnail. * @member {signalbackups.IMessageAttachment|null|undefined} thumbnail * @memberof signalbackups.Quote.QuotedAttachment * @instance */ QuotedAttachment.prototype.thumbnail = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * QuotedAttachment _contentType. * @member {"contentType"|undefined} _contentType * @memberof signalbackups.Quote.QuotedAttachment * @instance */ Object.defineProperty(QuotedAttachment.prototype, "_contentType", { get: $util.oneOfGetter($oneOfFields = ["contentType"]), set: $util.oneOfSetter($oneOfFields) }); /** * QuotedAttachment _fileName. * @member {"fileName"|undefined} _fileName * @memberof signalbackups.Quote.QuotedAttachment * @instance */ Object.defineProperty(QuotedAttachment.prototype, "_fileName", { get: $util.oneOfGetter($oneOfFields = ["fileName"]), set: $util.oneOfSetter($oneOfFields) }); /** * QuotedAttachment _thumbnail. * @member {"thumbnail"|undefined} _thumbnail * @memberof signalbackups.Quote.QuotedAttachment * @instance */ Object.defineProperty(QuotedAttachment.prototype, "_thumbnail", { get: $util.oneOfGetter($oneOfFields = ["thumbnail"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified QuotedAttachment message. Does not implicitly {@link signalbackups.Quote.QuotedAttachment.verify|verify} messages. * @function encode * @memberof signalbackups.Quote.QuotedAttachment * @static * @param {signalbackups.Quote.IQuotedAttachment} message QuotedAttachment message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ QuotedAttachment.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.Quote.QuotedAttachment.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.Quote.QuotedAttachment.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.contentType != null && Object.hasOwnProperty.call(message, "contentType")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.contentType); if (message.fileName != null && Object.hasOwnProperty.call(message, "fileName")) writer.uint32(/* id 2, wireType 2 =*/18).string(message.fileName); if (message.thumbnail != null && Object.hasOwnProperty.call(message, "thumbnail")) $root.signalbackups.MessageAttachment.encode(message.thumbnail, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified QuotedAttachment message, length delimited. Does not implicitly {@link signalbackups.Quote.QuotedAttachment.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.Quote.QuotedAttachment * @static * @param {signalbackups.Quote.IQuotedAttachment} message QuotedAttachment message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ QuotedAttachment.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a QuotedAttachment message from the specified reader or buffer. * @function decode * @memberof signalbackups.Quote.QuotedAttachment * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.Quote.QuotedAttachment} QuotedAttachment * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ QuotedAttachment.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.Quote.QuotedAttachment(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.contentType = reader.string(); break; } case 2: { message.fileName = reader.string(); break; } case 3: { message.thumbnail = $root.signalbackups.MessageAttachment.decode(reader, reader.uint32()); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a QuotedAttachment message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.Quote.QuotedAttachment * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.Quote.QuotedAttachment} QuotedAttachment * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ QuotedAttachment.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return QuotedAttachment; })(); return Quote; })(); signalbackups.BodyRange = (function() { /** * Properties of a BodyRange. * @memberof signalbackups * @interface IBodyRange * @property {number|null} [start] BodyRange start * @property {number|null} [length] BodyRange length * @property {Uint8Array|null} [mentionAci] BodyRange mentionAci * @property {signalbackups.BodyRange.Style|null} [style] BodyRange style */ /** * Constructs a new BodyRange. * @memberof signalbackups * @classdesc Represents a BodyRange. * @implements IBodyRange * @constructor * @param {signalbackups.IBodyRange=} [properties] Properties to set */ function BodyRange(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * BodyRange start. * @member {number} start * @memberof signalbackups.BodyRange * @instance */ BodyRange.prototype.start = 0; /** * BodyRange length. * @member {number} length * @memberof signalbackups.BodyRange * @instance */ BodyRange.prototype.length = 0; /** * BodyRange mentionAci. * @member {Uint8Array|null|undefined} mentionAci * @memberof signalbackups.BodyRange * @instance */ BodyRange.prototype.mentionAci = null; /** * BodyRange style. * @member {signalbackups.BodyRange.Style|null|undefined} style * @memberof signalbackups.BodyRange * @instance */ BodyRange.prototype.style = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * BodyRange associatedValue. * @member {"mentionAci"|"style"|undefined} associatedValue * @memberof signalbackups.BodyRange * @instance */ Object.defineProperty(BodyRange.prototype, "associatedValue", { get: $util.oneOfGetter($oneOfFields = ["mentionAci", "style"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified BodyRange message. Does not implicitly {@link signalbackups.BodyRange.verify|verify} messages. * @function encode * @memberof signalbackups.BodyRange * @static * @param {signalbackups.IBodyRange} message BodyRange message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ BodyRange.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.BodyRange.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.BodyRange.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.start != null && Object.hasOwnProperty.call(message, "start")) writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.start); if (message.length != null && Object.hasOwnProperty.call(message, "length")) writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.length); if (message.mentionAci != null && Object.hasOwnProperty.call(message, "mentionAci")) writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.mentionAci); if (message.style != null && Object.hasOwnProperty.call(message, "style")) writer.uint32(/* id 4, wireType 0 =*/32).int32(message.style); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified BodyRange message, length delimited. Does not implicitly {@link signalbackups.BodyRange.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.BodyRange * @static * @param {signalbackups.IBodyRange} message BodyRange message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ BodyRange.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a BodyRange message from the specified reader or buffer. * @function decode * @memberof signalbackups.BodyRange * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.BodyRange} BodyRange * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ BodyRange.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.BodyRange(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.start = reader.uint32(); break; } case 2: { message.length = reader.uint32(); break; } case 3: { message.mentionAci = reader.bytes(); break; } case 4: { message.style = reader.int32(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a BodyRange message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.BodyRange * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.BodyRange} BodyRange * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ BodyRange.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * Style enum. * @name signalbackups.BodyRange.Style * @enum {number} * @property {number} NONE=0 NONE value * @property {number} BOLD=1 BOLD value * @property {number} ITALIC=2 ITALIC value * @property {number} SPOILER=3 SPOILER value * @property {number} STRIKETHROUGH=4 STRIKETHROUGH value * @property {number} MONOSPACE=5 MONOSPACE value */ BodyRange.Style = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "NONE"] = 0; values[valuesById[1] = "BOLD"] = 1; values[valuesById[2] = "ITALIC"] = 2; values[valuesById[3] = "SPOILER"] = 3; values[valuesById[4] = "STRIKETHROUGH"] = 4; values[valuesById[5] = "MONOSPACE"] = 5; return values; })(); return BodyRange; })(); signalbackups.Reaction = (function() { /** * Properties of a Reaction. * @memberof signalbackups * @interface IReaction * @property {string|null} [emoji] Reaction emoji * @property {Long|null} [authorId] Reaction authorId * @property {Long|null} [sentTimestamp] Reaction sentTimestamp * @property {Long|null} [sortOrder] Reaction sortOrder */ /** * Constructs a new Reaction. * @memberof signalbackups * @classdesc Represents a Reaction. * @implements IReaction * @constructor * @param {signalbackups.IReaction=} [properties] Properties to set */ function Reaction(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Reaction emoji. * @member {string} emoji * @memberof signalbackups.Reaction * @instance */ Reaction.prototype.emoji = ""; /** * Reaction authorId. * @member {Long} authorId * @memberof signalbackups.Reaction * @instance */ Reaction.prototype.authorId = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * Reaction sentTimestamp. * @member {Long} sentTimestamp * @memberof signalbackups.Reaction * @instance */ Reaction.prototype.sentTimestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * Reaction sortOrder. * @member {Long} sortOrder * @memberof signalbackups.Reaction * @instance */ Reaction.prototype.sortOrder = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * Encodes the specified Reaction message. Does not implicitly {@link signalbackups.Reaction.verify|verify} messages. * @function encode * @memberof signalbackups.Reaction * @static * @param {signalbackups.IReaction} message Reaction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Reaction.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.Reaction.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.Reaction.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.emoji != null && Object.hasOwnProperty.call(message, "emoji")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.emoji); if (message.authorId != null && Object.hasOwnProperty.call(message, "authorId")) writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.authorId); if (message.sentTimestamp != null && Object.hasOwnProperty.call(message, "sentTimestamp")) writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.sentTimestamp); if (message.sortOrder != null && Object.hasOwnProperty.call(message, "sortOrder")) writer.uint32(/* id 4, wireType 0 =*/32).uint64(message.sortOrder); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Reaction message, length delimited. Does not implicitly {@link signalbackups.Reaction.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.Reaction * @static * @param {signalbackups.IReaction} message Reaction message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Reaction.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Reaction message from the specified reader or buffer. * @function decode * @memberof signalbackups.Reaction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.Reaction} Reaction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Reaction.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.Reaction(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.emoji = reader.string(); break; } case 2: { message.authorId = reader.uint64(); break; } case 3: { message.sentTimestamp = reader.uint64(); break; } case 4: { message.sortOrder = reader.uint64(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Reaction message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.Reaction * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.Reaction} Reaction * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Reaction.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return Reaction; })(); signalbackups.Poll = (function() { /** * Properties of a Poll. * @memberof signalbackups * @interface IPoll * @property {string|null} [question] Poll question * @property {boolean|null} [allowMultiple] Poll allowMultiple * @property {Array.|null} [options] Poll options * @property {boolean|null} [hasEnded] Poll hasEnded * @property {Array.|null} [reactions] Poll reactions */ /** * Constructs a new Poll. * @memberof signalbackups * @classdesc Represents a Poll. * @implements IPoll * @constructor * @param {signalbackups.IPoll=} [properties] Properties to set */ function Poll(properties) { this.options = []; this.reactions = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Poll question. * @member {string} question * @memberof signalbackups.Poll * @instance */ Poll.prototype.question = ""; /** * Poll allowMultiple. * @member {boolean} allowMultiple * @memberof signalbackups.Poll * @instance */ Poll.prototype.allowMultiple = false; /** * Poll options. * @member {Array.} options * @memberof signalbackups.Poll * @instance */ Poll.prototype.options = $util.emptyArray; /** * Poll hasEnded. * @member {boolean} hasEnded * @memberof signalbackups.Poll * @instance */ Poll.prototype.hasEnded = false; /** * Poll reactions. * @member {Array.} reactions * @memberof signalbackups.Poll * @instance */ Poll.prototype.reactions = $util.emptyArray; /** * Encodes the specified Poll message. Does not implicitly {@link signalbackups.Poll.verify|verify} messages. * @function encode * @memberof signalbackups.Poll * @static * @param {signalbackups.IPoll} message Poll message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Poll.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.Poll.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.Poll.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.question != null && Object.hasOwnProperty.call(message, "question")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.question); if (message.allowMultiple != null && Object.hasOwnProperty.call(message, "allowMultiple")) writer.uint32(/* id 2, wireType 0 =*/16).bool(message.allowMultiple); if (message.options != null && message.options.length) for (var i = 0; i < message.options.length; ++i) $root.signalbackups.Poll.PollOption.encode(message.options[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); if (message.hasEnded != null && Object.hasOwnProperty.call(message, "hasEnded")) writer.uint32(/* id 4, wireType 0 =*/32).bool(message.hasEnded); if (message.reactions != null && message.reactions.length) for (var i = 0; i < message.reactions.length; ++i) $root.signalbackups.Reaction.encode(message.reactions[i], writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Poll message, length delimited. Does not implicitly {@link signalbackups.Poll.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.Poll * @static * @param {signalbackups.IPoll} message Poll message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Poll.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Poll message from the specified reader or buffer. * @function decode * @memberof signalbackups.Poll * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.Poll} Poll * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Poll.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.Poll(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.question = reader.string(); break; } case 2: { message.allowMultiple = reader.bool(); break; } case 3: { if (!(message.options && message.options.length)) message.options = []; message.options.push($root.signalbackups.Poll.PollOption.decode(reader, reader.uint32())); break; } case 4: { message.hasEnded = reader.bool(); break; } case 5: { if (!(message.reactions && message.reactions.length)) message.reactions = []; message.reactions.push($root.signalbackups.Reaction.decode(reader, reader.uint32())); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Poll message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.Poll * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.Poll} Poll * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Poll.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; Poll.PollOption = (function() { /** * Properties of a PollOption. * @memberof signalbackups.Poll * @interface IPollOption * @property {string|null} [option] PollOption option * @property {Array.|null} [votes] PollOption votes */ /** * Constructs a new PollOption. * @memberof signalbackups.Poll * @classdesc Represents a PollOption. * @implements IPollOption * @constructor * @param {signalbackups.Poll.IPollOption=} [properties] Properties to set */ function PollOption(properties) { this.votes = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * PollOption option. * @member {string} option * @memberof signalbackups.Poll.PollOption * @instance */ PollOption.prototype.option = ""; /** * PollOption votes. * @member {Array.} votes * @memberof signalbackups.Poll.PollOption * @instance */ PollOption.prototype.votes = $util.emptyArray; /** * Encodes the specified PollOption message. Does not implicitly {@link signalbackups.Poll.PollOption.verify|verify} messages. * @function encode * @memberof signalbackups.Poll.PollOption * @static * @param {signalbackups.Poll.IPollOption} message PollOption message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ PollOption.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.Poll.PollOption.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.Poll.PollOption.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.option != null && Object.hasOwnProperty.call(message, "option")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.option); if (message.votes != null && message.votes.length) for (var i = 0; i < message.votes.length; ++i) $root.signalbackups.Poll.PollOption.PollVote.encode(message.votes[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified PollOption message, length delimited. Does not implicitly {@link signalbackups.Poll.PollOption.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.Poll.PollOption * @static * @param {signalbackups.Poll.IPollOption} message PollOption message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ PollOption.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a PollOption message from the specified reader or buffer. * @function decode * @memberof signalbackups.Poll.PollOption * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.Poll.PollOption} PollOption * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ PollOption.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.Poll.PollOption(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.option = reader.string(); break; } case 2: { if (!(message.votes && message.votes.length)) message.votes = []; message.votes.push($root.signalbackups.Poll.PollOption.PollVote.decode(reader, reader.uint32())); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a PollOption message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.Poll.PollOption * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.Poll.PollOption} PollOption * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ PollOption.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; PollOption.PollVote = (function() { /** * Properties of a PollVote. * @memberof signalbackups.Poll.PollOption * @interface IPollVote * @property {Long|null} [voterId] PollVote voterId * @property {number|null} [voteCount] PollVote voteCount */ /** * Constructs a new PollVote. * @memberof signalbackups.Poll.PollOption * @classdesc Represents a PollVote. * @implements IPollVote * @constructor * @param {signalbackups.Poll.PollOption.IPollVote=} [properties] Properties to set */ function PollVote(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * PollVote voterId. * @member {Long} voterId * @memberof signalbackups.Poll.PollOption.PollVote * @instance */ PollVote.prototype.voterId = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * PollVote voteCount. * @member {number} voteCount * @memberof signalbackups.Poll.PollOption.PollVote * @instance */ PollVote.prototype.voteCount = 0; /** * Encodes the specified PollVote message. Does not implicitly {@link signalbackups.Poll.PollOption.PollVote.verify|verify} messages. * @function encode * @memberof signalbackups.Poll.PollOption.PollVote * @static * @param {signalbackups.Poll.PollOption.IPollVote} message PollVote message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ PollVote.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.Poll.PollOption.PollVote.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.Poll.PollOption.PollVote.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.voterId != null && Object.hasOwnProperty.call(message, "voterId")) writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.voterId); if (message.voteCount != null && Object.hasOwnProperty.call(message, "voteCount")) writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.voteCount); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified PollVote message, length delimited. Does not implicitly {@link signalbackups.Poll.PollOption.PollVote.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.Poll.PollOption.PollVote * @static * @param {signalbackups.Poll.PollOption.IPollVote} message PollVote message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ PollVote.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a PollVote message from the specified reader or buffer. * @function decode * @memberof signalbackups.Poll.PollOption.PollVote * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.Poll.PollOption.PollVote} PollVote * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ PollVote.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.Poll.PollOption.PollVote(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.voterId = reader.uint64(); break; } case 2: { message.voteCount = reader.uint32(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a PollVote message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.Poll.PollOption.PollVote * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.Poll.PollOption.PollVote} PollVote * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ PollVote.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return PollVote; })(); return PollOption; })(); return Poll; })(); signalbackups.ChatUpdateMessage = (function() { /** * Properties of a ChatUpdateMessage. * @memberof signalbackups * @interface IChatUpdateMessage * @property {signalbackups.ISimpleChatUpdate|null} [simpleUpdate] ChatUpdateMessage simpleUpdate * @property {signalbackups.IGroupChangeChatUpdate|null} [groupChange] ChatUpdateMessage groupChange * @property {signalbackups.IExpirationTimerChatUpdate|null} [expirationTimerChange] ChatUpdateMessage expirationTimerChange * @property {signalbackups.IProfileChangeChatUpdate|null} [profileChange] ChatUpdateMessage profileChange * @property {signalbackups.IThreadMergeChatUpdate|null} [threadMerge] ChatUpdateMessage threadMerge * @property {signalbackups.ISessionSwitchoverChatUpdate|null} [sessionSwitchover] ChatUpdateMessage sessionSwitchover * @property {signalbackups.IIndividualCall|null} [individualCall] ChatUpdateMessage individualCall * @property {signalbackups.IGroupCall|null} [groupCall] ChatUpdateMessage groupCall * @property {signalbackups.ILearnedProfileChatUpdate|null} [learnedProfileChange] ChatUpdateMessage learnedProfileChange * @property {signalbackups.IPollTerminateUpdate|null} [pollTerminate] ChatUpdateMessage pollTerminate * @property {signalbackups.IPinMessageUpdate|null} [pinMessage] ChatUpdateMessage pinMessage */ /** * Constructs a new ChatUpdateMessage. * @memberof signalbackups * @classdesc Represents a ChatUpdateMessage. * @implements IChatUpdateMessage * @constructor * @param {signalbackups.IChatUpdateMessage=} [properties] Properties to set */ function ChatUpdateMessage(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * ChatUpdateMessage simpleUpdate. * @member {signalbackups.ISimpleChatUpdate|null|undefined} simpleUpdate * @memberof signalbackups.ChatUpdateMessage * @instance */ ChatUpdateMessage.prototype.simpleUpdate = null; /** * ChatUpdateMessage groupChange. * @member {signalbackups.IGroupChangeChatUpdate|null|undefined} groupChange * @memberof signalbackups.ChatUpdateMessage * @instance */ ChatUpdateMessage.prototype.groupChange = null; /** * ChatUpdateMessage expirationTimerChange. * @member {signalbackups.IExpirationTimerChatUpdate|null|undefined} expirationTimerChange * @memberof signalbackups.ChatUpdateMessage * @instance */ ChatUpdateMessage.prototype.expirationTimerChange = null; /** * ChatUpdateMessage profileChange. * @member {signalbackups.IProfileChangeChatUpdate|null|undefined} profileChange * @memberof signalbackups.ChatUpdateMessage * @instance */ ChatUpdateMessage.prototype.profileChange = null; /** * ChatUpdateMessage threadMerge. * @member {signalbackups.IThreadMergeChatUpdate|null|undefined} threadMerge * @memberof signalbackups.ChatUpdateMessage * @instance */ ChatUpdateMessage.prototype.threadMerge = null; /** * ChatUpdateMessage sessionSwitchover. * @member {signalbackups.ISessionSwitchoverChatUpdate|null|undefined} sessionSwitchover * @memberof signalbackups.ChatUpdateMessage * @instance */ ChatUpdateMessage.prototype.sessionSwitchover = null; /** * ChatUpdateMessage individualCall. * @member {signalbackups.IIndividualCall|null|undefined} individualCall * @memberof signalbackups.ChatUpdateMessage * @instance */ ChatUpdateMessage.prototype.individualCall = null; /** * ChatUpdateMessage groupCall. * @member {signalbackups.IGroupCall|null|undefined} groupCall * @memberof signalbackups.ChatUpdateMessage * @instance */ ChatUpdateMessage.prototype.groupCall = null; /** * ChatUpdateMessage learnedProfileChange. * @member {signalbackups.ILearnedProfileChatUpdate|null|undefined} learnedProfileChange * @memberof signalbackups.ChatUpdateMessage * @instance */ ChatUpdateMessage.prototype.learnedProfileChange = null; /** * ChatUpdateMessage pollTerminate. * @member {signalbackups.IPollTerminateUpdate|null|undefined} pollTerminate * @memberof signalbackups.ChatUpdateMessage * @instance */ ChatUpdateMessage.prototype.pollTerminate = null; /** * ChatUpdateMessage pinMessage. * @member {signalbackups.IPinMessageUpdate|null|undefined} pinMessage * @memberof signalbackups.ChatUpdateMessage * @instance */ ChatUpdateMessage.prototype.pinMessage = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * ChatUpdateMessage update. * @member {"simpleUpdate"|"groupChange"|"expirationTimerChange"|"profileChange"|"threadMerge"|"sessionSwitchover"|"individualCall"|"groupCall"|"learnedProfileChange"|"pollTerminate"|"pinMessage"|undefined} update * @memberof signalbackups.ChatUpdateMessage * @instance */ Object.defineProperty(ChatUpdateMessage.prototype, "update", { get: $util.oneOfGetter($oneOfFields = ["simpleUpdate", "groupChange", "expirationTimerChange", "profileChange", "threadMerge", "sessionSwitchover", "individualCall", "groupCall", "learnedProfileChange", "pollTerminate", "pinMessage"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified ChatUpdateMessage message. Does not implicitly {@link signalbackups.ChatUpdateMessage.verify|verify} messages. * @function encode * @memberof signalbackups.ChatUpdateMessage * @static * @param {signalbackups.IChatUpdateMessage} message ChatUpdateMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ChatUpdateMessage.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.ChatUpdateMessage.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.ChatUpdateMessage.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.simpleUpdate != null && Object.hasOwnProperty.call(message, "simpleUpdate")) $root.signalbackups.SimpleChatUpdate.encode(message.simpleUpdate, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.groupChange != null && Object.hasOwnProperty.call(message, "groupChange")) $root.signalbackups.GroupChangeChatUpdate.encode(message.groupChange, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); if (message.expirationTimerChange != null && Object.hasOwnProperty.call(message, "expirationTimerChange")) $root.signalbackups.ExpirationTimerChatUpdate.encode(message.expirationTimerChange, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); if (message.profileChange != null && Object.hasOwnProperty.call(message, "profileChange")) $root.signalbackups.ProfileChangeChatUpdate.encode(message.profileChange, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); if (message.threadMerge != null && Object.hasOwnProperty.call(message, "threadMerge")) $root.signalbackups.ThreadMergeChatUpdate.encode(message.threadMerge, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); if (message.sessionSwitchover != null && Object.hasOwnProperty.call(message, "sessionSwitchover")) $root.signalbackups.SessionSwitchoverChatUpdate.encode(message.sessionSwitchover, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim(); if (message.individualCall != null && Object.hasOwnProperty.call(message, "individualCall")) $root.signalbackups.IndividualCall.encode(message.individualCall, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim(); if (message.groupCall != null && Object.hasOwnProperty.call(message, "groupCall")) $root.signalbackups.GroupCall.encode(message.groupCall, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim(); if (message.learnedProfileChange != null && Object.hasOwnProperty.call(message, "learnedProfileChange")) $root.signalbackups.LearnedProfileChatUpdate.encode(message.learnedProfileChange, writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim(); if (message.pollTerminate != null && Object.hasOwnProperty.call(message, "pollTerminate")) $root.signalbackups.PollTerminateUpdate.encode(message.pollTerminate, writer.uint32(/* id 10, wireType 2 =*/82).fork()).ldelim(); if (message.pinMessage != null && Object.hasOwnProperty.call(message, "pinMessage")) $root.signalbackups.PinMessageUpdate.encode(message.pinMessage, writer.uint32(/* id 11, wireType 2 =*/90).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified ChatUpdateMessage message, length delimited. Does not implicitly {@link signalbackups.ChatUpdateMessage.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.ChatUpdateMessage * @static * @param {signalbackups.IChatUpdateMessage} message ChatUpdateMessage message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ChatUpdateMessage.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a ChatUpdateMessage message from the specified reader or buffer. * @function decode * @memberof signalbackups.ChatUpdateMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.ChatUpdateMessage} ChatUpdateMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ChatUpdateMessage.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.ChatUpdateMessage(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.simpleUpdate = $root.signalbackups.SimpleChatUpdate.decode(reader, reader.uint32()); break; } case 2: { message.groupChange = $root.signalbackups.GroupChangeChatUpdate.decode(reader, reader.uint32()); break; } case 3: { message.expirationTimerChange = $root.signalbackups.ExpirationTimerChatUpdate.decode(reader, reader.uint32()); break; } case 4: { message.profileChange = $root.signalbackups.ProfileChangeChatUpdate.decode(reader, reader.uint32()); break; } case 5: { message.threadMerge = $root.signalbackups.ThreadMergeChatUpdate.decode(reader, reader.uint32()); break; } case 6: { message.sessionSwitchover = $root.signalbackups.SessionSwitchoverChatUpdate.decode(reader, reader.uint32()); break; } case 7: { message.individualCall = $root.signalbackups.IndividualCall.decode(reader, reader.uint32()); break; } case 8: { message.groupCall = $root.signalbackups.GroupCall.decode(reader, reader.uint32()); break; } case 9: { message.learnedProfileChange = $root.signalbackups.LearnedProfileChatUpdate.decode(reader, reader.uint32()); break; } case 10: { message.pollTerminate = $root.signalbackups.PollTerminateUpdate.decode(reader, reader.uint32()); break; } case 11: { message.pinMessage = $root.signalbackups.PinMessageUpdate.decode(reader, reader.uint32()); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a ChatUpdateMessage message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.ChatUpdateMessage * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.ChatUpdateMessage} ChatUpdateMessage * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ChatUpdateMessage.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return ChatUpdateMessage; })(); signalbackups.IndividualCall = (function() { /** * Properties of an IndividualCall. * @memberof signalbackups * @interface IIndividualCall * @property {Long|null} [callId] IndividualCall callId * @property {signalbackups.IndividualCall.Type|null} [type] IndividualCall type * @property {signalbackups.IndividualCall.Direction|null} [direction] IndividualCall direction * @property {signalbackups.IndividualCall.State|null} [state] IndividualCall state * @property {Long|null} [startedCallTimestamp] IndividualCall startedCallTimestamp * @property {boolean|null} [read] IndividualCall read */ /** * Constructs a new IndividualCall. * @memberof signalbackups * @classdesc Represents an IndividualCall. * @implements IIndividualCall * @constructor * @param {signalbackups.IIndividualCall=} [properties] Properties to set */ function IndividualCall(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * IndividualCall callId. * @member {Long|null|undefined} callId * @memberof signalbackups.IndividualCall * @instance */ IndividualCall.prototype.callId = null; /** * IndividualCall type. * @member {signalbackups.IndividualCall.Type} type * @memberof signalbackups.IndividualCall * @instance */ IndividualCall.prototype.type = 0; /** * IndividualCall direction. * @member {signalbackups.IndividualCall.Direction} direction * @memberof signalbackups.IndividualCall * @instance */ IndividualCall.prototype.direction = 0; /** * IndividualCall state. * @member {signalbackups.IndividualCall.State} state * @memberof signalbackups.IndividualCall * @instance */ IndividualCall.prototype.state = 0; /** * IndividualCall startedCallTimestamp. * @member {Long} startedCallTimestamp * @memberof signalbackups.IndividualCall * @instance */ IndividualCall.prototype.startedCallTimestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * IndividualCall read. * @member {boolean} read * @memberof signalbackups.IndividualCall * @instance */ IndividualCall.prototype.read = false; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * IndividualCall _callId. * @member {"callId"|undefined} _callId * @memberof signalbackups.IndividualCall * @instance */ Object.defineProperty(IndividualCall.prototype, "_callId", { get: $util.oneOfGetter($oneOfFields = ["callId"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified IndividualCall message. Does not implicitly {@link signalbackups.IndividualCall.verify|verify} messages. * @function encode * @memberof signalbackups.IndividualCall * @static * @param {signalbackups.IIndividualCall} message IndividualCall message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ IndividualCall.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.IndividualCall.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.IndividualCall.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.callId != null && Object.hasOwnProperty.call(message, "callId")) writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.callId); if (message.type != null && Object.hasOwnProperty.call(message, "type")) writer.uint32(/* id 2, wireType 0 =*/16).int32(message.type); if (message.direction != null && Object.hasOwnProperty.call(message, "direction")) writer.uint32(/* id 3, wireType 0 =*/24).int32(message.direction); if (message.state != null && Object.hasOwnProperty.call(message, "state")) writer.uint32(/* id 4, wireType 0 =*/32).int32(message.state); if (message.startedCallTimestamp != null && Object.hasOwnProperty.call(message, "startedCallTimestamp")) writer.uint32(/* id 5, wireType 0 =*/40).uint64(message.startedCallTimestamp); if (message.read != null && Object.hasOwnProperty.call(message, "read")) writer.uint32(/* id 6, wireType 0 =*/48).bool(message.read); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified IndividualCall message, length delimited. Does not implicitly {@link signalbackups.IndividualCall.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.IndividualCall * @static * @param {signalbackups.IIndividualCall} message IndividualCall message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ IndividualCall.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an IndividualCall message from the specified reader or buffer. * @function decode * @memberof signalbackups.IndividualCall * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.IndividualCall} IndividualCall * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ IndividualCall.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.IndividualCall(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.callId = reader.uint64(); break; } case 2: { message.type = reader.int32(); break; } case 3: { message.direction = reader.int32(); break; } case 4: { message.state = reader.int32(); break; } case 5: { message.startedCallTimestamp = reader.uint64(); break; } case 6: { message.read = reader.bool(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an IndividualCall message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.IndividualCall * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.IndividualCall} IndividualCall * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ IndividualCall.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * Type enum. * @name signalbackups.IndividualCall.Type * @enum {number} * @property {number} UNKNOWN_TYPE=0 UNKNOWN_TYPE value * @property {number} AUDIO_CALL=1 AUDIO_CALL value * @property {number} VIDEO_CALL=2 VIDEO_CALL value */ IndividualCall.Type = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "UNKNOWN_TYPE"] = 0; values[valuesById[1] = "AUDIO_CALL"] = 1; values[valuesById[2] = "VIDEO_CALL"] = 2; return values; })(); /** * Direction enum. * @name signalbackups.IndividualCall.Direction * @enum {number} * @property {number} UNKNOWN_DIRECTION=0 UNKNOWN_DIRECTION value * @property {number} INCOMING=1 INCOMING value * @property {number} OUTGOING=2 OUTGOING value */ IndividualCall.Direction = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "UNKNOWN_DIRECTION"] = 0; values[valuesById[1] = "INCOMING"] = 1; values[valuesById[2] = "OUTGOING"] = 2; return values; })(); /** * State enum. * @name signalbackups.IndividualCall.State * @enum {number} * @property {number} UNKNOWN_STATE=0 UNKNOWN_STATE value * @property {number} ACCEPTED=1 ACCEPTED value * @property {number} NOT_ACCEPTED=2 NOT_ACCEPTED value * @property {number} MISSED=3 MISSED value * @property {number} MISSED_NOTIFICATION_PROFILE=4 MISSED_NOTIFICATION_PROFILE value */ IndividualCall.State = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "UNKNOWN_STATE"] = 0; values[valuesById[1] = "ACCEPTED"] = 1; values[valuesById[2] = "NOT_ACCEPTED"] = 2; values[valuesById[3] = "MISSED"] = 3; values[valuesById[4] = "MISSED_NOTIFICATION_PROFILE"] = 4; return values; })(); return IndividualCall; })(); signalbackups.GroupCall = (function() { /** * Properties of a GroupCall. * @memberof signalbackups * @interface IGroupCall * @property {Long|null} [callId] GroupCall callId * @property {signalbackups.GroupCall.State|null} [state] GroupCall state * @property {Long|null} [ringerRecipientId] GroupCall ringerRecipientId * @property {Long|null} [startedCallRecipientId] GroupCall startedCallRecipientId * @property {Long|null} [startedCallTimestamp] GroupCall startedCallTimestamp * @property {Long|null} [endedCallTimestamp] GroupCall endedCallTimestamp * @property {boolean|null} [read] GroupCall read */ /** * Constructs a new GroupCall. * @memberof signalbackups * @classdesc Represents a GroupCall. * @implements IGroupCall * @constructor * @param {signalbackups.IGroupCall=} [properties] Properties to set */ function GroupCall(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GroupCall callId. * @member {Long|null|undefined} callId * @memberof signalbackups.GroupCall * @instance */ GroupCall.prototype.callId = null; /** * GroupCall state. * @member {signalbackups.GroupCall.State} state * @memberof signalbackups.GroupCall * @instance */ GroupCall.prototype.state = 0; /** * GroupCall ringerRecipientId. * @member {Long|null|undefined} ringerRecipientId * @memberof signalbackups.GroupCall * @instance */ GroupCall.prototype.ringerRecipientId = null; /** * GroupCall startedCallRecipientId. * @member {Long|null|undefined} startedCallRecipientId * @memberof signalbackups.GroupCall * @instance */ GroupCall.prototype.startedCallRecipientId = null; /** * GroupCall startedCallTimestamp. * @member {Long} startedCallTimestamp * @memberof signalbackups.GroupCall * @instance */ GroupCall.prototype.startedCallTimestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * GroupCall endedCallTimestamp. * @member {Long|null|undefined} endedCallTimestamp * @memberof signalbackups.GroupCall * @instance */ GroupCall.prototype.endedCallTimestamp = null; /** * GroupCall read. * @member {boolean} read * @memberof signalbackups.GroupCall * @instance */ GroupCall.prototype.read = false; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * GroupCall _callId. * @member {"callId"|undefined} _callId * @memberof signalbackups.GroupCall * @instance */ Object.defineProperty(GroupCall.prototype, "_callId", { get: $util.oneOfGetter($oneOfFields = ["callId"]), set: $util.oneOfSetter($oneOfFields) }); /** * GroupCall _ringerRecipientId. * @member {"ringerRecipientId"|undefined} _ringerRecipientId * @memberof signalbackups.GroupCall * @instance */ Object.defineProperty(GroupCall.prototype, "_ringerRecipientId", { get: $util.oneOfGetter($oneOfFields = ["ringerRecipientId"]), set: $util.oneOfSetter($oneOfFields) }); /** * GroupCall _startedCallRecipientId. * @member {"startedCallRecipientId"|undefined} _startedCallRecipientId * @memberof signalbackups.GroupCall * @instance */ Object.defineProperty(GroupCall.prototype, "_startedCallRecipientId", { get: $util.oneOfGetter($oneOfFields = ["startedCallRecipientId"]), set: $util.oneOfSetter($oneOfFields) }); /** * GroupCall _endedCallTimestamp. * @member {"endedCallTimestamp"|undefined} _endedCallTimestamp * @memberof signalbackups.GroupCall * @instance */ Object.defineProperty(GroupCall.prototype, "_endedCallTimestamp", { get: $util.oneOfGetter($oneOfFields = ["endedCallTimestamp"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified GroupCall message. Does not implicitly {@link signalbackups.GroupCall.verify|verify} messages. * @function encode * @memberof signalbackups.GroupCall * @static * @param {signalbackups.IGroupCall} message GroupCall message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupCall.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.GroupCall.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.GroupCall.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.callId != null && Object.hasOwnProperty.call(message, "callId")) writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.callId); if (message.state != null && Object.hasOwnProperty.call(message, "state")) writer.uint32(/* id 2, wireType 0 =*/16).int32(message.state); if (message.ringerRecipientId != null && Object.hasOwnProperty.call(message, "ringerRecipientId")) writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.ringerRecipientId); if (message.startedCallRecipientId != null && Object.hasOwnProperty.call(message, "startedCallRecipientId")) writer.uint32(/* id 4, wireType 0 =*/32).uint64(message.startedCallRecipientId); if (message.startedCallTimestamp != null && Object.hasOwnProperty.call(message, "startedCallTimestamp")) writer.uint32(/* id 5, wireType 0 =*/40).uint64(message.startedCallTimestamp); if (message.endedCallTimestamp != null && Object.hasOwnProperty.call(message, "endedCallTimestamp")) writer.uint32(/* id 6, wireType 0 =*/48).uint64(message.endedCallTimestamp); if (message.read != null && Object.hasOwnProperty.call(message, "read")) writer.uint32(/* id 7, wireType 0 =*/56).bool(message.read); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupCall message, length delimited. Does not implicitly {@link signalbackups.GroupCall.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.GroupCall * @static * @param {signalbackups.IGroupCall} message GroupCall message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupCall.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupCall message from the specified reader or buffer. * @function decode * @memberof signalbackups.GroupCall * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.GroupCall} GroupCall * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupCall.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.GroupCall(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.callId = reader.uint64(); break; } case 2: { message.state = reader.int32(); break; } case 3: { message.ringerRecipientId = reader.uint64(); break; } case 4: { message.startedCallRecipientId = reader.uint64(); break; } case 5: { message.startedCallTimestamp = reader.uint64(); break; } case 6: { message.endedCallTimestamp = reader.uint64(); break; } case 7: { message.read = reader.bool(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupCall message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.GroupCall * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.GroupCall} GroupCall * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupCall.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * State enum. * @name signalbackups.GroupCall.State * @enum {number} * @property {number} UNKNOWN_STATE=0 UNKNOWN_STATE value * @property {number} GENERIC=1 GENERIC value * @property {number} JOINED=2 JOINED value * @property {number} RINGING=3 RINGING value * @property {number} ACCEPTED=4 ACCEPTED value * @property {number} DECLINED=5 DECLINED value * @property {number} MISSED=6 MISSED value * @property {number} MISSED_NOTIFICATION_PROFILE=7 MISSED_NOTIFICATION_PROFILE value * @property {number} OUTGOING_RING=8 OUTGOING_RING value */ GroupCall.State = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "UNKNOWN_STATE"] = 0; values[valuesById[1] = "GENERIC"] = 1; values[valuesById[2] = "JOINED"] = 2; values[valuesById[3] = "RINGING"] = 3; values[valuesById[4] = "ACCEPTED"] = 4; values[valuesById[5] = "DECLINED"] = 5; values[valuesById[6] = "MISSED"] = 6; values[valuesById[7] = "MISSED_NOTIFICATION_PROFILE"] = 7; values[valuesById[8] = "OUTGOING_RING"] = 8; return values; })(); return GroupCall; })(); signalbackups.SimpleChatUpdate = (function() { /** * Properties of a SimpleChatUpdate. * @memberof signalbackups * @interface ISimpleChatUpdate * @property {signalbackups.SimpleChatUpdate.Type|null} [type] SimpleChatUpdate type */ /** * Constructs a new SimpleChatUpdate. * @memberof signalbackups * @classdesc Represents a SimpleChatUpdate. * @implements ISimpleChatUpdate * @constructor * @param {signalbackups.ISimpleChatUpdate=} [properties] Properties to set */ function SimpleChatUpdate(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * SimpleChatUpdate type. * @member {signalbackups.SimpleChatUpdate.Type} type * @memberof signalbackups.SimpleChatUpdate * @instance */ SimpleChatUpdate.prototype.type = 0; /** * Encodes the specified SimpleChatUpdate message. Does not implicitly {@link signalbackups.SimpleChatUpdate.verify|verify} messages. * @function encode * @memberof signalbackups.SimpleChatUpdate * @static * @param {signalbackups.ISimpleChatUpdate} message SimpleChatUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ SimpleChatUpdate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.SimpleChatUpdate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.SimpleChatUpdate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.type != null && Object.hasOwnProperty.call(message, "type")) writer.uint32(/* id 1, wireType 0 =*/8).int32(message.type); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified SimpleChatUpdate message, length delimited. Does not implicitly {@link signalbackups.SimpleChatUpdate.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.SimpleChatUpdate * @static * @param {signalbackups.ISimpleChatUpdate} message SimpleChatUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ SimpleChatUpdate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a SimpleChatUpdate message from the specified reader or buffer. * @function decode * @memberof signalbackups.SimpleChatUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.SimpleChatUpdate} SimpleChatUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ SimpleChatUpdate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.SimpleChatUpdate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.type = reader.int32(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a SimpleChatUpdate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.SimpleChatUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.SimpleChatUpdate} SimpleChatUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ SimpleChatUpdate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * Type enum. * @name signalbackups.SimpleChatUpdate.Type * @enum {number} * @property {number} UNKNOWN=0 UNKNOWN value * @property {number} JOINED_SIGNAL=1 JOINED_SIGNAL value * @property {number} IDENTITY_UPDATE=2 IDENTITY_UPDATE value * @property {number} IDENTITY_VERIFIED=3 IDENTITY_VERIFIED value * @property {number} IDENTITY_DEFAULT=4 IDENTITY_DEFAULT value * @property {number} CHANGE_NUMBER=5 CHANGE_NUMBER value * @property {number} RELEASE_CHANNEL_DONATION_REQUEST=6 RELEASE_CHANNEL_DONATION_REQUEST value * @property {number} END_SESSION=7 END_SESSION value * @property {number} CHAT_SESSION_REFRESH=8 CHAT_SESSION_REFRESH value * @property {number} BAD_DECRYPT=9 BAD_DECRYPT value * @property {number} PAYMENTS_ACTIVATED=10 PAYMENTS_ACTIVATED value * @property {number} PAYMENT_ACTIVATION_REQUEST=11 PAYMENT_ACTIVATION_REQUEST value * @property {number} UNSUPPORTED_PROTOCOL_MESSAGE=12 UNSUPPORTED_PROTOCOL_MESSAGE value * @property {number} REPORTED_SPAM=13 REPORTED_SPAM value * @property {number} BLOCKED=14 BLOCKED value * @property {number} UNBLOCKED=15 UNBLOCKED value * @property {number} MESSAGE_REQUEST_ACCEPTED=16 MESSAGE_REQUEST_ACCEPTED value */ SimpleChatUpdate.Type = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "UNKNOWN"] = 0; values[valuesById[1] = "JOINED_SIGNAL"] = 1; values[valuesById[2] = "IDENTITY_UPDATE"] = 2; values[valuesById[3] = "IDENTITY_VERIFIED"] = 3; values[valuesById[4] = "IDENTITY_DEFAULT"] = 4; values[valuesById[5] = "CHANGE_NUMBER"] = 5; values[valuesById[6] = "RELEASE_CHANNEL_DONATION_REQUEST"] = 6; values[valuesById[7] = "END_SESSION"] = 7; values[valuesById[8] = "CHAT_SESSION_REFRESH"] = 8; values[valuesById[9] = "BAD_DECRYPT"] = 9; values[valuesById[10] = "PAYMENTS_ACTIVATED"] = 10; values[valuesById[11] = "PAYMENT_ACTIVATION_REQUEST"] = 11; values[valuesById[12] = "UNSUPPORTED_PROTOCOL_MESSAGE"] = 12; values[valuesById[13] = "REPORTED_SPAM"] = 13; values[valuesById[14] = "BLOCKED"] = 14; values[valuesById[15] = "UNBLOCKED"] = 15; values[valuesById[16] = "MESSAGE_REQUEST_ACCEPTED"] = 16; return values; })(); return SimpleChatUpdate; })(); signalbackups.ExpirationTimerChatUpdate = (function() { /** * Properties of an ExpirationTimerChatUpdate. * @memberof signalbackups * @interface IExpirationTimerChatUpdate * @property {Long|null} [expiresInMs] ExpirationTimerChatUpdate expiresInMs */ /** * Constructs a new ExpirationTimerChatUpdate. * @memberof signalbackups * @classdesc Represents an ExpirationTimerChatUpdate. * @implements IExpirationTimerChatUpdate * @constructor * @param {signalbackups.IExpirationTimerChatUpdate=} [properties] Properties to set */ function ExpirationTimerChatUpdate(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * ExpirationTimerChatUpdate expiresInMs. * @member {Long} expiresInMs * @memberof signalbackups.ExpirationTimerChatUpdate * @instance */ ExpirationTimerChatUpdate.prototype.expiresInMs = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * Encodes the specified ExpirationTimerChatUpdate message. Does not implicitly {@link signalbackups.ExpirationTimerChatUpdate.verify|verify} messages. * @function encode * @memberof signalbackups.ExpirationTimerChatUpdate * @static * @param {signalbackups.IExpirationTimerChatUpdate} message ExpirationTimerChatUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ExpirationTimerChatUpdate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.ExpirationTimerChatUpdate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.ExpirationTimerChatUpdate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.expiresInMs != null && Object.hasOwnProperty.call(message, "expiresInMs")) writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.expiresInMs); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified ExpirationTimerChatUpdate message, length delimited. Does not implicitly {@link signalbackups.ExpirationTimerChatUpdate.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.ExpirationTimerChatUpdate * @static * @param {signalbackups.IExpirationTimerChatUpdate} message ExpirationTimerChatUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ExpirationTimerChatUpdate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an ExpirationTimerChatUpdate message from the specified reader or buffer. * @function decode * @memberof signalbackups.ExpirationTimerChatUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.ExpirationTimerChatUpdate} ExpirationTimerChatUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ExpirationTimerChatUpdate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.ExpirationTimerChatUpdate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.expiresInMs = reader.uint64(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an ExpirationTimerChatUpdate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.ExpirationTimerChatUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.ExpirationTimerChatUpdate} ExpirationTimerChatUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ExpirationTimerChatUpdate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return ExpirationTimerChatUpdate; })(); signalbackups.ProfileChangeChatUpdate = (function() { /** * Properties of a ProfileChangeChatUpdate. * @memberof signalbackups * @interface IProfileChangeChatUpdate * @property {string|null} [previousName] ProfileChangeChatUpdate previousName * @property {string|null} [newName] ProfileChangeChatUpdate newName */ /** * Constructs a new ProfileChangeChatUpdate. * @memberof signalbackups * @classdesc Represents a ProfileChangeChatUpdate. * @implements IProfileChangeChatUpdate * @constructor * @param {signalbackups.IProfileChangeChatUpdate=} [properties] Properties to set */ function ProfileChangeChatUpdate(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * ProfileChangeChatUpdate previousName. * @member {string} previousName * @memberof signalbackups.ProfileChangeChatUpdate * @instance */ ProfileChangeChatUpdate.prototype.previousName = ""; /** * ProfileChangeChatUpdate newName. * @member {string} newName * @memberof signalbackups.ProfileChangeChatUpdate * @instance */ ProfileChangeChatUpdate.prototype.newName = ""; /** * Encodes the specified ProfileChangeChatUpdate message. Does not implicitly {@link signalbackups.ProfileChangeChatUpdate.verify|verify} messages. * @function encode * @memberof signalbackups.ProfileChangeChatUpdate * @static * @param {signalbackups.IProfileChangeChatUpdate} message ProfileChangeChatUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ProfileChangeChatUpdate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.ProfileChangeChatUpdate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.ProfileChangeChatUpdate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.previousName != null && Object.hasOwnProperty.call(message, "previousName")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.previousName); if (message.newName != null && Object.hasOwnProperty.call(message, "newName")) writer.uint32(/* id 2, wireType 2 =*/18).string(message.newName); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified ProfileChangeChatUpdate message, length delimited. Does not implicitly {@link signalbackups.ProfileChangeChatUpdate.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.ProfileChangeChatUpdate * @static * @param {signalbackups.IProfileChangeChatUpdate} message ProfileChangeChatUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ProfileChangeChatUpdate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a ProfileChangeChatUpdate message from the specified reader or buffer. * @function decode * @memberof signalbackups.ProfileChangeChatUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.ProfileChangeChatUpdate} ProfileChangeChatUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ProfileChangeChatUpdate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.ProfileChangeChatUpdate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.previousName = reader.string(); break; } case 2: { message.newName = reader.string(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a ProfileChangeChatUpdate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.ProfileChangeChatUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.ProfileChangeChatUpdate} ProfileChangeChatUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ProfileChangeChatUpdate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return ProfileChangeChatUpdate; })(); signalbackups.LearnedProfileChatUpdate = (function() { /** * Properties of a LearnedProfileChatUpdate. * @memberof signalbackups * @interface ILearnedProfileChatUpdate * @property {Long|null} [e164] LearnedProfileChatUpdate e164 * @property {string|null} [username] LearnedProfileChatUpdate username */ /** * Constructs a new LearnedProfileChatUpdate. * @memberof signalbackups * @classdesc Represents a LearnedProfileChatUpdate. * @implements ILearnedProfileChatUpdate * @constructor * @param {signalbackups.ILearnedProfileChatUpdate=} [properties] Properties to set */ function LearnedProfileChatUpdate(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * LearnedProfileChatUpdate e164. * @member {Long|null|undefined} e164 * @memberof signalbackups.LearnedProfileChatUpdate * @instance */ LearnedProfileChatUpdate.prototype.e164 = null; /** * LearnedProfileChatUpdate username. * @member {string|null|undefined} username * @memberof signalbackups.LearnedProfileChatUpdate * @instance */ LearnedProfileChatUpdate.prototype.username = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * LearnedProfileChatUpdate previousName. * @member {"e164"|"username"|undefined} previousName * @memberof signalbackups.LearnedProfileChatUpdate * @instance */ Object.defineProperty(LearnedProfileChatUpdate.prototype, "previousName", { get: $util.oneOfGetter($oneOfFields = ["e164", "username"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified LearnedProfileChatUpdate message. Does not implicitly {@link signalbackups.LearnedProfileChatUpdate.verify|verify} messages. * @function encode * @memberof signalbackups.LearnedProfileChatUpdate * @static * @param {signalbackups.ILearnedProfileChatUpdate} message LearnedProfileChatUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ LearnedProfileChatUpdate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.LearnedProfileChatUpdate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.LearnedProfileChatUpdate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.e164 != null && Object.hasOwnProperty.call(message, "e164")) writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.e164); if (message.username != null && Object.hasOwnProperty.call(message, "username")) writer.uint32(/* id 2, wireType 2 =*/18).string(message.username); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified LearnedProfileChatUpdate message, length delimited. Does not implicitly {@link signalbackups.LearnedProfileChatUpdate.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.LearnedProfileChatUpdate * @static * @param {signalbackups.ILearnedProfileChatUpdate} message LearnedProfileChatUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ LearnedProfileChatUpdate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a LearnedProfileChatUpdate message from the specified reader or buffer. * @function decode * @memberof signalbackups.LearnedProfileChatUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.LearnedProfileChatUpdate} LearnedProfileChatUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ LearnedProfileChatUpdate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.LearnedProfileChatUpdate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.e164 = reader.uint64(); break; } case 2: { message.username = reader.string(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a LearnedProfileChatUpdate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.LearnedProfileChatUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.LearnedProfileChatUpdate} LearnedProfileChatUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ LearnedProfileChatUpdate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return LearnedProfileChatUpdate; })(); signalbackups.ThreadMergeChatUpdate = (function() { /** * Properties of a ThreadMergeChatUpdate. * @memberof signalbackups * @interface IThreadMergeChatUpdate * @property {Long|null} [previousE164] ThreadMergeChatUpdate previousE164 */ /** * Constructs a new ThreadMergeChatUpdate. * @memberof signalbackups * @classdesc Represents a ThreadMergeChatUpdate. * @implements IThreadMergeChatUpdate * @constructor * @param {signalbackups.IThreadMergeChatUpdate=} [properties] Properties to set */ function ThreadMergeChatUpdate(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * ThreadMergeChatUpdate previousE164. * @member {Long} previousE164 * @memberof signalbackups.ThreadMergeChatUpdate * @instance */ ThreadMergeChatUpdate.prototype.previousE164 = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * Encodes the specified ThreadMergeChatUpdate message. Does not implicitly {@link signalbackups.ThreadMergeChatUpdate.verify|verify} messages. * @function encode * @memberof signalbackups.ThreadMergeChatUpdate * @static * @param {signalbackups.IThreadMergeChatUpdate} message ThreadMergeChatUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ThreadMergeChatUpdate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.ThreadMergeChatUpdate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.ThreadMergeChatUpdate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.previousE164 != null && Object.hasOwnProperty.call(message, "previousE164")) writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.previousE164); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified ThreadMergeChatUpdate message, length delimited. Does not implicitly {@link signalbackups.ThreadMergeChatUpdate.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.ThreadMergeChatUpdate * @static * @param {signalbackups.IThreadMergeChatUpdate} message ThreadMergeChatUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ThreadMergeChatUpdate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a ThreadMergeChatUpdate message from the specified reader or buffer. * @function decode * @memberof signalbackups.ThreadMergeChatUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.ThreadMergeChatUpdate} ThreadMergeChatUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ThreadMergeChatUpdate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.ThreadMergeChatUpdate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.previousE164 = reader.uint64(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a ThreadMergeChatUpdate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.ThreadMergeChatUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.ThreadMergeChatUpdate} ThreadMergeChatUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ThreadMergeChatUpdate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return ThreadMergeChatUpdate; })(); signalbackups.SessionSwitchoverChatUpdate = (function() { /** * Properties of a SessionSwitchoverChatUpdate. * @memberof signalbackups * @interface ISessionSwitchoverChatUpdate * @property {Long|null} [e164] SessionSwitchoverChatUpdate e164 */ /** * Constructs a new SessionSwitchoverChatUpdate. * @memberof signalbackups * @classdesc Represents a SessionSwitchoverChatUpdate. * @implements ISessionSwitchoverChatUpdate * @constructor * @param {signalbackups.ISessionSwitchoverChatUpdate=} [properties] Properties to set */ function SessionSwitchoverChatUpdate(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * SessionSwitchoverChatUpdate e164. * @member {Long} e164 * @memberof signalbackups.SessionSwitchoverChatUpdate * @instance */ SessionSwitchoverChatUpdate.prototype.e164 = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * Encodes the specified SessionSwitchoverChatUpdate message. Does not implicitly {@link signalbackups.SessionSwitchoverChatUpdate.verify|verify} messages. * @function encode * @memberof signalbackups.SessionSwitchoverChatUpdate * @static * @param {signalbackups.ISessionSwitchoverChatUpdate} message SessionSwitchoverChatUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ SessionSwitchoverChatUpdate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.SessionSwitchoverChatUpdate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.SessionSwitchoverChatUpdate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.e164 != null && Object.hasOwnProperty.call(message, "e164")) writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.e164); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified SessionSwitchoverChatUpdate message, length delimited. Does not implicitly {@link signalbackups.SessionSwitchoverChatUpdate.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.SessionSwitchoverChatUpdate * @static * @param {signalbackups.ISessionSwitchoverChatUpdate} message SessionSwitchoverChatUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ SessionSwitchoverChatUpdate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a SessionSwitchoverChatUpdate message from the specified reader or buffer. * @function decode * @memberof signalbackups.SessionSwitchoverChatUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.SessionSwitchoverChatUpdate} SessionSwitchoverChatUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ SessionSwitchoverChatUpdate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.SessionSwitchoverChatUpdate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.e164 = reader.uint64(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a SessionSwitchoverChatUpdate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.SessionSwitchoverChatUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.SessionSwitchoverChatUpdate} SessionSwitchoverChatUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ SessionSwitchoverChatUpdate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return SessionSwitchoverChatUpdate; })(); signalbackups.GroupChangeChatUpdate = (function() { /** * Properties of a GroupChangeChatUpdate. * @memberof signalbackups * @interface IGroupChangeChatUpdate * @property {Array.|null} [updates] GroupChangeChatUpdate updates */ /** * Constructs a new GroupChangeChatUpdate. * @memberof signalbackups * @classdesc Represents a GroupChangeChatUpdate. * @implements IGroupChangeChatUpdate * @constructor * @param {signalbackups.IGroupChangeChatUpdate=} [properties] Properties to set */ function GroupChangeChatUpdate(properties) { this.updates = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GroupChangeChatUpdate updates. * @member {Array.} updates * @memberof signalbackups.GroupChangeChatUpdate * @instance */ GroupChangeChatUpdate.prototype.updates = $util.emptyArray; /** * Encodes the specified GroupChangeChatUpdate message. Does not implicitly {@link signalbackups.GroupChangeChatUpdate.verify|verify} messages. * @function encode * @memberof signalbackups.GroupChangeChatUpdate * @static * @param {signalbackups.IGroupChangeChatUpdate} message GroupChangeChatUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupChangeChatUpdate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.GroupChangeChatUpdate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.GroupChangeChatUpdate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.updates != null && message.updates.length) for (var i = 0; i < message.updates.length; ++i) $root.signalbackups.GroupChangeChatUpdate.Update.encode(message.updates[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupChangeChatUpdate message, length delimited. Does not implicitly {@link signalbackups.GroupChangeChatUpdate.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.GroupChangeChatUpdate * @static * @param {signalbackups.IGroupChangeChatUpdate} message GroupChangeChatUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupChangeChatUpdate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupChangeChatUpdate message from the specified reader or buffer. * @function decode * @memberof signalbackups.GroupChangeChatUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.GroupChangeChatUpdate} GroupChangeChatUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupChangeChatUpdate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.GroupChangeChatUpdate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { if (!(message.updates && message.updates.length)) message.updates = []; message.updates.push($root.signalbackups.GroupChangeChatUpdate.Update.decode(reader, reader.uint32())); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupChangeChatUpdate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.GroupChangeChatUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.GroupChangeChatUpdate} GroupChangeChatUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupChangeChatUpdate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; GroupChangeChatUpdate.Update = (function() { /** * Properties of an Update. * @memberof signalbackups.GroupChangeChatUpdate * @interface IUpdate * @property {signalbackups.IGenericGroupUpdate|null} [genericGroupUpdate] Update genericGroupUpdate * @property {signalbackups.IGroupCreationUpdate|null} [groupCreationUpdate] Update groupCreationUpdate * @property {signalbackups.IGroupNameUpdate|null} [groupNameUpdate] Update groupNameUpdate * @property {signalbackups.IGroupAvatarUpdate|null} [groupAvatarUpdate] Update groupAvatarUpdate * @property {signalbackups.IGroupDescriptionUpdate|null} [groupDescriptionUpdate] Update groupDescriptionUpdate * @property {signalbackups.IGroupMembershipAccessLevelChangeUpdate|null} [groupMembershipAccessLevelChangeUpdate] Update groupMembershipAccessLevelChangeUpdate * @property {signalbackups.IGroupAttributesAccessLevelChangeUpdate|null} [groupAttributesAccessLevelChangeUpdate] Update groupAttributesAccessLevelChangeUpdate * @property {signalbackups.IGroupAnnouncementOnlyChangeUpdate|null} [groupAnnouncementOnlyChangeUpdate] Update groupAnnouncementOnlyChangeUpdate * @property {signalbackups.IGroupAdminStatusUpdate|null} [groupAdminStatusUpdate] Update groupAdminStatusUpdate * @property {signalbackups.IGroupMemberLeftUpdate|null} [groupMemberLeftUpdate] Update groupMemberLeftUpdate * @property {signalbackups.IGroupMemberRemovedUpdate|null} [groupMemberRemovedUpdate] Update groupMemberRemovedUpdate * @property {signalbackups.ISelfInvitedToGroupUpdate|null} [selfInvitedToGroupUpdate] Update selfInvitedToGroupUpdate * @property {signalbackups.ISelfInvitedOtherUserToGroupUpdate|null} [selfInvitedOtherUserToGroupUpdate] Update selfInvitedOtherUserToGroupUpdate * @property {signalbackups.IGroupUnknownInviteeUpdate|null} [groupUnknownInviteeUpdate] Update groupUnknownInviteeUpdate * @property {signalbackups.IGroupInvitationAcceptedUpdate|null} [groupInvitationAcceptedUpdate] Update groupInvitationAcceptedUpdate * @property {signalbackups.IGroupInvitationDeclinedUpdate|null} [groupInvitationDeclinedUpdate] Update groupInvitationDeclinedUpdate * @property {signalbackups.IGroupMemberJoinedUpdate|null} [groupMemberJoinedUpdate] Update groupMemberJoinedUpdate * @property {signalbackups.IGroupMemberAddedUpdate|null} [groupMemberAddedUpdate] Update groupMemberAddedUpdate * @property {signalbackups.IGroupSelfInvitationRevokedUpdate|null} [groupSelfInvitationRevokedUpdate] Update groupSelfInvitationRevokedUpdate * @property {signalbackups.IGroupInvitationRevokedUpdate|null} [groupInvitationRevokedUpdate] Update groupInvitationRevokedUpdate * @property {signalbackups.IGroupJoinRequestUpdate|null} [groupJoinRequestUpdate] Update groupJoinRequestUpdate * @property {signalbackups.IGroupJoinRequestApprovalUpdate|null} [groupJoinRequestApprovalUpdate] Update groupJoinRequestApprovalUpdate * @property {signalbackups.IGroupJoinRequestCanceledUpdate|null} [groupJoinRequestCanceledUpdate] Update groupJoinRequestCanceledUpdate * @property {signalbackups.IGroupInviteLinkResetUpdate|null} [groupInviteLinkResetUpdate] Update groupInviteLinkResetUpdate * @property {signalbackups.IGroupInviteLinkEnabledUpdate|null} [groupInviteLinkEnabledUpdate] Update groupInviteLinkEnabledUpdate * @property {signalbackups.IGroupInviteLinkAdminApprovalUpdate|null} [groupInviteLinkAdminApprovalUpdate] Update groupInviteLinkAdminApprovalUpdate * @property {signalbackups.IGroupInviteLinkDisabledUpdate|null} [groupInviteLinkDisabledUpdate] Update groupInviteLinkDisabledUpdate * @property {signalbackups.IGroupMemberJoinedByLinkUpdate|null} [groupMemberJoinedByLinkUpdate] Update groupMemberJoinedByLinkUpdate * @property {signalbackups.IGroupV2MigrationUpdate|null} [groupV2MigrationUpdate] Update groupV2MigrationUpdate * @property {signalbackups.IGroupV2MigrationSelfInvitedUpdate|null} [groupV2MigrationSelfInvitedUpdate] Update groupV2MigrationSelfInvitedUpdate * @property {signalbackups.IGroupV2MigrationInvitedMembersUpdate|null} [groupV2MigrationInvitedMembersUpdate] Update groupV2MigrationInvitedMembersUpdate * @property {signalbackups.IGroupV2MigrationDroppedMembersUpdate|null} [groupV2MigrationDroppedMembersUpdate] Update groupV2MigrationDroppedMembersUpdate * @property {signalbackups.IGroupSequenceOfRequestsAndCancelsUpdate|null} [groupSequenceOfRequestsAndCancelsUpdate] Update groupSequenceOfRequestsAndCancelsUpdate * @property {signalbackups.IGroupExpirationTimerUpdate|null} [groupExpirationTimerUpdate] Update groupExpirationTimerUpdate */ /** * Constructs a new Update. * @memberof signalbackups.GroupChangeChatUpdate * @classdesc Represents an Update. * @implements IUpdate * @constructor * @param {signalbackups.GroupChangeChatUpdate.IUpdate=} [properties] Properties to set */ function Update(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Update genericGroupUpdate. * @member {signalbackups.IGenericGroupUpdate|null|undefined} genericGroupUpdate * @memberof signalbackups.GroupChangeChatUpdate.Update * @instance */ Update.prototype.genericGroupUpdate = null; /** * Update groupCreationUpdate. * @member {signalbackups.IGroupCreationUpdate|null|undefined} groupCreationUpdate * @memberof signalbackups.GroupChangeChatUpdate.Update * @instance */ Update.prototype.groupCreationUpdate = null; /** * Update groupNameUpdate. * @member {signalbackups.IGroupNameUpdate|null|undefined} groupNameUpdate * @memberof signalbackups.GroupChangeChatUpdate.Update * @instance */ Update.prototype.groupNameUpdate = null; /** * Update groupAvatarUpdate. * @member {signalbackups.IGroupAvatarUpdate|null|undefined} groupAvatarUpdate * @memberof signalbackups.GroupChangeChatUpdate.Update * @instance */ Update.prototype.groupAvatarUpdate = null; /** * Update groupDescriptionUpdate. * @member {signalbackups.IGroupDescriptionUpdate|null|undefined} groupDescriptionUpdate * @memberof signalbackups.GroupChangeChatUpdate.Update * @instance */ Update.prototype.groupDescriptionUpdate = null; /** * Update groupMembershipAccessLevelChangeUpdate. * @member {signalbackups.IGroupMembershipAccessLevelChangeUpdate|null|undefined} groupMembershipAccessLevelChangeUpdate * @memberof signalbackups.GroupChangeChatUpdate.Update * @instance */ Update.prototype.groupMembershipAccessLevelChangeUpdate = null; /** * Update groupAttributesAccessLevelChangeUpdate. * @member {signalbackups.IGroupAttributesAccessLevelChangeUpdate|null|undefined} groupAttributesAccessLevelChangeUpdate * @memberof signalbackups.GroupChangeChatUpdate.Update * @instance */ Update.prototype.groupAttributesAccessLevelChangeUpdate = null; /** * Update groupAnnouncementOnlyChangeUpdate. * @member {signalbackups.IGroupAnnouncementOnlyChangeUpdate|null|undefined} groupAnnouncementOnlyChangeUpdate * @memberof signalbackups.GroupChangeChatUpdate.Update * @instance */ Update.prototype.groupAnnouncementOnlyChangeUpdate = null; /** * Update groupAdminStatusUpdate. * @member {signalbackups.IGroupAdminStatusUpdate|null|undefined} groupAdminStatusUpdate * @memberof signalbackups.GroupChangeChatUpdate.Update * @instance */ Update.prototype.groupAdminStatusUpdate = null; /** * Update groupMemberLeftUpdate. * @member {signalbackups.IGroupMemberLeftUpdate|null|undefined} groupMemberLeftUpdate * @memberof signalbackups.GroupChangeChatUpdate.Update * @instance */ Update.prototype.groupMemberLeftUpdate = null; /** * Update groupMemberRemovedUpdate. * @member {signalbackups.IGroupMemberRemovedUpdate|null|undefined} groupMemberRemovedUpdate * @memberof signalbackups.GroupChangeChatUpdate.Update * @instance */ Update.prototype.groupMemberRemovedUpdate = null; /** * Update selfInvitedToGroupUpdate. * @member {signalbackups.ISelfInvitedToGroupUpdate|null|undefined} selfInvitedToGroupUpdate * @memberof signalbackups.GroupChangeChatUpdate.Update * @instance */ Update.prototype.selfInvitedToGroupUpdate = null; /** * Update selfInvitedOtherUserToGroupUpdate. * @member {signalbackups.ISelfInvitedOtherUserToGroupUpdate|null|undefined} selfInvitedOtherUserToGroupUpdate * @memberof signalbackups.GroupChangeChatUpdate.Update * @instance */ Update.prototype.selfInvitedOtherUserToGroupUpdate = null; /** * Update groupUnknownInviteeUpdate. * @member {signalbackups.IGroupUnknownInviteeUpdate|null|undefined} groupUnknownInviteeUpdate * @memberof signalbackups.GroupChangeChatUpdate.Update * @instance */ Update.prototype.groupUnknownInviteeUpdate = null; /** * Update groupInvitationAcceptedUpdate. * @member {signalbackups.IGroupInvitationAcceptedUpdate|null|undefined} groupInvitationAcceptedUpdate * @memberof signalbackups.GroupChangeChatUpdate.Update * @instance */ Update.prototype.groupInvitationAcceptedUpdate = null; /** * Update groupInvitationDeclinedUpdate. * @member {signalbackups.IGroupInvitationDeclinedUpdate|null|undefined} groupInvitationDeclinedUpdate * @memberof signalbackups.GroupChangeChatUpdate.Update * @instance */ Update.prototype.groupInvitationDeclinedUpdate = null; /** * Update groupMemberJoinedUpdate. * @member {signalbackups.IGroupMemberJoinedUpdate|null|undefined} groupMemberJoinedUpdate * @memberof signalbackups.GroupChangeChatUpdate.Update * @instance */ Update.prototype.groupMemberJoinedUpdate = null; /** * Update groupMemberAddedUpdate. * @member {signalbackups.IGroupMemberAddedUpdate|null|undefined} groupMemberAddedUpdate * @memberof signalbackups.GroupChangeChatUpdate.Update * @instance */ Update.prototype.groupMemberAddedUpdate = null; /** * Update groupSelfInvitationRevokedUpdate. * @member {signalbackups.IGroupSelfInvitationRevokedUpdate|null|undefined} groupSelfInvitationRevokedUpdate * @memberof signalbackups.GroupChangeChatUpdate.Update * @instance */ Update.prototype.groupSelfInvitationRevokedUpdate = null; /** * Update groupInvitationRevokedUpdate. * @member {signalbackups.IGroupInvitationRevokedUpdate|null|undefined} groupInvitationRevokedUpdate * @memberof signalbackups.GroupChangeChatUpdate.Update * @instance */ Update.prototype.groupInvitationRevokedUpdate = null; /** * Update groupJoinRequestUpdate. * @member {signalbackups.IGroupJoinRequestUpdate|null|undefined} groupJoinRequestUpdate * @memberof signalbackups.GroupChangeChatUpdate.Update * @instance */ Update.prototype.groupJoinRequestUpdate = null; /** * Update groupJoinRequestApprovalUpdate. * @member {signalbackups.IGroupJoinRequestApprovalUpdate|null|undefined} groupJoinRequestApprovalUpdate * @memberof signalbackups.GroupChangeChatUpdate.Update * @instance */ Update.prototype.groupJoinRequestApprovalUpdate = null; /** * Update groupJoinRequestCanceledUpdate. * @member {signalbackups.IGroupJoinRequestCanceledUpdate|null|undefined} groupJoinRequestCanceledUpdate * @memberof signalbackups.GroupChangeChatUpdate.Update * @instance */ Update.prototype.groupJoinRequestCanceledUpdate = null; /** * Update groupInviteLinkResetUpdate. * @member {signalbackups.IGroupInviteLinkResetUpdate|null|undefined} groupInviteLinkResetUpdate * @memberof signalbackups.GroupChangeChatUpdate.Update * @instance */ Update.prototype.groupInviteLinkResetUpdate = null; /** * Update groupInviteLinkEnabledUpdate. * @member {signalbackups.IGroupInviteLinkEnabledUpdate|null|undefined} groupInviteLinkEnabledUpdate * @memberof signalbackups.GroupChangeChatUpdate.Update * @instance */ Update.prototype.groupInviteLinkEnabledUpdate = null; /** * Update groupInviteLinkAdminApprovalUpdate. * @member {signalbackups.IGroupInviteLinkAdminApprovalUpdate|null|undefined} groupInviteLinkAdminApprovalUpdate * @memberof signalbackups.GroupChangeChatUpdate.Update * @instance */ Update.prototype.groupInviteLinkAdminApprovalUpdate = null; /** * Update groupInviteLinkDisabledUpdate. * @member {signalbackups.IGroupInviteLinkDisabledUpdate|null|undefined} groupInviteLinkDisabledUpdate * @memberof signalbackups.GroupChangeChatUpdate.Update * @instance */ Update.prototype.groupInviteLinkDisabledUpdate = null; /** * Update groupMemberJoinedByLinkUpdate. * @member {signalbackups.IGroupMemberJoinedByLinkUpdate|null|undefined} groupMemberJoinedByLinkUpdate * @memberof signalbackups.GroupChangeChatUpdate.Update * @instance */ Update.prototype.groupMemberJoinedByLinkUpdate = null; /** * Update groupV2MigrationUpdate. * @member {signalbackups.IGroupV2MigrationUpdate|null|undefined} groupV2MigrationUpdate * @memberof signalbackups.GroupChangeChatUpdate.Update * @instance */ Update.prototype.groupV2MigrationUpdate = null; /** * Update groupV2MigrationSelfInvitedUpdate. * @member {signalbackups.IGroupV2MigrationSelfInvitedUpdate|null|undefined} groupV2MigrationSelfInvitedUpdate * @memberof signalbackups.GroupChangeChatUpdate.Update * @instance */ Update.prototype.groupV2MigrationSelfInvitedUpdate = null; /** * Update groupV2MigrationInvitedMembersUpdate. * @member {signalbackups.IGroupV2MigrationInvitedMembersUpdate|null|undefined} groupV2MigrationInvitedMembersUpdate * @memberof signalbackups.GroupChangeChatUpdate.Update * @instance */ Update.prototype.groupV2MigrationInvitedMembersUpdate = null; /** * Update groupV2MigrationDroppedMembersUpdate. * @member {signalbackups.IGroupV2MigrationDroppedMembersUpdate|null|undefined} groupV2MigrationDroppedMembersUpdate * @memberof signalbackups.GroupChangeChatUpdate.Update * @instance */ Update.prototype.groupV2MigrationDroppedMembersUpdate = null; /** * Update groupSequenceOfRequestsAndCancelsUpdate. * @member {signalbackups.IGroupSequenceOfRequestsAndCancelsUpdate|null|undefined} groupSequenceOfRequestsAndCancelsUpdate * @memberof signalbackups.GroupChangeChatUpdate.Update * @instance */ Update.prototype.groupSequenceOfRequestsAndCancelsUpdate = null; /** * Update groupExpirationTimerUpdate. * @member {signalbackups.IGroupExpirationTimerUpdate|null|undefined} groupExpirationTimerUpdate * @memberof signalbackups.GroupChangeChatUpdate.Update * @instance */ Update.prototype.groupExpirationTimerUpdate = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * Update update. * @member {"genericGroupUpdate"|"groupCreationUpdate"|"groupNameUpdate"|"groupAvatarUpdate"|"groupDescriptionUpdate"|"groupMembershipAccessLevelChangeUpdate"|"groupAttributesAccessLevelChangeUpdate"|"groupAnnouncementOnlyChangeUpdate"|"groupAdminStatusUpdate"|"groupMemberLeftUpdate"|"groupMemberRemovedUpdate"|"selfInvitedToGroupUpdate"|"selfInvitedOtherUserToGroupUpdate"|"groupUnknownInviteeUpdate"|"groupInvitationAcceptedUpdate"|"groupInvitationDeclinedUpdate"|"groupMemberJoinedUpdate"|"groupMemberAddedUpdate"|"groupSelfInvitationRevokedUpdate"|"groupInvitationRevokedUpdate"|"groupJoinRequestUpdate"|"groupJoinRequestApprovalUpdate"|"groupJoinRequestCanceledUpdate"|"groupInviteLinkResetUpdate"|"groupInviteLinkEnabledUpdate"|"groupInviteLinkAdminApprovalUpdate"|"groupInviteLinkDisabledUpdate"|"groupMemberJoinedByLinkUpdate"|"groupV2MigrationUpdate"|"groupV2MigrationSelfInvitedUpdate"|"groupV2MigrationInvitedMembersUpdate"|"groupV2MigrationDroppedMembersUpdate"|"groupSequenceOfRequestsAndCancelsUpdate"|"groupExpirationTimerUpdate"|undefined} update * @memberof signalbackups.GroupChangeChatUpdate.Update * @instance */ Object.defineProperty(Update.prototype, "update", { get: $util.oneOfGetter($oneOfFields = ["genericGroupUpdate", "groupCreationUpdate", "groupNameUpdate", "groupAvatarUpdate", "groupDescriptionUpdate", "groupMembershipAccessLevelChangeUpdate", "groupAttributesAccessLevelChangeUpdate", "groupAnnouncementOnlyChangeUpdate", "groupAdminStatusUpdate", "groupMemberLeftUpdate", "groupMemberRemovedUpdate", "selfInvitedToGroupUpdate", "selfInvitedOtherUserToGroupUpdate", "groupUnknownInviteeUpdate", "groupInvitationAcceptedUpdate", "groupInvitationDeclinedUpdate", "groupMemberJoinedUpdate", "groupMemberAddedUpdate", "groupSelfInvitationRevokedUpdate", "groupInvitationRevokedUpdate", "groupJoinRequestUpdate", "groupJoinRequestApprovalUpdate", "groupJoinRequestCanceledUpdate", "groupInviteLinkResetUpdate", "groupInviteLinkEnabledUpdate", "groupInviteLinkAdminApprovalUpdate", "groupInviteLinkDisabledUpdate", "groupMemberJoinedByLinkUpdate", "groupV2MigrationUpdate", "groupV2MigrationSelfInvitedUpdate", "groupV2MigrationInvitedMembersUpdate", "groupV2MigrationDroppedMembersUpdate", "groupSequenceOfRequestsAndCancelsUpdate", "groupExpirationTimerUpdate"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified Update message. Does not implicitly {@link signalbackups.GroupChangeChatUpdate.Update.verify|verify} messages. * @function encode * @memberof signalbackups.GroupChangeChatUpdate.Update * @static * @param {signalbackups.GroupChangeChatUpdate.IUpdate} message Update message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Update.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.GroupChangeChatUpdate.Update.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.GroupChangeChatUpdate.Update.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.genericGroupUpdate != null && Object.hasOwnProperty.call(message, "genericGroupUpdate")) $root.signalbackups.GenericGroupUpdate.encode(message.genericGroupUpdate, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.groupCreationUpdate != null && Object.hasOwnProperty.call(message, "groupCreationUpdate")) $root.signalbackups.GroupCreationUpdate.encode(message.groupCreationUpdate, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); if (message.groupNameUpdate != null && Object.hasOwnProperty.call(message, "groupNameUpdate")) $root.signalbackups.GroupNameUpdate.encode(message.groupNameUpdate, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); if (message.groupAvatarUpdate != null && Object.hasOwnProperty.call(message, "groupAvatarUpdate")) $root.signalbackups.GroupAvatarUpdate.encode(message.groupAvatarUpdate, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); if (message.groupDescriptionUpdate != null && Object.hasOwnProperty.call(message, "groupDescriptionUpdate")) $root.signalbackups.GroupDescriptionUpdate.encode(message.groupDescriptionUpdate, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); if (message.groupMembershipAccessLevelChangeUpdate != null && Object.hasOwnProperty.call(message, "groupMembershipAccessLevelChangeUpdate")) $root.signalbackups.GroupMembershipAccessLevelChangeUpdate.encode(message.groupMembershipAccessLevelChangeUpdate, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim(); if (message.groupAttributesAccessLevelChangeUpdate != null && Object.hasOwnProperty.call(message, "groupAttributesAccessLevelChangeUpdate")) $root.signalbackups.GroupAttributesAccessLevelChangeUpdate.encode(message.groupAttributesAccessLevelChangeUpdate, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim(); if (message.groupAnnouncementOnlyChangeUpdate != null && Object.hasOwnProperty.call(message, "groupAnnouncementOnlyChangeUpdate")) $root.signalbackups.GroupAnnouncementOnlyChangeUpdate.encode(message.groupAnnouncementOnlyChangeUpdate, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim(); if (message.groupAdminStatusUpdate != null && Object.hasOwnProperty.call(message, "groupAdminStatusUpdate")) $root.signalbackups.GroupAdminStatusUpdate.encode(message.groupAdminStatusUpdate, writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim(); if (message.groupMemberLeftUpdate != null && Object.hasOwnProperty.call(message, "groupMemberLeftUpdate")) $root.signalbackups.GroupMemberLeftUpdate.encode(message.groupMemberLeftUpdate, writer.uint32(/* id 10, wireType 2 =*/82).fork()).ldelim(); if (message.groupMemberRemovedUpdate != null && Object.hasOwnProperty.call(message, "groupMemberRemovedUpdate")) $root.signalbackups.GroupMemberRemovedUpdate.encode(message.groupMemberRemovedUpdate, writer.uint32(/* id 11, wireType 2 =*/90).fork()).ldelim(); if (message.selfInvitedToGroupUpdate != null && Object.hasOwnProperty.call(message, "selfInvitedToGroupUpdate")) $root.signalbackups.SelfInvitedToGroupUpdate.encode(message.selfInvitedToGroupUpdate, writer.uint32(/* id 12, wireType 2 =*/98).fork()).ldelim(); if (message.selfInvitedOtherUserToGroupUpdate != null && Object.hasOwnProperty.call(message, "selfInvitedOtherUserToGroupUpdate")) $root.signalbackups.SelfInvitedOtherUserToGroupUpdate.encode(message.selfInvitedOtherUserToGroupUpdate, writer.uint32(/* id 13, wireType 2 =*/106).fork()).ldelim(); if (message.groupUnknownInviteeUpdate != null && Object.hasOwnProperty.call(message, "groupUnknownInviteeUpdate")) $root.signalbackups.GroupUnknownInviteeUpdate.encode(message.groupUnknownInviteeUpdate, writer.uint32(/* id 14, wireType 2 =*/114).fork()).ldelim(); if (message.groupInvitationAcceptedUpdate != null && Object.hasOwnProperty.call(message, "groupInvitationAcceptedUpdate")) $root.signalbackups.GroupInvitationAcceptedUpdate.encode(message.groupInvitationAcceptedUpdate, writer.uint32(/* id 15, wireType 2 =*/122).fork()).ldelim(); if (message.groupInvitationDeclinedUpdate != null && Object.hasOwnProperty.call(message, "groupInvitationDeclinedUpdate")) $root.signalbackups.GroupInvitationDeclinedUpdate.encode(message.groupInvitationDeclinedUpdate, writer.uint32(/* id 16, wireType 2 =*/130).fork()).ldelim(); if (message.groupMemberJoinedUpdate != null && Object.hasOwnProperty.call(message, "groupMemberJoinedUpdate")) $root.signalbackups.GroupMemberJoinedUpdate.encode(message.groupMemberJoinedUpdate, writer.uint32(/* id 17, wireType 2 =*/138).fork()).ldelim(); if (message.groupMemberAddedUpdate != null && Object.hasOwnProperty.call(message, "groupMemberAddedUpdate")) $root.signalbackups.GroupMemberAddedUpdate.encode(message.groupMemberAddedUpdate, writer.uint32(/* id 18, wireType 2 =*/146).fork()).ldelim(); if (message.groupSelfInvitationRevokedUpdate != null && Object.hasOwnProperty.call(message, "groupSelfInvitationRevokedUpdate")) $root.signalbackups.GroupSelfInvitationRevokedUpdate.encode(message.groupSelfInvitationRevokedUpdate, writer.uint32(/* id 19, wireType 2 =*/154).fork()).ldelim(); if (message.groupInvitationRevokedUpdate != null && Object.hasOwnProperty.call(message, "groupInvitationRevokedUpdate")) $root.signalbackups.GroupInvitationRevokedUpdate.encode(message.groupInvitationRevokedUpdate, writer.uint32(/* id 20, wireType 2 =*/162).fork()).ldelim(); if (message.groupJoinRequestUpdate != null && Object.hasOwnProperty.call(message, "groupJoinRequestUpdate")) $root.signalbackups.GroupJoinRequestUpdate.encode(message.groupJoinRequestUpdate, writer.uint32(/* id 21, wireType 2 =*/170).fork()).ldelim(); if (message.groupJoinRequestApprovalUpdate != null && Object.hasOwnProperty.call(message, "groupJoinRequestApprovalUpdate")) $root.signalbackups.GroupJoinRequestApprovalUpdate.encode(message.groupJoinRequestApprovalUpdate, writer.uint32(/* id 22, wireType 2 =*/178).fork()).ldelim(); if (message.groupJoinRequestCanceledUpdate != null && Object.hasOwnProperty.call(message, "groupJoinRequestCanceledUpdate")) $root.signalbackups.GroupJoinRequestCanceledUpdate.encode(message.groupJoinRequestCanceledUpdate, writer.uint32(/* id 23, wireType 2 =*/186).fork()).ldelim(); if (message.groupInviteLinkResetUpdate != null && Object.hasOwnProperty.call(message, "groupInviteLinkResetUpdate")) $root.signalbackups.GroupInviteLinkResetUpdate.encode(message.groupInviteLinkResetUpdate, writer.uint32(/* id 24, wireType 2 =*/194).fork()).ldelim(); if (message.groupInviteLinkEnabledUpdate != null && Object.hasOwnProperty.call(message, "groupInviteLinkEnabledUpdate")) $root.signalbackups.GroupInviteLinkEnabledUpdate.encode(message.groupInviteLinkEnabledUpdate, writer.uint32(/* id 25, wireType 2 =*/202).fork()).ldelim(); if (message.groupInviteLinkAdminApprovalUpdate != null && Object.hasOwnProperty.call(message, "groupInviteLinkAdminApprovalUpdate")) $root.signalbackups.GroupInviteLinkAdminApprovalUpdate.encode(message.groupInviteLinkAdminApprovalUpdate, writer.uint32(/* id 26, wireType 2 =*/210).fork()).ldelim(); if (message.groupInviteLinkDisabledUpdate != null && Object.hasOwnProperty.call(message, "groupInviteLinkDisabledUpdate")) $root.signalbackups.GroupInviteLinkDisabledUpdate.encode(message.groupInviteLinkDisabledUpdate, writer.uint32(/* id 27, wireType 2 =*/218).fork()).ldelim(); if (message.groupMemberJoinedByLinkUpdate != null && Object.hasOwnProperty.call(message, "groupMemberJoinedByLinkUpdate")) $root.signalbackups.GroupMemberJoinedByLinkUpdate.encode(message.groupMemberJoinedByLinkUpdate, writer.uint32(/* id 28, wireType 2 =*/226).fork()).ldelim(); if (message.groupV2MigrationUpdate != null && Object.hasOwnProperty.call(message, "groupV2MigrationUpdate")) $root.signalbackups.GroupV2MigrationUpdate.encode(message.groupV2MigrationUpdate, writer.uint32(/* id 29, wireType 2 =*/234).fork()).ldelim(); if (message.groupV2MigrationSelfInvitedUpdate != null && Object.hasOwnProperty.call(message, "groupV2MigrationSelfInvitedUpdate")) $root.signalbackups.GroupV2MigrationSelfInvitedUpdate.encode(message.groupV2MigrationSelfInvitedUpdate, writer.uint32(/* id 30, wireType 2 =*/242).fork()).ldelim(); if (message.groupV2MigrationInvitedMembersUpdate != null && Object.hasOwnProperty.call(message, "groupV2MigrationInvitedMembersUpdate")) $root.signalbackups.GroupV2MigrationInvitedMembersUpdate.encode(message.groupV2MigrationInvitedMembersUpdate, writer.uint32(/* id 31, wireType 2 =*/250).fork()).ldelim(); if (message.groupV2MigrationDroppedMembersUpdate != null && Object.hasOwnProperty.call(message, "groupV2MigrationDroppedMembersUpdate")) $root.signalbackups.GroupV2MigrationDroppedMembersUpdate.encode(message.groupV2MigrationDroppedMembersUpdate, writer.uint32(/* id 32, wireType 2 =*/258).fork()).ldelim(); if (message.groupSequenceOfRequestsAndCancelsUpdate != null && Object.hasOwnProperty.call(message, "groupSequenceOfRequestsAndCancelsUpdate")) $root.signalbackups.GroupSequenceOfRequestsAndCancelsUpdate.encode(message.groupSequenceOfRequestsAndCancelsUpdate, writer.uint32(/* id 33, wireType 2 =*/266).fork()).ldelim(); if (message.groupExpirationTimerUpdate != null && Object.hasOwnProperty.call(message, "groupExpirationTimerUpdate")) $root.signalbackups.GroupExpirationTimerUpdate.encode(message.groupExpirationTimerUpdate, writer.uint32(/* id 34, wireType 2 =*/274).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Update message, length delimited. Does not implicitly {@link signalbackups.GroupChangeChatUpdate.Update.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.GroupChangeChatUpdate.Update * @static * @param {signalbackups.GroupChangeChatUpdate.IUpdate} message Update message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Update.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an Update message from the specified reader or buffer. * @function decode * @memberof signalbackups.GroupChangeChatUpdate.Update * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.GroupChangeChatUpdate.Update} Update * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Update.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.GroupChangeChatUpdate.Update(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.genericGroupUpdate = $root.signalbackups.GenericGroupUpdate.decode(reader, reader.uint32()); break; } case 2: { message.groupCreationUpdate = $root.signalbackups.GroupCreationUpdate.decode(reader, reader.uint32()); break; } case 3: { message.groupNameUpdate = $root.signalbackups.GroupNameUpdate.decode(reader, reader.uint32()); break; } case 4: { message.groupAvatarUpdate = $root.signalbackups.GroupAvatarUpdate.decode(reader, reader.uint32()); break; } case 5: { message.groupDescriptionUpdate = $root.signalbackups.GroupDescriptionUpdate.decode(reader, reader.uint32()); break; } case 6: { message.groupMembershipAccessLevelChangeUpdate = $root.signalbackups.GroupMembershipAccessLevelChangeUpdate.decode(reader, reader.uint32()); break; } case 7: { message.groupAttributesAccessLevelChangeUpdate = $root.signalbackups.GroupAttributesAccessLevelChangeUpdate.decode(reader, reader.uint32()); break; } case 8: { message.groupAnnouncementOnlyChangeUpdate = $root.signalbackups.GroupAnnouncementOnlyChangeUpdate.decode(reader, reader.uint32()); break; } case 9: { message.groupAdminStatusUpdate = $root.signalbackups.GroupAdminStatusUpdate.decode(reader, reader.uint32()); break; } case 10: { message.groupMemberLeftUpdate = $root.signalbackups.GroupMemberLeftUpdate.decode(reader, reader.uint32()); break; } case 11: { message.groupMemberRemovedUpdate = $root.signalbackups.GroupMemberRemovedUpdate.decode(reader, reader.uint32()); break; } case 12: { message.selfInvitedToGroupUpdate = $root.signalbackups.SelfInvitedToGroupUpdate.decode(reader, reader.uint32()); break; } case 13: { message.selfInvitedOtherUserToGroupUpdate = $root.signalbackups.SelfInvitedOtherUserToGroupUpdate.decode(reader, reader.uint32()); break; } case 14: { message.groupUnknownInviteeUpdate = $root.signalbackups.GroupUnknownInviteeUpdate.decode(reader, reader.uint32()); break; } case 15: { message.groupInvitationAcceptedUpdate = $root.signalbackups.GroupInvitationAcceptedUpdate.decode(reader, reader.uint32()); break; } case 16: { message.groupInvitationDeclinedUpdate = $root.signalbackups.GroupInvitationDeclinedUpdate.decode(reader, reader.uint32()); break; } case 17: { message.groupMemberJoinedUpdate = $root.signalbackups.GroupMemberJoinedUpdate.decode(reader, reader.uint32()); break; } case 18: { message.groupMemberAddedUpdate = $root.signalbackups.GroupMemberAddedUpdate.decode(reader, reader.uint32()); break; } case 19: { message.groupSelfInvitationRevokedUpdate = $root.signalbackups.GroupSelfInvitationRevokedUpdate.decode(reader, reader.uint32()); break; } case 20: { message.groupInvitationRevokedUpdate = $root.signalbackups.GroupInvitationRevokedUpdate.decode(reader, reader.uint32()); break; } case 21: { message.groupJoinRequestUpdate = $root.signalbackups.GroupJoinRequestUpdate.decode(reader, reader.uint32()); break; } case 22: { message.groupJoinRequestApprovalUpdate = $root.signalbackups.GroupJoinRequestApprovalUpdate.decode(reader, reader.uint32()); break; } case 23: { message.groupJoinRequestCanceledUpdate = $root.signalbackups.GroupJoinRequestCanceledUpdate.decode(reader, reader.uint32()); break; } case 24: { message.groupInviteLinkResetUpdate = $root.signalbackups.GroupInviteLinkResetUpdate.decode(reader, reader.uint32()); break; } case 25: { message.groupInviteLinkEnabledUpdate = $root.signalbackups.GroupInviteLinkEnabledUpdate.decode(reader, reader.uint32()); break; } case 26: { message.groupInviteLinkAdminApprovalUpdate = $root.signalbackups.GroupInviteLinkAdminApprovalUpdate.decode(reader, reader.uint32()); break; } case 27: { message.groupInviteLinkDisabledUpdate = $root.signalbackups.GroupInviteLinkDisabledUpdate.decode(reader, reader.uint32()); break; } case 28: { message.groupMemberJoinedByLinkUpdate = $root.signalbackups.GroupMemberJoinedByLinkUpdate.decode(reader, reader.uint32()); break; } case 29: { message.groupV2MigrationUpdate = $root.signalbackups.GroupV2MigrationUpdate.decode(reader, reader.uint32()); break; } case 30: { message.groupV2MigrationSelfInvitedUpdate = $root.signalbackups.GroupV2MigrationSelfInvitedUpdate.decode(reader, reader.uint32()); break; } case 31: { message.groupV2MigrationInvitedMembersUpdate = $root.signalbackups.GroupV2MigrationInvitedMembersUpdate.decode(reader, reader.uint32()); break; } case 32: { message.groupV2MigrationDroppedMembersUpdate = $root.signalbackups.GroupV2MigrationDroppedMembersUpdate.decode(reader, reader.uint32()); break; } case 33: { message.groupSequenceOfRequestsAndCancelsUpdate = $root.signalbackups.GroupSequenceOfRequestsAndCancelsUpdate.decode(reader, reader.uint32()); break; } case 34: { message.groupExpirationTimerUpdate = $root.signalbackups.GroupExpirationTimerUpdate.decode(reader, reader.uint32()); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an Update message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.GroupChangeChatUpdate.Update * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.GroupChangeChatUpdate.Update} Update * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Update.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return Update; })(); return GroupChangeChatUpdate; })(); signalbackups.GenericGroupUpdate = (function() { /** * Properties of a GenericGroupUpdate. * @memberof signalbackups * @interface IGenericGroupUpdate * @property {Uint8Array|null} [updaterAci] GenericGroupUpdate updaterAci */ /** * Constructs a new GenericGroupUpdate. * @memberof signalbackups * @classdesc Represents a GenericGroupUpdate. * @implements IGenericGroupUpdate * @constructor * @param {signalbackups.IGenericGroupUpdate=} [properties] Properties to set */ function GenericGroupUpdate(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GenericGroupUpdate updaterAci. * @member {Uint8Array|null|undefined} updaterAci * @memberof signalbackups.GenericGroupUpdate * @instance */ GenericGroupUpdate.prototype.updaterAci = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * GenericGroupUpdate _updaterAci. * @member {"updaterAci"|undefined} _updaterAci * @memberof signalbackups.GenericGroupUpdate * @instance */ Object.defineProperty(GenericGroupUpdate.prototype, "_updaterAci", { get: $util.oneOfGetter($oneOfFields = ["updaterAci"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified GenericGroupUpdate message. Does not implicitly {@link signalbackups.GenericGroupUpdate.verify|verify} messages. * @function encode * @memberof signalbackups.GenericGroupUpdate * @static * @param {signalbackups.IGenericGroupUpdate} message GenericGroupUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GenericGroupUpdate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.GenericGroupUpdate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.GenericGroupUpdate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.updaterAci != null && Object.hasOwnProperty.call(message, "updaterAci")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.updaterAci); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GenericGroupUpdate message, length delimited. Does not implicitly {@link signalbackups.GenericGroupUpdate.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.GenericGroupUpdate * @static * @param {signalbackups.IGenericGroupUpdate} message GenericGroupUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GenericGroupUpdate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GenericGroupUpdate message from the specified reader or buffer. * @function decode * @memberof signalbackups.GenericGroupUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.GenericGroupUpdate} GenericGroupUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GenericGroupUpdate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.GenericGroupUpdate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.updaterAci = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GenericGroupUpdate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.GenericGroupUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.GenericGroupUpdate} GenericGroupUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GenericGroupUpdate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return GenericGroupUpdate; })(); signalbackups.GroupCreationUpdate = (function() { /** * Properties of a GroupCreationUpdate. * @memberof signalbackups * @interface IGroupCreationUpdate * @property {Uint8Array|null} [updaterAci] GroupCreationUpdate updaterAci */ /** * Constructs a new GroupCreationUpdate. * @memberof signalbackups * @classdesc Represents a GroupCreationUpdate. * @implements IGroupCreationUpdate * @constructor * @param {signalbackups.IGroupCreationUpdate=} [properties] Properties to set */ function GroupCreationUpdate(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GroupCreationUpdate updaterAci. * @member {Uint8Array|null|undefined} updaterAci * @memberof signalbackups.GroupCreationUpdate * @instance */ GroupCreationUpdate.prototype.updaterAci = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * GroupCreationUpdate _updaterAci. * @member {"updaterAci"|undefined} _updaterAci * @memberof signalbackups.GroupCreationUpdate * @instance */ Object.defineProperty(GroupCreationUpdate.prototype, "_updaterAci", { get: $util.oneOfGetter($oneOfFields = ["updaterAci"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified GroupCreationUpdate message. Does not implicitly {@link signalbackups.GroupCreationUpdate.verify|verify} messages. * @function encode * @memberof signalbackups.GroupCreationUpdate * @static * @param {signalbackups.IGroupCreationUpdate} message GroupCreationUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupCreationUpdate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.GroupCreationUpdate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.GroupCreationUpdate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.updaterAci != null && Object.hasOwnProperty.call(message, "updaterAci")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.updaterAci); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupCreationUpdate message, length delimited. Does not implicitly {@link signalbackups.GroupCreationUpdate.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.GroupCreationUpdate * @static * @param {signalbackups.IGroupCreationUpdate} message GroupCreationUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupCreationUpdate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupCreationUpdate message from the specified reader or buffer. * @function decode * @memberof signalbackups.GroupCreationUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.GroupCreationUpdate} GroupCreationUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupCreationUpdate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.GroupCreationUpdate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.updaterAci = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupCreationUpdate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.GroupCreationUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.GroupCreationUpdate} GroupCreationUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupCreationUpdate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return GroupCreationUpdate; })(); signalbackups.GroupNameUpdate = (function() { /** * Properties of a GroupNameUpdate. * @memberof signalbackups * @interface IGroupNameUpdate * @property {Uint8Array|null} [updaterAci] GroupNameUpdate updaterAci * @property {string|null} [newGroupName] GroupNameUpdate newGroupName */ /** * Constructs a new GroupNameUpdate. * @memberof signalbackups * @classdesc Represents a GroupNameUpdate. * @implements IGroupNameUpdate * @constructor * @param {signalbackups.IGroupNameUpdate=} [properties] Properties to set */ function GroupNameUpdate(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GroupNameUpdate updaterAci. * @member {Uint8Array|null|undefined} updaterAci * @memberof signalbackups.GroupNameUpdate * @instance */ GroupNameUpdate.prototype.updaterAci = null; /** * GroupNameUpdate newGroupName. * @member {string|null|undefined} newGroupName * @memberof signalbackups.GroupNameUpdate * @instance */ GroupNameUpdate.prototype.newGroupName = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * GroupNameUpdate _updaterAci. * @member {"updaterAci"|undefined} _updaterAci * @memberof signalbackups.GroupNameUpdate * @instance */ Object.defineProperty(GroupNameUpdate.prototype, "_updaterAci", { get: $util.oneOfGetter($oneOfFields = ["updaterAci"]), set: $util.oneOfSetter($oneOfFields) }); /** * GroupNameUpdate _newGroupName. * @member {"newGroupName"|undefined} _newGroupName * @memberof signalbackups.GroupNameUpdate * @instance */ Object.defineProperty(GroupNameUpdate.prototype, "_newGroupName", { get: $util.oneOfGetter($oneOfFields = ["newGroupName"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified GroupNameUpdate message. Does not implicitly {@link signalbackups.GroupNameUpdate.verify|verify} messages. * @function encode * @memberof signalbackups.GroupNameUpdate * @static * @param {signalbackups.IGroupNameUpdate} message GroupNameUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupNameUpdate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.GroupNameUpdate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.GroupNameUpdate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.updaterAci != null && Object.hasOwnProperty.call(message, "updaterAci")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.updaterAci); if (message.newGroupName != null && Object.hasOwnProperty.call(message, "newGroupName")) writer.uint32(/* id 2, wireType 2 =*/18).string(message.newGroupName); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupNameUpdate message, length delimited. Does not implicitly {@link signalbackups.GroupNameUpdate.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.GroupNameUpdate * @static * @param {signalbackups.IGroupNameUpdate} message GroupNameUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupNameUpdate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupNameUpdate message from the specified reader or buffer. * @function decode * @memberof signalbackups.GroupNameUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.GroupNameUpdate} GroupNameUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupNameUpdate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.GroupNameUpdate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.updaterAci = reader.bytes(); break; } case 2: { message.newGroupName = reader.string(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupNameUpdate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.GroupNameUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.GroupNameUpdate} GroupNameUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupNameUpdate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return GroupNameUpdate; })(); signalbackups.GroupAvatarUpdate = (function() { /** * Properties of a GroupAvatarUpdate. * @memberof signalbackups * @interface IGroupAvatarUpdate * @property {Uint8Array|null} [updaterAci] GroupAvatarUpdate updaterAci * @property {boolean|null} [wasRemoved] GroupAvatarUpdate wasRemoved */ /** * Constructs a new GroupAvatarUpdate. * @memberof signalbackups * @classdesc Represents a GroupAvatarUpdate. * @implements IGroupAvatarUpdate * @constructor * @param {signalbackups.IGroupAvatarUpdate=} [properties] Properties to set */ function GroupAvatarUpdate(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GroupAvatarUpdate updaterAci. * @member {Uint8Array|null|undefined} updaterAci * @memberof signalbackups.GroupAvatarUpdate * @instance */ GroupAvatarUpdate.prototype.updaterAci = null; /** * GroupAvatarUpdate wasRemoved. * @member {boolean} wasRemoved * @memberof signalbackups.GroupAvatarUpdate * @instance */ GroupAvatarUpdate.prototype.wasRemoved = false; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * GroupAvatarUpdate _updaterAci. * @member {"updaterAci"|undefined} _updaterAci * @memberof signalbackups.GroupAvatarUpdate * @instance */ Object.defineProperty(GroupAvatarUpdate.prototype, "_updaterAci", { get: $util.oneOfGetter($oneOfFields = ["updaterAci"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified GroupAvatarUpdate message. Does not implicitly {@link signalbackups.GroupAvatarUpdate.verify|verify} messages. * @function encode * @memberof signalbackups.GroupAvatarUpdate * @static * @param {signalbackups.IGroupAvatarUpdate} message GroupAvatarUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupAvatarUpdate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.GroupAvatarUpdate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.GroupAvatarUpdate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.updaterAci != null && Object.hasOwnProperty.call(message, "updaterAci")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.updaterAci); if (message.wasRemoved != null && Object.hasOwnProperty.call(message, "wasRemoved")) writer.uint32(/* id 2, wireType 0 =*/16).bool(message.wasRemoved); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupAvatarUpdate message, length delimited. Does not implicitly {@link signalbackups.GroupAvatarUpdate.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.GroupAvatarUpdate * @static * @param {signalbackups.IGroupAvatarUpdate} message GroupAvatarUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupAvatarUpdate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupAvatarUpdate message from the specified reader or buffer. * @function decode * @memberof signalbackups.GroupAvatarUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.GroupAvatarUpdate} GroupAvatarUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupAvatarUpdate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.GroupAvatarUpdate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.updaterAci = reader.bytes(); break; } case 2: { message.wasRemoved = reader.bool(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupAvatarUpdate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.GroupAvatarUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.GroupAvatarUpdate} GroupAvatarUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupAvatarUpdate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return GroupAvatarUpdate; })(); signalbackups.GroupDescriptionUpdate = (function() { /** * Properties of a GroupDescriptionUpdate. * @memberof signalbackups * @interface IGroupDescriptionUpdate * @property {Uint8Array|null} [updaterAci] GroupDescriptionUpdate updaterAci * @property {string|null} [newDescription] GroupDescriptionUpdate newDescription */ /** * Constructs a new GroupDescriptionUpdate. * @memberof signalbackups * @classdesc Represents a GroupDescriptionUpdate. * @implements IGroupDescriptionUpdate * @constructor * @param {signalbackups.IGroupDescriptionUpdate=} [properties] Properties to set */ function GroupDescriptionUpdate(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GroupDescriptionUpdate updaterAci. * @member {Uint8Array|null|undefined} updaterAci * @memberof signalbackups.GroupDescriptionUpdate * @instance */ GroupDescriptionUpdate.prototype.updaterAci = null; /** * GroupDescriptionUpdate newDescription. * @member {string|null|undefined} newDescription * @memberof signalbackups.GroupDescriptionUpdate * @instance */ GroupDescriptionUpdate.prototype.newDescription = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * GroupDescriptionUpdate _updaterAci. * @member {"updaterAci"|undefined} _updaterAci * @memberof signalbackups.GroupDescriptionUpdate * @instance */ Object.defineProperty(GroupDescriptionUpdate.prototype, "_updaterAci", { get: $util.oneOfGetter($oneOfFields = ["updaterAci"]), set: $util.oneOfSetter($oneOfFields) }); /** * GroupDescriptionUpdate _newDescription. * @member {"newDescription"|undefined} _newDescription * @memberof signalbackups.GroupDescriptionUpdate * @instance */ Object.defineProperty(GroupDescriptionUpdate.prototype, "_newDescription", { get: $util.oneOfGetter($oneOfFields = ["newDescription"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified GroupDescriptionUpdate message. Does not implicitly {@link signalbackups.GroupDescriptionUpdate.verify|verify} messages. * @function encode * @memberof signalbackups.GroupDescriptionUpdate * @static * @param {signalbackups.IGroupDescriptionUpdate} message GroupDescriptionUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupDescriptionUpdate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.GroupDescriptionUpdate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.GroupDescriptionUpdate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.updaterAci != null && Object.hasOwnProperty.call(message, "updaterAci")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.updaterAci); if (message.newDescription != null && Object.hasOwnProperty.call(message, "newDescription")) writer.uint32(/* id 2, wireType 2 =*/18).string(message.newDescription); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupDescriptionUpdate message, length delimited. Does not implicitly {@link signalbackups.GroupDescriptionUpdate.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.GroupDescriptionUpdate * @static * @param {signalbackups.IGroupDescriptionUpdate} message GroupDescriptionUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupDescriptionUpdate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupDescriptionUpdate message from the specified reader or buffer. * @function decode * @memberof signalbackups.GroupDescriptionUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.GroupDescriptionUpdate} GroupDescriptionUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupDescriptionUpdate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.GroupDescriptionUpdate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.updaterAci = reader.bytes(); break; } case 2: { message.newDescription = reader.string(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupDescriptionUpdate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.GroupDescriptionUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.GroupDescriptionUpdate} GroupDescriptionUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupDescriptionUpdate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return GroupDescriptionUpdate; })(); /** * GroupV2AccessLevel enum. * @name signalbackups.GroupV2AccessLevel * @enum {number} * @property {number} UNKNOWN=0 UNKNOWN value * @property {number} ANY=1 ANY value * @property {number} MEMBER=2 MEMBER value * @property {number} ADMINISTRATOR=3 ADMINISTRATOR value * @property {number} UNSATISFIABLE=4 UNSATISFIABLE value */ signalbackups.GroupV2AccessLevel = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "UNKNOWN"] = 0; values[valuesById[1] = "ANY"] = 1; values[valuesById[2] = "MEMBER"] = 2; values[valuesById[3] = "ADMINISTRATOR"] = 3; values[valuesById[4] = "UNSATISFIABLE"] = 4; return values; })(); signalbackups.GroupMembershipAccessLevelChangeUpdate = (function() { /** * Properties of a GroupMembershipAccessLevelChangeUpdate. * @memberof signalbackups * @interface IGroupMembershipAccessLevelChangeUpdate * @property {Uint8Array|null} [updaterAci] GroupMembershipAccessLevelChangeUpdate updaterAci * @property {signalbackups.GroupV2AccessLevel|null} [accessLevel] GroupMembershipAccessLevelChangeUpdate accessLevel */ /** * Constructs a new GroupMembershipAccessLevelChangeUpdate. * @memberof signalbackups * @classdesc Represents a GroupMembershipAccessLevelChangeUpdate. * @implements IGroupMembershipAccessLevelChangeUpdate * @constructor * @param {signalbackups.IGroupMembershipAccessLevelChangeUpdate=} [properties] Properties to set */ function GroupMembershipAccessLevelChangeUpdate(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GroupMembershipAccessLevelChangeUpdate updaterAci. * @member {Uint8Array|null|undefined} updaterAci * @memberof signalbackups.GroupMembershipAccessLevelChangeUpdate * @instance */ GroupMembershipAccessLevelChangeUpdate.prototype.updaterAci = null; /** * GroupMembershipAccessLevelChangeUpdate accessLevel. * @member {signalbackups.GroupV2AccessLevel} accessLevel * @memberof signalbackups.GroupMembershipAccessLevelChangeUpdate * @instance */ GroupMembershipAccessLevelChangeUpdate.prototype.accessLevel = 0; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * GroupMembershipAccessLevelChangeUpdate _updaterAci. * @member {"updaterAci"|undefined} _updaterAci * @memberof signalbackups.GroupMembershipAccessLevelChangeUpdate * @instance */ Object.defineProperty(GroupMembershipAccessLevelChangeUpdate.prototype, "_updaterAci", { get: $util.oneOfGetter($oneOfFields = ["updaterAci"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified GroupMembershipAccessLevelChangeUpdate message. Does not implicitly {@link signalbackups.GroupMembershipAccessLevelChangeUpdate.verify|verify} messages. * @function encode * @memberof signalbackups.GroupMembershipAccessLevelChangeUpdate * @static * @param {signalbackups.IGroupMembershipAccessLevelChangeUpdate} message GroupMembershipAccessLevelChangeUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupMembershipAccessLevelChangeUpdate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.GroupMembershipAccessLevelChangeUpdate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.GroupMembershipAccessLevelChangeUpdate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.updaterAci != null && Object.hasOwnProperty.call(message, "updaterAci")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.updaterAci); if (message.accessLevel != null && Object.hasOwnProperty.call(message, "accessLevel")) writer.uint32(/* id 2, wireType 0 =*/16).int32(message.accessLevel); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupMembershipAccessLevelChangeUpdate message, length delimited. Does not implicitly {@link signalbackups.GroupMembershipAccessLevelChangeUpdate.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.GroupMembershipAccessLevelChangeUpdate * @static * @param {signalbackups.IGroupMembershipAccessLevelChangeUpdate} message GroupMembershipAccessLevelChangeUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupMembershipAccessLevelChangeUpdate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupMembershipAccessLevelChangeUpdate message from the specified reader or buffer. * @function decode * @memberof signalbackups.GroupMembershipAccessLevelChangeUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.GroupMembershipAccessLevelChangeUpdate} GroupMembershipAccessLevelChangeUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupMembershipAccessLevelChangeUpdate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.GroupMembershipAccessLevelChangeUpdate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.updaterAci = reader.bytes(); break; } case 2: { message.accessLevel = reader.int32(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupMembershipAccessLevelChangeUpdate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.GroupMembershipAccessLevelChangeUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.GroupMembershipAccessLevelChangeUpdate} GroupMembershipAccessLevelChangeUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupMembershipAccessLevelChangeUpdate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return GroupMembershipAccessLevelChangeUpdate; })(); signalbackups.GroupAttributesAccessLevelChangeUpdate = (function() { /** * Properties of a GroupAttributesAccessLevelChangeUpdate. * @memberof signalbackups * @interface IGroupAttributesAccessLevelChangeUpdate * @property {Uint8Array|null} [updaterAci] GroupAttributesAccessLevelChangeUpdate updaterAci * @property {signalbackups.GroupV2AccessLevel|null} [accessLevel] GroupAttributesAccessLevelChangeUpdate accessLevel */ /** * Constructs a new GroupAttributesAccessLevelChangeUpdate. * @memberof signalbackups * @classdesc Represents a GroupAttributesAccessLevelChangeUpdate. * @implements IGroupAttributesAccessLevelChangeUpdate * @constructor * @param {signalbackups.IGroupAttributesAccessLevelChangeUpdate=} [properties] Properties to set */ function GroupAttributesAccessLevelChangeUpdate(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GroupAttributesAccessLevelChangeUpdate updaterAci. * @member {Uint8Array|null|undefined} updaterAci * @memberof signalbackups.GroupAttributesAccessLevelChangeUpdate * @instance */ GroupAttributesAccessLevelChangeUpdate.prototype.updaterAci = null; /** * GroupAttributesAccessLevelChangeUpdate accessLevel. * @member {signalbackups.GroupV2AccessLevel} accessLevel * @memberof signalbackups.GroupAttributesAccessLevelChangeUpdate * @instance */ GroupAttributesAccessLevelChangeUpdate.prototype.accessLevel = 0; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * GroupAttributesAccessLevelChangeUpdate _updaterAci. * @member {"updaterAci"|undefined} _updaterAci * @memberof signalbackups.GroupAttributesAccessLevelChangeUpdate * @instance */ Object.defineProperty(GroupAttributesAccessLevelChangeUpdate.prototype, "_updaterAci", { get: $util.oneOfGetter($oneOfFields = ["updaterAci"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified GroupAttributesAccessLevelChangeUpdate message. Does not implicitly {@link signalbackups.GroupAttributesAccessLevelChangeUpdate.verify|verify} messages. * @function encode * @memberof signalbackups.GroupAttributesAccessLevelChangeUpdate * @static * @param {signalbackups.IGroupAttributesAccessLevelChangeUpdate} message GroupAttributesAccessLevelChangeUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupAttributesAccessLevelChangeUpdate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.GroupAttributesAccessLevelChangeUpdate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.GroupAttributesAccessLevelChangeUpdate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.updaterAci != null && Object.hasOwnProperty.call(message, "updaterAci")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.updaterAci); if (message.accessLevel != null && Object.hasOwnProperty.call(message, "accessLevel")) writer.uint32(/* id 2, wireType 0 =*/16).int32(message.accessLevel); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupAttributesAccessLevelChangeUpdate message, length delimited. Does not implicitly {@link signalbackups.GroupAttributesAccessLevelChangeUpdate.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.GroupAttributesAccessLevelChangeUpdate * @static * @param {signalbackups.IGroupAttributesAccessLevelChangeUpdate} message GroupAttributesAccessLevelChangeUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupAttributesAccessLevelChangeUpdate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupAttributesAccessLevelChangeUpdate message from the specified reader or buffer. * @function decode * @memberof signalbackups.GroupAttributesAccessLevelChangeUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.GroupAttributesAccessLevelChangeUpdate} GroupAttributesAccessLevelChangeUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupAttributesAccessLevelChangeUpdate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.GroupAttributesAccessLevelChangeUpdate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.updaterAci = reader.bytes(); break; } case 2: { message.accessLevel = reader.int32(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupAttributesAccessLevelChangeUpdate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.GroupAttributesAccessLevelChangeUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.GroupAttributesAccessLevelChangeUpdate} GroupAttributesAccessLevelChangeUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupAttributesAccessLevelChangeUpdate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return GroupAttributesAccessLevelChangeUpdate; })(); signalbackups.GroupAnnouncementOnlyChangeUpdate = (function() { /** * Properties of a GroupAnnouncementOnlyChangeUpdate. * @memberof signalbackups * @interface IGroupAnnouncementOnlyChangeUpdate * @property {Uint8Array|null} [updaterAci] GroupAnnouncementOnlyChangeUpdate updaterAci * @property {boolean|null} [isAnnouncementOnly] GroupAnnouncementOnlyChangeUpdate isAnnouncementOnly */ /** * Constructs a new GroupAnnouncementOnlyChangeUpdate. * @memberof signalbackups * @classdesc Represents a GroupAnnouncementOnlyChangeUpdate. * @implements IGroupAnnouncementOnlyChangeUpdate * @constructor * @param {signalbackups.IGroupAnnouncementOnlyChangeUpdate=} [properties] Properties to set */ function GroupAnnouncementOnlyChangeUpdate(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GroupAnnouncementOnlyChangeUpdate updaterAci. * @member {Uint8Array|null|undefined} updaterAci * @memberof signalbackups.GroupAnnouncementOnlyChangeUpdate * @instance */ GroupAnnouncementOnlyChangeUpdate.prototype.updaterAci = null; /** * GroupAnnouncementOnlyChangeUpdate isAnnouncementOnly. * @member {boolean} isAnnouncementOnly * @memberof signalbackups.GroupAnnouncementOnlyChangeUpdate * @instance */ GroupAnnouncementOnlyChangeUpdate.prototype.isAnnouncementOnly = false; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * GroupAnnouncementOnlyChangeUpdate _updaterAci. * @member {"updaterAci"|undefined} _updaterAci * @memberof signalbackups.GroupAnnouncementOnlyChangeUpdate * @instance */ Object.defineProperty(GroupAnnouncementOnlyChangeUpdate.prototype, "_updaterAci", { get: $util.oneOfGetter($oneOfFields = ["updaterAci"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified GroupAnnouncementOnlyChangeUpdate message. Does not implicitly {@link signalbackups.GroupAnnouncementOnlyChangeUpdate.verify|verify} messages. * @function encode * @memberof signalbackups.GroupAnnouncementOnlyChangeUpdate * @static * @param {signalbackups.IGroupAnnouncementOnlyChangeUpdate} message GroupAnnouncementOnlyChangeUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupAnnouncementOnlyChangeUpdate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.GroupAnnouncementOnlyChangeUpdate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.GroupAnnouncementOnlyChangeUpdate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.updaterAci != null && Object.hasOwnProperty.call(message, "updaterAci")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.updaterAci); if (message.isAnnouncementOnly != null && Object.hasOwnProperty.call(message, "isAnnouncementOnly")) writer.uint32(/* id 2, wireType 0 =*/16).bool(message.isAnnouncementOnly); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupAnnouncementOnlyChangeUpdate message, length delimited. Does not implicitly {@link signalbackups.GroupAnnouncementOnlyChangeUpdate.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.GroupAnnouncementOnlyChangeUpdate * @static * @param {signalbackups.IGroupAnnouncementOnlyChangeUpdate} message GroupAnnouncementOnlyChangeUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupAnnouncementOnlyChangeUpdate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupAnnouncementOnlyChangeUpdate message from the specified reader or buffer. * @function decode * @memberof signalbackups.GroupAnnouncementOnlyChangeUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.GroupAnnouncementOnlyChangeUpdate} GroupAnnouncementOnlyChangeUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupAnnouncementOnlyChangeUpdate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.GroupAnnouncementOnlyChangeUpdate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.updaterAci = reader.bytes(); break; } case 2: { message.isAnnouncementOnly = reader.bool(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupAnnouncementOnlyChangeUpdate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.GroupAnnouncementOnlyChangeUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.GroupAnnouncementOnlyChangeUpdate} GroupAnnouncementOnlyChangeUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupAnnouncementOnlyChangeUpdate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return GroupAnnouncementOnlyChangeUpdate; })(); signalbackups.GroupAdminStatusUpdate = (function() { /** * Properties of a GroupAdminStatusUpdate. * @memberof signalbackups * @interface IGroupAdminStatusUpdate * @property {Uint8Array|null} [updaterAci] GroupAdminStatusUpdate updaterAci * @property {Uint8Array|null} [memberAci] GroupAdminStatusUpdate memberAci * @property {boolean|null} [wasAdminStatusGranted] GroupAdminStatusUpdate wasAdminStatusGranted */ /** * Constructs a new GroupAdminStatusUpdate. * @memberof signalbackups * @classdesc Represents a GroupAdminStatusUpdate. * @implements IGroupAdminStatusUpdate * @constructor * @param {signalbackups.IGroupAdminStatusUpdate=} [properties] Properties to set */ function GroupAdminStatusUpdate(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GroupAdminStatusUpdate updaterAci. * @member {Uint8Array|null|undefined} updaterAci * @memberof signalbackups.GroupAdminStatusUpdate * @instance */ GroupAdminStatusUpdate.prototype.updaterAci = null; /** * GroupAdminStatusUpdate memberAci. * @member {Uint8Array} memberAci * @memberof signalbackups.GroupAdminStatusUpdate * @instance */ GroupAdminStatusUpdate.prototype.memberAci = $util.newBuffer([]); /** * GroupAdminStatusUpdate wasAdminStatusGranted. * @member {boolean} wasAdminStatusGranted * @memberof signalbackups.GroupAdminStatusUpdate * @instance */ GroupAdminStatusUpdate.prototype.wasAdminStatusGranted = false; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * GroupAdminStatusUpdate _updaterAci. * @member {"updaterAci"|undefined} _updaterAci * @memberof signalbackups.GroupAdminStatusUpdate * @instance */ Object.defineProperty(GroupAdminStatusUpdate.prototype, "_updaterAci", { get: $util.oneOfGetter($oneOfFields = ["updaterAci"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified GroupAdminStatusUpdate message. Does not implicitly {@link signalbackups.GroupAdminStatusUpdate.verify|verify} messages. * @function encode * @memberof signalbackups.GroupAdminStatusUpdate * @static * @param {signalbackups.IGroupAdminStatusUpdate} message GroupAdminStatusUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupAdminStatusUpdate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.GroupAdminStatusUpdate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.GroupAdminStatusUpdate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.updaterAci != null && Object.hasOwnProperty.call(message, "updaterAci")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.updaterAci); if (message.memberAci != null && Object.hasOwnProperty.call(message, "memberAci")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.memberAci); if (message.wasAdminStatusGranted != null && Object.hasOwnProperty.call(message, "wasAdminStatusGranted")) writer.uint32(/* id 3, wireType 0 =*/24).bool(message.wasAdminStatusGranted); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupAdminStatusUpdate message, length delimited. Does not implicitly {@link signalbackups.GroupAdminStatusUpdate.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.GroupAdminStatusUpdate * @static * @param {signalbackups.IGroupAdminStatusUpdate} message GroupAdminStatusUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupAdminStatusUpdate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupAdminStatusUpdate message from the specified reader or buffer. * @function decode * @memberof signalbackups.GroupAdminStatusUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.GroupAdminStatusUpdate} GroupAdminStatusUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupAdminStatusUpdate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.GroupAdminStatusUpdate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.updaterAci = reader.bytes(); break; } case 2: { message.memberAci = reader.bytes(); break; } case 3: { message.wasAdminStatusGranted = reader.bool(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupAdminStatusUpdate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.GroupAdminStatusUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.GroupAdminStatusUpdate} GroupAdminStatusUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupAdminStatusUpdate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return GroupAdminStatusUpdate; })(); signalbackups.GroupMemberLeftUpdate = (function() { /** * Properties of a GroupMemberLeftUpdate. * @memberof signalbackups * @interface IGroupMemberLeftUpdate * @property {Uint8Array|null} [aci] GroupMemberLeftUpdate aci */ /** * Constructs a new GroupMemberLeftUpdate. * @memberof signalbackups * @classdesc Represents a GroupMemberLeftUpdate. * @implements IGroupMemberLeftUpdate * @constructor * @param {signalbackups.IGroupMemberLeftUpdate=} [properties] Properties to set */ function GroupMemberLeftUpdate(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GroupMemberLeftUpdate aci. * @member {Uint8Array} aci * @memberof signalbackups.GroupMemberLeftUpdate * @instance */ GroupMemberLeftUpdate.prototype.aci = $util.newBuffer([]); /** * Encodes the specified GroupMemberLeftUpdate message. Does not implicitly {@link signalbackups.GroupMemberLeftUpdate.verify|verify} messages. * @function encode * @memberof signalbackups.GroupMemberLeftUpdate * @static * @param {signalbackups.IGroupMemberLeftUpdate} message GroupMemberLeftUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupMemberLeftUpdate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.GroupMemberLeftUpdate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.GroupMemberLeftUpdate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.aci != null && Object.hasOwnProperty.call(message, "aci")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.aci); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupMemberLeftUpdate message, length delimited. Does not implicitly {@link signalbackups.GroupMemberLeftUpdate.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.GroupMemberLeftUpdate * @static * @param {signalbackups.IGroupMemberLeftUpdate} message GroupMemberLeftUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupMemberLeftUpdate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupMemberLeftUpdate message from the specified reader or buffer. * @function decode * @memberof signalbackups.GroupMemberLeftUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.GroupMemberLeftUpdate} GroupMemberLeftUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupMemberLeftUpdate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.GroupMemberLeftUpdate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.aci = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupMemberLeftUpdate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.GroupMemberLeftUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.GroupMemberLeftUpdate} GroupMemberLeftUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupMemberLeftUpdate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return GroupMemberLeftUpdate; })(); signalbackups.GroupMemberRemovedUpdate = (function() { /** * Properties of a GroupMemberRemovedUpdate. * @memberof signalbackups * @interface IGroupMemberRemovedUpdate * @property {Uint8Array|null} [removerAci] GroupMemberRemovedUpdate removerAci * @property {Uint8Array|null} [removedAci] GroupMemberRemovedUpdate removedAci */ /** * Constructs a new GroupMemberRemovedUpdate. * @memberof signalbackups * @classdesc Represents a GroupMemberRemovedUpdate. * @implements IGroupMemberRemovedUpdate * @constructor * @param {signalbackups.IGroupMemberRemovedUpdate=} [properties] Properties to set */ function GroupMemberRemovedUpdate(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GroupMemberRemovedUpdate removerAci. * @member {Uint8Array|null|undefined} removerAci * @memberof signalbackups.GroupMemberRemovedUpdate * @instance */ GroupMemberRemovedUpdate.prototype.removerAci = null; /** * GroupMemberRemovedUpdate removedAci. * @member {Uint8Array} removedAci * @memberof signalbackups.GroupMemberRemovedUpdate * @instance */ GroupMemberRemovedUpdate.prototype.removedAci = $util.newBuffer([]); // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * GroupMemberRemovedUpdate _removerAci. * @member {"removerAci"|undefined} _removerAci * @memberof signalbackups.GroupMemberRemovedUpdate * @instance */ Object.defineProperty(GroupMemberRemovedUpdate.prototype, "_removerAci", { get: $util.oneOfGetter($oneOfFields = ["removerAci"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified GroupMemberRemovedUpdate message. Does not implicitly {@link signalbackups.GroupMemberRemovedUpdate.verify|verify} messages. * @function encode * @memberof signalbackups.GroupMemberRemovedUpdate * @static * @param {signalbackups.IGroupMemberRemovedUpdate} message GroupMemberRemovedUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupMemberRemovedUpdate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.GroupMemberRemovedUpdate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.GroupMemberRemovedUpdate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.removerAci != null && Object.hasOwnProperty.call(message, "removerAci")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.removerAci); if (message.removedAci != null && Object.hasOwnProperty.call(message, "removedAci")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.removedAci); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupMemberRemovedUpdate message, length delimited. Does not implicitly {@link signalbackups.GroupMemberRemovedUpdate.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.GroupMemberRemovedUpdate * @static * @param {signalbackups.IGroupMemberRemovedUpdate} message GroupMemberRemovedUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupMemberRemovedUpdate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupMemberRemovedUpdate message from the specified reader or buffer. * @function decode * @memberof signalbackups.GroupMemberRemovedUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.GroupMemberRemovedUpdate} GroupMemberRemovedUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupMemberRemovedUpdate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.GroupMemberRemovedUpdate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.removerAci = reader.bytes(); break; } case 2: { message.removedAci = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupMemberRemovedUpdate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.GroupMemberRemovedUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.GroupMemberRemovedUpdate} GroupMemberRemovedUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupMemberRemovedUpdate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return GroupMemberRemovedUpdate; })(); signalbackups.SelfInvitedToGroupUpdate = (function() { /** * Properties of a SelfInvitedToGroupUpdate. * @memberof signalbackups * @interface ISelfInvitedToGroupUpdate * @property {Uint8Array|null} [inviterAci] SelfInvitedToGroupUpdate inviterAci */ /** * Constructs a new SelfInvitedToGroupUpdate. * @memberof signalbackups * @classdesc Represents a SelfInvitedToGroupUpdate. * @implements ISelfInvitedToGroupUpdate * @constructor * @param {signalbackups.ISelfInvitedToGroupUpdate=} [properties] Properties to set */ function SelfInvitedToGroupUpdate(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * SelfInvitedToGroupUpdate inviterAci. * @member {Uint8Array|null|undefined} inviterAci * @memberof signalbackups.SelfInvitedToGroupUpdate * @instance */ SelfInvitedToGroupUpdate.prototype.inviterAci = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * SelfInvitedToGroupUpdate _inviterAci. * @member {"inviterAci"|undefined} _inviterAci * @memberof signalbackups.SelfInvitedToGroupUpdate * @instance */ Object.defineProperty(SelfInvitedToGroupUpdate.prototype, "_inviterAci", { get: $util.oneOfGetter($oneOfFields = ["inviterAci"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified SelfInvitedToGroupUpdate message. Does not implicitly {@link signalbackups.SelfInvitedToGroupUpdate.verify|verify} messages. * @function encode * @memberof signalbackups.SelfInvitedToGroupUpdate * @static * @param {signalbackups.ISelfInvitedToGroupUpdate} message SelfInvitedToGroupUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ SelfInvitedToGroupUpdate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.SelfInvitedToGroupUpdate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.SelfInvitedToGroupUpdate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.inviterAci != null && Object.hasOwnProperty.call(message, "inviterAci")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.inviterAci); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified SelfInvitedToGroupUpdate message, length delimited. Does not implicitly {@link signalbackups.SelfInvitedToGroupUpdate.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.SelfInvitedToGroupUpdate * @static * @param {signalbackups.ISelfInvitedToGroupUpdate} message SelfInvitedToGroupUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ SelfInvitedToGroupUpdate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a SelfInvitedToGroupUpdate message from the specified reader or buffer. * @function decode * @memberof signalbackups.SelfInvitedToGroupUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.SelfInvitedToGroupUpdate} SelfInvitedToGroupUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ SelfInvitedToGroupUpdate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.SelfInvitedToGroupUpdate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.inviterAci = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a SelfInvitedToGroupUpdate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.SelfInvitedToGroupUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.SelfInvitedToGroupUpdate} SelfInvitedToGroupUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ SelfInvitedToGroupUpdate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return SelfInvitedToGroupUpdate; })(); signalbackups.SelfInvitedOtherUserToGroupUpdate = (function() { /** * Properties of a SelfInvitedOtherUserToGroupUpdate. * @memberof signalbackups * @interface ISelfInvitedOtherUserToGroupUpdate * @property {Uint8Array|null} [inviteeServiceId] SelfInvitedOtherUserToGroupUpdate inviteeServiceId */ /** * Constructs a new SelfInvitedOtherUserToGroupUpdate. * @memberof signalbackups * @classdesc Represents a SelfInvitedOtherUserToGroupUpdate. * @implements ISelfInvitedOtherUserToGroupUpdate * @constructor * @param {signalbackups.ISelfInvitedOtherUserToGroupUpdate=} [properties] Properties to set */ function SelfInvitedOtherUserToGroupUpdate(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * SelfInvitedOtherUserToGroupUpdate inviteeServiceId. * @member {Uint8Array} inviteeServiceId * @memberof signalbackups.SelfInvitedOtherUserToGroupUpdate * @instance */ SelfInvitedOtherUserToGroupUpdate.prototype.inviteeServiceId = $util.newBuffer([]); /** * Encodes the specified SelfInvitedOtherUserToGroupUpdate message. Does not implicitly {@link signalbackups.SelfInvitedOtherUserToGroupUpdate.verify|verify} messages. * @function encode * @memberof signalbackups.SelfInvitedOtherUserToGroupUpdate * @static * @param {signalbackups.ISelfInvitedOtherUserToGroupUpdate} message SelfInvitedOtherUserToGroupUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ SelfInvitedOtherUserToGroupUpdate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.SelfInvitedOtherUserToGroupUpdate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.SelfInvitedOtherUserToGroupUpdate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.inviteeServiceId != null && Object.hasOwnProperty.call(message, "inviteeServiceId")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.inviteeServiceId); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified SelfInvitedOtherUserToGroupUpdate message, length delimited. Does not implicitly {@link signalbackups.SelfInvitedOtherUserToGroupUpdate.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.SelfInvitedOtherUserToGroupUpdate * @static * @param {signalbackups.ISelfInvitedOtherUserToGroupUpdate} message SelfInvitedOtherUserToGroupUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ SelfInvitedOtherUserToGroupUpdate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a SelfInvitedOtherUserToGroupUpdate message from the specified reader or buffer. * @function decode * @memberof signalbackups.SelfInvitedOtherUserToGroupUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.SelfInvitedOtherUserToGroupUpdate} SelfInvitedOtherUserToGroupUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ SelfInvitedOtherUserToGroupUpdate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.SelfInvitedOtherUserToGroupUpdate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.inviteeServiceId = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a SelfInvitedOtherUserToGroupUpdate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.SelfInvitedOtherUserToGroupUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.SelfInvitedOtherUserToGroupUpdate} SelfInvitedOtherUserToGroupUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ SelfInvitedOtherUserToGroupUpdate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return SelfInvitedOtherUserToGroupUpdate; })(); signalbackups.GroupUnknownInviteeUpdate = (function() { /** * Properties of a GroupUnknownInviteeUpdate. * @memberof signalbackups * @interface IGroupUnknownInviteeUpdate * @property {Uint8Array|null} [inviterAci] GroupUnknownInviteeUpdate inviterAci * @property {number|null} [inviteeCount] GroupUnknownInviteeUpdate inviteeCount */ /** * Constructs a new GroupUnknownInviteeUpdate. * @memberof signalbackups * @classdesc Represents a GroupUnknownInviteeUpdate. * @implements IGroupUnknownInviteeUpdate * @constructor * @param {signalbackups.IGroupUnknownInviteeUpdate=} [properties] Properties to set */ function GroupUnknownInviteeUpdate(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GroupUnknownInviteeUpdate inviterAci. * @member {Uint8Array|null|undefined} inviterAci * @memberof signalbackups.GroupUnknownInviteeUpdate * @instance */ GroupUnknownInviteeUpdate.prototype.inviterAci = null; /** * GroupUnknownInviteeUpdate inviteeCount. * @member {number} inviteeCount * @memberof signalbackups.GroupUnknownInviteeUpdate * @instance */ GroupUnknownInviteeUpdate.prototype.inviteeCount = 0; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * GroupUnknownInviteeUpdate _inviterAci. * @member {"inviterAci"|undefined} _inviterAci * @memberof signalbackups.GroupUnknownInviteeUpdate * @instance */ Object.defineProperty(GroupUnknownInviteeUpdate.prototype, "_inviterAci", { get: $util.oneOfGetter($oneOfFields = ["inviterAci"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified GroupUnknownInviteeUpdate message. Does not implicitly {@link signalbackups.GroupUnknownInviteeUpdate.verify|verify} messages. * @function encode * @memberof signalbackups.GroupUnknownInviteeUpdate * @static * @param {signalbackups.IGroupUnknownInviteeUpdate} message GroupUnknownInviteeUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupUnknownInviteeUpdate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.GroupUnknownInviteeUpdate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.GroupUnknownInviteeUpdate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.inviterAci != null && Object.hasOwnProperty.call(message, "inviterAci")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.inviterAci); if (message.inviteeCount != null && Object.hasOwnProperty.call(message, "inviteeCount")) writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.inviteeCount); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupUnknownInviteeUpdate message, length delimited. Does not implicitly {@link signalbackups.GroupUnknownInviteeUpdate.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.GroupUnknownInviteeUpdate * @static * @param {signalbackups.IGroupUnknownInviteeUpdate} message GroupUnknownInviteeUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupUnknownInviteeUpdate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupUnknownInviteeUpdate message from the specified reader or buffer. * @function decode * @memberof signalbackups.GroupUnknownInviteeUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.GroupUnknownInviteeUpdate} GroupUnknownInviteeUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupUnknownInviteeUpdate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.GroupUnknownInviteeUpdate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.inviterAci = reader.bytes(); break; } case 2: { message.inviteeCount = reader.uint32(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupUnknownInviteeUpdate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.GroupUnknownInviteeUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.GroupUnknownInviteeUpdate} GroupUnknownInviteeUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupUnknownInviteeUpdate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return GroupUnknownInviteeUpdate; })(); signalbackups.GroupInvitationAcceptedUpdate = (function() { /** * Properties of a GroupInvitationAcceptedUpdate. * @memberof signalbackups * @interface IGroupInvitationAcceptedUpdate * @property {Uint8Array|null} [inviterAci] GroupInvitationAcceptedUpdate inviterAci * @property {Uint8Array|null} [newMemberAci] GroupInvitationAcceptedUpdate newMemberAci */ /** * Constructs a new GroupInvitationAcceptedUpdate. * @memberof signalbackups * @classdesc Represents a GroupInvitationAcceptedUpdate. * @implements IGroupInvitationAcceptedUpdate * @constructor * @param {signalbackups.IGroupInvitationAcceptedUpdate=} [properties] Properties to set */ function GroupInvitationAcceptedUpdate(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GroupInvitationAcceptedUpdate inviterAci. * @member {Uint8Array|null|undefined} inviterAci * @memberof signalbackups.GroupInvitationAcceptedUpdate * @instance */ GroupInvitationAcceptedUpdate.prototype.inviterAci = null; /** * GroupInvitationAcceptedUpdate newMemberAci. * @member {Uint8Array} newMemberAci * @memberof signalbackups.GroupInvitationAcceptedUpdate * @instance */ GroupInvitationAcceptedUpdate.prototype.newMemberAci = $util.newBuffer([]); // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * GroupInvitationAcceptedUpdate _inviterAci. * @member {"inviterAci"|undefined} _inviterAci * @memberof signalbackups.GroupInvitationAcceptedUpdate * @instance */ Object.defineProperty(GroupInvitationAcceptedUpdate.prototype, "_inviterAci", { get: $util.oneOfGetter($oneOfFields = ["inviterAci"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified GroupInvitationAcceptedUpdate message. Does not implicitly {@link signalbackups.GroupInvitationAcceptedUpdate.verify|verify} messages. * @function encode * @memberof signalbackups.GroupInvitationAcceptedUpdate * @static * @param {signalbackups.IGroupInvitationAcceptedUpdate} message GroupInvitationAcceptedUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupInvitationAcceptedUpdate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.GroupInvitationAcceptedUpdate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.GroupInvitationAcceptedUpdate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.inviterAci != null && Object.hasOwnProperty.call(message, "inviterAci")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.inviterAci); if (message.newMemberAci != null && Object.hasOwnProperty.call(message, "newMemberAci")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.newMemberAci); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupInvitationAcceptedUpdate message, length delimited. Does not implicitly {@link signalbackups.GroupInvitationAcceptedUpdate.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.GroupInvitationAcceptedUpdate * @static * @param {signalbackups.IGroupInvitationAcceptedUpdate} message GroupInvitationAcceptedUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupInvitationAcceptedUpdate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupInvitationAcceptedUpdate message from the specified reader or buffer. * @function decode * @memberof signalbackups.GroupInvitationAcceptedUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.GroupInvitationAcceptedUpdate} GroupInvitationAcceptedUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupInvitationAcceptedUpdate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.GroupInvitationAcceptedUpdate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.inviterAci = reader.bytes(); break; } case 2: { message.newMemberAci = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupInvitationAcceptedUpdate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.GroupInvitationAcceptedUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.GroupInvitationAcceptedUpdate} GroupInvitationAcceptedUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupInvitationAcceptedUpdate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return GroupInvitationAcceptedUpdate; })(); signalbackups.GroupInvitationDeclinedUpdate = (function() { /** * Properties of a GroupInvitationDeclinedUpdate. * @memberof signalbackups * @interface IGroupInvitationDeclinedUpdate * @property {Uint8Array|null} [inviterAci] GroupInvitationDeclinedUpdate inviterAci * @property {Uint8Array|null} [inviteeAci] GroupInvitationDeclinedUpdate inviteeAci */ /** * Constructs a new GroupInvitationDeclinedUpdate. * @memberof signalbackups * @classdesc Represents a GroupInvitationDeclinedUpdate. * @implements IGroupInvitationDeclinedUpdate * @constructor * @param {signalbackups.IGroupInvitationDeclinedUpdate=} [properties] Properties to set */ function GroupInvitationDeclinedUpdate(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GroupInvitationDeclinedUpdate inviterAci. * @member {Uint8Array|null|undefined} inviterAci * @memberof signalbackups.GroupInvitationDeclinedUpdate * @instance */ GroupInvitationDeclinedUpdate.prototype.inviterAci = null; /** * GroupInvitationDeclinedUpdate inviteeAci. * @member {Uint8Array|null|undefined} inviteeAci * @memberof signalbackups.GroupInvitationDeclinedUpdate * @instance */ GroupInvitationDeclinedUpdate.prototype.inviteeAci = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * GroupInvitationDeclinedUpdate _inviterAci. * @member {"inviterAci"|undefined} _inviterAci * @memberof signalbackups.GroupInvitationDeclinedUpdate * @instance */ Object.defineProperty(GroupInvitationDeclinedUpdate.prototype, "_inviterAci", { get: $util.oneOfGetter($oneOfFields = ["inviterAci"]), set: $util.oneOfSetter($oneOfFields) }); /** * GroupInvitationDeclinedUpdate _inviteeAci. * @member {"inviteeAci"|undefined} _inviteeAci * @memberof signalbackups.GroupInvitationDeclinedUpdate * @instance */ Object.defineProperty(GroupInvitationDeclinedUpdate.prototype, "_inviteeAci", { get: $util.oneOfGetter($oneOfFields = ["inviteeAci"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified GroupInvitationDeclinedUpdate message. Does not implicitly {@link signalbackups.GroupInvitationDeclinedUpdate.verify|verify} messages. * @function encode * @memberof signalbackups.GroupInvitationDeclinedUpdate * @static * @param {signalbackups.IGroupInvitationDeclinedUpdate} message GroupInvitationDeclinedUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupInvitationDeclinedUpdate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.GroupInvitationDeclinedUpdate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.GroupInvitationDeclinedUpdate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.inviterAci != null && Object.hasOwnProperty.call(message, "inviterAci")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.inviterAci); if (message.inviteeAci != null && Object.hasOwnProperty.call(message, "inviteeAci")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.inviteeAci); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupInvitationDeclinedUpdate message, length delimited. Does not implicitly {@link signalbackups.GroupInvitationDeclinedUpdate.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.GroupInvitationDeclinedUpdate * @static * @param {signalbackups.IGroupInvitationDeclinedUpdate} message GroupInvitationDeclinedUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupInvitationDeclinedUpdate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupInvitationDeclinedUpdate message from the specified reader or buffer. * @function decode * @memberof signalbackups.GroupInvitationDeclinedUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.GroupInvitationDeclinedUpdate} GroupInvitationDeclinedUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupInvitationDeclinedUpdate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.GroupInvitationDeclinedUpdate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.inviterAci = reader.bytes(); break; } case 2: { message.inviteeAci = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupInvitationDeclinedUpdate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.GroupInvitationDeclinedUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.GroupInvitationDeclinedUpdate} GroupInvitationDeclinedUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupInvitationDeclinedUpdate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return GroupInvitationDeclinedUpdate; })(); signalbackups.GroupMemberJoinedUpdate = (function() { /** * Properties of a GroupMemberJoinedUpdate. * @memberof signalbackups * @interface IGroupMemberJoinedUpdate * @property {Uint8Array|null} [newMemberAci] GroupMemberJoinedUpdate newMemberAci */ /** * Constructs a new GroupMemberJoinedUpdate. * @memberof signalbackups * @classdesc Represents a GroupMemberJoinedUpdate. * @implements IGroupMemberJoinedUpdate * @constructor * @param {signalbackups.IGroupMemberJoinedUpdate=} [properties] Properties to set */ function GroupMemberJoinedUpdate(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GroupMemberJoinedUpdate newMemberAci. * @member {Uint8Array} newMemberAci * @memberof signalbackups.GroupMemberJoinedUpdate * @instance */ GroupMemberJoinedUpdate.prototype.newMemberAci = $util.newBuffer([]); /** * Encodes the specified GroupMemberJoinedUpdate message. Does not implicitly {@link signalbackups.GroupMemberJoinedUpdate.verify|verify} messages. * @function encode * @memberof signalbackups.GroupMemberJoinedUpdate * @static * @param {signalbackups.IGroupMemberJoinedUpdate} message GroupMemberJoinedUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupMemberJoinedUpdate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.GroupMemberJoinedUpdate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.GroupMemberJoinedUpdate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.newMemberAci != null && Object.hasOwnProperty.call(message, "newMemberAci")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.newMemberAci); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupMemberJoinedUpdate message, length delimited. Does not implicitly {@link signalbackups.GroupMemberJoinedUpdate.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.GroupMemberJoinedUpdate * @static * @param {signalbackups.IGroupMemberJoinedUpdate} message GroupMemberJoinedUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupMemberJoinedUpdate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupMemberJoinedUpdate message from the specified reader or buffer. * @function decode * @memberof signalbackups.GroupMemberJoinedUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.GroupMemberJoinedUpdate} GroupMemberJoinedUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupMemberJoinedUpdate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.GroupMemberJoinedUpdate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.newMemberAci = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupMemberJoinedUpdate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.GroupMemberJoinedUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.GroupMemberJoinedUpdate} GroupMemberJoinedUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupMemberJoinedUpdate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return GroupMemberJoinedUpdate; })(); signalbackups.GroupMemberAddedUpdate = (function() { /** * Properties of a GroupMemberAddedUpdate. * @memberof signalbackups * @interface IGroupMemberAddedUpdate * @property {Uint8Array|null} [updaterAci] GroupMemberAddedUpdate updaterAci * @property {Uint8Array|null} [newMemberAci] GroupMemberAddedUpdate newMemberAci * @property {boolean|null} [hadOpenInvitation] GroupMemberAddedUpdate hadOpenInvitation * @property {Uint8Array|null} [inviterAci] GroupMemberAddedUpdate inviterAci */ /** * Constructs a new GroupMemberAddedUpdate. * @memberof signalbackups * @classdesc Represents a GroupMemberAddedUpdate. * @implements IGroupMemberAddedUpdate * @constructor * @param {signalbackups.IGroupMemberAddedUpdate=} [properties] Properties to set */ function GroupMemberAddedUpdate(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GroupMemberAddedUpdate updaterAci. * @member {Uint8Array|null|undefined} updaterAci * @memberof signalbackups.GroupMemberAddedUpdate * @instance */ GroupMemberAddedUpdate.prototype.updaterAci = null; /** * GroupMemberAddedUpdate newMemberAci. * @member {Uint8Array} newMemberAci * @memberof signalbackups.GroupMemberAddedUpdate * @instance */ GroupMemberAddedUpdate.prototype.newMemberAci = $util.newBuffer([]); /** * GroupMemberAddedUpdate hadOpenInvitation. * @member {boolean} hadOpenInvitation * @memberof signalbackups.GroupMemberAddedUpdate * @instance */ GroupMemberAddedUpdate.prototype.hadOpenInvitation = false; /** * GroupMemberAddedUpdate inviterAci. * @member {Uint8Array|null|undefined} inviterAci * @memberof signalbackups.GroupMemberAddedUpdate * @instance */ GroupMemberAddedUpdate.prototype.inviterAci = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * GroupMemberAddedUpdate _updaterAci. * @member {"updaterAci"|undefined} _updaterAci * @memberof signalbackups.GroupMemberAddedUpdate * @instance */ Object.defineProperty(GroupMemberAddedUpdate.prototype, "_updaterAci", { get: $util.oneOfGetter($oneOfFields = ["updaterAci"]), set: $util.oneOfSetter($oneOfFields) }); /** * GroupMemberAddedUpdate _inviterAci. * @member {"inviterAci"|undefined} _inviterAci * @memberof signalbackups.GroupMemberAddedUpdate * @instance */ Object.defineProperty(GroupMemberAddedUpdate.prototype, "_inviterAci", { get: $util.oneOfGetter($oneOfFields = ["inviterAci"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified GroupMemberAddedUpdate message. Does not implicitly {@link signalbackups.GroupMemberAddedUpdate.verify|verify} messages. * @function encode * @memberof signalbackups.GroupMemberAddedUpdate * @static * @param {signalbackups.IGroupMemberAddedUpdate} message GroupMemberAddedUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupMemberAddedUpdate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.GroupMemberAddedUpdate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.GroupMemberAddedUpdate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.updaterAci != null && Object.hasOwnProperty.call(message, "updaterAci")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.updaterAci); if (message.newMemberAci != null && Object.hasOwnProperty.call(message, "newMemberAci")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.newMemberAci); if (message.hadOpenInvitation != null && Object.hasOwnProperty.call(message, "hadOpenInvitation")) writer.uint32(/* id 3, wireType 0 =*/24).bool(message.hadOpenInvitation); if (message.inviterAci != null && Object.hasOwnProperty.call(message, "inviterAci")) writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.inviterAci); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupMemberAddedUpdate message, length delimited. Does not implicitly {@link signalbackups.GroupMemberAddedUpdate.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.GroupMemberAddedUpdate * @static * @param {signalbackups.IGroupMemberAddedUpdate} message GroupMemberAddedUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupMemberAddedUpdate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupMemberAddedUpdate message from the specified reader or buffer. * @function decode * @memberof signalbackups.GroupMemberAddedUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.GroupMemberAddedUpdate} GroupMemberAddedUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupMemberAddedUpdate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.GroupMemberAddedUpdate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.updaterAci = reader.bytes(); break; } case 2: { message.newMemberAci = reader.bytes(); break; } case 3: { message.hadOpenInvitation = reader.bool(); break; } case 4: { message.inviterAci = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupMemberAddedUpdate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.GroupMemberAddedUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.GroupMemberAddedUpdate} GroupMemberAddedUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupMemberAddedUpdate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return GroupMemberAddedUpdate; })(); signalbackups.GroupSelfInvitationRevokedUpdate = (function() { /** * Properties of a GroupSelfInvitationRevokedUpdate. * @memberof signalbackups * @interface IGroupSelfInvitationRevokedUpdate * @property {Uint8Array|null} [revokerAci] GroupSelfInvitationRevokedUpdate revokerAci */ /** * Constructs a new GroupSelfInvitationRevokedUpdate. * @memberof signalbackups * @classdesc Represents a GroupSelfInvitationRevokedUpdate. * @implements IGroupSelfInvitationRevokedUpdate * @constructor * @param {signalbackups.IGroupSelfInvitationRevokedUpdate=} [properties] Properties to set */ function GroupSelfInvitationRevokedUpdate(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GroupSelfInvitationRevokedUpdate revokerAci. * @member {Uint8Array|null|undefined} revokerAci * @memberof signalbackups.GroupSelfInvitationRevokedUpdate * @instance */ GroupSelfInvitationRevokedUpdate.prototype.revokerAci = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * GroupSelfInvitationRevokedUpdate _revokerAci. * @member {"revokerAci"|undefined} _revokerAci * @memberof signalbackups.GroupSelfInvitationRevokedUpdate * @instance */ Object.defineProperty(GroupSelfInvitationRevokedUpdate.prototype, "_revokerAci", { get: $util.oneOfGetter($oneOfFields = ["revokerAci"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified GroupSelfInvitationRevokedUpdate message. Does not implicitly {@link signalbackups.GroupSelfInvitationRevokedUpdate.verify|verify} messages. * @function encode * @memberof signalbackups.GroupSelfInvitationRevokedUpdate * @static * @param {signalbackups.IGroupSelfInvitationRevokedUpdate} message GroupSelfInvitationRevokedUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupSelfInvitationRevokedUpdate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.GroupSelfInvitationRevokedUpdate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.GroupSelfInvitationRevokedUpdate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.revokerAci != null && Object.hasOwnProperty.call(message, "revokerAci")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.revokerAci); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupSelfInvitationRevokedUpdate message, length delimited. Does not implicitly {@link signalbackups.GroupSelfInvitationRevokedUpdate.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.GroupSelfInvitationRevokedUpdate * @static * @param {signalbackups.IGroupSelfInvitationRevokedUpdate} message GroupSelfInvitationRevokedUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupSelfInvitationRevokedUpdate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupSelfInvitationRevokedUpdate message from the specified reader or buffer. * @function decode * @memberof signalbackups.GroupSelfInvitationRevokedUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.GroupSelfInvitationRevokedUpdate} GroupSelfInvitationRevokedUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupSelfInvitationRevokedUpdate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.GroupSelfInvitationRevokedUpdate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.revokerAci = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupSelfInvitationRevokedUpdate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.GroupSelfInvitationRevokedUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.GroupSelfInvitationRevokedUpdate} GroupSelfInvitationRevokedUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupSelfInvitationRevokedUpdate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return GroupSelfInvitationRevokedUpdate; })(); signalbackups.GroupInvitationRevokedUpdate = (function() { /** * Properties of a GroupInvitationRevokedUpdate. * @memberof signalbackups * @interface IGroupInvitationRevokedUpdate * @property {Uint8Array|null} [updaterAci] GroupInvitationRevokedUpdate updaterAci * @property {Array.|null} [invitees] GroupInvitationRevokedUpdate invitees */ /** * Constructs a new GroupInvitationRevokedUpdate. * @memberof signalbackups * @classdesc Represents a GroupInvitationRevokedUpdate. * @implements IGroupInvitationRevokedUpdate * @constructor * @param {signalbackups.IGroupInvitationRevokedUpdate=} [properties] Properties to set */ function GroupInvitationRevokedUpdate(properties) { this.invitees = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GroupInvitationRevokedUpdate updaterAci. * @member {Uint8Array|null|undefined} updaterAci * @memberof signalbackups.GroupInvitationRevokedUpdate * @instance */ GroupInvitationRevokedUpdate.prototype.updaterAci = null; /** * GroupInvitationRevokedUpdate invitees. * @member {Array.} invitees * @memberof signalbackups.GroupInvitationRevokedUpdate * @instance */ GroupInvitationRevokedUpdate.prototype.invitees = $util.emptyArray; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * GroupInvitationRevokedUpdate _updaterAci. * @member {"updaterAci"|undefined} _updaterAci * @memberof signalbackups.GroupInvitationRevokedUpdate * @instance */ Object.defineProperty(GroupInvitationRevokedUpdate.prototype, "_updaterAci", { get: $util.oneOfGetter($oneOfFields = ["updaterAci"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified GroupInvitationRevokedUpdate message. Does not implicitly {@link signalbackups.GroupInvitationRevokedUpdate.verify|verify} messages. * @function encode * @memberof signalbackups.GroupInvitationRevokedUpdate * @static * @param {signalbackups.IGroupInvitationRevokedUpdate} message GroupInvitationRevokedUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupInvitationRevokedUpdate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.GroupInvitationRevokedUpdate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.GroupInvitationRevokedUpdate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.updaterAci != null && Object.hasOwnProperty.call(message, "updaterAci")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.updaterAci); if (message.invitees != null && message.invitees.length) for (var i = 0; i < message.invitees.length; ++i) $root.signalbackups.GroupInvitationRevokedUpdate.Invitee.encode(message.invitees[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupInvitationRevokedUpdate message, length delimited. Does not implicitly {@link signalbackups.GroupInvitationRevokedUpdate.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.GroupInvitationRevokedUpdate * @static * @param {signalbackups.IGroupInvitationRevokedUpdate} message GroupInvitationRevokedUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupInvitationRevokedUpdate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupInvitationRevokedUpdate message from the specified reader or buffer. * @function decode * @memberof signalbackups.GroupInvitationRevokedUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.GroupInvitationRevokedUpdate} GroupInvitationRevokedUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupInvitationRevokedUpdate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.GroupInvitationRevokedUpdate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.updaterAci = reader.bytes(); break; } case 2: { if (!(message.invitees && message.invitees.length)) message.invitees = []; message.invitees.push($root.signalbackups.GroupInvitationRevokedUpdate.Invitee.decode(reader, reader.uint32())); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupInvitationRevokedUpdate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.GroupInvitationRevokedUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.GroupInvitationRevokedUpdate} GroupInvitationRevokedUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupInvitationRevokedUpdate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; GroupInvitationRevokedUpdate.Invitee = (function() { /** * Properties of an Invitee. * @memberof signalbackups.GroupInvitationRevokedUpdate * @interface IInvitee * @property {Uint8Array|null} [inviterAci] Invitee inviterAci * @property {Uint8Array|null} [inviteeAci] Invitee inviteeAci * @property {Uint8Array|null} [inviteePni] Invitee inviteePni */ /** * Constructs a new Invitee. * @memberof signalbackups.GroupInvitationRevokedUpdate * @classdesc Represents an Invitee. * @implements IInvitee * @constructor * @param {signalbackups.GroupInvitationRevokedUpdate.IInvitee=} [properties] Properties to set */ function Invitee(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Invitee inviterAci. * @member {Uint8Array|null|undefined} inviterAci * @memberof signalbackups.GroupInvitationRevokedUpdate.Invitee * @instance */ Invitee.prototype.inviterAci = null; /** * Invitee inviteeAci. * @member {Uint8Array|null|undefined} inviteeAci * @memberof signalbackups.GroupInvitationRevokedUpdate.Invitee * @instance */ Invitee.prototype.inviteeAci = null; /** * Invitee inviteePni. * @member {Uint8Array|null|undefined} inviteePni * @memberof signalbackups.GroupInvitationRevokedUpdate.Invitee * @instance */ Invitee.prototype.inviteePni = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * Invitee _inviterAci. * @member {"inviterAci"|undefined} _inviterAci * @memberof signalbackups.GroupInvitationRevokedUpdate.Invitee * @instance */ Object.defineProperty(Invitee.prototype, "_inviterAci", { get: $util.oneOfGetter($oneOfFields = ["inviterAci"]), set: $util.oneOfSetter($oneOfFields) }); /** * Invitee _inviteeAci. * @member {"inviteeAci"|undefined} _inviteeAci * @memberof signalbackups.GroupInvitationRevokedUpdate.Invitee * @instance */ Object.defineProperty(Invitee.prototype, "_inviteeAci", { get: $util.oneOfGetter($oneOfFields = ["inviteeAci"]), set: $util.oneOfSetter($oneOfFields) }); /** * Invitee _inviteePni. * @member {"inviteePni"|undefined} _inviteePni * @memberof signalbackups.GroupInvitationRevokedUpdate.Invitee * @instance */ Object.defineProperty(Invitee.prototype, "_inviteePni", { get: $util.oneOfGetter($oneOfFields = ["inviteePni"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified Invitee message. Does not implicitly {@link signalbackups.GroupInvitationRevokedUpdate.Invitee.verify|verify} messages. * @function encode * @memberof signalbackups.GroupInvitationRevokedUpdate.Invitee * @static * @param {signalbackups.GroupInvitationRevokedUpdate.IInvitee} message Invitee message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Invitee.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.GroupInvitationRevokedUpdate.Invitee.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.GroupInvitationRevokedUpdate.Invitee.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.inviterAci != null && Object.hasOwnProperty.call(message, "inviterAci")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.inviterAci); if (message.inviteeAci != null && Object.hasOwnProperty.call(message, "inviteeAci")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.inviteeAci); if (message.inviteePni != null && Object.hasOwnProperty.call(message, "inviteePni")) writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.inviteePni); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Invitee message, length delimited. Does not implicitly {@link signalbackups.GroupInvitationRevokedUpdate.Invitee.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.GroupInvitationRevokedUpdate.Invitee * @static * @param {signalbackups.GroupInvitationRevokedUpdate.IInvitee} message Invitee message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Invitee.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an Invitee message from the specified reader or buffer. * @function decode * @memberof signalbackups.GroupInvitationRevokedUpdate.Invitee * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.GroupInvitationRevokedUpdate.Invitee} Invitee * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Invitee.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.GroupInvitationRevokedUpdate.Invitee(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.inviterAci = reader.bytes(); break; } case 2: { message.inviteeAci = reader.bytes(); break; } case 3: { message.inviteePni = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an Invitee message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.GroupInvitationRevokedUpdate.Invitee * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.GroupInvitationRevokedUpdate.Invitee} Invitee * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Invitee.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return Invitee; })(); return GroupInvitationRevokedUpdate; })(); signalbackups.GroupJoinRequestUpdate = (function() { /** * Properties of a GroupJoinRequestUpdate. * @memberof signalbackups * @interface IGroupJoinRequestUpdate * @property {Uint8Array|null} [requestorAci] GroupJoinRequestUpdate requestorAci */ /** * Constructs a new GroupJoinRequestUpdate. * @memberof signalbackups * @classdesc Represents a GroupJoinRequestUpdate. * @implements IGroupJoinRequestUpdate * @constructor * @param {signalbackups.IGroupJoinRequestUpdate=} [properties] Properties to set */ function GroupJoinRequestUpdate(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GroupJoinRequestUpdate requestorAci. * @member {Uint8Array} requestorAci * @memberof signalbackups.GroupJoinRequestUpdate * @instance */ GroupJoinRequestUpdate.prototype.requestorAci = $util.newBuffer([]); /** * Encodes the specified GroupJoinRequestUpdate message. Does not implicitly {@link signalbackups.GroupJoinRequestUpdate.verify|verify} messages. * @function encode * @memberof signalbackups.GroupJoinRequestUpdate * @static * @param {signalbackups.IGroupJoinRequestUpdate} message GroupJoinRequestUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupJoinRequestUpdate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.GroupJoinRequestUpdate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.GroupJoinRequestUpdate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.requestorAci != null && Object.hasOwnProperty.call(message, "requestorAci")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.requestorAci); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupJoinRequestUpdate message, length delimited. Does not implicitly {@link signalbackups.GroupJoinRequestUpdate.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.GroupJoinRequestUpdate * @static * @param {signalbackups.IGroupJoinRequestUpdate} message GroupJoinRequestUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupJoinRequestUpdate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupJoinRequestUpdate message from the specified reader or buffer. * @function decode * @memberof signalbackups.GroupJoinRequestUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.GroupJoinRequestUpdate} GroupJoinRequestUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupJoinRequestUpdate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.GroupJoinRequestUpdate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.requestorAci = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupJoinRequestUpdate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.GroupJoinRequestUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.GroupJoinRequestUpdate} GroupJoinRequestUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupJoinRequestUpdate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return GroupJoinRequestUpdate; })(); signalbackups.GroupJoinRequestApprovalUpdate = (function() { /** * Properties of a GroupJoinRequestApprovalUpdate. * @memberof signalbackups * @interface IGroupJoinRequestApprovalUpdate * @property {Uint8Array|null} [requestorAci] GroupJoinRequestApprovalUpdate requestorAci * @property {Uint8Array|null} [updaterAci] GroupJoinRequestApprovalUpdate updaterAci * @property {boolean|null} [wasApproved] GroupJoinRequestApprovalUpdate wasApproved */ /** * Constructs a new GroupJoinRequestApprovalUpdate. * @memberof signalbackups * @classdesc Represents a GroupJoinRequestApprovalUpdate. * @implements IGroupJoinRequestApprovalUpdate * @constructor * @param {signalbackups.IGroupJoinRequestApprovalUpdate=} [properties] Properties to set */ function GroupJoinRequestApprovalUpdate(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GroupJoinRequestApprovalUpdate requestorAci. * @member {Uint8Array} requestorAci * @memberof signalbackups.GroupJoinRequestApprovalUpdate * @instance */ GroupJoinRequestApprovalUpdate.prototype.requestorAci = $util.newBuffer([]); /** * GroupJoinRequestApprovalUpdate updaterAci. * @member {Uint8Array|null|undefined} updaterAci * @memberof signalbackups.GroupJoinRequestApprovalUpdate * @instance */ GroupJoinRequestApprovalUpdate.prototype.updaterAci = null; /** * GroupJoinRequestApprovalUpdate wasApproved. * @member {boolean} wasApproved * @memberof signalbackups.GroupJoinRequestApprovalUpdate * @instance */ GroupJoinRequestApprovalUpdate.prototype.wasApproved = false; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * GroupJoinRequestApprovalUpdate _updaterAci. * @member {"updaterAci"|undefined} _updaterAci * @memberof signalbackups.GroupJoinRequestApprovalUpdate * @instance */ Object.defineProperty(GroupJoinRequestApprovalUpdate.prototype, "_updaterAci", { get: $util.oneOfGetter($oneOfFields = ["updaterAci"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified GroupJoinRequestApprovalUpdate message. Does not implicitly {@link signalbackups.GroupJoinRequestApprovalUpdate.verify|verify} messages. * @function encode * @memberof signalbackups.GroupJoinRequestApprovalUpdate * @static * @param {signalbackups.IGroupJoinRequestApprovalUpdate} message GroupJoinRequestApprovalUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupJoinRequestApprovalUpdate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.GroupJoinRequestApprovalUpdate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.GroupJoinRequestApprovalUpdate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.requestorAci != null && Object.hasOwnProperty.call(message, "requestorAci")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.requestorAci); if (message.updaterAci != null && Object.hasOwnProperty.call(message, "updaterAci")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.updaterAci); if (message.wasApproved != null && Object.hasOwnProperty.call(message, "wasApproved")) writer.uint32(/* id 3, wireType 0 =*/24).bool(message.wasApproved); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupJoinRequestApprovalUpdate message, length delimited. Does not implicitly {@link signalbackups.GroupJoinRequestApprovalUpdate.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.GroupJoinRequestApprovalUpdate * @static * @param {signalbackups.IGroupJoinRequestApprovalUpdate} message GroupJoinRequestApprovalUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupJoinRequestApprovalUpdate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupJoinRequestApprovalUpdate message from the specified reader or buffer. * @function decode * @memberof signalbackups.GroupJoinRequestApprovalUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.GroupJoinRequestApprovalUpdate} GroupJoinRequestApprovalUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupJoinRequestApprovalUpdate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.GroupJoinRequestApprovalUpdate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.requestorAci = reader.bytes(); break; } case 2: { message.updaterAci = reader.bytes(); break; } case 3: { message.wasApproved = reader.bool(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupJoinRequestApprovalUpdate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.GroupJoinRequestApprovalUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.GroupJoinRequestApprovalUpdate} GroupJoinRequestApprovalUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupJoinRequestApprovalUpdate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return GroupJoinRequestApprovalUpdate; })(); signalbackups.GroupJoinRequestCanceledUpdate = (function() { /** * Properties of a GroupJoinRequestCanceledUpdate. * @memberof signalbackups * @interface IGroupJoinRequestCanceledUpdate * @property {Uint8Array|null} [requestorAci] GroupJoinRequestCanceledUpdate requestorAci */ /** * Constructs a new GroupJoinRequestCanceledUpdate. * @memberof signalbackups * @classdesc Represents a GroupJoinRequestCanceledUpdate. * @implements IGroupJoinRequestCanceledUpdate * @constructor * @param {signalbackups.IGroupJoinRequestCanceledUpdate=} [properties] Properties to set */ function GroupJoinRequestCanceledUpdate(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GroupJoinRequestCanceledUpdate requestorAci. * @member {Uint8Array} requestorAci * @memberof signalbackups.GroupJoinRequestCanceledUpdate * @instance */ GroupJoinRequestCanceledUpdate.prototype.requestorAci = $util.newBuffer([]); /** * Encodes the specified GroupJoinRequestCanceledUpdate message. Does not implicitly {@link signalbackups.GroupJoinRequestCanceledUpdate.verify|verify} messages. * @function encode * @memberof signalbackups.GroupJoinRequestCanceledUpdate * @static * @param {signalbackups.IGroupJoinRequestCanceledUpdate} message GroupJoinRequestCanceledUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupJoinRequestCanceledUpdate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.GroupJoinRequestCanceledUpdate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.GroupJoinRequestCanceledUpdate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.requestorAci != null && Object.hasOwnProperty.call(message, "requestorAci")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.requestorAci); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupJoinRequestCanceledUpdate message, length delimited. Does not implicitly {@link signalbackups.GroupJoinRequestCanceledUpdate.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.GroupJoinRequestCanceledUpdate * @static * @param {signalbackups.IGroupJoinRequestCanceledUpdate} message GroupJoinRequestCanceledUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupJoinRequestCanceledUpdate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupJoinRequestCanceledUpdate message from the specified reader or buffer. * @function decode * @memberof signalbackups.GroupJoinRequestCanceledUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.GroupJoinRequestCanceledUpdate} GroupJoinRequestCanceledUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupJoinRequestCanceledUpdate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.GroupJoinRequestCanceledUpdate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.requestorAci = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupJoinRequestCanceledUpdate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.GroupJoinRequestCanceledUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.GroupJoinRequestCanceledUpdate} GroupJoinRequestCanceledUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupJoinRequestCanceledUpdate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return GroupJoinRequestCanceledUpdate; })(); signalbackups.GroupSequenceOfRequestsAndCancelsUpdate = (function() { /** * Properties of a GroupSequenceOfRequestsAndCancelsUpdate. * @memberof signalbackups * @interface IGroupSequenceOfRequestsAndCancelsUpdate * @property {Uint8Array|null} [requestorAci] GroupSequenceOfRequestsAndCancelsUpdate requestorAci * @property {number|null} [count] GroupSequenceOfRequestsAndCancelsUpdate count */ /** * Constructs a new GroupSequenceOfRequestsAndCancelsUpdate. * @memberof signalbackups * @classdesc Represents a GroupSequenceOfRequestsAndCancelsUpdate. * @implements IGroupSequenceOfRequestsAndCancelsUpdate * @constructor * @param {signalbackups.IGroupSequenceOfRequestsAndCancelsUpdate=} [properties] Properties to set */ function GroupSequenceOfRequestsAndCancelsUpdate(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GroupSequenceOfRequestsAndCancelsUpdate requestorAci. * @member {Uint8Array} requestorAci * @memberof signalbackups.GroupSequenceOfRequestsAndCancelsUpdate * @instance */ GroupSequenceOfRequestsAndCancelsUpdate.prototype.requestorAci = $util.newBuffer([]); /** * GroupSequenceOfRequestsAndCancelsUpdate count. * @member {number} count * @memberof signalbackups.GroupSequenceOfRequestsAndCancelsUpdate * @instance */ GroupSequenceOfRequestsAndCancelsUpdate.prototype.count = 0; /** * Encodes the specified GroupSequenceOfRequestsAndCancelsUpdate message. Does not implicitly {@link signalbackups.GroupSequenceOfRequestsAndCancelsUpdate.verify|verify} messages. * @function encode * @memberof signalbackups.GroupSequenceOfRequestsAndCancelsUpdate * @static * @param {signalbackups.IGroupSequenceOfRequestsAndCancelsUpdate} message GroupSequenceOfRequestsAndCancelsUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupSequenceOfRequestsAndCancelsUpdate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.GroupSequenceOfRequestsAndCancelsUpdate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.GroupSequenceOfRequestsAndCancelsUpdate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.requestorAci != null && Object.hasOwnProperty.call(message, "requestorAci")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.requestorAci); if (message.count != null && Object.hasOwnProperty.call(message, "count")) writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.count); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupSequenceOfRequestsAndCancelsUpdate message, length delimited. Does not implicitly {@link signalbackups.GroupSequenceOfRequestsAndCancelsUpdate.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.GroupSequenceOfRequestsAndCancelsUpdate * @static * @param {signalbackups.IGroupSequenceOfRequestsAndCancelsUpdate} message GroupSequenceOfRequestsAndCancelsUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupSequenceOfRequestsAndCancelsUpdate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupSequenceOfRequestsAndCancelsUpdate message from the specified reader or buffer. * @function decode * @memberof signalbackups.GroupSequenceOfRequestsAndCancelsUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.GroupSequenceOfRequestsAndCancelsUpdate} GroupSequenceOfRequestsAndCancelsUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupSequenceOfRequestsAndCancelsUpdate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.GroupSequenceOfRequestsAndCancelsUpdate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.requestorAci = reader.bytes(); break; } case 2: { message.count = reader.uint32(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupSequenceOfRequestsAndCancelsUpdate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.GroupSequenceOfRequestsAndCancelsUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.GroupSequenceOfRequestsAndCancelsUpdate} GroupSequenceOfRequestsAndCancelsUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupSequenceOfRequestsAndCancelsUpdate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return GroupSequenceOfRequestsAndCancelsUpdate; })(); signalbackups.GroupInviteLinkResetUpdate = (function() { /** * Properties of a GroupInviteLinkResetUpdate. * @memberof signalbackups * @interface IGroupInviteLinkResetUpdate * @property {Uint8Array|null} [updaterAci] GroupInviteLinkResetUpdate updaterAci */ /** * Constructs a new GroupInviteLinkResetUpdate. * @memberof signalbackups * @classdesc Represents a GroupInviteLinkResetUpdate. * @implements IGroupInviteLinkResetUpdate * @constructor * @param {signalbackups.IGroupInviteLinkResetUpdate=} [properties] Properties to set */ function GroupInviteLinkResetUpdate(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GroupInviteLinkResetUpdate updaterAci. * @member {Uint8Array|null|undefined} updaterAci * @memberof signalbackups.GroupInviteLinkResetUpdate * @instance */ GroupInviteLinkResetUpdate.prototype.updaterAci = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * GroupInviteLinkResetUpdate _updaterAci. * @member {"updaterAci"|undefined} _updaterAci * @memberof signalbackups.GroupInviteLinkResetUpdate * @instance */ Object.defineProperty(GroupInviteLinkResetUpdate.prototype, "_updaterAci", { get: $util.oneOfGetter($oneOfFields = ["updaterAci"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified GroupInviteLinkResetUpdate message. Does not implicitly {@link signalbackups.GroupInviteLinkResetUpdate.verify|verify} messages. * @function encode * @memberof signalbackups.GroupInviteLinkResetUpdate * @static * @param {signalbackups.IGroupInviteLinkResetUpdate} message GroupInviteLinkResetUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupInviteLinkResetUpdate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.GroupInviteLinkResetUpdate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.GroupInviteLinkResetUpdate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.updaterAci != null && Object.hasOwnProperty.call(message, "updaterAci")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.updaterAci); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupInviteLinkResetUpdate message, length delimited. Does not implicitly {@link signalbackups.GroupInviteLinkResetUpdate.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.GroupInviteLinkResetUpdate * @static * @param {signalbackups.IGroupInviteLinkResetUpdate} message GroupInviteLinkResetUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupInviteLinkResetUpdate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupInviteLinkResetUpdate message from the specified reader or buffer. * @function decode * @memberof signalbackups.GroupInviteLinkResetUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.GroupInviteLinkResetUpdate} GroupInviteLinkResetUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupInviteLinkResetUpdate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.GroupInviteLinkResetUpdate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.updaterAci = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupInviteLinkResetUpdate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.GroupInviteLinkResetUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.GroupInviteLinkResetUpdate} GroupInviteLinkResetUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupInviteLinkResetUpdate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return GroupInviteLinkResetUpdate; })(); signalbackups.GroupInviteLinkEnabledUpdate = (function() { /** * Properties of a GroupInviteLinkEnabledUpdate. * @memberof signalbackups * @interface IGroupInviteLinkEnabledUpdate * @property {Uint8Array|null} [updaterAci] GroupInviteLinkEnabledUpdate updaterAci * @property {boolean|null} [linkRequiresAdminApproval] GroupInviteLinkEnabledUpdate linkRequiresAdminApproval */ /** * Constructs a new GroupInviteLinkEnabledUpdate. * @memberof signalbackups * @classdesc Represents a GroupInviteLinkEnabledUpdate. * @implements IGroupInviteLinkEnabledUpdate * @constructor * @param {signalbackups.IGroupInviteLinkEnabledUpdate=} [properties] Properties to set */ function GroupInviteLinkEnabledUpdate(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GroupInviteLinkEnabledUpdate updaterAci. * @member {Uint8Array|null|undefined} updaterAci * @memberof signalbackups.GroupInviteLinkEnabledUpdate * @instance */ GroupInviteLinkEnabledUpdate.prototype.updaterAci = null; /** * GroupInviteLinkEnabledUpdate linkRequiresAdminApproval. * @member {boolean} linkRequiresAdminApproval * @memberof signalbackups.GroupInviteLinkEnabledUpdate * @instance */ GroupInviteLinkEnabledUpdate.prototype.linkRequiresAdminApproval = false; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * GroupInviteLinkEnabledUpdate _updaterAci. * @member {"updaterAci"|undefined} _updaterAci * @memberof signalbackups.GroupInviteLinkEnabledUpdate * @instance */ Object.defineProperty(GroupInviteLinkEnabledUpdate.prototype, "_updaterAci", { get: $util.oneOfGetter($oneOfFields = ["updaterAci"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified GroupInviteLinkEnabledUpdate message. Does not implicitly {@link signalbackups.GroupInviteLinkEnabledUpdate.verify|verify} messages. * @function encode * @memberof signalbackups.GroupInviteLinkEnabledUpdate * @static * @param {signalbackups.IGroupInviteLinkEnabledUpdate} message GroupInviteLinkEnabledUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupInviteLinkEnabledUpdate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.GroupInviteLinkEnabledUpdate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.GroupInviteLinkEnabledUpdate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.updaterAci != null && Object.hasOwnProperty.call(message, "updaterAci")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.updaterAci); if (message.linkRequiresAdminApproval != null && Object.hasOwnProperty.call(message, "linkRequiresAdminApproval")) writer.uint32(/* id 2, wireType 0 =*/16).bool(message.linkRequiresAdminApproval); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupInviteLinkEnabledUpdate message, length delimited. Does not implicitly {@link signalbackups.GroupInviteLinkEnabledUpdate.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.GroupInviteLinkEnabledUpdate * @static * @param {signalbackups.IGroupInviteLinkEnabledUpdate} message GroupInviteLinkEnabledUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupInviteLinkEnabledUpdate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupInviteLinkEnabledUpdate message from the specified reader or buffer. * @function decode * @memberof signalbackups.GroupInviteLinkEnabledUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.GroupInviteLinkEnabledUpdate} GroupInviteLinkEnabledUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupInviteLinkEnabledUpdate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.GroupInviteLinkEnabledUpdate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.updaterAci = reader.bytes(); break; } case 2: { message.linkRequiresAdminApproval = reader.bool(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupInviteLinkEnabledUpdate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.GroupInviteLinkEnabledUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.GroupInviteLinkEnabledUpdate} GroupInviteLinkEnabledUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupInviteLinkEnabledUpdate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return GroupInviteLinkEnabledUpdate; })(); signalbackups.GroupInviteLinkAdminApprovalUpdate = (function() { /** * Properties of a GroupInviteLinkAdminApprovalUpdate. * @memberof signalbackups * @interface IGroupInviteLinkAdminApprovalUpdate * @property {Uint8Array|null} [updaterAci] GroupInviteLinkAdminApprovalUpdate updaterAci * @property {boolean|null} [linkRequiresAdminApproval] GroupInviteLinkAdminApprovalUpdate linkRequiresAdminApproval */ /** * Constructs a new GroupInviteLinkAdminApprovalUpdate. * @memberof signalbackups * @classdesc Represents a GroupInviteLinkAdminApprovalUpdate. * @implements IGroupInviteLinkAdminApprovalUpdate * @constructor * @param {signalbackups.IGroupInviteLinkAdminApprovalUpdate=} [properties] Properties to set */ function GroupInviteLinkAdminApprovalUpdate(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GroupInviteLinkAdminApprovalUpdate updaterAci. * @member {Uint8Array|null|undefined} updaterAci * @memberof signalbackups.GroupInviteLinkAdminApprovalUpdate * @instance */ GroupInviteLinkAdminApprovalUpdate.prototype.updaterAci = null; /** * GroupInviteLinkAdminApprovalUpdate linkRequiresAdminApproval. * @member {boolean} linkRequiresAdminApproval * @memberof signalbackups.GroupInviteLinkAdminApprovalUpdate * @instance */ GroupInviteLinkAdminApprovalUpdate.prototype.linkRequiresAdminApproval = false; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * GroupInviteLinkAdminApprovalUpdate _updaterAci. * @member {"updaterAci"|undefined} _updaterAci * @memberof signalbackups.GroupInviteLinkAdminApprovalUpdate * @instance */ Object.defineProperty(GroupInviteLinkAdminApprovalUpdate.prototype, "_updaterAci", { get: $util.oneOfGetter($oneOfFields = ["updaterAci"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified GroupInviteLinkAdminApprovalUpdate message. Does not implicitly {@link signalbackups.GroupInviteLinkAdminApprovalUpdate.verify|verify} messages. * @function encode * @memberof signalbackups.GroupInviteLinkAdminApprovalUpdate * @static * @param {signalbackups.IGroupInviteLinkAdminApprovalUpdate} message GroupInviteLinkAdminApprovalUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupInviteLinkAdminApprovalUpdate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.GroupInviteLinkAdminApprovalUpdate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.GroupInviteLinkAdminApprovalUpdate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.updaterAci != null && Object.hasOwnProperty.call(message, "updaterAci")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.updaterAci); if (message.linkRequiresAdminApproval != null && Object.hasOwnProperty.call(message, "linkRequiresAdminApproval")) writer.uint32(/* id 2, wireType 0 =*/16).bool(message.linkRequiresAdminApproval); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupInviteLinkAdminApprovalUpdate message, length delimited. Does not implicitly {@link signalbackups.GroupInviteLinkAdminApprovalUpdate.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.GroupInviteLinkAdminApprovalUpdate * @static * @param {signalbackups.IGroupInviteLinkAdminApprovalUpdate} message GroupInviteLinkAdminApprovalUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupInviteLinkAdminApprovalUpdate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupInviteLinkAdminApprovalUpdate message from the specified reader or buffer. * @function decode * @memberof signalbackups.GroupInviteLinkAdminApprovalUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.GroupInviteLinkAdminApprovalUpdate} GroupInviteLinkAdminApprovalUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupInviteLinkAdminApprovalUpdate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.GroupInviteLinkAdminApprovalUpdate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.updaterAci = reader.bytes(); break; } case 2: { message.linkRequiresAdminApproval = reader.bool(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupInviteLinkAdminApprovalUpdate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.GroupInviteLinkAdminApprovalUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.GroupInviteLinkAdminApprovalUpdate} GroupInviteLinkAdminApprovalUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupInviteLinkAdminApprovalUpdate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return GroupInviteLinkAdminApprovalUpdate; })(); signalbackups.GroupInviteLinkDisabledUpdate = (function() { /** * Properties of a GroupInviteLinkDisabledUpdate. * @memberof signalbackups * @interface IGroupInviteLinkDisabledUpdate * @property {Uint8Array|null} [updaterAci] GroupInviteLinkDisabledUpdate updaterAci */ /** * Constructs a new GroupInviteLinkDisabledUpdate. * @memberof signalbackups * @classdesc Represents a GroupInviteLinkDisabledUpdate. * @implements IGroupInviteLinkDisabledUpdate * @constructor * @param {signalbackups.IGroupInviteLinkDisabledUpdate=} [properties] Properties to set */ function GroupInviteLinkDisabledUpdate(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GroupInviteLinkDisabledUpdate updaterAci. * @member {Uint8Array|null|undefined} updaterAci * @memberof signalbackups.GroupInviteLinkDisabledUpdate * @instance */ GroupInviteLinkDisabledUpdate.prototype.updaterAci = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * GroupInviteLinkDisabledUpdate _updaterAci. * @member {"updaterAci"|undefined} _updaterAci * @memberof signalbackups.GroupInviteLinkDisabledUpdate * @instance */ Object.defineProperty(GroupInviteLinkDisabledUpdate.prototype, "_updaterAci", { get: $util.oneOfGetter($oneOfFields = ["updaterAci"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified GroupInviteLinkDisabledUpdate message. Does not implicitly {@link signalbackups.GroupInviteLinkDisabledUpdate.verify|verify} messages. * @function encode * @memberof signalbackups.GroupInviteLinkDisabledUpdate * @static * @param {signalbackups.IGroupInviteLinkDisabledUpdate} message GroupInviteLinkDisabledUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupInviteLinkDisabledUpdate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.GroupInviteLinkDisabledUpdate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.GroupInviteLinkDisabledUpdate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.updaterAci != null && Object.hasOwnProperty.call(message, "updaterAci")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.updaterAci); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupInviteLinkDisabledUpdate message, length delimited. Does not implicitly {@link signalbackups.GroupInviteLinkDisabledUpdate.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.GroupInviteLinkDisabledUpdate * @static * @param {signalbackups.IGroupInviteLinkDisabledUpdate} message GroupInviteLinkDisabledUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupInviteLinkDisabledUpdate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupInviteLinkDisabledUpdate message from the specified reader or buffer. * @function decode * @memberof signalbackups.GroupInviteLinkDisabledUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.GroupInviteLinkDisabledUpdate} GroupInviteLinkDisabledUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupInviteLinkDisabledUpdate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.GroupInviteLinkDisabledUpdate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.updaterAci = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupInviteLinkDisabledUpdate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.GroupInviteLinkDisabledUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.GroupInviteLinkDisabledUpdate} GroupInviteLinkDisabledUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupInviteLinkDisabledUpdate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return GroupInviteLinkDisabledUpdate; })(); signalbackups.GroupMemberJoinedByLinkUpdate = (function() { /** * Properties of a GroupMemberJoinedByLinkUpdate. * @memberof signalbackups * @interface IGroupMemberJoinedByLinkUpdate * @property {Uint8Array|null} [newMemberAci] GroupMemberJoinedByLinkUpdate newMemberAci */ /** * Constructs a new GroupMemberJoinedByLinkUpdate. * @memberof signalbackups * @classdesc Represents a GroupMemberJoinedByLinkUpdate. * @implements IGroupMemberJoinedByLinkUpdate * @constructor * @param {signalbackups.IGroupMemberJoinedByLinkUpdate=} [properties] Properties to set */ function GroupMemberJoinedByLinkUpdate(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GroupMemberJoinedByLinkUpdate newMemberAci. * @member {Uint8Array} newMemberAci * @memberof signalbackups.GroupMemberJoinedByLinkUpdate * @instance */ GroupMemberJoinedByLinkUpdate.prototype.newMemberAci = $util.newBuffer([]); /** * Encodes the specified GroupMemberJoinedByLinkUpdate message. Does not implicitly {@link signalbackups.GroupMemberJoinedByLinkUpdate.verify|verify} messages. * @function encode * @memberof signalbackups.GroupMemberJoinedByLinkUpdate * @static * @param {signalbackups.IGroupMemberJoinedByLinkUpdate} message GroupMemberJoinedByLinkUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupMemberJoinedByLinkUpdate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.GroupMemberJoinedByLinkUpdate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.GroupMemberJoinedByLinkUpdate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.newMemberAci != null && Object.hasOwnProperty.call(message, "newMemberAci")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.newMemberAci); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupMemberJoinedByLinkUpdate message, length delimited. Does not implicitly {@link signalbackups.GroupMemberJoinedByLinkUpdate.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.GroupMemberJoinedByLinkUpdate * @static * @param {signalbackups.IGroupMemberJoinedByLinkUpdate} message GroupMemberJoinedByLinkUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupMemberJoinedByLinkUpdate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupMemberJoinedByLinkUpdate message from the specified reader or buffer. * @function decode * @memberof signalbackups.GroupMemberJoinedByLinkUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.GroupMemberJoinedByLinkUpdate} GroupMemberJoinedByLinkUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupMemberJoinedByLinkUpdate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.GroupMemberJoinedByLinkUpdate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.newMemberAci = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupMemberJoinedByLinkUpdate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.GroupMemberJoinedByLinkUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.GroupMemberJoinedByLinkUpdate} GroupMemberJoinedByLinkUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupMemberJoinedByLinkUpdate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return GroupMemberJoinedByLinkUpdate; })(); signalbackups.GroupV2MigrationUpdate = (function() { /** * Properties of a GroupV2MigrationUpdate. * @memberof signalbackups * @interface IGroupV2MigrationUpdate */ /** * Constructs a new GroupV2MigrationUpdate. * @memberof signalbackups * @classdesc Represents a GroupV2MigrationUpdate. * @implements IGroupV2MigrationUpdate * @constructor * @param {signalbackups.IGroupV2MigrationUpdate=} [properties] Properties to set */ function GroupV2MigrationUpdate(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Encodes the specified GroupV2MigrationUpdate message. Does not implicitly {@link signalbackups.GroupV2MigrationUpdate.verify|verify} messages. * @function encode * @memberof signalbackups.GroupV2MigrationUpdate * @static * @param {signalbackups.IGroupV2MigrationUpdate} message GroupV2MigrationUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupV2MigrationUpdate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.GroupV2MigrationUpdate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.GroupV2MigrationUpdate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupV2MigrationUpdate message, length delimited. Does not implicitly {@link signalbackups.GroupV2MigrationUpdate.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.GroupV2MigrationUpdate * @static * @param {signalbackups.IGroupV2MigrationUpdate} message GroupV2MigrationUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupV2MigrationUpdate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupV2MigrationUpdate message from the specified reader or buffer. * @function decode * @memberof signalbackups.GroupV2MigrationUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.GroupV2MigrationUpdate} GroupV2MigrationUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupV2MigrationUpdate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.GroupV2MigrationUpdate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupV2MigrationUpdate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.GroupV2MigrationUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.GroupV2MigrationUpdate} GroupV2MigrationUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupV2MigrationUpdate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return GroupV2MigrationUpdate; })(); signalbackups.GroupV2MigrationSelfInvitedUpdate = (function() { /** * Properties of a GroupV2MigrationSelfInvitedUpdate. * @memberof signalbackups * @interface IGroupV2MigrationSelfInvitedUpdate */ /** * Constructs a new GroupV2MigrationSelfInvitedUpdate. * @memberof signalbackups * @classdesc Represents a GroupV2MigrationSelfInvitedUpdate. * @implements IGroupV2MigrationSelfInvitedUpdate * @constructor * @param {signalbackups.IGroupV2MigrationSelfInvitedUpdate=} [properties] Properties to set */ function GroupV2MigrationSelfInvitedUpdate(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Encodes the specified GroupV2MigrationSelfInvitedUpdate message. Does not implicitly {@link signalbackups.GroupV2MigrationSelfInvitedUpdate.verify|verify} messages. * @function encode * @memberof signalbackups.GroupV2MigrationSelfInvitedUpdate * @static * @param {signalbackups.IGroupV2MigrationSelfInvitedUpdate} message GroupV2MigrationSelfInvitedUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupV2MigrationSelfInvitedUpdate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.GroupV2MigrationSelfInvitedUpdate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.GroupV2MigrationSelfInvitedUpdate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupV2MigrationSelfInvitedUpdate message, length delimited. Does not implicitly {@link signalbackups.GroupV2MigrationSelfInvitedUpdate.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.GroupV2MigrationSelfInvitedUpdate * @static * @param {signalbackups.IGroupV2MigrationSelfInvitedUpdate} message GroupV2MigrationSelfInvitedUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupV2MigrationSelfInvitedUpdate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupV2MigrationSelfInvitedUpdate message from the specified reader or buffer. * @function decode * @memberof signalbackups.GroupV2MigrationSelfInvitedUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.GroupV2MigrationSelfInvitedUpdate} GroupV2MigrationSelfInvitedUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupV2MigrationSelfInvitedUpdate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.GroupV2MigrationSelfInvitedUpdate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupV2MigrationSelfInvitedUpdate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.GroupV2MigrationSelfInvitedUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.GroupV2MigrationSelfInvitedUpdate} GroupV2MigrationSelfInvitedUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupV2MigrationSelfInvitedUpdate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return GroupV2MigrationSelfInvitedUpdate; })(); signalbackups.GroupV2MigrationInvitedMembersUpdate = (function() { /** * Properties of a GroupV2MigrationInvitedMembersUpdate. * @memberof signalbackups * @interface IGroupV2MigrationInvitedMembersUpdate * @property {number|null} [invitedMembersCount] GroupV2MigrationInvitedMembersUpdate invitedMembersCount */ /** * Constructs a new GroupV2MigrationInvitedMembersUpdate. * @memberof signalbackups * @classdesc Represents a GroupV2MigrationInvitedMembersUpdate. * @implements IGroupV2MigrationInvitedMembersUpdate * @constructor * @param {signalbackups.IGroupV2MigrationInvitedMembersUpdate=} [properties] Properties to set */ function GroupV2MigrationInvitedMembersUpdate(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GroupV2MigrationInvitedMembersUpdate invitedMembersCount. * @member {number} invitedMembersCount * @memberof signalbackups.GroupV2MigrationInvitedMembersUpdate * @instance */ GroupV2MigrationInvitedMembersUpdate.prototype.invitedMembersCount = 0; /** * Encodes the specified GroupV2MigrationInvitedMembersUpdate message. Does not implicitly {@link signalbackups.GroupV2MigrationInvitedMembersUpdate.verify|verify} messages. * @function encode * @memberof signalbackups.GroupV2MigrationInvitedMembersUpdate * @static * @param {signalbackups.IGroupV2MigrationInvitedMembersUpdate} message GroupV2MigrationInvitedMembersUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupV2MigrationInvitedMembersUpdate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.GroupV2MigrationInvitedMembersUpdate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.GroupV2MigrationInvitedMembersUpdate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.invitedMembersCount != null && Object.hasOwnProperty.call(message, "invitedMembersCount")) writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.invitedMembersCount); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupV2MigrationInvitedMembersUpdate message, length delimited. Does not implicitly {@link signalbackups.GroupV2MigrationInvitedMembersUpdate.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.GroupV2MigrationInvitedMembersUpdate * @static * @param {signalbackups.IGroupV2MigrationInvitedMembersUpdate} message GroupV2MigrationInvitedMembersUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupV2MigrationInvitedMembersUpdate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupV2MigrationInvitedMembersUpdate message from the specified reader or buffer. * @function decode * @memberof signalbackups.GroupV2MigrationInvitedMembersUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.GroupV2MigrationInvitedMembersUpdate} GroupV2MigrationInvitedMembersUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupV2MigrationInvitedMembersUpdate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.GroupV2MigrationInvitedMembersUpdate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.invitedMembersCount = reader.uint32(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupV2MigrationInvitedMembersUpdate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.GroupV2MigrationInvitedMembersUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.GroupV2MigrationInvitedMembersUpdate} GroupV2MigrationInvitedMembersUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupV2MigrationInvitedMembersUpdate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return GroupV2MigrationInvitedMembersUpdate; })(); signalbackups.GroupV2MigrationDroppedMembersUpdate = (function() { /** * Properties of a GroupV2MigrationDroppedMembersUpdate. * @memberof signalbackups * @interface IGroupV2MigrationDroppedMembersUpdate * @property {number|null} [droppedMembersCount] GroupV2MigrationDroppedMembersUpdate droppedMembersCount */ /** * Constructs a new GroupV2MigrationDroppedMembersUpdate. * @memberof signalbackups * @classdesc Represents a GroupV2MigrationDroppedMembersUpdate. * @implements IGroupV2MigrationDroppedMembersUpdate * @constructor * @param {signalbackups.IGroupV2MigrationDroppedMembersUpdate=} [properties] Properties to set */ function GroupV2MigrationDroppedMembersUpdate(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GroupV2MigrationDroppedMembersUpdate droppedMembersCount. * @member {number} droppedMembersCount * @memberof signalbackups.GroupV2MigrationDroppedMembersUpdate * @instance */ GroupV2MigrationDroppedMembersUpdate.prototype.droppedMembersCount = 0; /** * Encodes the specified GroupV2MigrationDroppedMembersUpdate message. Does not implicitly {@link signalbackups.GroupV2MigrationDroppedMembersUpdate.verify|verify} messages. * @function encode * @memberof signalbackups.GroupV2MigrationDroppedMembersUpdate * @static * @param {signalbackups.IGroupV2MigrationDroppedMembersUpdate} message GroupV2MigrationDroppedMembersUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupV2MigrationDroppedMembersUpdate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.GroupV2MigrationDroppedMembersUpdate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.GroupV2MigrationDroppedMembersUpdate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.droppedMembersCount != null && Object.hasOwnProperty.call(message, "droppedMembersCount")) writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.droppedMembersCount); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupV2MigrationDroppedMembersUpdate message, length delimited. Does not implicitly {@link signalbackups.GroupV2MigrationDroppedMembersUpdate.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.GroupV2MigrationDroppedMembersUpdate * @static * @param {signalbackups.IGroupV2MigrationDroppedMembersUpdate} message GroupV2MigrationDroppedMembersUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupV2MigrationDroppedMembersUpdate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupV2MigrationDroppedMembersUpdate message from the specified reader or buffer. * @function decode * @memberof signalbackups.GroupV2MigrationDroppedMembersUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.GroupV2MigrationDroppedMembersUpdate} GroupV2MigrationDroppedMembersUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupV2MigrationDroppedMembersUpdate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.GroupV2MigrationDroppedMembersUpdate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.droppedMembersCount = reader.uint32(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupV2MigrationDroppedMembersUpdate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.GroupV2MigrationDroppedMembersUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.GroupV2MigrationDroppedMembersUpdate} GroupV2MigrationDroppedMembersUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupV2MigrationDroppedMembersUpdate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return GroupV2MigrationDroppedMembersUpdate; })(); signalbackups.GroupExpirationTimerUpdate = (function() { /** * Properties of a GroupExpirationTimerUpdate. * @memberof signalbackups * @interface IGroupExpirationTimerUpdate * @property {Long|null} [expiresInMs] GroupExpirationTimerUpdate expiresInMs * @property {Uint8Array|null} [updaterAci] GroupExpirationTimerUpdate updaterAci */ /** * Constructs a new GroupExpirationTimerUpdate. * @memberof signalbackups * @classdesc Represents a GroupExpirationTimerUpdate. * @implements IGroupExpirationTimerUpdate * @constructor * @param {signalbackups.IGroupExpirationTimerUpdate=} [properties] Properties to set */ function GroupExpirationTimerUpdate(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * GroupExpirationTimerUpdate expiresInMs. * @member {Long} expiresInMs * @memberof signalbackups.GroupExpirationTimerUpdate * @instance */ GroupExpirationTimerUpdate.prototype.expiresInMs = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * GroupExpirationTimerUpdate updaterAci. * @member {Uint8Array|null|undefined} updaterAci * @memberof signalbackups.GroupExpirationTimerUpdate * @instance */ GroupExpirationTimerUpdate.prototype.updaterAci = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * GroupExpirationTimerUpdate _updaterAci. * @member {"updaterAci"|undefined} _updaterAci * @memberof signalbackups.GroupExpirationTimerUpdate * @instance */ Object.defineProperty(GroupExpirationTimerUpdate.prototype, "_updaterAci", { get: $util.oneOfGetter($oneOfFields = ["updaterAci"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified GroupExpirationTimerUpdate message. Does not implicitly {@link signalbackups.GroupExpirationTimerUpdate.verify|verify} messages. * @function encode * @memberof signalbackups.GroupExpirationTimerUpdate * @static * @param {signalbackups.IGroupExpirationTimerUpdate} message GroupExpirationTimerUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupExpirationTimerUpdate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.GroupExpirationTimerUpdate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.GroupExpirationTimerUpdate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.expiresInMs != null && Object.hasOwnProperty.call(message, "expiresInMs")) writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.expiresInMs); if (message.updaterAci != null && Object.hasOwnProperty.call(message, "updaterAci")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.updaterAci); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified GroupExpirationTimerUpdate message, length delimited. Does not implicitly {@link signalbackups.GroupExpirationTimerUpdate.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.GroupExpirationTimerUpdate * @static * @param {signalbackups.IGroupExpirationTimerUpdate} message GroupExpirationTimerUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ GroupExpirationTimerUpdate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a GroupExpirationTimerUpdate message from the specified reader or buffer. * @function decode * @memberof signalbackups.GroupExpirationTimerUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.GroupExpirationTimerUpdate} GroupExpirationTimerUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupExpirationTimerUpdate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.GroupExpirationTimerUpdate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.expiresInMs = reader.uint64(); break; } case 2: { message.updaterAci = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a GroupExpirationTimerUpdate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.GroupExpirationTimerUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.GroupExpirationTimerUpdate} GroupExpirationTimerUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ GroupExpirationTimerUpdate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return GroupExpirationTimerUpdate; })(); signalbackups.PollTerminateUpdate = (function() { /** * Properties of a PollTerminateUpdate. * @memberof signalbackups * @interface IPollTerminateUpdate * @property {Long|null} [targetSentTimestamp] PollTerminateUpdate targetSentTimestamp * @property {string|null} [question] PollTerminateUpdate question */ /** * Constructs a new PollTerminateUpdate. * @memberof signalbackups * @classdesc Represents a PollTerminateUpdate. * @implements IPollTerminateUpdate * @constructor * @param {signalbackups.IPollTerminateUpdate=} [properties] Properties to set */ function PollTerminateUpdate(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * PollTerminateUpdate targetSentTimestamp. * @member {Long} targetSentTimestamp * @memberof signalbackups.PollTerminateUpdate * @instance */ PollTerminateUpdate.prototype.targetSentTimestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * PollTerminateUpdate question. * @member {string} question * @memberof signalbackups.PollTerminateUpdate * @instance */ PollTerminateUpdate.prototype.question = ""; /** * Encodes the specified PollTerminateUpdate message. Does not implicitly {@link signalbackups.PollTerminateUpdate.verify|verify} messages. * @function encode * @memberof signalbackups.PollTerminateUpdate * @static * @param {signalbackups.IPollTerminateUpdate} message PollTerminateUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ PollTerminateUpdate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.PollTerminateUpdate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.PollTerminateUpdate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.targetSentTimestamp != null && Object.hasOwnProperty.call(message, "targetSentTimestamp")) writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.targetSentTimestamp); if (message.question != null && Object.hasOwnProperty.call(message, "question")) writer.uint32(/* id 2, wireType 2 =*/18).string(message.question); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified PollTerminateUpdate message, length delimited. Does not implicitly {@link signalbackups.PollTerminateUpdate.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.PollTerminateUpdate * @static * @param {signalbackups.IPollTerminateUpdate} message PollTerminateUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ PollTerminateUpdate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a PollTerminateUpdate message from the specified reader or buffer. * @function decode * @memberof signalbackups.PollTerminateUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.PollTerminateUpdate} PollTerminateUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ PollTerminateUpdate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.PollTerminateUpdate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.targetSentTimestamp = reader.uint64(); break; } case 2: { message.question = reader.string(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a PollTerminateUpdate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.PollTerminateUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.PollTerminateUpdate} PollTerminateUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ PollTerminateUpdate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return PollTerminateUpdate; })(); signalbackups.PinMessageUpdate = (function() { /** * Properties of a PinMessageUpdate. * @memberof signalbackups * @interface IPinMessageUpdate * @property {Long|null} [targetSentTimestamp] PinMessageUpdate targetSentTimestamp * @property {Long|null} [authorId] PinMessageUpdate authorId */ /** * Constructs a new PinMessageUpdate. * @memberof signalbackups * @classdesc Represents a PinMessageUpdate. * @implements IPinMessageUpdate * @constructor * @param {signalbackups.IPinMessageUpdate=} [properties] Properties to set */ function PinMessageUpdate(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * PinMessageUpdate targetSentTimestamp. * @member {Long} targetSentTimestamp * @memberof signalbackups.PinMessageUpdate * @instance */ PinMessageUpdate.prototype.targetSentTimestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * PinMessageUpdate authorId. * @member {Long} authorId * @memberof signalbackups.PinMessageUpdate * @instance */ PinMessageUpdate.prototype.authorId = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * Encodes the specified PinMessageUpdate message. Does not implicitly {@link signalbackups.PinMessageUpdate.verify|verify} messages. * @function encode * @memberof signalbackups.PinMessageUpdate * @static * @param {signalbackups.IPinMessageUpdate} message PinMessageUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ PinMessageUpdate.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.PinMessageUpdate.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.PinMessageUpdate.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.targetSentTimestamp != null && Object.hasOwnProperty.call(message, "targetSentTimestamp")) writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.targetSentTimestamp); if (message.authorId != null && Object.hasOwnProperty.call(message, "authorId")) writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.authorId); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified PinMessageUpdate message, length delimited. Does not implicitly {@link signalbackups.PinMessageUpdate.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.PinMessageUpdate * @static * @param {signalbackups.IPinMessageUpdate} message PinMessageUpdate message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ PinMessageUpdate.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a PinMessageUpdate message from the specified reader or buffer. * @function decode * @memberof signalbackups.PinMessageUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.PinMessageUpdate} PinMessageUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ PinMessageUpdate.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.PinMessageUpdate(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.targetSentTimestamp = reader.uint64(); break; } case 2: { message.authorId = reader.uint64(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a PinMessageUpdate message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.PinMessageUpdate * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.PinMessageUpdate} PinMessageUpdate * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ PinMessageUpdate.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return PinMessageUpdate; })(); signalbackups.StickerPack = (function() { /** * Properties of a StickerPack. * @memberof signalbackups * @interface IStickerPack * @property {Uint8Array|null} [packId] StickerPack packId * @property {Uint8Array|null} [packKey] StickerPack packKey */ /** * Constructs a new StickerPack. * @memberof signalbackups * @classdesc Represents a StickerPack. * @implements IStickerPack * @constructor * @param {signalbackups.IStickerPack=} [properties] Properties to set */ function StickerPack(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * StickerPack packId. * @member {Uint8Array} packId * @memberof signalbackups.StickerPack * @instance */ StickerPack.prototype.packId = $util.newBuffer([]); /** * StickerPack packKey. * @member {Uint8Array} packKey * @memberof signalbackups.StickerPack * @instance */ StickerPack.prototype.packKey = $util.newBuffer([]); /** * Encodes the specified StickerPack message. Does not implicitly {@link signalbackups.StickerPack.verify|verify} messages. * @function encode * @memberof signalbackups.StickerPack * @static * @param {signalbackups.IStickerPack} message StickerPack message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ StickerPack.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.StickerPack.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.StickerPack.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.packId != null && Object.hasOwnProperty.call(message, "packId")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.packId); if (message.packKey != null && Object.hasOwnProperty.call(message, "packKey")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.packKey); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified StickerPack message, length delimited. Does not implicitly {@link signalbackups.StickerPack.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.StickerPack * @static * @param {signalbackups.IStickerPack} message StickerPack message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ StickerPack.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a StickerPack message from the specified reader or buffer. * @function decode * @memberof signalbackups.StickerPack * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.StickerPack} StickerPack * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ StickerPack.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.StickerPack(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.packId = reader.bytes(); break; } case 2: { message.packKey = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a StickerPack message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.StickerPack * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.StickerPack} StickerPack * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ StickerPack.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return StickerPack; })(); signalbackups.ChatStyle = (function() { /** * Properties of a ChatStyle. * @memberof signalbackups * @interface IChatStyle * @property {signalbackups.ChatStyle.WallpaperPreset|null} [wallpaperPreset] ChatStyle wallpaperPreset * @property {signalbackups.IFilePointer|null} [wallpaperPhoto] ChatStyle wallpaperPhoto * @property {signalbackups.ChatStyle.IAutomaticBubbleColor|null} [autoBubbleColor] ChatStyle autoBubbleColor * @property {signalbackups.ChatStyle.BubbleColorPreset|null} [bubbleColorPreset] ChatStyle bubbleColorPreset * @property {Long|null} [customColorId] ChatStyle customColorId * @property {boolean|null} [dimWallpaperInDarkMode] ChatStyle dimWallpaperInDarkMode */ /** * Constructs a new ChatStyle. * @memberof signalbackups * @classdesc Represents a ChatStyle. * @implements IChatStyle * @constructor * @param {signalbackups.IChatStyle=} [properties] Properties to set */ function ChatStyle(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * ChatStyle wallpaperPreset. * @member {signalbackups.ChatStyle.WallpaperPreset|null|undefined} wallpaperPreset * @memberof signalbackups.ChatStyle * @instance */ ChatStyle.prototype.wallpaperPreset = null; /** * ChatStyle wallpaperPhoto. * @member {signalbackups.IFilePointer|null|undefined} wallpaperPhoto * @memberof signalbackups.ChatStyle * @instance */ ChatStyle.prototype.wallpaperPhoto = null; /** * ChatStyle autoBubbleColor. * @member {signalbackups.ChatStyle.IAutomaticBubbleColor|null|undefined} autoBubbleColor * @memberof signalbackups.ChatStyle * @instance */ ChatStyle.prototype.autoBubbleColor = null; /** * ChatStyle bubbleColorPreset. * @member {signalbackups.ChatStyle.BubbleColorPreset|null|undefined} bubbleColorPreset * @memberof signalbackups.ChatStyle * @instance */ ChatStyle.prototype.bubbleColorPreset = null; /** * ChatStyle customColorId. * @member {Long|null|undefined} customColorId * @memberof signalbackups.ChatStyle * @instance */ ChatStyle.prototype.customColorId = null; /** * ChatStyle dimWallpaperInDarkMode. * @member {boolean} dimWallpaperInDarkMode * @memberof signalbackups.ChatStyle * @instance */ ChatStyle.prototype.dimWallpaperInDarkMode = false; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * ChatStyle wallpaper. * @member {"wallpaperPreset"|"wallpaperPhoto"|undefined} wallpaper * @memberof signalbackups.ChatStyle * @instance */ Object.defineProperty(ChatStyle.prototype, "wallpaper", { get: $util.oneOfGetter($oneOfFields = ["wallpaperPreset", "wallpaperPhoto"]), set: $util.oneOfSetter($oneOfFields) }); /** * ChatStyle bubbleColor. * @member {"autoBubbleColor"|"bubbleColorPreset"|"customColorId"|undefined} bubbleColor * @memberof signalbackups.ChatStyle * @instance */ Object.defineProperty(ChatStyle.prototype, "bubbleColor", { get: $util.oneOfGetter($oneOfFields = ["autoBubbleColor", "bubbleColorPreset", "customColorId"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified ChatStyle message. Does not implicitly {@link signalbackups.ChatStyle.verify|verify} messages. * @function encode * @memberof signalbackups.ChatStyle * @static * @param {signalbackups.IChatStyle} message ChatStyle message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ChatStyle.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.ChatStyle.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.ChatStyle.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.wallpaperPreset != null && Object.hasOwnProperty.call(message, "wallpaperPreset")) writer.uint32(/* id 1, wireType 0 =*/8).int32(message.wallpaperPreset); if (message.wallpaperPhoto != null && Object.hasOwnProperty.call(message, "wallpaperPhoto")) $root.signalbackups.FilePointer.encode(message.wallpaperPhoto, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); if (message.autoBubbleColor != null && Object.hasOwnProperty.call(message, "autoBubbleColor")) $root.signalbackups.ChatStyle.AutomaticBubbleColor.encode(message.autoBubbleColor, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); if (message.bubbleColorPreset != null && Object.hasOwnProperty.call(message, "bubbleColorPreset")) writer.uint32(/* id 4, wireType 0 =*/32).int32(message.bubbleColorPreset); if (message.customColorId != null && Object.hasOwnProperty.call(message, "customColorId")) writer.uint32(/* id 5, wireType 0 =*/40).uint64(message.customColorId); if (message.dimWallpaperInDarkMode != null && Object.hasOwnProperty.call(message, "dimWallpaperInDarkMode")) writer.uint32(/* id 7, wireType 0 =*/56).bool(message.dimWallpaperInDarkMode); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified ChatStyle message, length delimited. Does not implicitly {@link signalbackups.ChatStyle.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.ChatStyle * @static * @param {signalbackups.IChatStyle} message ChatStyle message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ChatStyle.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a ChatStyle message from the specified reader or buffer. * @function decode * @memberof signalbackups.ChatStyle * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.ChatStyle} ChatStyle * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ChatStyle.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.ChatStyle(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.wallpaperPreset = reader.int32(); break; } case 2: { message.wallpaperPhoto = $root.signalbackups.FilePointer.decode(reader, reader.uint32()); break; } case 3: { message.autoBubbleColor = $root.signalbackups.ChatStyle.AutomaticBubbleColor.decode(reader, reader.uint32()); break; } case 4: { message.bubbleColorPreset = reader.int32(); break; } case 5: { message.customColorId = reader.uint64(); break; } case 7: { message.dimWallpaperInDarkMode = reader.bool(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a ChatStyle message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.ChatStyle * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.ChatStyle} ChatStyle * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ChatStyle.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; ChatStyle.Gradient = (function() { /** * Properties of a Gradient. * @memberof signalbackups.ChatStyle * @interface IGradient * @property {number|null} [angle] Gradient angle * @property {Array.|null} [colors] Gradient colors * @property {Array.|null} [positions] Gradient positions */ /** * Constructs a new Gradient. * @memberof signalbackups.ChatStyle * @classdesc Represents a Gradient. * @implements IGradient * @constructor * @param {signalbackups.ChatStyle.IGradient=} [properties] Properties to set */ function Gradient(properties) { this.colors = []; this.positions = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Gradient angle. * @member {number} angle * @memberof signalbackups.ChatStyle.Gradient * @instance */ Gradient.prototype.angle = 0; /** * Gradient colors. * @member {Array.} colors * @memberof signalbackups.ChatStyle.Gradient * @instance */ Gradient.prototype.colors = $util.emptyArray; /** * Gradient positions. * @member {Array.} positions * @memberof signalbackups.ChatStyle.Gradient * @instance */ Gradient.prototype.positions = $util.emptyArray; /** * Encodes the specified Gradient message. Does not implicitly {@link signalbackups.ChatStyle.Gradient.verify|verify} messages. * @function encode * @memberof signalbackups.ChatStyle.Gradient * @static * @param {signalbackups.ChatStyle.IGradient} message Gradient message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Gradient.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.ChatStyle.Gradient.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.ChatStyle.Gradient.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.angle != null && Object.hasOwnProperty.call(message, "angle")) writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.angle); if (message.colors != null && message.colors.length) { writer.uint32(/* id 2, wireType 2 =*/18).fork(); for (var i = 0; i < message.colors.length; ++i) writer.fixed32(message.colors[i]); writer.ldelim(); } if (message.positions != null && message.positions.length) { writer.uint32(/* id 3, wireType 2 =*/26).fork(); for (var i = 0; i < message.positions.length; ++i) writer.float(message.positions[i]); writer.ldelim(); } for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Gradient message, length delimited. Does not implicitly {@link signalbackups.ChatStyle.Gradient.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.ChatStyle.Gradient * @static * @param {signalbackups.ChatStyle.IGradient} message Gradient message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Gradient.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Gradient message from the specified reader or buffer. * @function decode * @memberof signalbackups.ChatStyle.Gradient * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.ChatStyle.Gradient} Gradient * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Gradient.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.ChatStyle.Gradient(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.angle = reader.uint32(); break; } case 2: { if (!(message.colors && message.colors.length)) message.colors = []; if ((tag & 7) === 2) { var end2 = reader.uint32() + reader.pos; while (reader.pos < end2) message.colors.push(reader.fixed32()); } else message.colors.push(reader.fixed32()); break; } case 3: { if (!(message.positions && message.positions.length)) message.positions = []; if ((tag & 7) === 2) { var end2 = reader.uint32() + reader.pos; while (reader.pos < end2) message.positions.push(reader.float()); } else message.positions.push(reader.float()); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Gradient message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.ChatStyle.Gradient * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.ChatStyle.Gradient} Gradient * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Gradient.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return Gradient; })(); ChatStyle.CustomChatColor = (function() { /** * Properties of a CustomChatColor. * @memberof signalbackups.ChatStyle * @interface ICustomChatColor * @property {Long|null} [id] CustomChatColor id * @property {number|null} [solid] CustomChatColor solid * @property {signalbackups.ChatStyle.IGradient|null} [gradient] CustomChatColor gradient */ /** * Constructs a new CustomChatColor. * @memberof signalbackups.ChatStyle * @classdesc Represents a CustomChatColor. * @implements ICustomChatColor * @constructor * @param {signalbackups.ChatStyle.ICustomChatColor=} [properties] Properties to set */ function CustomChatColor(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * CustomChatColor id. * @member {Long} id * @memberof signalbackups.ChatStyle.CustomChatColor * @instance */ CustomChatColor.prototype.id = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * CustomChatColor solid. * @member {number|null|undefined} solid * @memberof signalbackups.ChatStyle.CustomChatColor * @instance */ CustomChatColor.prototype.solid = null; /** * CustomChatColor gradient. * @member {signalbackups.ChatStyle.IGradient|null|undefined} gradient * @memberof signalbackups.ChatStyle.CustomChatColor * @instance */ CustomChatColor.prototype.gradient = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * CustomChatColor color. * @member {"solid"|"gradient"|undefined} color * @memberof signalbackups.ChatStyle.CustomChatColor * @instance */ Object.defineProperty(CustomChatColor.prototype, "color", { get: $util.oneOfGetter($oneOfFields = ["solid", "gradient"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified CustomChatColor message. Does not implicitly {@link signalbackups.ChatStyle.CustomChatColor.verify|verify} messages. * @function encode * @memberof signalbackups.ChatStyle.CustomChatColor * @static * @param {signalbackups.ChatStyle.ICustomChatColor} message CustomChatColor message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ CustomChatColor.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.ChatStyle.CustomChatColor.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.ChatStyle.CustomChatColor.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.id != null && Object.hasOwnProperty.call(message, "id")) writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.id); if (message.solid != null && Object.hasOwnProperty.call(message, "solid")) writer.uint32(/* id 2, wireType 5 =*/21).fixed32(message.solid); if (message.gradient != null && Object.hasOwnProperty.call(message, "gradient")) $root.signalbackups.ChatStyle.Gradient.encode(message.gradient, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified CustomChatColor message, length delimited. Does not implicitly {@link signalbackups.ChatStyle.CustomChatColor.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.ChatStyle.CustomChatColor * @static * @param {signalbackups.ChatStyle.ICustomChatColor} message CustomChatColor message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ CustomChatColor.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a CustomChatColor message from the specified reader or buffer. * @function decode * @memberof signalbackups.ChatStyle.CustomChatColor * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.ChatStyle.CustomChatColor} CustomChatColor * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ CustomChatColor.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.ChatStyle.CustomChatColor(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.id = reader.uint64(); break; } case 2: { message.solid = reader.fixed32(); break; } case 3: { message.gradient = $root.signalbackups.ChatStyle.Gradient.decode(reader, reader.uint32()); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a CustomChatColor message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.ChatStyle.CustomChatColor * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.ChatStyle.CustomChatColor} CustomChatColor * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ CustomChatColor.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return CustomChatColor; })(); ChatStyle.AutomaticBubbleColor = (function() { /** * Properties of an AutomaticBubbleColor. * @memberof signalbackups.ChatStyle * @interface IAutomaticBubbleColor */ /** * Constructs a new AutomaticBubbleColor. * @memberof signalbackups.ChatStyle * @classdesc Represents an AutomaticBubbleColor. * @implements IAutomaticBubbleColor * @constructor * @param {signalbackups.ChatStyle.IAutomaticBubbleColor=} [properties] Properties to set */ function AutomaticBubbleColor(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Encodes the specified AutomaticBubbleColor message. Does not implicitly {@link signalbackups.ChatStyle.AutomaticBubbleColor.verify|verify} messages. * @function encode * @memberof signalbackups.ChatStyle.AutomaticBubbleColor * @static * @param {signalbackups.ChatStyle.IAutomaticBubbleColor} message AutomaticBubbleColor message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ AutomaticBubbleColor.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.ChatStyle.AutomaticBubbleColor.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.ChatStyle.AutomaticBubbleColor.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified AutomaticBubbleColor message, length delimited. Does not implicitly {@link signalbackups.ChatStyle.AutomaticBubbleColor.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.ChatStyle.AutomaticBubbleColor * @static * @param {signalbackups.ChatStyle.IAutomaticBubbleColor} message AutomaticBubbleColor message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ AutomaticBubbleColor.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an AutomaticBubbleColor message from the specified reader or buffer. * @function decode * @memberof signalbackups.ChatStyle.AutomaticBubbleColor * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.ChatStyle.AutomaticBubbleColor} AutomaticBubbleColor * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ AutomaticBubbleColor.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.ChatStyle.AutomaticBubbleColor(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an AutomaticBubbleColor message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.ChatStyle.AutomaticBubbleColor * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.ChatStyle.AutomaticBubbleColor} AutomaticBubbleColor * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ AutomaticBubbleColor.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return AutomaticBubbleColor; })(); /** * WallpaperPreset enum. * @name signalbackups.ChatStyle.WallpaperPreset * @enum {number} * @property {number} UNKNOWN_WALLPAPER_PRESET=0 UNKNOWN_WALLPAPER_PRESET value * @property {number} SOLID_BLUSH=1 SOLID_BLUSH value * @property {number} SOLID_COPPER=2 SOLID_COPPER value * @property {number} SOLID_DUST=3 SOLID_DUST value * @property {number} SOLID_CELADON=4 SOLID_CELADON value * @property {number} SOLID_RAINFOREST=5 SOLID_RAINFOREST value * @property {number} SOLID_PACIFIC=6 SOLID_PACIFIC value * @property {number} SOLID_FROST=7 SOLID_FROST value * @property {number} SOLID_NAVY=8 SOLID_NAVY value * @property {number} SOLID_LILAC=9 SOLID_LILAC value * @property {number} SOLID_PINK=10 SOLID_PINK value * @property {number} SOLID_EGGPLANT=11 SOLID_EGGPLANT value * @property {number} SOLID_SILVER=12 SOLID_SILVER value * @property {number} GRADIENT_SUNSET=13 GRADIENT_SUNSET value * @property {number} GRADIENT_NOIR=14 GRADIENT_NOIR value * @property {number} GRADIENT_HEATMAP=15 GRADIENT_HEATMAP value * @property {number} GRADIENT_AQUA=16 GRADIENT_AQUA value * @property {number} GRADIENT_IRIDESCENT=17 GRADIENT_IRIDESCENT value * @property {number} GRADIENT_MONSTERA=18 GRADIENT_MONSTERA value * @property {number} GRADIENT_BLISS=19 GRADIENT_BLISS value * @property {number} GRADIENT_SKY=20 GRADIENT_SKY value * @property {number} GRADIENT_PEACH=21 GRADIENT_PEACH value */ ChatStyle.WallpaperPreset = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "UNKNOWN_WALLPAPER_PRESET"] = 0; values[valuesById[1] = "SOLID_BLUSH"] = 1; values[valuesById[2] = "SOLID_COPPER"] = 2; values[valuesById[3] = "SOLID_DUST"] = 3; values[valuesById[4] = "SOLID_CELADON"] = 4; values[valuesById[5] = "SOLID_RAINFOREST"] = 5; values[valuesById[6] = "SOLID_PACIFIC"] = 6; values[valuesById[7] = "SOLID_FROST"] = 7; values[valuesById[8] = "SOLID_NAVY"] = 8; values[valuesById[9] = "SOLID_LILAC"] = 9; values[valuesById[10] = "SOLID_PINK"] = 10; values[valuesById[11] = "SOLID_EGGPLANT"] = 11; values[valuesById[12] = "SOLID_SILVER"] = 12; values[valuesById[13] = "GRADIENT_SUNSET"] = 13; values[valuesById[14] = "GRADIENT_NOIR"] = 14; values[valuesById[15] = "GRADIENT_HEATMAP"] = 15; values[valuesById[16] = "GRADIENT_AQUA"] = 16; values[valuesById[17] = "GRADIENT_IRIDESCENT"] = 17; values[valuesById[18] = "GRADIENT_MONSTERA"] = 18; values[valuesById[19] = "GRADIENT_BLISS"] = 19; values[valuesById[20] = "GRADIENT_SKY"] = 20; values[valuesById[21] = "GRADIENT_PEACH"] = 21; return values; })(); /** * BubbleColorPreset enum. * @name signalbackups.ChatStyle.BubbleColorPreset * @enum {number} * @property {number} UNKNOWN_BUBBLE_COLOR_PRESET=0 UNKNOWN_BUBBLE_COLOR_PRESET value * @property {number} SOLID_ULTRAMARINE=1 SOLID_ULTRAMARINE value * @property {number} SOLID_CRIMSON=2 SOLID_CRIMSON value * @property {number} SOLID_VERMILION=3 SOLID_VERMILION value * @property {number} SOLID_BURLAP=4 SOLID_BURLAP value * @property {number} SOLID_FOREST=5 SOLID_FOREST value * @property {number} SOLID_WINTERGREEN=6 SOLID_WINTERGREEN value * @property {number} SOLID_TEAL=7 SOLID_TEAL value * @property {number} SOLID_BLUE=8 SOLID_BLUE value * @property {number} SOLID_INDIGO=9 SOLID_INDIGO value * @property {number} SOLID_VIOLET=10 SOLID_VIOLET value * @property {number} SOLID_PLUM=11 SOLID_PLUM value * @property {number} SOLID_TAUPE=12 SOLID_TAUPE value * @property {number} SOLID_STEEL=13 SOLID_STEEL value * @property {number} GRADIENT_EMBER=14 GRADIENT_EMBER value * @property {number} GRADIENT_MIDNIGHT=15 GRADIENT_MIDNIGHT value * @property {number} GRADIENT_INFRARED=16 GRADIENT_INFRARED value * @property {number} GRADIENT_LAGOON=17 GRADIENT_LAGOON value * @property {number} GRADIENT_FLUORESCENT=18 GRADIENT_FLUORESCENT value * @property {number} GRADIENT_BASIL=19 GRADIENT_BASIL value * @property {number} GRADIENT_SUBLIME=20 GRADIENT_SUBLIME value * @property {number} GRADIENT_SEA=21 GRADIENT_SEA value * @property {number} GRADIENT_TANGERINE=22 GRADIENT_TANGERINE value */ ChatStyle.BubbleColorPreset = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "UNKNOWN_BUBBLE_COLOR_PRESET"] = 0; values[valuesById[1] = "SOLID_ULTRAMARINE"] = 1; values[valuesById[2] = "SOLID_CRIMSON"] = 2; values[valuesById[3] = "SOLID_VERMILION"] = 3; values[valuesById[4] = "SOLID_BURLAP"] = 4; values[valuesById[5] = "SOLID_FOREST"] = 5; values[valuesById[6] = "SOLID_WINTERGREEN"] = 6; values[valuesById[7] = "SOLID_TEAL"] = 7; values[valuesById[8] = "SOLID_BLUE"] = 8; values[valuesById[9] = "SOLID_INDIGO"] = 9; values[valuesById[10] = "SOLID_VIOLET"] = 10; values[valuesById[11] = "SOLID_PLUM"] = 11; values[valuesById[12] = "SOLID_TAUPE"] = 12; values[valuesById[13] = "SOLID_STEEL"] = 13; values[valuesById[14] = "GRADIENT_EMBER"] = 14; values[valuesById[15] = "GRADIENT_MIDNIGHT"] = 15; values[valuesById[16] = "GRADIENT_INFRARED"] = 16; values[valuesById[17] = "GRADIENT_LAGOON"] = 17; values[valuesById[18] = "GRADIENT_FLUORESCENT"] = 18; values[valuesById[19] = "GRADIENT_BASIL"] = 19; values[valuesById[20] = "GRADIENT_SUBLIME"] = 20; values[valuesById[21] = "GRADIENT_SEA"] = 21; values[valuesById[22] = "GRADIENT_TANGERINE"] = 22; return values; })(); return ChatStyle; })(); signalbackups.NotificationProfile = (function() { /** * Properties of a NotificationProfile. * @memberof signalbackups * @interface INotificationProfile * @property {string|null} [name] NotificationProfile name * @property {string|null} [emoji] NotificationProfile emoji * @property {number|null} [color] NotificationProfile color * @property {Long|null} [createdAtMs] NotificationProfile createdAtMs * @property {boolean|null} [allowAllCalls] NotificationProfile allowAllCalls * @property {boolean|null} [allowAllMentions] NotificationProfile allowAllMentions * @property {Array.|null} [allowedMembers] NotificationProfile allowedMembers * @property {boolean|null} [scheduleEnabled] NotificationProfile scheduleEnabled * @property {number|null} [scheduleStartTime] NotificationProfile scheduleStartTime * @property {number|null} [scheduleEndTime] NotificationProfile scheduleEndTime * @property {Array.|null} [scheduleDaysEnabled] NotificationProfile scheduleDaysEnabled * @property {Uint8Array|null} [id] NotificationProfile id */ /** * Constructs a new NotificationProfile. * @memberof signalbackups * @classdesc Represents a NotificationProfile. * @implements INotificationProfile * @constructor * @param {signalbackups.INotificationProfile=} [properties] Properties to set */ function NotificationProfile(properties) { this.allowedMembers = []; this.scheduleDaysEnabled = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * NotificationProfile name. * @member {string} name * @memberof signalbackups.NotificationProfile * @instance */ NotificationProfile.prototype.name = ""; /** * NotificationProfile emoji. * @member {string|null|undefined} emoji * @memberof signalbackups.NotificationProfile * @instance */ NotificationProfile.prototype.emoji = null; /** * NotificationProfile color. * @member {number} color * @memberof signalbackups.NotificationProfile * @instance */ NotificationProfile.prototype.color = 0; /** * NotificationProfile createdAtMs. * @member {Long} createdAtMs * @memberof signalbackups.NotificationProfile * @instance */ NotificationProfile.prototype.createdAtMs = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * NotificationProfile allowAllCalls. * @member {boolean} allowAllCalls * @memberof signalbackups.NotificationProfile * @instance */ NotificationProfile.prototype.allowAllCalls = false; /** * NotificationProfile allowAllMentions. * @member {boolean} allowAllMentions * @memberof signalbackups.NotificationProfile * @instance */ NotificationProfile.prototype.allowAllMentions = false; /** * NotificationProfile allowedMembers. * @member {Array.} allowedMembers * @memberof signalbackups.NotificationProfile * @instance */ NotificationProfile.prototype.allowedMembers = $util.emptyArray; /** * NotificationProfile scheduleEnabled. * @member {boolean} scheduleEnabled * @memberof signalbackups.NotificationProfile * @instance */ NotificationProfile.prototype.scheduleEnabled = false; /** * NotificationProfile scheduleStartTime. * @member {number} scheduleStartTime * @memberof signalbackups.NotificationProfile * @instance */ NotificationProfile.prototype.scheduleStartTime = 0; /** * NotificationProfile scheduleEndTime. * @member {number} scheduleEndTime * @memberof signalbackups.NotificationProfile * @instance */ NotificationProfile.prototype.scheduleEndTime = 0; /** * NotificationProfile scheduleDaysEnabled. * @member {Array.} scheduleDaysEnabled * @memberof signalbackups.NotificationProfile * @instance */ NotificationProfile.prototype.scheduleDaysEnabled = $util.emptyArray; /** * NotificationProfile id. * @member {Uint8Array} id * @memberof signalbackups.NotificationProfile * @instance */ NotificationProfile.prototype.id = $util.newBuffer([]); // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * NotificationProfile _emoji. * @member {"emoji"|undefined} _emoji * @memberof signalbackups.NotificationProfile * @instance */ Object.defineProperty(NotificationProfile.prototype, "_emoji", { get: $util.oneOfGetter($oneOfFields = ["emoji"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified NotificationProfile message. Does not implicitly {@link signalbackups.NotificationProfile.verify|verify} messages. * @function encode * @memberof signalbackups.NotificationProfile * @static * @param {signalbackups.INotificationProfile} message NotificationProfile message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ NotificationProfile.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.NotificationProfile.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.NotificationProfile.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.name != null && Object.hasOwnProperty.call(message, "name")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.name); if (message.emoji != null && Object.hasOwnProperty.call(message, "emoji")) writer.uint32(/* id 2, wireType 2 =*/18).string(message.emoji); if (message.color != null && Object.hasOwnProperty.call(message, "color")) writer.uint32(/* id 3, wireType 5 =*/29).fixed32(message.color); if (message.createdAtMs != null && Object.hasOwnProperty.call(message, "createdAtMs")) writer.uint32(/* id 4, wireType 0 =*/32).uint64(message.createdAtMs); if (message.allowAllCalls != null && Object.hasOwnProperty.call(message, "allowAllCalls")) writer.uint32(/* id 5, wireType 0 =*/40).bool(message.allowAllCalls); if (message.allowAllMentions != null && Object.hasOwnProperty.call(message, "allowAllMentions")) writer.uint32(/* id 6, wireType 0 =*/48).bool(message.allowAllMentions); if (message.allowedMembers != null && message.allowedMembers.length) { writer.uint32(/* id 7, wireType 2 =*/58).fork(); for (var i = 0; i < message.allowedMembers.length; ++i) writer.uint64(message.allowedMembers[i]); writer.ldelim(); } if (message.scheduleEnabled != null && Object.hasOwnProperty.call(message, "scheduleEnabled")) writer.uint32(/* id 8, wireType 0 =*/64).bool(message.scheduleEnabled); if (message.scheduleStartTime != null && Object.hasOwnProperty.call(message, "scheduleStartTime")) writer.uint32(/* id 9, wireType 0 =*/72).uint32(message.scheduleStartTime); if (message.scheduleEndTime != null && Object.hasOwnProperty.call(message, "scheduleEndTime")) writer.uint32(/* id 10, wireType 0 =*/80).uint32(message.scheduleEndTime); if (message.scheduleDaysEnabled != null && message.scheduleDaysEnabled.length) { writer.uint32(/* id 11, wireType 2 =*/90).fork(); for (var i = 0; i < message.scheduleDaysEnabled.length; ++i) writer.int32(message.scheduleDaysEnabled[i]); writer.ldelim(); } if (message.id != null && Object.hasOwnProperty.call(message, "id")) writer.uint32(/* id 12, wireType 2 =*/98).bytes(message.id); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified NotificationProfile message, length delimited. Does not implicitly {@link signalbackups.NotificationProfile.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.NotificationProfile * @static * @param {signalbackups.INotificationProfile} message NotificationProfile message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ NotificationProfile.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a NotificationProfile message from the specified reader or buffer. * @function decode * @memberof signalbackups.NotificationProfile * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.NotificationProfile} NotificationProfile * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ NotificationProfile.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.NotificationProfile(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.name = reader.string(); break; } case 2: { message.emoji = reader.string(); break; } case 3: { message.color = reader.fixed32(); break; } case 4: { message.createdAtMs = reader.uint64(); break; } case 5: { message.allowAllCalls = reader.bool(); break; } case 6: { message.allowAllMentions = reader.bool(); break; } case 7: { if (!(message.allowedMembers && message.allowedMembers.length)) message.allowedMembers = []; if ((tag & 7) === 2) { var end2 = reader.uint32() + reader.pos; while (reader.pos < end2) message.allowedMembers.push(reader.uint64()); } else message.allowedMembers.push(reader.uint64()); break; } case 8: { message.scheduleEnabled = reader.bool(); break; } case 9: { message.scheduleStartTime = reader.uint32(); break; } case 10: { message.scheduleEndTime = reader.uint32(); break; } case 11: { if (!(message.scheduleDaysEnabled && message.scheduleDaysEnabled.length)) message.scheduleDaysEnabled = []; if ((tag & 7) === 2) { var end2 = reader.uint32() + reader.pos; while (reader.pos < end2) message.scheduleDaysEnabled.push(reader.int32()); } else message.scheduleDaysEnabled.push(reader.int32()); break; } case 12: { message.id = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a NotificationProfile message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.NotificationProfile * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.NotificationProfile} NotificationProfile * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ NotificationProfile.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * DayOfWeek enum. * @name signalbackups.NotificationProfile.DayOfWeek * @enum {number} * @property {number} UNKNOWN=0 UNKNOWN value * @property {number} MONDAY=1 MONDAY value * @property {number} TUESDAY=2 TUESDAY value * @property {number} WEDNESDAY=3 WEDNESDAY value * @property {number} THURSDAY=4 THURSDAY value * @property {number} FRIDAY=5 FRIDAY value * @property {number} SATURDAY=6 SATURDAY value * @property {number} SUNDAY=7 SUNDAY value */ NotificationProfile.DayOfWeek = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "UNKNOWN"] = 0; values[valuesById[1] = "MONDAY"] = 1; values[valuesById[2] = "TUESDAY"] = 2; values[valuesById[3] = "WEDNESDAY"] = 3; values[valuesById[4] = "THURSDAY"] = 4; values[valuesById[5] = "FRIDAY"] = 5; values[valuesById[6] = "SATURDAY"] = 6; values[valuesById[7] = "SUNDAY"] = 7; return values; })(); return NotificationProfile; })(); signalbackups.ChatFolder = (function() { /** * Properties of a ChatFolder. * @memberof signalbackups * @interface IChatFolder * @property {string|null} [name] ChatFolder name * @property {boolean|null} [showOnlyUnread] ChatFolder showOnlyUnread * @property {boolean|null} [showMutedChats] ChatFolder showMutedChats * @property {boolean|null} [includeAllIndividualChats] ChatFolder includeAllIndividualChats * @property {boolean|null} [includeAllGroupChats] ChatFolder includeAllGroupChats * @property {signalbackups.ChatFolder.FolderType|null} [folderType] ChatFolder folderType * @property {Array.|null} [includedRecipientIds] ChatFolder includedRecipientIds * @property {Array.|null} [excludedRecipientIds] ChatFolder excludedRecipientIds * @property {Uint8Array|null} [id] ChatFolder id */ /** * Constructs a new ChatFolder. * @memberof signalbackups * @classdesc Represents a ChatFolder. * @implements IChatFolder * @constructor * @param {signalbackups.IChatFolder=} [properties] Properties to set */ function ChatFolder(properties) { this.includedRecipientIds = []; this.excludedRecipientIds = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * ChatFolder name. * @member {string} name * @memberof signalbackups.ChatFolder * @instance */ ChatFolder.prototype.name = ""; /** * ChatFolder showOnlyUnread. * @member {boolean} showOnlyUnread * @memberof signalbackups.ChatFolder * @instance */ ChatFolder.prototype.showOnlyUnread = false; /** * ChatFolder showMutedChats. * @member {boolean} showMutedChats * @memberof signalbackups.ChatFolder * @instance */ ChatFolder.prototype.showMutedChats = false; /** * ChatFolder includeAllIndividualChats. * @member {boolean} includeAllIndividualChats * @memberof signalbackups.ChatFolder * @instance */ ChatFolder.prototype.includeAllIndividualChats = false; /** * ChatFolder includeAllGroupChats. * @member {boolean} includeAllGroupChats * @memberof signalbackups.ChatFolder * @instance */ ChatFolder.prototype.includeAllGroupChats = false; /** * ChatFolder folderType. * @member {signalbackups.ChatFolder.FolderType} folderType * @memberof signalbackups.ChatFolder * @instance */ ChatFolder.prototype.folderType = 0; /** * ChatFolder includedRecipientIds. * @member {Array.} includedRecipientIds * @memberof signalbackups.ChatFolder * @instance */ ChatFolder.prototype.includedRecipientIds = $util.emptyArray; /** * ChatFolder excludedRecipientIds. * @member {Array.} excludedRecipientIds * @memberof signalbackups.ChatFolder * @instance */ ChatFolder.prototype.excludedRecipientIds = $util.emptyArray; /** * ChatFolder id. * @member {Uint8Array} id * @memberof signalbackups.ChatFolder * @instance */ ChatFolder.prototype.id = $util.newBuffer([]); /** * Encodes the specified ChatFolder message. Does not implicitly {@link signalbackups.ChatFolder.verify|verify} messages. * @function encode * @memberof signalbackups.ChatFolder * @static * @param {signalbackups.IChatFolder} message ChatFolder message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ChatFolder.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signalbackups.ChatFolder.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signalbackups.ChatFolder.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.name != null && Object.hasOwnProperty.call(message, "name")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.name); if (message.showOnlyUnread != null && Object.hasOwnProperty.call(message, "showOnlyUnread")) writer.uint32(/* id 2, wireType 0 =*/16).bool(message.showOnlyUnread); if (message.showMutedChats != null && Object.hasOwnProperty.call(message, "showMutedChats")) writer.uint32(/* id 3, wireType 0 =*/24).bool(message.showMutedChats); if (message.includeAllIndividualChats != null && Object.hasOwnProperty.call(message, "includeAllIndividualChats")) writer.uint32(/* id 4, wireType 0 =*/32).bool(message.includeAllIndividualChats); if (message.includeAllGroupChats != null && Object.hasOwnProperty.call(message, "includeAllGroupChats")) writer.uint32(/* id 5, wireType 0 =*/40).bool(message.includeAllGroupChats); if (message.folderType != null && Object.hasOwnProperty.call(message, "folderType")) writer.uint32(/* id 6, wireType 0 =*/48).int32(message.folderType); if (message.includedRecipientIds != null && message.includedRecipientIds.length) { writer.uint32(/* id 7, wireType 2 =*/58).fork(); for (var i = 0; i < message.includedRecipientIds.length; ++i) writer.uint64(message.includedRecipientIds[i]); writer.ldelim(); } if (message.excludedRecipientIds != null && message.excludedRecipientIds.length) { writer.uint32(/* id 8, wireType 2 =*/66).fork(); for (var i = 0; i < message.excludedRecipientIds.length; ++i) writer.uint64(message.excludedRecipientIds[i]); writer.ldelim(); } if (message.id != null && Object.hasOwnProperty.call(message, "id")) writer.uint32(/* id 9, wireType 2 =*/74).bytes(message.id); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified ChatFolder message, length delimited. Does not implicitly {@link signalbackups.ChatFolder.verify|verify} messages. * @function encodeDelimited * @memberof signalbackups.ChatFolder * @static * @param {signalbackups.IChatFolder} message ChatFolder message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ChatFolder.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a ChatFolder message from the specified reader or buffer. * @function decode * @memberof signalbackups.ChatFolder * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signalbackups.ChatFolder} ChatFolder * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ChatFolder.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signalbackups.ChatFolder(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.name = reader.string(); break; } case 2: { message.showOnlyUnread = reader.bool(); break; } case 3: { message.showMutedChats = reader.bool(); break; } case 4: { message.includeAllIndividualChats = reader.bool(); break; } case 5: { message.includeAllGroupChats = reader.bool(); break; } case 6: { message.folderType = reader.int32(); break; } case 7: { if (!(message.includedRecipientIds && message.includedRecipientIds.length)) message.includedRecipientIds = []; if ((tag & 7) === 2) { var end2 = reader.uint32() + reader.pos; while (reader.pos < end2) message.includedRecipientIds.push(reader.uint64()); } else message.includedRecipientIds.push(reader.uint64()); break; } case 8: { if (!(message.excludedRecipientIds && message.excludedRecipientIds.length)) message.excludedRecipientIds = []; if ((tag & 7) === 2) { var end2 = reader.uint32() + reader.pos; while (reader.pos < end2) message.excludedRecipientIds.push(reader.uint64()); } else message.excludedRecipientIds.push(reader.uint64()); break; } case 9: { message.id = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a ChatFolder message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signalbackups.ChatFolder * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signalbackups.ChatFolder} ChatFolder * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ChatFolder.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * FolderType enum. * @name signalbackups.ChatFolder.FolderType * @enum {number} * @property {number} UNKNOWN=0 UNKNOWN value * @property {number} ALL=1 ALL value * @property {number} CUSTOM=2 CUSTOM value */ ChatFolder.FolderType = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "UNKNOWN"] = 0; values[valuesById[1] = "ALL"] = 1; values[valuesById[2] = "CUSTOM"] = 2; return values; })(); return ChatFolder; })(); return signalbackups; })(); $root.signal = (function() { /** * Namespace signal. * @exports signal * @namespace */ var signal = {}; signal.proto = (function() { /** * Namespace proto. * @memberof signal * @namespace */ var proto = {}; proto.storage = (function() { /** * Namespace storage. * @memberof signal.proto * @namespace */ var storage = {}; storage.SessionStructure = (function() { /** * Properties of a SessionStructure. * @memberof signal.proto.storage * @interface ISessionStructure * @property {number|null} [sessionVersion] SessionStructure sessionVersion * @property {Uint8Array|null} [localIdentityPublic] SessionStructure localIdentityPublic * @property {Uint8Array|null} [remoteIdentityPublic] SessionStructure remoteIdentityPublic * @property {Uint8Array|null} [rootKey] SessionStructure rootKey * @property {number|null} [previousCounter] SessionStructure previousCounter * @property {signal.proto.storage.SessionStructure.IChain|null} [senderChain] SessionStructure senderChain * @property {Array.|null} [receiverChains] SessionStructure receiverChains * @property {signal.proto.storage.SessionStructure.IPendingPreKey|null} [pendingPreKey] SessionStructure pendingPreKey * @property {number|null} [remoteRegistrationId] SessionStructure remoteRegistrationId * @property {number|null} [localRegistrationId] SessionStructure localRegistrationId * @property {boolean|null} [needsRefresh] SessionStructure needsRefresh * @property {Uint8Array|null} [aliceBaseKey] SessionStructure aliceBaseKey */ /** * Constructs a new SessionStructure. * @memberof signal.proto.storage * @classdesc Represents a SessionStructure. * @implements ISessionStructure * @constructor * @param {signal.proto.storage.ISessionStructure=} [properties] Properties to set */ function SessionStructure(properties) { this.receiverChains = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * SessionStructure sessionVersion. * @member {number} sessionVersion * @memberof signal.proto.storage.SessionStructure * @instance */ SessionStructure.prototype.sessionVersion = 0; /** * SessionStructure localIdentityPublic. * @member {Uint8Array} localIdentityPublic * @memberof signal.proto.storage.SessionStructure * @instance */ SessionStructure.prototype.localIdentityPublic = $util.newBuffer([]); /** * SessionStructure remoteIdentityPublic. * @member {Uint8Array} remoteIdentityPublic * @memberof signal.proto.storage.SessionStructure * @instance */ SessionStructure.prototype.remoteIdentityPublic = $util.newBuffer([]); /** * SessionStructure rootKey. * @member {Uint8Array} rootKey * @memberof signal.proto.storage.SessionStructure * @instance */ SessionStructure.prototype.rootKey = $util.newBuffer([]); /** * SessionStructure previousCounter. * @member {number} previousCounter * @memberof signal.proto.storage.SessionStructure * @instance */ SessionStructure.prototype.previousCounter = 0; /** * SessionStructure senderChain. * @member {signal.proto.storage.SessionStructure.IChain|null|undefined} senderChain * @memberof signal.proto.storage.SessionStructure * @instance */ SessionStructure.prototype.senderChain = null; /** * SessionStructure receiverChains. * @member {Array.} receiverChains * @memberof signal.proto.storage.SessionStructure * @instance */ SessionStructure.prototype.receiverChains = $util.emptyArray; /** * SessionStructure pendingPreKey. * @member {signal.proto.storage.SessionStructure.IPendingPreKey|null|undefined} pendingPreKey * @memberof signal.proto.storage.SessionStructure * @instance */ SessionStructure.prototype.pendingPreKey = null; /** * SessionStructure remoteRegistrationId. * @member {number} remoteRegistrationId * @memberof signal.proto.storage.SessionStructure * @instance */ SessionStructure.prototype.remoteRegistrationId = 0; /** * SessionStructure localRegistrationId. * @member {number} localRegistrationId * @memberof signal.proto.storage.SessionStructure * @instance */ SessionStructure.prototype.localRegistrationId = 0; /** * SessionStructure needsRefresh. * @member {boolean} needsRefresh * @memberof signal.proto.storage.SessionStructure * @instance */ SessionStructure.prototype.needsRefresh = false; /** * SessionStructure aliceBaseKey. * @member {Uint8Array} aliceBaseKey * @memberof signal.proto.storage.SessionStructure * @instance */ SessionStructure.prototype.aliceBaseKey = $util.newBuffer([]); /** * Encodes the specified SessionStructure message. Does not implicitly {@link signal.proto.storage.SessionStructure.verify|verify} messages. * @function encode * @memberof signal.proto.storage.SessionStructure * @static * @param {signal.proto.storage.ISessionStructure} message SessionStructure message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ SessionStructure.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signal.proto.storage.SessionStructure.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signal.proto.storage.SessionStructure.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.sessionVersion != null && Object.hasOwnProperty.call(message, "sessionVersion")) writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.sessionVersion); if (message.localIdentityPublic != null && Object.hasOwnProperty.call(message, "localIdentityPublic")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.localIdentityPublic); if (message.remoteIdentityPublic != null && Object.hasOwnProperty.call(message, "remoteIdentityPublic")) writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.remoteIdentityPublic); if (message.rootKey != null && Object.hasOwnProperty.call(message, "rootKey")) writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.rootKey); if (message.previousCounter != null && Object.hasOwnProperty.call(message, "previousCounter")) writer.uint32(/* id 5, wireType 0 =*/40).uint32(message.previousCounter); if (message.senderChain != null && Object.hasOwnProperty.call(message, "senderChain")) $root.signal.proto.storage.SessionStructure.Chain.encode(message.senderChain, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim(); if (message.receiverChains != null && message.receiverChains.length) for (var i = 0; i < message.receiverChains.length; ++i) $root.signal.proto.storage.SessionStructure.Chain.encode(message.receiverChains[i], writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim(); if (message.pendingPreKey != null && Object.hasOwnProperty.call(message, "pendingPreKey")) $root.signal.proto.storage.SessionStructure.PendingPreKey.encode(message.pendingPreKey, writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim(); if (message.remoteRegistrationId != null && Object.hasOwnProperty.call(message, "remoteRegistrationId")) writer.uint32(/* id 10, wireType 0 =*/80).uint32(message.remoteRegistrationId); if (message.localRegistrationId != null && Object.hasOwnProperty.call(message, "localRegistrationId")) writer.uint32(/* id 11, wireType 0 =*/88).uint32(message.localRegistrationId); if (message.needsRefresh != null && Object.hasOwnProperty.call(message, "needsRefresh")) writer.uint32(/* id 12, wireType 0 =*/96).bool(message.needsRefresh); if (message.aliceBaseKey != null && Object.hasOwnProperty.call(message, "aliceBaseKey")) writer.uint32(/* id 13, wireType 2 =*/106).bytes(message.aliceBaseKey); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified SessionStructure message, length delimited. Does not implicitly {@link signal.proto.storage.SessionStructure.verify|verify} messages. * @function encodeDelimited * @memberof signal.proto.storage.SessionStructure * @static * @param {signal.proto.storage.ISessionStructure} message SessionStructure message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ SessionStructure.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a SessionStructure message from the specified reader or buffer. * @function decode * @memberof signal.proto.storage.SessionStructure * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signal.proto.storage.SessionStructure} SessionStructure * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ SessionStructure.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signal.proto.storage.SessionStructure(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.sessionVersion = reader.uint32(); break; } case 2: { message.localIdentityPublic = reader.bytes(); break; } case 3: { message.remoteIdentityPublic = reader.bytes(); break; } case 4: { message.rootKey = reader.bytes(); break; } case 5: { message.previousCounter = reader.uint32(); break; } case 6: { message.senderChain = $root.signal.proto.storage.SessionStructure.Chain.decode(reader, reader.uint32()); break; } case 7: { if (!(message.receiverChains && message.receiverChains.length)) message.receiverChains = []; message.receiverChains.push($root.signal.proto.storage.SessionStructure.Chain.decode(reader, reader.uint32())); break; } case 9: { message.pendingPreKey = $root.signal.proto.storage.SessionStructure.PendingPreKey.decode(reader, reader.uint32()); break; } case 10: { message.remoteRegistrationId = reader.uint32(); break; } case 11: { message.localRegistrationId = reader.uint32(); break; } case 12: { message.needsRefresh = reader.bool(); break; } case 13: { message.aliceBaseKey = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a SessionStructure message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signal.proto.storage.SessionStructure * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signal.proto.storage.SessionStructure} SessionStructure * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ SessionStructure.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; SessionStructure.Chain = (function() { /** * Properties of a Chain. * @memberof signal.proto.storage.SessionStructure * @interface IChain * @property {Uint8Array|null} [senderRatchetKey] Chain senderRatchetKey * @property {Uint8Array|null} [senderRatchetKeyPrivate] Chain senderRatchetKeyPrivate * @property {signal.proto.storage.SessionStructure.Chain.IChainKey|null} [chainKey] Chain chainKey * @property {Array.|null} [messageKeys] Chain messageKeys */ /** * Constructs a new Chain. * @memberof signal.proto.storage.SessionStructure * @classdesc Represents a Chain. * @implements IChain * @constructor * @param {signal.proto.storage.SessionStructure.IChain=} [properties] Properties to set */ function Chain(properties) { this.messageKeys = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Chain senderRatchetKey. * @member {Uint8Array} senderRatchetKey * @memberof signal.proto.storage.SessionStructure.Chain * @instance */ Chain.prototype.senderRatchetKey = $util.newBuffer([]); /** * Chain senderRatchetKeyPrivate. * @member {Uint8Array} senderRatchetKeyPrivate * @memberof signal.proto.storage.SessionStructure.Chain * @instance */ Chain.prototype.senderRatchetKeyPrivate = $util.newBuffer([]); /** * Chain chainKey. * @member {signal.proto.storage.SessionStructure.Chain.IChainKey|null|undefined} chainKey * @memberof signal.proto.storage.SessionStructure.Chain * @instance */ Chain.prototype.chainKey = null; /** * Chain messageKeys. * @member {Array.} messageKeys * @memberof signal.proto.storage.SessionStructure.Chain * @instance */ Chain.prototype.messageKeys = $util.emptyArray; /** * Encodes the specified Chain message. Does not implicitly {@link signal.proto.storage.SessionStructure.Chain.verify|verify} messages. * @function encode * @memberof signal.proto.storage.SessionStructure.Chain * @static * @param {signal.proto.storage.SessionStructure.IChain} message Chain message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Chain.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signal.proto.storage.SessionStructure.Chain.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signal.proto.storage.SessionStructure.Chain.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.senderRatchetKey != null && Object.hasOwnProperty.call(message, "senderRatchetKey")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.senderRatchetKey); if (message.senderRatchetKeyPrivate != null && Object.hasOwnProperty.call(message, "senderRatchetKeyPrivate")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.senderRatchetKeyPrivate); if (message.chainKey != null && Object.hasOwnProperty.call(message, "chainKey")) $root.signal.proto.storage.SessionStructure.Chain.ChainKey.encode(message.chainKey, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); if (message.messageKeys != null && message.messageKeys.length) for (var i = 0; i < message.messageKeys.length; ++i) $root.signal.proto.storage.SessionStructure.Chain.MessageKey.encode(message.messageKeys[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Chain message, length delimited. Does not implicitly {@link signal.proto.storage.SessionStructure.Chain.verify|verify} messages. * @function encodeDelimited * @memberof signal.proto.storage.SessionStructure.Chain * @static * @param {signal.proto.storage.SessionStructure.IChain} message Chain message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Chain.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Chain message from the specified reader or buffer. * @function decode * @memberof signal.proto.storage.SessionStructure.Chain * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signal.proto.storage.SessionStructure.Chain} Chain * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Chain.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signal.proto.storage.SessionStructure.Chain(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.senderRatchetKey = reader.bytes(); break; } case 2: { message.senderRatchetKeyPrivate = reader.bytes(); break; } case 3: { message.chainKey = $root.signal.proto.storage.SessionStructure.Chain.ChainKey.decode(reader, reader.uint32()); break; } case 4: { if (!(message.messageKeys && message.messageKeys.length)) message.messageKeys = []; message.messageKeys.push($root.signal.proto.storage.SessionStructure.Chain.MessageKey.decode(reader, reader.uint32())); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Chain message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signal.proto.storage.SessionStructure.Chain * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signal.proto.storage.SessionStructure.Chain} Chain * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Chain.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; Chain.ChainKey = (function() { /** * Properties of a ChainKey. * @memberof signal.proto.storage.SessionStructure.Chain * @interface IChainKey * @property {number|null} [index] ChainKey index * @property {Uint8Array|null} [key] ChainKey key */ /** * Constructs a new ChainKey. * @memberof signal.proto.storage.SessionStructure.Chain * @classdesc Represents a ChainKey. * @implements IChainKey * @constructor * @param {signal.proto.storage.SessionStructure.Chain.IChainKey=} [properties] Properties to set */ function ChainKey(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * ChainKey index. * @member {number} index * @memberof signal.proto.storage.SessionStructure.Chain.ChainKey * @instance */ ChainKey.prototype.index = 0; /** * ChainKey key. * @member {Uint8Array} key * @memberof signal.proto.storage.SessionStructure.Chain.ChainKey * @instance */ ChainKey.prototype.key = $util.newBuffer([]); /** * Encodes the specified ChainKey message. Does not implicitly {@link signal.proto.storage.SessionStructure.Chain.ChainKey.verify|verify} messages. * @function encode * @memberof signal.proto.storage.SessionStructure.Chain.ChainKey * @static * @param {signal.proto.storage.SessionStructure.Chain.IChainKey} message ChainKey message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ChainKey.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signal.proto.storage.SessionStructure.Chain.ChainKey.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signal.proto.storage.SessionStructure.Chain.ChainKey.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.index != null && Object.hasOwnProperty.call(message, "index")) writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.index); if (message.key != null && Object.hasOwnProperty.call(message, "key")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.key); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified ChainKey message, length delimited. Does not implicitly {@link signal.proto.storage.SessionStructure.Chain.ChainKey.verify|verify} messages. * @function encodeDelimited * @memberof signal.proto.storage.SessionStructure.Chain.ChainKey * @static * @param {signal.proto.storage.SessionStructure.Chain.IChainKey} message ChainKey message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ChainKey.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a ChainKey message from the specified reader or buffer. * @function decode * @memberof signal.proto.storage.SessionStructure.Chain.ChainKey * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signal.proto.storage.SessionStructure.Chain.ChainKey} ChainKey * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ChainKey.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signal.proto.storage.SessionStructure.Chain.ChainKey(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.index = reader.uint32(); break; } case 2: { message.key = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a ChainKey message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signal.proto.storage.SessionStructure.Chain.ChainKey * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signal.proto.storage.SessionStructure.Chain.ChainKey} ChainKey * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ChainKey.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return ChainKey; })(); Chain.MessageKey = (function() { /** * Properties of a MessageKey. * @memberof signal.proto.storage.SessionStructure.Chain * @interface IMessageKey * @property {number|null} [index] MessageKey index * @property {Uint8Array|null} [cipherKey] MessageKey cipherKey * @property {Uint8Array|null} [macKey] MessageKey macKey * @property {Uint8Array|null} [iv] MessageKey iv */ /** * Constructs a new MessageKey. * @memberof signal.proto.storage.SessionStructure.Chain * @classdesc Represents a MessageKey. * @implements IMessageKey * @constructor * @param {signal.proto.storage.SessionStructure.Chain.IMessageKey=} [properties] Properties to set */ function MessageKey(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * MessageKey index. * @member {number} index * @memberof signal.proto.storage.SessionStructure.Chain.MessageKey * @instance */ MessageKey.prototype.index = 0; /** * MessageKey cipherKey. * @member {Uint8Array} cipherKey * @memberof signal.proto.storage.SessionStructure.Chain.MessageKey * @instance */ MessageKey.prototype.cipherKey = $util.newBuffer([]); /** * MessageKey macKey. * @member {Uint8Array} macKey * @memberof signal.proto.storage.SessionStructure.Chain.MessageKey * @instance */ MessageKey.prototype.macKey = $util.newBuffer([]); /** * MessageKey iv. * @member {Uint8Array} iv * @memberof signal.proto.storage.SessionStructure.Chain.MessageKey * @instance */ MessageKey.prototype.iv = $util.newBuffer([]); /** * Encodes the specified MessageKey message. Does not implicitly {@link signal.proto.storage.SessionStructure.Chain.MessageKey.verify|verify} messages. * @function encode * @memberof signal.proto.storage.SessionStructure.Chain.MessageKey * @static * @param {signal.proto.storage.SessionStructure.Chain.IMessageKey} message MessageKey message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ MessageKey.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signal.proto.storage.SessionStructure.Chain.MessageKey.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signal.proto.storage.SessionStructure.Chain.MessageKey.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.index != null && Object.hasOwnProperty.call(message, "index")) writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.index); if (message.cipherKey != null && Object.hasOwnProperty.call(message, "cipherKey")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.cipherKey); if (message.macKey != null && Object.hasOwnProperty.call(message, "macKey")) writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.macKey); if (message.iv != null && Object.hasOwnProperty.call(message, "iv")) writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.iv); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified MessageKey message, length delimited. Does not implicitly {@link signal.proto.storage.SessionStructure.Chain.MessageKey.verify|verify} messages. * @function encodeDelimited * @memberof signal.proto.storage.SessionStructure.Chain.MessageKey * @static * @param {signal.proto.storage.SessionStructure.Chain.IMessageKey} message MessageKey message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ MessageKey.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a MessageKey message from the specified reader or buffer. * @function decode * @memberof signal.proto.storage.SessionStructure.Chain.MessageKey * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signal.proto.storage.SessionStructure.Chain.MessageKey} MessageKey * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ MessageKey.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signal.proto.storage.SessionStructure.Chain.MessageKey(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.index = reader.uint32(); break; } case 2: { message.cipherKey = reader.bytes(); break; } case 3: { message.macKey = reader.bytes(); break; } case 4: { message.iv = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a MessageKey message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signal.proto.storage.SessionStructure.Chain.MessageKey * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signal.proto.storage.SessionStructure.Chain.MessageKey} MessageKey * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ MessageKey.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return MessageKey; })(); return Chain; })(); SessionStructure.PendingPreKey = (function() { /** * Properties of a PendingPreKey. * @memberof signal.proto.storage.SessionStructure * @interface IPendingPreKey * @property {number|null} [preKeyId] PendingPreKey preKeyId * @property {number|null} [signedPreKeyId] PendingPreKey signedPreKeyId * @property {Uint8Array|null} [baseKey] PendingPreKey baseKey */ /** * Constructs a new PendingPreKey. * @memberof signal.proto.storage.SessionStructure * @classdesc Represents a PendingPreKey. * @implements IPendingPreKey * @constructor * @param {signal.proto.storage.SessionStructure.IPendingPreKey=} [properties] Properties to set */ function PendingPreKey(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * PendingPreKey preKeyId. * @member {number} preKeyId * @memberof signal.proto.storage.SessionStructure.PendingPreKey * @instance */ PendingPreKey.prototype.preKeyId = 0; /** * PendingPreKey signedPreKeyId. * @member {number} signedPreKeyId * @memberof signal.proto.storage.SessionStructure.PendingPreKey * @instance */ PendingPreKey.prototype.signedPreKeyId = 0; /** * PendingPreKey baseKey. * @member {Uint8Array} baseKey * @memberof signal.proto.storage.SessionStructure.PendingPreKey * @instance */ PendingPreKey.prototype.baseKey = $util.newBuffer([]); /** * Encodes the specified PendingPreKey message. Does not implicitly {@link signal.proto.storage.SessionStructure.PendingPreKey.verify|verify} messages. * @function encode * @memberof signal.proto.storage.SessionStructure.PendingPreKey * @static * @param {signal.proto.storage.SessionStructure.IPendingPreKey} message PendingPreKey message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ PendingPreKey.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signal.proto.storage.SessionStructure.PendingPreKey.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signal.proto.storage.SessionStructure.PendingPreKey.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.preKeyId != null && Object.hasOwnProperty.call(message, "preKeyId")) writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.preKeyId); if (message.baseKey != null && Object.hasOwnProperty.call(message, "baseKey")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.baseKey); if (message.signedPreKeyId != null && Object.hasOwnProperty.call(message, "signedPreKeyId")) writer.uint32(/* id 3, wireType 0 =*/24).int32(message.signedPreKeyId); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified PendingPreKey message, length delimited. Does not implicitly {@link signal.proto.storage.SessionStructure.PendingPreKey.verify|verify} messages. * @function encodeDelimited * @memberof signal.proto.storage.SessionStructure.PendingPreKey * @static * @param {signal.proto.storage.SessionStructure.IPendingPreKey} message PendingPreKey message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ PendingPreKey.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a PendingPreKey message from the specified reader or buffer. * @function decode * @memberof signal.proto.storage.SessionStructure.PendingPreKey * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signal.proto.storage.SessionStructure.PendingPreKey} PendingPreKey * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ PendingPreKey.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signal.proto.storage.SessionStructure.PendingPreKey(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.preKeyId = reader.uint32(); break; } case 3: { message.signedPreKeyId = reader.int32(); break; } case 2: { message.baseKey = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a PendingPreKey message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signal.proto.storage.SessionStructure.PendingPreKey * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signal.proto.storage.SessionStructure.PendingPreKey} PendingPreKey * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ PendingPreKey.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return PendingPreKey; })(); return SessionStructure; })(); storage.RecordStructure = (function() { /** * Properties of a RecordStructure. * @memberof signal.proto.storage * @interface IRecordStructure * @property {signal.proto.storage.ISessionStructure|null} [currentSession] RecordStructure currentSession * @property {Array.|null} [previousSessions] RecordStructure previousSessions */ /** * Constructs a new RecordStructure. * @memberof signal.proto.storage * @classdesc Represents a RecordStructure. * @implements IRecordStructure * @constructor * @param {signal.proto.storage.IRecordStructure=} [properties] Properties to set */ function RecordStructure(properties) { this.previousSessions = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * RecordStructure currentSession. * @member {signal.proto.storage.ISessionStructure|null|undefined} currentSession * @memberof signal.proto.storage.RecordStructure * @instance */ RecordStructure.prototype.currentSession = null; /** * RecordStructure previousSessions. * @member {Array.} previousSessions * @memberof signal.proto.storage.RecordStructure * @instance */ RecordStructure.prototype.previousSessions = $util.emptyArray; /** * Encodes the specified RecordStructure message. Does not implicitly {@link signal.proto.storage.RecordStructure.verify|verify} messages. * @function encode * @memberof signal.proto.storage.RecordStructure * @static * @param {signal.proto.storage.IRecordStructure} message RecordStructure message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ RecordStructure.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signal.proto.storage.RecordStructure.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signal.proto.storage.RecordStructure.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.currentSession != null && Object.hasOwnProperty.call(message, "currentSession")) $root.signal.proto.storage.SessionStructure.encode(message.currentSession, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.previousSessions != null && message.previousSessions.length) for (var i = 0; i < message.previousSessions.length; ++i) $root.signal.proto.storage.SessionStructure.encode(message.previousSessions[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified RecordStructure message, length delimited. Does not implicitly {@link signal.proto.storage.RecordStructure.verify|verify} messages. * @function encodeDelimited * @memberof signal.proto.storage.RecordStructure * @static * @param {signal.proto.storage.IRecordStructure} message RecordStructure message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ RecordStructure.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a RecordStructure message from the specified reader or buffer. * @function decode * @memberof signal.proto.storage.RecordStructure * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signal.proto.storage.RecordStructure} RecordStructure * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ RecordStructure.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signal.proto.storage.RecordStructure(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.currentSession = $root.signal.proto.storage.SessionStructure.decode(reader, reader.uint32()); break; } case 2: { if (!(message.previousSessions && message.previousSessions.length)) message.previousSessions = []; message.previousSessions.push($root.signal.proto.storage.SessionStructure.decode(reader, reader.uint32())); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a RecordStructure message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signal.proto.storage.RecordStructure * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signal.proto.storage.RecordStructure} RecordStructure * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ RecordStructure.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return RecordStructure; })(); storage.PreKeyRecordStructure = (function() { /** * Properties of a PreKeyRecordStructure. * @memberof signal.proto.storage * @interface IPreKeyRecordStructure * @property {number|null} [id] PreKeyRecordStructure id * @property {Uint8Array|null} [publicKey] PreKeyRecordStructure publicKey * @property {Uint8Array|null} [privateKey] PreKeyRecordStructure privateKey */ /** * Constructs a new PreKeyRecordStructure. * @memberof signal.proto.storage * @classdesc Represents a PreKeyRecordStructure. * @implements IPreKeyRecordStructure * @constructor * @param {signal.proto.storage.IPreKeyRecordStructure=} [properties] Properties to set */ function PreKeyRecordStructure(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * PreKeyRecordStructure id. * @member {number} id * @memberof signal.proto.storage.PreKeyRecordStructure * @instance */ PreKeyRecordStructure.prototype.id = 0; /** * PreKeyRecordStructure publicKey. * @member {Uint8Array} publicKey * @memberof signal.proto.storage.PreKeyRecordStructure * @instance */ PreKeyRecordStructure.prototype.publicKey = $util.newBuffer([]); /** * PreKeyRecordStructure privateKey. * @member {Uint8Array} privateKey * @memberof signal.proto.storage.PreKeyRecordStructure * @instance */ PreKeyRecordStructure.prototype.privateKey = $util.newBuffer([]); /** * Encodes the specified PreKeyRecordStructure message. Does not implicitly {@link signal.proto.storage.PreKeyRecordStructure.verify|verify} messages. * @function encode * @memberof signal.proto.storage.PreKeyRecordStructure * @static * @param {signal.proto.storage.IPreKeyRecordStructure} message PreKeyRecordStructure message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ PreKeyRecordStructure.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signal.proto.storage.PreKeyRecordStructure.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signal.proto.storage.PreKeyRecordStructure.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.id != null && Object.hasOwnProperty.call(message, "id")) writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.id); if (message.publicKey != null && Object.hasOwnProperty.call(message, "publicKey")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.publicKey); if (message.privateKey != null && Object.hasOwnProperty.call(message, "privateKey")) writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.privateKey); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified PreKeyRecordStructure message, length delimited. Does not implicitly {@link signal.proto.storage.PreKeyRecordStructure.verify|verify} messages. * @function encodeDelimited * @memberof signal.proto.storage.PreKeyRecordStructure * @static * @param {signal.proto.storage.IPreKeyRecordStructure} message PreKeyRecordStructure message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ PreKeyRecordStructure.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a PreKeyRecordStructure message from the specified reader or buffer. * @function decode * @memberof signal.proto.storage.PreKeyRecordStructure * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signal.proto.storage.PreKeyRecordStructure} PreKeyRecordStructure * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ PreKeyRecordStructure.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signal.proto.storage.PreKeyRecordStructure(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.id = reader.uint32(); break; } case 2: { message.publicKey = reader.bytes(); break; } case 3: { message.privateKey = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a PreKeyRecordStructure message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signal.proto.storage.PreKeyRecordStructure * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signal.proto.storage.PreKeyRecordStructure} PreKeyRecordStructure * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ PreKeyRecordStructure.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return PreKeyRecordStructure; })(); storage.SignedPreKeyRecordStructure = (function() { /** * Properties of a SignedPreKeyRecordStructure. * @memberof signal.proto.storage * @interface ISignedPreKeyRecordStructure * @property {number|null} [id] SignedPreKeyRecordStructure id * @property {Uint8Array|null} [publicKey] SignedPreKeyRecordStructure publicKey * @property {Uint8Array|null} [privateKey] SignedPreKeyRecordStructure privateKey * @property {Uint8Array|null} [signature] SignedPreKeyRecordStructure signature * @property {Long|null} [timestamp] SignedPreKeyRecordStructure timestamp */ /** * Constructs a new SignedPreKeyRecordStructure. * @memberof signal.proto.storage * @classdesc Represents a SignedPreKeyRecordStructure. * @implements ISignedPreKeyRecordStructure * @constructor * @param {signal.proto.storage.ISignedPreKeyRecordStructure=} [properties] Properties to set */ function SignedPreKeyRecordStructure(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * SignedPreKeyRecordStructure id. * @member {number} id * @memberof signal.proto.storage.SignedPreKeyRecordStructure * @instance */ SignedPreKeyRecordStructure.prototype.id = 0; /** * SignedPreKeyRecordStructure publicKey. * @member {Uint8Array} publicKey * @memberof signal.proto.storage.SignedPreKeyRecordStructure * @instance */ SignedPreKeyRecordStructure.prototype.publicKey = $util.newBuffer([]); /** * SignedPreKeyRecordStructure privateKey. * @member {Uint8Array} privateKey * @memberof signal.proto.storage.SignedPreKeyRecordStructure * @instance */ SignedPreKeyRecordStructure.prototype.privateKey = $util.newBuffer([]); /** * SignedPreKeyRecordStructure signature. * @member {Uint8Array} signature * @memberof signal.proto.storage.SignedPreKeyRecordStructure * @instance */ SignedPreKeyRecordStructure.prototype.signature = $util.newBuffer([]); /** * SignedPreKeyRecordStructure timestamp. * @member {Long} timestamp * @memberof signal.proto.storage.SignedPreKeyRecordStructure * @instance */ SignedPreKeyRecordStructure.prototype.timestamp = $util.Long ? $util.Long.fromBits(0,0,false) : 0; /** * Encodes the specified SignedPreKeyRecordStructure message. Does not implicitly {@link signal.proto.storage.SignedPreKeyRecordStructure.verify|verify} messages. * @function encode * @memberof signal.proto.storage.SignedPreKeyRecordStructure * @static * @param {signal.proto.storage.ISignedPreKeyRecordStructure} message SignedPreKeyRecordStructure message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ SignedPreKeyRecordStructure.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signal.proto.storage.SignedPreKeyRecordStructure.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signal.proto.storage.SignedPreKeyRecordStructure.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.id != null && Object.hasOwnProperty.call(message, "id")) writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.id); if (message.publicKey != null && Object.hasOwnProperty.call(message, "publicKey")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.publicKey); if (message.privateKey != null && Object.hasOwnProperty.call(message, "privateKey")) writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.privateKey); if (message.signature != null && Object.hasOwnProperty.call(message, "signature")) writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.signature); if (message.timestamp != null && Object.hasOwnProperty.call(message, "timestamp")) writer.uint32(/* id 5, wireType 1 =*/41).fixed64(message.timestamp); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified SignedPreKeyRecordStructure message, length delimited. Does not implicitly {@link signal.proto.storage.SignedPreKeyRecordStructure.verify|verify} messages. * @function encodeDelimited * @memberof signal.proto.storage.SignedPreKeyRecordStructure * @static * @param {signal.proto.storage.ISignedPreKeyRecordStructure} message SignedPreKeyRecordStructure message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ SignedPreKeyRecordStructure.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a SignedPreKeyRecordStructure message from the specified reader or buffer. * @function decode * @memberof signal.proto.storage.SignedPreKeyRecordStructure * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signal.proto.storage.SignedPreKeyRecordStructure} SignedPreKeyRecordStructure * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ SignedPreKeyRecordStructure.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signal.proto.storage.SignedPreKeyRecordStructure(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.id = reader.uint32(); break; } case 2: { message.publicKey = reader.bytes(); break; } case 3: { message.privateKey = reader.bytes(); break; } case 4: { message.signature = reader.bytes(); break; } case 5: { message.timestamp = reader.fixed64(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a SignedPreKeyRecordStructure message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signal.proto.storage.SignedPreKeyRecordStructure * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signal.proto.storage.SignedPreKeyRecordStructure} SignedPreKeyRecordStructure * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ SignedPreKeyRecordStructure.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return SignedPreKeyRecordStructure; })(); storage.IdentityKeyPairStructure = (function() { /** * Properties of an IdentityKeyPairStructure. * @memberof signal.proto.storage * @interface IIdentityKeyPairStructure * @property {Uint8Array|null} [publicKey] IdentityKeyPairStructure publicKey * @property {Uint8Array|null} [privateKey] IdentityKeyPairStructure privateKey */ /** * Constructs a new IdentityKeyPairStructure. * @memberof signal.proto.storage * @classdesc Represents an IdentityKeyPairStructure. * @implements IIdentityKeyPairStructure * @constructor * @param {signal.proto.storage.IIdentityKeyPairStructure=} [properties] Properties to set */ function IdentityKeyPairStructure(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * IdentityKeyPairStructure publicKey. * @member {Uint8Array} publicKey * @memberof signal.proto.storage.IdentityKeyPairStructure * @instance */ IdentityKeyPairStructure.prototype.publicKey = $util.newBuffer([]); /** * IdentityKeyPairStructure privateKey. * @member {Uint8Array} privateKey * @memberof signal.proto.storage.IdentityKeyPairStructure * @instance */ IdentityKeyPairStructure.prototype.privateKey = $util.newBuffer([]); /** * Encodes the specified IdentityKeyPairStructure message. Does not implicitly {@link signal.proto.storage.IdentityKeyPairStructure.verify|verify} messages. * @function encode * @memberof signal.proto.storage.IdentityKeyPairStructure * @static * @param {signal.proto.storage.IIdentityKeyPairStructure} message IdentityKeyPairStructure message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ IdentityKeyPairStructure.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signal.proto.storage.IdentityKeyPairStructure.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signal.proto.storage.IdentityKeyPairStructure.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.publicKey != null && Object.hasOwnProperty.call(message, "publicKey")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.publicKey); if (message.privateKey != null && Object.hasOwnProperty.call(message, "privateKey")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.privateKey); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified IdentityKeyPairStructure message, length delimited. Does not implicitly {@link signal.proto.storage.IdentityKeyPairStructure.verify|verify} messages. * @function encodeDelimited * @memberof signal.proto.storage.IdentityKeyPairStructure * @static * @param {signal.proto.storage.IIdentityKeyPairStructure} message IdentityKeyPairStructure message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ IdentityKeyPairStructure.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an IdentityKeyPairStructure message from the specified reader or buffer. * @function decode * @memberof signal.proto.storage.IdentityKeyPairStructure * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signal.proto.storage.IdentityKeyPairStructure} IdentityKeyPairStructure * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ IdentityKeyPairStructure.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signal.proto.storage.IdentityKeyPairStructure(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.publicKey = reader.bytes(); break; } case 2: { message.privateKey = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an IdentityKeyPairStructure message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signal.proto.storage.IdentityKeyPairStructure * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signal.proto.storage.IdentityKeyPairStructure} IdentityKeyPairStructure * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ IdentityKeyPairStructure.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return IdentityKeyPairStructure; })(); storage.SenderKeyStateStructure = (function() { /** * Properties of a SenderKeyStateStructure. * @memberof signal.proto.storage * @interface ISenderKeyStateStructure * @property {number|null} [senderKeyId] SenderKeyStateStructure senderKeyId * @property {signal.proto.storage.SenderKeyStateStructure.ISenderChainKey|null} [senderChainKey] SenderKeyStateStructure senderChainKey * @property {signal.proto.storage.SenderKeyStateStructure.ISenderSigningKey|null} [senderSigningKey] SenderKeyStateStructure senderSigningKey * @property {Array.|null} [senderMessageKeys] SenderKeyStateStructure senderMessageKeys */ /** * Constructs a new SenderKeyStateStructure. * @memberof signal.proto.storage * @classdesc Represents a SenderKeyStateStructure. * @implements ISenderKeyStateStructure * @constructor * @param {signal.proto.storage.ISenderKeyStateStructure=} [properties] Properties to set */ function SenderKeyStateStructure(properties) { this.senderMessageKeys = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * SenderKeyStateStructure senderKeyId. * @member {number} senderKeyId * @memberof signal.proto.storage.SenderKeyStateStructure * @instance */ SenderKeyStateStructure.prototype.senderKeyId = 0; /** * SenderKeyStateStructure senderChainKey. * @member {signal.proto.storage.SenderKeyStateStructure.ISenderChainKey|null|undefined} senderChainKey * @memberof signal.proto.storage.SenderKeyStateStructure * @instance */ SenderKeyStateStructure.prototype.senderChainKey = null; /** * SenderKeyStateStructure senderSigningKey. * @member {signal.proto.storage.SenderKeyStateStructure.ISenderSigningKey|null|undefined} senderSigningKey * @memberof signal.proto.storage.SenderKeyStateStructure * @instance */ SenderKeyStateStructure.prototype.senderSigningKey = null; /** * SenderKeyStateStructure senderMessageKeys. * @member {Array.} senderMessageKeys * @memberof signal.proto.storage.SenderKeyStateStructure * @instance */ SenderKeyStateStructure.prototype.senderMessageKeys = $util.emptyArray; /** * Encodes the specified SenderKeyStateStructure message. Does not implicitly {@link signal.proto.storage.SenderKeyStateStructure.verify|verify} messages. * @function encode * @memberof signal.proto.storage.SenderKeyStateStructure * @static * @param {signal.proto.storage.ISenderKeyStateStructure} message SenderKeyStateStructure message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ SenderKeyStateStructure.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signal.proto.storage.SenderKeyStateStructure.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signal.proto.storage.SenderKeyStateStructure.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.senderKeyId != null && Object.hasOwnProperty.call(message, "senderKeyId")) writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.senderKeyId); if (message.senderChainKey != null && Object.hasOwnProperty.call(message, "senderChainKey")) $root.signal.proto.storage.SenderKeyStateStructure.SenderChainKey.encode(message.senderChainKey, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); if (message.senderSigningKey != null && Object.hasOwnProperty.call(message, "senderSigningKey")) $root.signal.proto.storage.SenderKeyStateStructure.SenderSigningKey.encode(message.senderSigningKey, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); if (message.senderMessageKeys != null && message.senderMessageKeys.length) for (var i = 0; i < message.senderMessageKeys.length; ++i) $root.signal.proto.storage.SenderKeyStateStructure.SenderMessageKey.encode(message.senderMessageKeys[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified SenderKeyStateStructure message, length delimited. Does not implicitly {@link signal.proto.storage.SenderKeyStateStructure.verify|verify} messages. * @function encodeDelimited * @memberof signal.proto.storage.SenderKeyStateStructure * @static * @param {signal.proto.storage.ISenderKeyStateStructure} message SenderKeyStateStructure message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ SenderKeyStateStructure.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a SenderKeyStateStructure message from the specified reader or buffer. * @function decode * @memberof signal.proto.storage.SenderKeyStateStructure * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signal.proto.storage.SenderKeyStateStructure} SenderKeyStateStructure * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ SenderKeyStateStructure.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signal.proto.storage.SenderKeyStateStructure(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.senderKeyId = reader.uint32(); break; } case 2: { message.senderChainKey = $root.signal.proto.storage.SenderKeyStateStructure.SenderChainKey.decode(reader, reader.uint32()); break; } case 3: { message.senderSigningKey = $root.signal.proto.storage.SenderKeyStateStructure.SenderSigningKey.decode(reader, reader.uint32()); break; } case 4: { if (!(message.senderMessageKeys && message.senderMessageKeys.length)) message.senderMessageKeys = []; message.senderMessageKeys.push($root.signal.proto.storage.SenderKeyStateStructure.SenderMessageKey.decode(reader, reader.uint32())); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a SenderKeyStateStructure message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signal.proto.storage.SenderKeyStateStructure * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signal.proto.storage.SenderKeyStateStructure} SenderKeyStateStructure * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ SenderKeyStateStructure.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; SenderKeyStateStructure.SenderChainKey = (function() { /** * Properties of a SenderChainKey. * @memberof signal.proto.storage.SenderKeyStateStructure * @interface ISenderChainKey * @property {number|null} [iteration] SenderChainKey iteration * @property {Uint8Array|null} [seed] SenderChainKey seed */ /** * Constructs a new SenderChainKey. * @memberof signal.proto.storage.SenderKeyStateStructure * @classdesc Represents a SenderChainKey. * @implements ISenderChainKey * @constructor * @param {signal.proto.storage.SenderKeyStateStructure.ISenderChainKey=} [properties] Properties to set */ function SenderChainKey(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * SenderChainKey iteration. * @member {number} iteration * @memberof signal.proto.storage.SenderKeyStateStructure.SenderChainKey * @instance */ SenderChainKey.prototype.iteration = 0; /** * SenderChainKey seed. * @member {Uint8Array} seed * @memberof signal.proto.storage.SenderKeyStateStructure.SenderChainKey * @instance */ SenderChainKey.prototype.seed = $util.newBuffer([]); /** * Encodes the specified SenderChainKey message. Does not implicitly {@link signal.proto.storage.SenderKeyStateStructure.SenderChainKey.verify|verify} messages. * @function encode * @memberof signal.proto.storage.SenderKeyStateStructure.SenderChainKey * @static * @param {signal.proto.storage.SenderKeyStateStructure.ISenderChainKey} message SenderChainKey message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ SenderChainKey.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signal.proto.storage.SenderKeyStateStructure.SenderChainKey.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signal.proto.storage.SenderKeyStateStructure.SenderChainKey.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.iteration != null && Object.hasOwnProperty.call(message, "iteration")) writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.iteration); if (message.seed != null && Object.hasOwnProperty.call(message, "seed")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.seed); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified SenderChainKey message, length delimited. Does not implicitly {@link signal.proto.storage.SenderKeyStateStructure.SenderChainKey.verify|verify} messages. * @function encodeDelimited * @memberof signal.proto.storage.SenderKeyStateStructure.SenderChainKey * @static * @param {signal.proto.storage.SenderKeyStateStructure.ISenderChainKey} message SenderChainKey message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ SenderChainKey.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a SenderChainKey message from the specified reader or buffer. * @function decode * @memberof signal.proto.storage.SenderKeyStateStructure.SenderChainKey * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signal.proto.storage.SenderKeyStateStructure.SenderChainKey} SenderChainKey * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ SenderChainKey.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signal.proto.storage.SenderKeyStateStructure.SenderChainKey(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.iteration = reader.uint32(); break; } case 2: { message.seed = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a SenderChainKey message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signal.proto.storage.SenderKeyStateStructure.SenderChainKey * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signal.proto.storage.SenderKeyStateStructure.SenderChainKey} SenderChainKey * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ SenderChainKey.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return SenderChainKey; })(); SenderKeyStateStructure.SenderMessageKey = (function() { /** * Properties of a SenderMessageKey. * @memberof signal.proto.storage.SenderKeyStateStructure * @interface ISenderMessageKey * @property {number|null} [iteration] SenderMessageKey iteration * @property {Uint8Array|null} [seed] SenderMessageKey seed */ /** * Constructs a new SenderMessageKey. * @memberof signal.proto.storage.SenderKeyStateStructure * @classdesc Represents a SenderMessageKey. * @implements ISenderMessageKey * @constructor * @param {signal.proto.storage.SenderKeyStateStructure.ISenderMessageKey=} [properties] Properties to set */ function SenderMessageKey(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * SenderMessageKey iteration. * @member {number} iteration * @memberof signal.proto.storage.SenderKeyStateStructure.SenderMessageKey * @instance */ SenderMessageKey.prototype.iteration = 0; /** * SenderMessageKey seed. * @member {Uint8Array} seed * @memberof signal.proto.storage.SenderKeyStateStructure.SenderMessageKey * @instance */ SenderMessageKey.prototype.seed = $util.newBuffer([]); /** * Encodes the specified SenderMessageKey message. Does not implicitly {@link signal.proto.storage.SenderKeyStateStructure.SenderMessageKey.verify|verify} messages. * @function encode * @memberof signal.proto.storage.SenderKeyStateStructure.SenderMessageKey * @static * @param {signal.proto.storage.SenderKeyStateStructure.ISenderMessageKey} message SenderMessageKey message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ SenderMessageKey.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signal.proto.storage.SenderKeyStateStructure.SenderMessageKey.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signal.proto.storage.SenderKeyStateStructure.SenderMessageKey.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.iteration != null && Object.hasOwnProperty.call(message, "iteration")) writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.iteration); if (message.seed != null && Object.hasOwnProperty.call(message, "seed")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.seed); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified SenderMessageKey message, length delimited. Does not implicitly {@link signal.proto.storage.SenderKeyStateStructure.SenderMessageKey.verify|verify} messages. * @function encodeDelimited * @memberof signal.proto.storage.SenderKeyStateStructure.SenderMessageKey * @static * @param {signal.proto.storage.SenderKeyStateStructure.ISenderMessageKey} message SenderMessageKey message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ SenderMessageKey.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a SenderMessageKey message from the specified reader or buffer. * @function decode * @memberof signal.proto.storage.SenderKeyStateStructure.SenderMessageKey * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signal.proto.storage.SenderKeyStateStructure.SenderMessageKey} SenderMessageKey * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ SenderMessageKey.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signal.proto.storage.SenderKeyStateStructure.SenderMessageKey(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.iteration = reader.uint32(); break; } case 2: { message.seed = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a SenderMessageKey message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signal.proto.storage.SenderKeyStateStructure.SenderMessageKey * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signal.proto.storage.SenderKeyStateStructure.SenderMessageKey} SenderMessageKey * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ SenderMessageKey.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return SenderMessageKey; })(); SenderKeyStateStructure.SenderSigningKey = (function() { /** * Properties of a SenderSigningKey. * @memberof signal.proto.storage.SenderKeyStateStructure * @interface ISenderSigningKey * @property {Uint8Array|null} ["public"] SenderSigningKey public * @property {Uint8Array|null} ["private"] SenderSigningKey private */ /** * Constructs a new SenderSigningKey. * @memberof signal.proto.storage.SenderKeyStateStructure * @classdesc Represents a SenderSigningKey. * @implements ISenderSigningKey * @constructor * @param {signal.proto.storage.SenderKeyStateStructure.ISenderSigningKey=} [properties] Properties to set */ function SenderSigningKey(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * SenderSigningKey public. * @member {Uint8Array} public * @memberof signal.proto.storage.SenderKeyStateStructure.SenderSigningKey * @instance */ SenderSigningKey.prototype["public"] = $util.newBuffer([]); /** * SenderSigningKey private. * @member {Uint8Array} private * @memberof signal.proto.storage.SenderKeyStateStructure.SenderSigningKey * @instance */ SenderSigningKey.prototype["private"] = $util.newBuffer([]); /** * Encodes the specified SenderSigningKey message. Does not implicitly {@link signal.proto.storage.SenderKeyStateStructure.SenderSigningKey.verify|verify} messages. * @function encode * @memberof signal.proto.storage.SenderKeyStateStructure.SenderSigningKey * @static * @param {signal.proto.storage.SenderKeyStateStructure.ISenderSigningKey} message SenderSigningKey message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ SenderSigningKey.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signal.proto.storage.SenderKeyStateStructure.SenderSigningKey.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signal.proto.storage.SenderKeyStateStructure.SenderSigningKey.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message["public"] != null && Object.hasOwnProperty.call(message, "public")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message["public"]); if (message["private"] != null && Object.hasOwnProperty.call(message, "private")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message["private"]); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified SenderSigningKey message, length delimited. Does not implicitly {@link signal.proto.storage.SenderKeyStateStructure.SenderSigningKey.verify|verify} messages. * @function encodeDelimited * @memberof signal.proto.storage.SenderKeyStateStructure.SenderSigningKey * @static * @param {signal.proto.storage.SenderKeyStateStructure.ISenderSigningKey} message SenderSigningKey message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ SenderSigningKey.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a SenderSigningKey message from the specified reader or buffer. * @function decode * @memberof signal.proto.storage.SenderKeyStateStructure.SenderSigningKey * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signal.proto.storage.SenderKeyStateStructure.SenderSigningKey} SenderSigningKey * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ SenderSigningKey.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signal.proto.storage.SenderKeyStateStructure.SenderSigningKey(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message["public"] = reader.bytes(); break; } case 2: { message["private"] = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a SenderSigningKey message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signal.proto.storage.SenderKeyStateStructure.SenderSigningKey * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signal.proto.storage.SenderKeyStateStructure.SenderSigningKey} SenderSigningKey * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ SenderSigningKey.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return SenderSigningKey; })(); return SenderKeyStateStructure; })(); storage.SenderKeyRecordStructure = (function() { /** * Properties of a SenderKeyRecordStructure. * @memberof signal.proto.storage * @interface ISenderKeyRecordStructure * @property {Array.|null} [senderKeyStates] SenderKeyRecordStructure senderKeyStates */ /** * Constructs a new SenderKeyRecordStructure. * @memberof signal.proto.storage * @classdesc Represents a SenderKeyRecordStructure. * @implements ISenderKeyRecordStructure * @constructor * @param {signal.proto.storage.ISenderKeyRecordStructure=} [properties] Properties to set */ function SenderKeyRecordStructure(properties) { this.senderKeyStates = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * SenderKeyRecordStructure senderKeyStates. * @member {Array.} senderKeyStates * @memberof signal.proto.storage.SenderKeyRecordStructure * @instance */ SenderKeyRecordStructure.prototype.senderKeyStates = $util.emptyArray; /** * Encodes the specified SenderKeyRecordStructure message. Does not implicitly {@link signal.proto.storage.SenderKeyRecordStructure.verify|verify} messages. * @function encode * @memberof signal.proto.storage.SenderKeyRecordStructure * @static * @param {signal.proto.storage.ISenderKeyRecordStructure} message SenderKeyRecordStructure message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ SenderKeyRecordStructure.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signal.proto.storage.SenderKeyRecordStructure.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signal.proto.storage.SenderKeyRecordStructure.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.senderKeyStates != null && message.senderKeyStates.length) for (var i = 0; i < message.senderKeyStates.length; ++i) $root.signal.proto.storage.SenderKeyStateStructure.encode(message.senderKeyStates[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified SenderKeyRecordStructure message, length delimited. Does not implicitly {@link signal.proto.storage.SenderKeyRecordStructure.verify|verify} messages. * @function encodeDelimited * @memberof signal.proto.storage.SenderKeyRecordStructure * @static * @param {signal.proto.storage.ISenderKeyRecordStructure} message SenderKeyRecordStructure message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ SenderKeyRecordStructure.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a SenderKeyRecordStructure message from the specified reader or buffer. * @function decode * @memberof signal.proto.storage.SenderKeyRecordStructure * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signal.proto.storage.SenderKeyRecordStructure} SenderKeyRecordStructure * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ SenderKeyRecordStructure.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signal.proto.storage.SenderKeyRecordStructure(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { if (!(message.senderKeyStates && message.senderKeyStates.length)) message.senderKeyStates = []; message.senderKeyStates.push($root.signal.proto.storage.SenderKeyStateStructure.decode(reader, reader.uint32())); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a SenderKeyRecordStructure message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signal.proto.storage.SenderKeyRecordStructure * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signal.proto.storage.SenderKeyRecordStructure} SenderKeyRecordStructure * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ SenderKeyRecordStructure.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return SenderKeyRecordStructure; })(); return storage; })(); return proto; })(); signal.backup = (function() { /** * Namespace backup. * @memberof signal * @namespace */ var backup = {}; backup.local = (function() { /** * Namespace local. * @memberof signal.backup * @namespace */ var local = {}; local.Metadata = (function() { /** * Properties of a Metadata. * @memberof signal.backup.local * @interface IMetadata * @property {number|null} [version] Metadata version * @property {signal.backup.local.Metadata.IEncryptedBackupId|null} [backupId] Metadata backupId */ /** * Constructs a new Metadata. * @memberof signal.backup.local * @classdesc Represents a Metadata. * @implements IMetadata * @constructor * @param {signal.backup.local.IMetadata=} [properties] Properties to set */ function Metadata(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Metadata version. * @member {number} version * @memberof signal.backup.local.Metadata * @instance */ Metadata.prototype.version = 0; /** * Metadata backupId. * @member {signal.backup.local.Metadata.IEncryptedBackupId|null|undefined} backupId * @memberof signal.backup.local.Metadata * @instance */ Metadata.prototype.backupId = null; /** * Encodes the specified Metadata message. Does not implicitly {@link signal.backup.local.Metadata.verify|verify} messages. * @function encode * @memberof signal.backup.local.Metadata * @static * @param {signal.backup.local.IMetadata} message Metadata message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Metadata.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signal.backup.local.Metadata.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signal.backup.local.Metadata.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.version != null && Object.hasOwnProperty.call(message, "version")) writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.version); if (message.backupId != null && Object.hasOwnProperty.call(message, "backupId")) $root.signal.backup.local.Metadata.EncryptedBackupId.encode(message.backupId, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Metadata message, length delimited. Does not implicitly {@link signal.backup.local.Metadata.verify|verify} messages. * @function encodeDelimited * @memberof signal.backup.local.Metadata * @static * @param {signal.backup.local.IMetadata} message Metadata message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Metadata.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a Metadata message from the specified reader or buffer. * @function decode * @memberof signal.backup.local.Metadata * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signal.backup.local.Metadata} Metadata * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Metadata.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signal.backup.local.Metadata(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.version = reader.uint32(); break; } case 2: { message.backupId = $root.signal.backup.local.Metadata.EncryptedBackupId.decode(reader, reader.uint32()); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a Metadata message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signal.backup.local.Metadata * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signal.backup.local.Metadata} Metadata * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Metadata.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; Metadata.EncryptedBackupId = (function() { /** * Properties of an EncryptedBackupId. * @memberof signal.backup.local.Metadata * @interface IEncryptedBackupId * @property {Uint8Array|null} [iv] EncryptedBackupId iv * @property {Uint8Array|null} [encryptedId] EncryptedBackupId encryptedId */ /** * Constructs a new EncryptedBackupId. * @memberof signal.backup.local.Metadata * @classdesc Represents an EncryptedBackupId. * @implements IEncryptedBackupId * @constructor * @param {signal.backup.local.Metadata.IEncryptedBackupId=} [properties] Properties to set */ function EncryptedBackupId(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * EncryptedBackupId iv. * @member {Uint8Array} iv * @memberof signal.backup.local.Metadata.EncryptedBackupId * @instance */ EncryptedBackupId.prototype.iv = $util.newBuffer([]); /** * EncryptedBackupId encryptedId. * @member {Uint8Array} encryptedId * @memberof signal.backup.local.Metadata.EncryptedBackupId * @instance */ EncryptedBackupId.prototype.encryptedId = $util.newBuffer([]); /** * Encodes the specified EncryptedBackupId message. Does not implicitly {@link signal.backup.local.Metadata.EncryptedBackupId.verify|verify} messages. * @function encode * @memberof signal.backup.local.Metadata.EncryptedBackupId * @static * @param {signal.backup.local.Metadata.IEncryptedBackupId} message EncryptedBackupId message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ EncryptedBackupId.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signal.backup.local.Metadata.EncryptedBackupId.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signal.backup.local.Metadata.EncryptedBackupId.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.iv != null && Object.hasOwnProperty.call(message, "iv")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.iv); if (message.encryptedId != null && Object.hasOwnProperty.call(message, "encryptedId")) writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.encryptedId); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified EncryptedBackupId message, length delimited. Does not implicitly {@link signal.backup.local.Metadata.EncryptedBackupId.verify|verify} messages. * @function encodeDelimited * @memberof signal.backup.local.Metadata.EncryptedBackupId * @static * @param {signal.backup.local.Metadata.IEncryptedBackupId} message EncryptedBackupId message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ EncryptedBackupId.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an EncryptedBackupId message from the specified reader or buffer. * @function decode * @memberof signal.backup.local.Metadata.EncryptedBackupId * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signal.backup.local.Metadata.EncryptedBackupId} EncryptedBackupId * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ EncryptedBackupId.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signal.backup.local.Metadata.EncryptedBackupId(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.iv = reader.bytes(); break; } case 2: { message.encryptedId = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an EncryptedBackupId message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signal.backup.local.Metadata.EncryptedBackupId * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signal.backup.local.Metadata.EncryptedBackupId} EncryptedBackupId * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ EncryptedBackupId.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return EncryptedBackupId; })(); return Metadata; })(); local.FilesFrame = (function() { /** * Properties of a FilesFrame. * @memberof signal.backup.local * @interface IFilesFrame * @property {string|null} [mediaName] FilesFrame mediaName */ /** * Constructs a new FilesFrame. * @memberof signal.backup.local * @classdesc Represents a FilesFrame. * @implements IFilesFrame * @constructor * @param {signal.backup.local.IFilesFrame=} [properties] Properties to set */ function FilesFrame(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * FilesFrame mediaName. * @member {string|null|undefined} mediaName * @memberof signal.backup.local.FilesFrame * @instance */ FilesFrame.prototype.mediaName = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** * FilesFrame item. * @member {"mediaName"|undefined} item * @memberof signal.backup.local.FilesFrame * @instance */ Object.defineProperty(FilesFrame.prototype, "item", { get: $util.oneOfGetter($oneOfFields = ["mediaName"]), set: $util.oneOfSetter($oneOfFields) }); /** * Encodes the specified FilesFrame message. Does not implicitly {@link signal.backup.local.FilesFrame.verify|verify} messages. * @function encode * @memberof signal.backup.local.FilesFrame * @static * @param {signal.backup.local.IFilesFrame} message FilesFrame message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ FilesFrame.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.signal.backup.local.FilesFrame.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.signal.backup.local.FilesFrame.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.mediaName != null && Object.hasOwnProperty.call(message, "mediaName")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.mediaName); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified FilesFrame message, length delimited. Does not implicitly {@link signal.backup.local.FilesFrame.verify|verify} messages. * @function encodeDelimited * @memberof signal.backup.local.FilesFrame * @static * @param {signal.backup.local.IFilesFrame} message FilesFrame message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ FilesFrame.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a FilesFrame message from the specified reader or buffer. * @function decode * @memberof signal.backup.local.FilesFrame * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {signal.backup.local.FilesFrame} FilesFrame * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ FilesFrame.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.signal.backup.local.FilesFrame(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.mediaName = reader.string(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes a FilesFrame message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof signal.backup.local.FilesFrame * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {signal.backup.local.FilesFrame} FilesFrame * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ FilesFrame.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; return FilesFrame; })(); return local; })(); return backup; })(); return signal; })(); $root.migrations = (function() { /** * Namespace migrations. * @exports migrations * @namespace */ var migrations = {}; migrations.Envelope = (function() { /** * Properties of an Envelope. * @memberof migrations * @interface IEnvelope * @property {migrations.Envelope.Type|null} [type] Envelope type * @property {string|null} [sourceServiceId] Envelope sourceServiceId * @property {number|null} [sourceDevice] Envelope sourceDevice * @property {string|null} [destinationServiceId] Envelope destinationServiceId * @property {Long|null} [timestamp] Envelope timestamp * @property {Uint8Array|null} [content] Envelope content * @property {string|null} [serverGuid] Envelope serverGuid * @property {Long|null} [serverTimestamp] Envelope serverTimestamp * @property {boolean|null} [ephemeral] Envelope ephemeral * @property {boolean|null} [urgent] Envelope urgent * @property {string|null} [updatedPni] Envelope updatedPni * @property {boolean|null} [story] Envelope story * @property {Uint8Array|null} [reportSpamToken] Envelope reportSpamToken */ /** * Constructs a new Envelope. * @memberof migrations * @classdesc Represents an Envelope. * @implements IEnvelope * @constructor * @param {migrations.IEnvelope=} [properties] Properties to set */ function Envelope(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * Envelope type. * @member {migrations.Envelope.Type} type * @memberof migrations.Envelope * @instance */ Envelope.prototype.type = 0; /** * Envelope sourceServiceId. * @member {string} sourceServiceId * @memberof migrations.Envelope * @instance */ Envelope.prototype.sourceServiceId = ""; /** * Envelope sourceDevice. * @member {number} sourceDevice * @memberof migrations.Envelope * @instance */ Envelope.prototype.sourceDevice = 0; /** * Envelope destinationServiceId. * @member {string} destinationServiceId * @memberof migrations.Envelope * @instance */ Envelope.prototype.destinationServiceId = ""; /** * Envelope timestamp. * @member {Long} timestamp * @memberof migrations.Envelope * @instance */ Envelope.prototype.timestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * Envelope content. * @member {Uint8Array} content * @memberof migrations.Envelope * @instance */ Envelope.prototype.content = $util.newBuffer([]); /** * Envelope serverGuid. * @member {string} serverGuid * @memberof migrations.Envelope * @instance */ Envelope.prototype.serverGuid = ""; /** * Envelope serverTimestamp. * @member {Long} serverTimestamp * @memberof migrations.Envelope * @instance */ Envelope.prototype.serverTimestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** * Envelope ephemeral. * @member {boolean} ephemeral * @memberof migrations.Envelope * @instance */ Envelope.prototype.ephemeral = false; /** * Envelope urgent. * @member {boolean} urgent * @memberof migrations.Envelope * @instance */ Envelope.prototype.urgent = true; /** * Envelope updatedPni. * @member {string} updatedPni * @memberof migrations.Envelope * @instance */ Envelope.prototype.updatedPni = ""; /** * Envelope story. * @member {boolean} story * @memberof migrations.Envelope * @instance */ Envelope.prototype.story = false; /** * Envelope reportSpamToken. * @member {Uint8Array} reportSpamToken * @memberof migrations.Envelope * @instance */ Envelope.prototype.reportSpamToken = $util.newBuffer([]); /** * Encodes the specified Envelope message. Does not implicitly {@link migrations.Envelope.verify|verify} messages. * @function encode * @memberof migrations.Envelope * @static * @param {migrations.IEnvelope} message Envelope message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Envelope.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); var fullyUnknown = []; if (message.$unknownFields && $root.migrations.Envelope.decode) for (var i = 0; i < message.$unknownFields.length; ++i) try { var known = $root.migrations.Envelope.decode(message.$unknownFields[i]); fullyUnknown = fullyUnknown.concat(known.$unknownFields || []); message = Object.assign(known, message); } catch (_) { } if (message.type != null && Object.hasOwnProperty.call(message, "type")) writer.uint32(/* id 1, wireType 0 =*/8).int32(message.type); if (message.timestamp != null && Object.hasOwnProperty.call(message, "timestamp")) writer.uint32(/* id 5, wireType 0 =*/40).uint64(message.timestamp); if (message.sourceDevice != null && Object.hasOwnProperty.call(message, "sourceDevice")) writer.uint32(/* id 7, wireType 0 =*/56).uint32(message.sourceDevice); if (message.content != null && Object.hasOwnProperty.call(message, "content")) writer.uint32(/* id 8, wireType 2 =*/66).bytes(message.content); if (message.serverGuid != null && Object.hasOwnProperty.call(message, "serverGuid")) writer.uint32(/* id 9, wireType 2 =*/74).string(message.serverGuid); if (message.serverTimestamp != null && Object.hasOwnProperty.call(message, "serverTimestamp")) writer.uint32(/* id 10, wireType 0 =*/80).uint64(message.serverTimestamp); if (message.sourceServiceId != null && Object.hasOwnProperty.call(message, "sourceServiceId")) writer.uint32(/* id 11, wireType 2 =*/90).string(message.sourceServiceId); if (message.ephemeral != null && Object.hasOwnProperty.call(message, "ephemeral")) writer.uint32(/* id 12, wireType 0 =*/96).bool(message.ephemeral); if (message.destinationServiceId != null && Object.hasOwnProperty.call(message, "destinationServiceId")) writer.uint32(/* id 13, wireType 2 =*/106).string(message.destinationServiceId); if (message.urgent != null && Object.hasOwnProperty.call(message, "urgent")) writer.uint32(/* id 14, wireType 0 =*/112).bool(message.urgent); if (message.updatedPni != null && Object.hasOwnProperty.call(message, "updatedPni")) writer.uint32(/* id 15, wireType 2 =*/122).string(message.updatedPni); if (message.story != null && Object.hasOwnProperty.call(message, "story")) writer.uint32(/* id 16, wireType 0 =*/128).bool(message.story); if (message.reportSpamToken != null && Object.hasOwnProperty.call(message, "reportSpamToken")) writer.uint32(/* id 17, wireType 2 =*/138).bytes(message.reportSpamToken); for (var i = 0; i < fullyUnknown.length; ++i) writer._unknownField(fullyUnknown[i]); return writer; }; /** * Encodes the specified Envelope message, length delimited. Does not implicitly {@link migrations.Envelope.verify|verify} messages. * @function encodeDelimited * @memberof migrations.Envelope * @static * @param {migrations.IEnvelope} message Envelope message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ Envelope.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an Envelope message from the specified reader or buffer. * @function decode * @memberof migrations.Envelope * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {migrations.Envelope} Envelope * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Envelope.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.migrations.Envelope(); while (reader.pos < end) { var unknownStartPos = reader.pos; var tag = reader.uint32(); switch (tag >>> 3) { case 1: { message.type = reader.int32(); break; } case 11: { message.sourceServiceId = reader.string(); break; } case 7: { message.sourceDevice = reader.uint32(); break; } case 13: { message.destinationServiceId = reader.string(); break; } case 5: { message.timestamp = reader.uint64(); break; } case 8: { message.content = reader.bytes(); break; } case 9: { message.serverGuid = reader.string(); break; } case 10: { message.serverTimestamp = reader.uint64(); break; } case 12: { message.ephemeral = reader.bool(); break; } case 14: { message.urgent = reader.bool(); break; } case 15: { message.updatedPni = reader.string(); break; } case 16: { message.story = reader.bool(); break; } case 17: { message.reportSpamToken = reader.bytes(); break; } default: reader.skipType(tag & 7); if (!message.$unknownFields) message.$unknownFields = []; message.$unknownFields.push(reader.buf.slice(unknownStartPos, reader.pos)); break; } } return message; }; /** * Decodes an Envelope message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof migrations.Envelope * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {migrations.Envelope} Envelope * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Envelope.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * Type enum. * @name migrations.Envelope.Type * @enum {number} * @property {number} UNKNOWN=0 UNKNOWN value * @property {number} CIPHERTEXT=1 CIPHERTEXT value * @property {number} PREKEY_BUNDLE=3 PREKEY_BUNDLE value * @property {number} SERVER_DELIVERY_RECEIPT=5 SERVER_DELIVERY_RECEIPT value * @property {number} UNIDENTIFIED_SENDER=6 UNIDENTIFIED_SENDER value * @property {number} SENDERKEY_MESSAGE=7 SENDERKEY_MESSAGE value * @property {number} PLAINTEXT_CONTENT=8 PLAINTEXT_CONTENT value */ Envelope.Type = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "UNKNOWN"] = 0; values[valuesById[1] = "CIPHERTEXT"] = 1; values[valuesById[3] = "PREKEY_BUNDLE"] = 3; values[valuesById[5] = "SERVER_DELIVERY_RECEIPT"] = 5; values[valuesById[6] = "UNIDENTIFIED_SENDER"] = 6; values[valuesById[7] = "SENDERKEY_MESSAGE"] = 7; values[valuesById[8] = "PLAINTEXT_CONTENT"] = 8; return values; })(); return Envelope; })(); return migrations; })(); module.exports = $root; "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var index_std_exports = {}; __export(index_std_exports, { Backups: () => import_compiled_std.signalbackups, Migrations: () => import_compiled_std.migrations, Signal: () => import_compiled_std.signal, SignalService: () => import_compiled_std.signalservice }); module.exports = __toCommonJS(index_std_exports); var import_wrap_std = require("./wrap.std.js"); var import_compiled_std = require("./compiled.std.js"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { Backups, Migrations, Signal, SignalService }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var wrap_std_exports = {}; __export(wrap_std_exports, { default: () => wrap_std_default }); module.exports = __toCommonJS(wrap_std_exports); var protobuf = __toESM(require("protobufjs/minimal")); var import_long = __toESM(require("long")); protobuf.util.Long = import_long.default; protobuf.configure(); var wrap_std_default = protobuf; "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var monospaceBlot_std_exports = {}; __export(monospaceBlot_std_exports, { MonospaceBlot: () => MonospaceBlot }); module.exports = __toCommonJS(monospaceBlot_std_exports); var import_inline = __toESM(require("@signalapp/quill-cjs/blots/inline.js")); class MonospaceBlot extends import_inline.default { static { __name(this, "MonospaceBlot"); } static blotName = "monospace"; static className = "quill--monospace"; static formats() { return true; } optimize(context) { super.optimize(context); if (!this.domNode.classList.contains(this.statics.className)) { this.domNode.classList.add(this.statics.className); } } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { MonospaceBlot }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var spoilerBlot_std_exports = {}; __export(spoilerBlot_std_exports, { SpoilerBlot: () => SpoilerBlot }); module.exports = __toCommonJS(spoilerBlot_std_exports); var import_inline = __toESM(require("@signalapp/quill-cjs/blots/inline.js")); class SpoilerBlot extends import_inline.default { static { __name(this, "SpoilerBlot"); } static blotName = "spoiler"; static className = "quill--spoiler"; static formats() { return { spoiler: true }; } optimize(context) { super.optimize(context); if (!this.domNode.classList.contains(this.statics.className)) { this.domNode.classList.add(this.statics.className); } } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { SpoilerBlot }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var memberRepository_std_exports = {}; __export(memberRepository_std_exports, { MemberRepository: () => MemberRepository, _toMembers: () => _toMembers }); module.exports = __toCommonJS(memberRepository_std_exports); var import_fuse = __toESM(require("fuse.js")); var import_lodash = __toESM(require("lodash")); var import_isAciString_std = require("../util/isAciString.std.js"); var import_iterables_std = require("../util/iterables.std.js"); var import_removeDiacritics_std = require("../util/removeDiacritics.std.js"); var import_isNotNil_std = require("../util/isNotNil.std.js"); const { get } = import_lodash.default; function toMember({ serviceId, ...restOfConvo }) { if (!(0, import_isAciString_std.isAciString)(serviceId)) { return void 0; } return { ...restOfConvo, aci: serviceId }; } __name(toMember, "toMember"); function _toMembers(conversations) { return conversations.map(toMember).filter(import_isNotNil_std.isNotNil); } __name(_toMembers, "_toMembers"); const FUSE_OPTIONS = { location: 0, shouldSort: true, threshold: 0, maxPatternLength: 32, minMatchCharLength: 1, keys: ["name", "firstName", "profileName", "title"], getFn(conversation, path) { const rawValue = get(conversation, path); if (typeof rawValue !== "string") { return ""; } const segmenter = new Intl.Segmenter(void 0, { granularity: "word" }); const segments = segmenter.segment((0, import_removeDiacritics_std.removeDiacritics)(rawValue)); const wordlikeSegments = (0, import_iterables_std.filter)(segments, (segment) => segment.isWordLike); const wordlikes = (0, import_iterables_std.map)(wordlikeSegments, (segment) => segment.segment); return Array.from(wordlikes); } }; class MemberRepository { static { __name(this, "MemberRepository"); } #members; #isFuseReady = false; #fuse = new import_fuse.default([], FUSE_OPTIONS); constructor(conversations = []) { this.#members = _toMembers(conversations); } updateMembers(conversations) { this.#members = _toMembers(conversations); this.#isFuseReady = false; } getMembers(omitId) { if (omitId) { return this.#members.filter(({ id }) => id !== omitId); } return this.#members; } getMemberById(id) { return id ? this.#members.find(({ id: memberId }) => memberId === id) : void 0; } getMemberByAci(aci) { return aci ? this.#members.find(({ aci: memberAci }) => memberAci === aci) : void 0; } search(pattern, omitId) { if (!this.#isFuseReady) { this.#fuse.setCollection(this.#members); this.#isFuseReady = true; } const results = this.#fuse.search((0, import_removeDiacritics_std.removeDiacritics)(pattern)).map((result) => result.item); if (omitId) { return results.filter(({ id }) => id !== omitId); } return results; } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { MemberRepository, _toMembers }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var matchers_std_exports = {}; __export(matchers_std_exports, { matchMention: () => matchMention }); module.exports = __toCommonJS(matchers_std_exports); var import_quill_cjs = require("@signalapp/quill-cjs"); var import_assert_std = require("../../util/assert.std.js"); var import_isAciString_std = require("../../util/isAciString.std.js"); const matchMention = /* @__PURE__ */ __name((memberRepositoryRef) => (node, delta, _scroll, attributes) => { const memberRepository = memberRepositoryRef.current; if (memberRepository) { const { title } = node.dataset; if (node.classList.contains("MessageBody__at-mention")) { const { id } = node.dataset; const member = memberRepository.getMemberById(id); if (member && member.aci) { const { aci } = member; return new import_quill_cjs.Delta().insert( { mention: { title, aci } }, attributes ); } return new import_quill_cjs.Delta().insert(`@${title}`, attributes); } if (node.classList.contains("mention-blot")) { const { aci } = node.dataset; (0, import_assert_std.assertDev)((0, import_isAciString_std.isAciString)(aci), "Mentioned blot has invalid ACI"); const member = memberRepository.getMemberByAci(aci); if (member && member.aci) { (0, import_assert_std.assertDev)(member.aci === aci, "Mentioned member has no ACI"); return new import_quill_cjs.Delta().insert( { mention: { title: title || member.title, aci } }, attributes ); } return new import_quill_cjs.Delta().insert(`@${title}`, attributes); } } return delta; }, "matchMention"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { matchMention }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var ReactionSource_std_exports = {}; __export(ReactionSource_std_exports, { ReactionSource: () => ReactionSource }); module.exports = __toCommonJS(ReactionSource_std_exports); var ReactionSource = /* @__PURE__ */ ((ReactionSource2) => { ReactionSource2[ReactionSource2["FromSomeoneElse"] = 0] = "FromSomeoneElse"; ReactionSource2[ReactionSource2["FromSync"] = 1] = "FromSync"; ReactionSource2[ReactionSource2["FromThisDevice"] = 2] = "FromThisDevice"; return ReactionSource2; })(ReactionSource || {}); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { ReactionSource }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var constants_std_exports = {}; __export(constants_std_exports, { DEFAULT_PREFERRED_REACTION_EMOJI: () => DEFAULT_PREFERRED_REACTION_EMOJI, DEFAULT_PREFERRED_REACTION_EMOJI_PARENT_KEYS: () => DEFAULT_PREFERRED_REACTION_EMOJI_PARENT_KEYS }); module.exports = __toCommonJS(constants_std_exports); var import_emojis_std = require("../components/fun/data/emojis.std.js"); const DEFAULT_PREFERRED_REACTION_EMOJI_PARENT_KEYS = [ import_emojis_std.EMOJI_PARENT_KEY_CONSTANTS.RED_HEART, import_emojis_std.EMOJI_PARENT_KEY_CONSTANTS.THUMBS_UP, import_emojis_std.EMOJI_PARENT_KEY_CONSTANTS.THUMBS_DOWN, import_emojis_std.EMOJI_PARENT_KEY_CONSTANTS.FACE_WITH_TEARS_OF_JOY, import_emojis_std.EMOJI_PARENT_KEY_CONSTANTS.FACE_WITH_OPEN_MOUTH, import_emojis_std.EMOJI_PARENT_KEY_CONSTANTS.CRYING_FACE ]; const DEFAULT_PREFERRED_REACTION_EMOJI = [ "\u2764\uFE0F", "\u{1F44D}", "\u{1F44E}", "\u{1F602}", "\u{1F62E}", "\u{1F622}" ]; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { DEFAULT_PREFERRED_REACTION_EMOJI, DEFAULT_PREFERRED_REACTION_EMOJI_PARENT_KEYS }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var isValidReactionEmoji_std_exports = {}; __export(isValidReactionEmoji_std_exports, { isValidReactionEmoji: () => isValidReactionEmoji }); module.exports = __toCommonJS(isValidReactionEmoji_std_exports); var import_emoji_regex = __toESM(require("emoji-regex")); var import_grapheme_std = require("../util/grapheme.std.js"); var import_iterables_std = require("../util/iterables.std.js"); function isValidReactionEmoji(value) { if (typeof value !== "string") { return false; } const graphemes = (0, import_grapheme_std.getGraphemes)(value); const truncatedGraphemes = (0, import_iterables_std.take)(graphemes, 2); if ((0, import_iterables_std.size)(truncatedGraphemes) !== 1) { return false; } return (0, import_emoji_regex.default)().test(value); } __name(isValidReactionEmoji, "isValidReactionEmoji"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { isValidReactionEmoji }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var preferredReactionEmoji_std_exports = {}; __export(preferredReactionEmoji_std_exports, { canBeSynced: () => canBeSynced, getPreferredReactionEmoji: () => getPreferredReactionEmoji }); module.exports = __toCommonJS(preferredReactionEmoji_std_exports); var import_lodash = __toESM(require("lodash")); var import_log_std = require("../logging/log.std.js"); var import_constants_std = require("./constants.std.js"); var import_isValidReactionEmoji_std = require("./isValidReactionEmoji.std.js"); var import_emojis_std = require("../components/fun/data/emojis.std.js"); const { times } = import_lodash.default; const log = (0, import_log_std.createLogger)("preferredReactionEmoji"); const MAX_STORED_LENGTH = 20; const MAX_ITEM_LENGTH = 20; const PREFERRED_REACTION_EMOJI_COUNT = import_constants_std.DEFAULT_PREFERRED_REACTION_EMOJI_PARENT_KEYS.length; function getPreferredReactionEmoji(storedValue, emojiSkinToneDefault) { const storedValueAsArray = Array.isArray(storedValue) ? storedValue : []; return times(PREFERRED_REACTION_EMOJI_COUNT, (index) => { const storedItem = storedValueAsArray[index]; if ((0, import_isValidReactionEmoji_std.isValidReactionEmoji)(storedItem)) { return storedItem; } const fallbackParentKey = import_constants_std.DEFAULT_PREFERRED_REACTION_EMOJI_PARENT_KEYS.at(index); if (fallbackParentKey == null) { log.error( "Index is out of range. Is the preferred count larger than the list of fallbacks?" ); return "\u2764\uFE0F"; } const fallbackEmoji = (0, import_emojis_std.getEmojiVariantByParentKeyAndSkinTone)( fallbackParentKey, emojiSkinToneDefault ); if (fallbackEmoji == null) { log.error( "No fallback emoji. Does the fallback list contain an invalid short name?" ); return "\u2764\uFE0F"; } return fallbackEmoji.value; }); } __name(getPreferredReactionEmoji, "getPreferredReactionEmoji"); const canBeSynced = /* @__PURE__ */ __name((value) => Array.isArray(value) && value.length <= MAX_STORED_LENGTH && value.every( (item) => typeof item === "string" && item.length <= MAX_ITEM_LENGTH ), "canBeSynced"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { canBeSynced, getPreferredReactionEmoji }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var util_std_exports = {}; __export(util_std_exports, { addOutgoingReaction: () => addOutgoingReaction, getNewestPendingOutgoingReaction: () => getNewestPendingOutgoingReaction, getUnsentConversationIds: () => getUnsentConversationIds, isNewReactionReplacingPrevious: () => isNewReactionReplacingPrevious, markOutgoingReactionFailed: () => markOutgoingReactionFailed, markOutgoingReactionSent: () => markOutgoingReactionSent }); module.exports = __toCommonJS(util_std_exports); var import_lodash = __toESM(require("lodash")); var import_areObjectEntriesEqual_std = require("../util/areObjectEntriesEqual.std.js"); const { findLastIndex, has, identity, omit, negate } = import_lodash.default; const isReactionEqual = /* @__PURE__ */ __name((a, b) => a === b || Boolean( a && b && (0, import_areObjectEntriesEqual_std.areObjectEntriesEqual)(a, b, ["emoji", "fromId", "timestamp"]) ), "isReactionEqual"); const isOutgoingReactionFullySent = /* @__PURE__ */ __name(({ isSentByConversationId = {} }) => !isSentByConversationId || Object.values(isSentByConversationId).every(identity), "isOutgoingReactionFullySent"); const isOutgoingReactionPending = negate(isOutgoingReactionFullySent); const isOutgoingReactionCompletelyUnsent = /* @__PURE__ */ __name(({ isSentByConversationId = {} }) => { const sendStates = Object.values(isSentByConversationId); return sendStates.length > 0 && sendStates.every((state) => state === false); }, "isOutgoingReactionCompletelyUnsent"); function addOutgoingReaction(oldReactions, newReaction) { const pendingOutgoingReactions = new Set( oldReactions.filter(isOutgoingReactionPending) ); return [ ...oldReactions.filter((re) => !pendingOutgoingReactions.has(re)), newReaction ]; } __name(addOutgoingReaction, "addOutgoingReaction"); function getNewestPendingOutgoingReaction(reactions, ourConversationId) { const ourReactions = reactions.filter(({ fromId }) => fromId === ourConversationId).sort((a, b) => a.timestamp - b.timestamp); const newestFinishedReactionIndex = findLastIndex( ourReactions, (re) => re.emoji && isOutgoingReactionFullySent(re) ); const newestFinishedReaction = ourReactions[newestFinishedReactionIndex]; const newestPendingReactionIndex = findLastIndex( ourReactions, isOutgoingReactionPending ); const pendingReaction = newestPendingReactionIndex > newestFinishedReactionIndex ? ourReactions[newestPendingReactionIndex] : void 0; return pendingReaction ? { pendingReaction, // This might not be right in some cases. For example, imagine the following // sequence: // // 1. I send reaction A to Alice and Bob, but it was only delivered to Alice. // 2. I send reaction B to Alice and Bob, but it was only delivered to Bob. // 3. I remove the reaction. // // Android and iOS don't care what your previous reaction is. Old Desktop versions // *do* care, so we make our best guess. We should be able to remove this after // Desktop has ignored this field for awhile. See commit // `1dc353f08910389ad8cc5487949e6998e90038e2`. emojiToRemove: newestFinishedReaction?.emoji } : {}; } __name(getNewestPendingOutgoingReaction, "getNewestPendingOutgoingReaction"); function* getUnsentConversationIds({ isSentByConversationId = {} }) { for (const [id, isSent] of Object.entries(isSentByConversationId)) { if (!isSent) { yield id; } } } __name(getUnsentConversationIds, "getUnsentConversationIds"); function isNewReactionReplacingPrevious(reaction, newReaction) { return reaction.fromId === newReaction.fromId; } __name(isNewReactionReplacingPrevious, "isNewReactionReplacingPrevious"); const markOutgoingReactionFailed = /* @__PURE__ */ __name((reactions, reaction) => isOutgoingReactionCompletelyUnsent(reaction) || !reaction.emoji ? reactions.filter((re) => !isReactionEqual(re, reaction)) : reactions.map( (re) => isReactionEqual(re, reaction) ? omit(re, ["isSentByConversationId"]) : re ), "markOutgoingReactionFailed"); const markOutgoingReactionSent = /* @__PURE__ */ __name((reactions, reaction, conversationIdsSentTo) => { const result = []; const newIsSentByConversationId = { ...reaction.isSentByConversationId || {} }; for (const id of conversationIdsSentTo) { if (has(newIsSentByConversationId, id)) { newIsSentByConversationId[id] = true; } } const isFullySent = Object.values(newIsSentByConversationId).every(identity); for (const re of reactions) { if (!isReactionEqual(re, reaction)) { let shouldKeep = true; if (isFullySent && isNewReactionReplacingPrevious(re, reaction) && re.timestamp <= reaction.timestamp) { shouldKeep = false; } if (shouldKeep) { result.push(re); } continue; } if (isFullySent) { if (re.emoji) { result.push(omit(re, ["isSentByConversationId"])); } } else { result.push({ ...re, isSentByConversationId: newIsSentByConversationId }); } } return result; }, "markOutgoingReactionSent"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { addOutgoingReaction, getNewestPendingOutgoingReaction, getUnsentConversationIds, isNewReactionReplacingPrevious, markOutgoingReactionFailed, markOutgoingReactionSent }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var ActiveWindowService_std_exports = {}; __export(ActiveWindowService_std_exports, { getActiveWindowService: () => getActiveWindowService }); module.exports = __toCommonJS(ActiveWindowService_std_exports); var import_constants_std = require("../util/durations/constants.std.js"); var import_throttle_std = require("../util/throttle.std.js"); const ACTIVE_TIMEOUT = 15 * import_constants_std.SECOND; const ACTIVE_AFTER_NON_FOCUSING_EVENT_TIMEOUT = 1 * import_constants_std.SECOND; const LISTENER_THROTTLE_TIME = 5 * import_constants_std.SECOND; const ACTIVE_EVENTS = [ "click", "keydown", "mousedown", "mousemove", // 'scroll', // this is triggered by Timeline re-renders, can't use "touchstart", "wheel" ]; const NON_FOCUSING_ACTIVE_EVENTS = ["wheel"]; class ActiveWindowService { static { __name(this, "ActiveWindowService"); } // This starting value might be wrong but we should get an update from the main process // soon. We'd rather report that the window is inactive so we can show notifications. #isInitialized = false; #isFocused = false; #activeCallbacks = []; #changeCallbacks = []; #lastActiveEventAt = -Infinity; #lastActiveNonFocusingEventAt = -Infinity; #lastBlurredAt = -Infinity; #callActiveCallbacks; constructor() { this.#callActiveCallbacks = (0, import_throttle_std.throttle)(() => { this.#activeCallbacks.forEach((callback) => callback()); }, LISTENER_THROTTLE_TIME); } // These types aren't perfectly accurate, but they make this class easier to test. initialize(document, ipc) { if (this.#isInitialized) { throw new Error( "Active window service should not be initialized multiple times" ); } this.#isInitialized = true; this.#lastActiveEventAt = Date.now(); const onActiveEvent = this.#onActiveEvent.bind(this); ACTIVE_EVENTS.forEach((eventName) => { document.addEventListener(eventName, onActiveEvent, true); }); ipc.on("set-window-focus", (_event, isFocused) => { this.#setWindowFocus(Boolean(isFocused)); }); } isActive() { if (this.#isFocused) { return Date.now() < this.#lastActiveEventAt + ACTIVE_TIMEOUT; } if (this.#lastBlurredAt >= this.#lastActiveNonFocusingEventAt) { return false; } return Date.now() < this.#lastActiveNonFocusingEventAt + ACTIVE_AFTER_NON_FOCUSING_EVENT_TIMEOUT; } registerForActive(callback) { this.#activeCallbacks.push(callback); } unregisterForActive(callback) { this.#activeCallbacks = this.#activeCallbacks.filter( (item) => item !== callback ); } registerForChange(callback) { this.#changeCallbacks.push(callback); } unregisterForChange(callback) { this.#changeCallbacks = this.#changeCallbacks.filter( (item) => item !== callback ); } #onActiveEvent(e) { this.#updateState(() => { this.#lastActiveEventAt = Date.now(); if (NON_FOCUSING_ACTIVE_EVENTS.includes(e.type)) { this.#lastActiveNonFocusingEventAt = Date.now(); } }); } #setWindowFocus(isFocused) { this.#updateState(() => { this.#isFocused = isFocused; if (!isFocused) { this.#lastBlurredAt = Date.now(); } }); } #updateState(fn) { const wasActiveBefore = this.isActive(); fn(); const isActiveNow = this.isActive(); if (!wasActiveBefore && isActiveNow) { this.#callActiveCallbacks(); } if (wasActiveBefore !== isActiveNow) { for (const callback of this.#changeCallbacks) { callback(isActiveNow); } } } } function getActiveWindowService(document, ipc) { const activeWindowService = new ActiveWindowService(); activeWindowService.initialize(document, ipc); return { isActive() { return activeWindowService.isActive(); }, registerForActive(callback) { return activeWindowService.registerForActive(callback); }, unregisterForActive(callback) { return activeWindowService.unregisterForActive(callback); }, registerForChange(callback) { return activeWindowService.registerForChange(callback); }, unregisterForChange(callback) { return activeWindowService.unregisterForChange(callback); } }; } __name(getActiveWindowService, "getActiveWindowService"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getActiveWindowService }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var BeforeNavigate_std_exports = {}; __export(BeforeNavigate_std_exports, { BeforeNavigateResponse: () => BeforeNavigateResponse, BeforeNavigateService: () => BeforeNavigateService, beforeNavigateService: () => beforeNavigateService }); module.exports = __toCommonJS(BeforeNavigate_std_exports); var import_log_std = require("../logging/log.std.js"); var import_index_std = require("../util/durations/index.std.js"); var import_sleep_std = require("../util/sleep.std.js"); const log = (0, import_log_std.createLogger)("BeforeNavigate"); var BeforeNavigateResponse = /* @__PURE__ */ ((BeforeNavigateResponse2) => { BeforeNavigateResponse2["Noop"] = "Noop"; BeforeNavigateResponse2["MadeChanges"] = "MadeChanges"; BeforeNavigateResponse2["WaitedForUser"] = "WaitedForUser"; BeforeNavigateResponse2["CancelNavigation"] = "CancelNavigation"; BeforeNavigateResponse2["TimedOut"] = "TimedOut"; return BeforeNavigateResponse2; })(BeforeNavigateResponse || {}); class BeforeNavigateService { static { __name(this, "BeforeNavigateService"); } #beforeNavigateCallbacks = /* @__PURE__ */ new Set(); findMatchingEntry(entry) { const { callback } = entry; return Array.from(this.#beforeNavigateCallbacks).find( (item) => item.callback === callback ); } registerCallback(entry) { const logId = "registerCallback"; const existing = this.findMatchingEntry(entry); if (existing) { log.warn( `${logId}: Overwriting duplicate callback for entry ${entry.name}` ); this.#beforeNavigateCallbacks.delete(existing); } this.#beforeNavigateCallbacks.add(entry); } unregisterCallback(entry) { const logId = "unregisterCallback"; const existing = this.findMatchingEntry(entry); if (!existing) { log.warn( `${logId}: Didn't find matching callback for entry ${entry.name}` ); return; } this.#beforeNavigateCallbacks.delete(existing); } async shouldCancelNavigation({ context, existingLocation, newLocation }) { const logId = `shouldCancelNavigation/${context}`; const entries = Array.from(this.#beforeNavigateCallbacks); for (let i = 0, max = entries.length; i < max; i += 1) { const entry = entries[i]; const response = await Promise.race([ entry.callback({ existingLocation, newLocation }), timeOutAfter(30 * import_index_std.SECOND) ]); if (response === "Noop" /* Noop */) { continue; } log.info(`${logId}: ${entry.name} returned result ${response}`); if (response === "CancelNavigation" /* CancelNavigation */ || response === "TimedOut" /* TimedOut */) { return true; } } return false; } } async function timeOutAfter(ms) { await (0, import_sleep_std.sleep)(ms); return "TimedOut" /* TimedOut */; } __name(timeOutAfter, "timeOutAfter"); const beforeNavigateService = new BeforeNavigateService(); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { BeforeNavigateResponse, BeforeNavigateService, beforeNavigateService }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var ZoomFactorService_main_exports = {}; __export(ZoomFactorService_main_exports, { ZoomFactorService: () => ZoomFactorService }); module.exports = __toCommonJS(ZoomFactorService_main_exports); var import_electron = require("electron"); var import_node_events = __toESM(require("node:events")); var import_log_std = require("../logging/log.std.js"); const log = (0, import_log_std.createLogger)("ZoomFactorService"); const DEFAULT_ZOOM_FACTOR = 1; const ZOOM_LEVEL_MULTIPLIER_RATIO = 1.2; function zoomLevelToZoomFactor(zoomLevel) { return ZOOM_LEVEL_MULTIPLIER_RATIO ** zoomLevel; } __name(zoomLevelToZoomFactor, "zoomLevelToZoomFactor"); function zoomFactorToZoomLevel(zoomFactor) { return Math.log(zoomFactor) / Math.log(ZOOM_LEVEL_MULTIPLIER_RATIO); } __name(zoomFactorToZoomLevel, "zoomFactorToZoomLevel"); function zoomFactorEquals(a, b) { return Math.abs(a - b) <= 1e-3; } __name(zoomFactorEquals, "zoomFactorEquals"); class ZoomFactorService extends import_node_events.default { static { __name(this, "ZoomFactorService"); } #config; #cachedZoomFactor = null; #isListeningForZoom = false; constructor(config) { super(); this.#config = config; import_electron.ipcMain.handle("getZoomFactor", () => { return this.getZoomFactor(); }); import_electron.ipcMain.on("setZoomFactor", (_event, zoomFactor) => { return this.setZoomFactor(zoomFactor); }); } async getZoomFactor() { if (this.#cachedZoomFactor != null) { return this.#cachedZoomFactor; } const zoomFactorSetting = await this.#config.getZoomFactorSetting(); const zoomFactor = zoomFactorSetting ?? DEFAULT_ZOOM_FACTOR; this.#cachedZoomFactor = zoomFactor; return zoomFactor; } async getZoomLevel() { const zoomFactor = await this.getZoomFactor(); return zoomFactorToZoomLevel(zoomFactor); } async setZoomFactor(zoomFactor) { if (this.#cachedZoomFactor != null && zoomFactorEquals(this.#cachedZoomFactor, zoomFactor)) { return; } this.#cachedZoomFactor = zoomFactor; await this.#config.setZoomFactorSetting(zoomFactor); this.emit("zoomFactorChanged", zoomFactor); } async setZoomLevel(zoomLevel) { const zoomFactor = zoomLevelToZoomFactor(zoomLevel); await this.setZoomFactor(zoomFactor); } async zoomIn() { const zoomLevel = await this.getZoomLevel(); await this.setZoomLevel(zoomLevel + 1); } async zoomOut() { const zoomLevel = await this.getZoomLevel(); await this.setZoomLevel(zoomLevel - 1); } async zoomReset() { await this.setZoomLevel(0); } // Call this after creating a new window before you show it async syncWindow(window) { const onWindowChange = /* @__PURE__ */ __name(async () => { const zoomFactor = window.webContents.getZoomFactor(); await this.setZoomFactor(zoomFactor); }, "onWindowChange"); const onServiceChange = /* @__PURE__ */ __name((zoomFactor) => { window.webContents.setZoomFactor(zoomFactor); window.webContents.send("zoomFactorChanged", zoomFactor); }, "onServiceChange"); let initialZoomFactor; try { initialZoomFactor = await this.getZoomFactor(); } catch (error) { log.error("Failed to get zoom factor", error); initialZoomFactor = DEFAULT_ZOOM_FACTOR; } const maybeListenForZoomEvents = /* @__PURE__ */ __name(() => { if (this.#isListeningForZoom) { return; } window.webContents.on("zoom-changed", onWindowChange); this.on("zoomFactorChanged", onServiceChange); this.#isListeningForZoom = true; }, "maybeListenForZoomEvents"); const stopListenForZoomEvents = /* @__PURE__ */ __name(() => { window.webContents.off("zoom-changed", onWindowChange); this.off("zoomFactorChanged", onServiceChange); this.#isListeningForZoom = false; }, "stopListenForZoomEvents"); window.once("ready-to-show", () => { window.webContents.setZoomFactor(initialZoomFactor); maybeListenForZoomEvents(); }); window.on("show", maybeListenForZoomEvents); window.on("close", stopListenForZoomEvents); } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { ZoomFactorService }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var constants_std_exports = {}; __export(constants_std_exports, { BACKUP_VERSION: () => BACKUP_VERSION, LOCAL_BACKUP_BACKUP_ID_IV_LENGTH: () => LOCAL_BACKUP_BACKUP_ID_IV_LENGTH, LOCAL_BACKUP_VERSION: () => LOCAL_BACKUP_VERSION, WALLPAPER_TO_BUBBLE_COLOR: () => WALLPAPER_TO_BUBBLE_COLOR }); module.exports = __toCommonJS(constants_std_exports); var import_index_std = require("../../protobuf/index.std.js"); const BACKUP_VERSION = 1; const LOCAL_BACKUP_VERSION = 1; const LOCAL_BACKUP_BACKUP_ID_IV_LENGTH = 16; const { WallpaperPreset } = import_index_std.Backups.ChatStyle; const WALLPAPER_TO_BUBBLE_COLOR = /* @__PURE__ */ new Map([ [WallpaperPreset.SOLID_BLUSH, "crimson"], [WallpaperPreset.SOLID_COPPER, "vermilion"], [WallpaperPreset.SOLID_DUST, "burlap"], [WallpaperPreset.SOLID_CELADON, "forest"], [WallpaperPreset.SOLID_RAINFOREST, "wintergreen"], [WallpaperPreset.SOLID_PACIFIC, "teal"], [WallpaperPreset.SOLID_FROST, "blue"], [WallpaperPreset.SOLID_NAVY, "indigo"], [WallpaperPreset.SOLID_LILAC, "violet"], [WallpaperPreset.SOLID_PINK, "plum"], [WallpaperPreset.SOLID_EGGPLANT, "taupe"], [WallpaperPreset.SOLID_SILVER, "steel"], [WallpaperPreset.GRADIENT_SUNSET, "ember"], [WallpaperPreset.GRADIENT_NOIR, "midnight"], [WallpaperPreset.GRADIENT_HEATMAP, "infrared"], [WallpaperPreset.GRADIENT_AQUA, "lagoon"], [WallpaperPreset.GRADIENT_IRIDESCENT, "fluorescent"], [WallpaperPreset.GRADIENT_MONSTERA, "basil"], [WallpaperPreset.GRADIENT_BLISS, "sublime"], [WallpaperPreset.GRADIENT_SKY, "sea"], [WallpaperPreset.GRADIENT_PEACH, "tangerine"] ]); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { BACKUP_VERSION, LOCAL_BACKUP_BACKUP_ID_IV_LENGTH, LOCAL_BACKUP_VERSION, WALLPAPER_TO_BUBBLE_COLOR }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var errors_std_exports = {}; __export(errors_std_exports, { BackupDownloadFailedError: () => BackupDownloadFailedError, BackupImportCanceledError: () => BackupImportCanceledError, BackupInstallerError: () => BackupInstallerError, BackupProcessingError: () => BackupProcessingError, RelinkRequestedError: () => RelinkRequestedError, UnsupportedBackupVersion: () => UnsupportedBackupVersion }); module.exports = __toCommonJS(errors_std_exports); var import_InstallScreen_std = require("../../types/InstallScreen.std.js"); class BackupInstallerError extends Error { constructor(name, installerError) { super(name); this.installerError = installerError; } static { __name(this, "BackupInstallerError"); } } class UnsupportedBackupVersion extends BackupInstallerError { static { __name(this, "UnsupportedBackupVersion"); } constructor(version) { super( `Unsupported backup version: ${version}`, import_InstallScreen_std.InstallScreenBackupError.UnsupportedVersion ); } } class BackupDownloadFailedError extends BackupInstallerError { static { __name(this, "BackupDownloadFailedError"); } constructor() { super("BackupDownloadFailedError", import_InstallScreen_std.InstallScreenBackupError.Retriable); } } class BackupProcessingError extends BackupInstallerError { static { __name(this, "BackupProcessingError"); } constructor(cause) { super("BackupProcessingError", import_InstallScreen_std.InstallScreenBackupError.Fatal); this.cause = cause; } } class BackupImportCanceledError extends BackupInstallerError { static { __name(this, "BackupImportCanceledError"); } constructor() { super("BackupImportCanceledError", import_InstallScreen_std.InstallScreenBackupError.Canceled); } } class RelinkRequestedError extends BackupInstallerError { static { __name(this, "RelinkRequestedError"); } constructor() { super("RelinkRequestedError", import_InstallScreen_std.InstallScreenBackupError.Fatal); } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { BackupDownloadFailedError, BackupImportCanceledError, BackupInstallerError, BackupProcessingError, RelinkRequestedError, UnsupportedBackupVersion }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var types_std_exports = {}; __export(types_std_exports, { BackupLevel: () => BackupLevel, backupLevelFromNumber: () => backupLevelFromNumber }); module.exports = __toCommonJS(types_std_exports); var BackupLevel = /* @__PURE__ */ ((BackupLevel2) => { BackupLevel2[BackupLevel2["Free"] = 200] = "Free"; BackupLevel2[BackupLevel2["Paid"] = 201] = "Paid"; return BackupLevel2; })(BackupLevel || {}); function backupLevelFromNumber(num) { if (Object.values(BackupLevel).includes(num)) { return num; } return null; } __name(backupLevelFromNumber, "backupLevelFromNumber"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { BackupLevel, backupLevelFromNumber }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var FileStream_node_exports = {}; __export(FileStream_node_exports, { FileStream: () => FileStream }); module.exports = __toCommonJS(FileStream_node_exports); var import_promises = require("node:fs/promises"); var import_node_buffer = require("node:buffer"); var import_io = require("@signalapp/libsignal-client/dist/io.js"); class FileStream extends import_io.InputStream { constructor(filePath) { super(); this.filePath = filePath; } static { __name(this, "FileStream"); } #file; #position = 0; #buffer = import_node_buffer.Buffer.alloc(16 * 1024); #initPromise; async close() { await this.#initPromise; await this.#file?.close(); } async read(amount) { const file = await this.#lazyOpen(); if (this.#buffer.length < amount) { this.#buffer = import_node_buffer.Buffer.alloc(amount); } const { bytesRead } = await file.read( this.#buffer, 0, amount, this.#position ); this.#position += bytesRead; return this.#buffer.subarray(0, bytesRead); } async skip(amount) { this.#position += amount; } async #lazyOpen() { await this.#initPromise; if (this.#file) { return this.#file; } const filePromise = (0, import_promises.open)(this.filePath); this.#initPromise = filePromise; this.#file = await filePromise; return this.#file; } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { FileStream }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var expiration_std_exports = {}; __export(expiration_std_exports, { expiresTooSoonForBackup: () => expiresTooSoonForBackup }); module.exports = __toCommonJS(expiration_std_exports); var import_constants_std = require("../../../util/durations/constants.std.js"); const EXCLUDE_MESSAGE_FROM_BACKUP_IF_EXPIRING_WITHIN_MS = import_constants_std.DAY; function expiresTooSoonForBackup({ messageExpiresAt }) { if (messageExpiresAt == null) { return false; } return messageExpiresAt <= Date.now() + EXCLUDE_MESSAGE_FROM_BACKUP_IF_EXPIRING_WITHIN_MS; } __name(expiresTooSoonForBackup, "expiresTooSoonForBackup"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { expiresTooSoonForBackup }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var localBackup_node_exports = {}; __export(localBackup_node_exports, { ParseFilesListTransform: () => ParseFilesListTransform, getAllPathsInLocalBackupFilesDirectory: () => getAllPathsInLocalBackupFilesDirectory, getAttachmentLocalBackupPathFromSnapshotDir: () => getAttachmentLocalBackupPathFromSnapshotDir, getLocalBackupDirectoryForMediaName: () => getLocalBackupDirectoryForMediaName, getLocalBackupFilesDirectory: () => getLocalBackupFilesDirectory, getLocalBackupPathForMediaName: () => getLocalBackupPathForMediaName, readLocalBackupFilesList: () => readLocalBackupFilesList, validateLocalBackupStructure: () => validateLocalBackupStructure, verifyLocalBackupMetadata: () => verifyLocalBackupMetadata, writeLocalBackupFilesList: () => writeLocalBackupFilesList, writeLocalBackupMetadata: () => writeLocalBackupMetadata }); module.exports = __toCommonJS(localBackup_node_exports); var import_node_crypto = require("node:crypto"); var import_node_path = require("node:path"); var import_promises = require("node:fs/promises"); var import_node_fs = require("node:fs"); var import_node_stream = require("node:stream"); var import_promises2 = require("node:stream/promises"); var import_log_std = require("../../../logging/log.std.js"); var Bytes = __toESM(require("../../../Bytes.std.js")); var Errors = __toESM(require("../../../types/errors.std.js")); var import_index_std = require("../../../protobuf/index.std.js"); var import_wrap_std = __toESM(require("../../../protobuf/wrap.std.js")); var import_assert_std = require("../../../util/assert.std.js"); var import_Crypto_node = require("../../../Crypto.node.js"); var import_constants_std = require("../constants.std.js"); var import_explodePromise_std = require("../../../util/explodePromise.std.js"); const log = (0, import_log_std.createLogger)("localBackup"); const { Reader } = import_wrap_std.default; function getLocalBackupFilesDirectory({ backupsBaseDir }) { return (0, import_node_path.join)(backupsBaseDir, "files"); } __name(getLocalBackupFilesDirectory, "getLocalBackupFilesDirectory"); async function getAllPathsInLocalBackupFilesDirectory({ backupsBaseDir }) { const filesDir = getLocalBackupFilesDirectory({ backupsBaseDir }); const allEntries = await (0, import_promises.readdir)(filesDir, { withFileTypes: true, recursive: true }); return allEntries.filter((entry) => entry.isFile()).map((entry) => (0, import_node_path.join)(entry.parentPath, entry.name)); } __name(getAllPathsInLocalBackupFilesDirectory, "getAllPathsInLocalBackupFilesDirectory"); function getLocalBackupDirectoryForMediaName({ backupsBaseDir, mediaName }) { if (mediaName.length < 2) { throw new Error("Invalid mediaName input"); } return (0, import_node_path.join)( getLocalBackupFilesDirectory({ backupsBaseDir }), mediaName.substring(0, 2) ); } __name(getLocalBackupDirectoryForMediaName, "getLocalBackupDirectoryForMediaName"); function getLocalBackupPathForMediaName({ backupsBaseDir, mediaName }) { return (0, import_node_path.join)( getLocalBackupDirectoryForMediaName({ backupsBaseDir, mediaName }), mediaName ); } __name(getLocalBackupPathForMediaName, "getLocalBackupPathForMediaName"); function getAttachmentLocalBackupPathFromSnapshotDir(mediaName, snapshotDir) { return (0, import_node_path.join)( (0, import_node_path.dirname)(snapshotDir), "files", mediaName.substring(0, 2), mediaName ); } __name(getAttachmentLocalBackupPathFromSnapshotDir, "getAttachmentLocalBackupPathFromSnapshotDir"); async function writeLocalBackupMetadata({ snapshotDir, backupId, metadataKey }) { const iv = (0, import_node_crypto.randomBytes)(import_constants_std.LOCAL_BACKUP_BACKUP_ID_IV_LENGTH); const encryptedId = (0, import_Crypto_node.encryptAesCtr)(metadataKey, backupId, iv); const metadataSerialized = import_index_std.Signal.backup.local.Metadata.encode({ backupId: new import_index_std.Signal.backup.local.Metadata.EncryptedBackupId({ iv, encryptedId }), version: import_constants_std.LOCAL_BACKUP_VERSION }).finish(); const metadataPath = (0, import_node_path.join)(snapshotDir, "metadata"); await (0, import_promises.writeFile)(metadataPath, metadataSerialized); } __name(writeLocalBackupMetadata, "writeLocalBackupMetadata"); async function verifyLocalBackupMetadata({ snapshotDir, backupId, metadataKey }) { const metadataPath = (0, import_node_path.join)(snapshotDir, "metadata"); const metadataSerialized = await (0, import_promises.readFile)(metadataPath); const metadata = import_index_std.Signal.backup.local.Metadata.decode(metadataSerialized); (0, import_assert_std.strictAssert)( metadata.version === import_constants_std.LOCAL_BACKUP_VERSION, "verifyLocalBackupMetadata: Local backup version must match" ); (0, import_assert_std.strictAssert)( metadata.backupId, "verifyLocalBackupMetadata: Must have backupId" ); const { iv, encryptedId } = metadata.backupId; (0, import_assert_std.strictAssert)(iv, "verifyLocalBackupMetadata: Must have backupId.iv"); (0, import_assert_std.strictAssert)( encryptedId, "verifyLocalBackupMetadata: Must have backupId.encryptedId" ); const localBackupBackupId = (0, import_Crypto_node.decryptAesCtr)(metadataKey, encryptedId, iv); (0, import_assert_std.strictAssert)( Bytes.areEqual(backupId, localBackupBackupId), "verifyLocalBackupMetadata: backupId must match the local backup backupId" ); return true; } __name(verifyLocalBackupMetadata, "verifyLocalBackupMetadata"); async function writeLocalBackupFilesList({ snapshotDir, mediaNamesIterator }) { const { promise, resolve, reject } = (0, import_explodePromise_std.explodePromise)(); const filesListPath = (0, import_node_path.join)(snapshotDir, "files"); const writeStream = (0, import_node_fs.createWriteStream)(filesListPath); writeStream.on("error", (error) => { reject(error); }); const files = []; for (const mediaName of mediaNamesIterator) { const data = import_index_std.Signal.backup.local.FilesFrame.encodeDelimited({ mediaName }).finish(); if (!writeStream.write(data)) { await new Promise( (resolveStream) => writeStream.once("drain", resolveStream) ); } files.push(mediaName); } writeStream.end(() => { resolve(files); }); await promise; return files; } __name(writeLocalBackupFilesList, "writeLocalBackupFilesList"); async function readLocalBackupFilesList(snapshotDir) { const filesListPath = (0, import_node_path.join)(snapshotDir, "files"); const readStream = (0, import_node_fs.createReadStream)(filesListPath); const parseFilesTransform = new ParseFilesListTransform(); try { await (0, import_promises2.pipeline)(readStream, parseFilesTransform); } catch (error) { try { readStream.close(); } catch (closeError) { log.error( "readLocalBackupFilesList: Error when closing readStream", Errors.toLogFormat(closeError) ); } throw error; } readStream.close(); return parseFilesTransform.mediaNames; } __name(readLocalBackupFilesList, "readLocalBackupFilesList"); class ParseFilesListTransform extends import_node_stream.Transform { static { __name(this, "ParseFilesListTransform"); } mediaNames = []; activeFile; #unused; async _transform(chunk, _encoding, done) { if (!chunk || chunk.byteLength === 0) { done(); return; } try { let data = chunk; if (this.#unused) { data = Buffer.concat([this.#unused, data]); this.#unused = void 0; } const reader = Reader.create(data); while (reader.pos < reader.len) { const startPos = reader.pos; if (!this.activeFile) { try { this.activeFile = import_index_std.Signal.backup.local.FilesFrame.decodeDelimited(reader); } catch (err) { if (err instanceof RangeError) { this.#unused = data.subarray(startPos); done(); return; } done(err); return; } } if (!this.activeFile) { done( new Error( "ParseFilesListTransform: No active file after successful decode!" ) ); return; } if (this.activeFile.mediaName) { this.mediaNames.push(this.activeFile.mediaName); } else { log.warn( "ParseFilesListTransform: Active file had empty mediaName, ignoring" ); } this.activeFile = void 0; } } catch (error) { done(error); return; } done(); } } async function validateLocalBackupStructure(snapshotDir) { try { await (0, import_promises.stat)(snapshotDir); } catch (error) { return { success: false, error: "Snapshot directory does not exist", snapshotDir }; } for (const file of ["main", "metadata", "files"]) { try { await (0, import_promises.stat)((0, import_node_path.join)(snapshotDir, "main")); } catch (error) { return { success: false, error: `Snapshot directory does not contain ${file} file`, snapshotDir }; } } return { success: true, error: void 0, snapshotDir }; } __name(validateLocalBackupStructure, "validateLocalBackupStructure"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { ParseFilesListTransform, getAllPathsInLocalBackupFilesDirectory, getAttachmentLocalBackupPathFromSnapshotDir, getLocalBackupDirectoryForMediaName, getLocalBackupFilesDirectory, getLocalBackupPathForMediaName, readLocalBackupFilesList, validateLocalBackupStructure, verifyLocalBackupMetadata, writeLocalBackupFilesList, writeLocalBackupMetadata }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var bounce_main_exports = {}; __export(bounce_main_exports, { init: () => init }); module.exports = __toCommonJS(bounce_main_exports); var import_electron = require("electron"); let bounceId = -1; function init(win) { import_electron.ipcMain.on("bounce-app-icon-start", (_, isCritical = false) => { if (import_electron.app.dock) { const type = isCritical ? "critical" : "informational"; bounceId = import_electron.app.dock.bounce(type); } else if (win && win.flashFrame) { win.once("focus", () => { win.flashFrame(false); }); win.flashFrame(true); } }); import_electron.ipcMain.on("bounce-app-icon-stop", () => { if (import_electron.app.dock) { if (bounceId < 0) { return; } import_electron.app.dock.cancelBounce(bounceId); bounceId = -1; } else if (win && win.flashFrame) { win.flashFrame(false); } }); } __name(init, "init"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { init }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var createExpiringEntityCleanupService_std_exports = {}; __export(createExpiringEntityCleanupService_std_exports, { createExpiringEntityCleanupService: () => createExpiringEntityCleanupService }); module.exports = __toCommonJS(createExpiringEntityCleanupService_std_exports); var import_environment_std = require("../../environment.std.js"); var import_log_std = require("../../logging/log.std.js"); var Errors = __toESM(require("../../types/errors.std.js")); var import_assert_std = require("../../util/assert.std.js"); var import_drop_std = require("../../util/drop.std.js"); var import_missingCaseError_std = require("../../util/missingCaseError.std.js"); var import_timeout_std = require("../../util/timeout.std.js"); const parentLog = (0, import_log_std.createLogger)("ExpiringEntityCleanupService"); var ServiceState = /* @__PURE__ */ ((ServiceState2) => { ServiceState2[ServiceState2["NEVER_STARTED"] = 0] = "NEVER_STARTED"; ServiceState2[ServiceState2["STARTED"] = 1] = "STARTED"; ServiceState2[ServiceState2["STOPPED"] = 2] = "STOPPED"; return ServiceState2; })(ServiceState || {}); function createExpiringEntityCleanupService(options) { const log = parentLog.child(options.logPrefix); let controller = null; let runningPromise = null; function getCurrentTime() { if (options._mockGetCurrentTime != null && (0, import_environment_std.isTestEnvironment)((0, import_environment_std.getEnvironment)())) { return options._mockGetCurrentTime(); } return Date.now(); } __name(getCurrentTime, "getCurrentTime"); function scheduleLongTimeout(ms, signal) { if (options._mockScheduleLongTimeout != null && (0, import_environment_std.isTestEnvironment)((0, import_environment_std.getEnvironment)())) { return options._mockScheduleLongTimeout(ms, signal); } return (0, import_timeout_std.longTimeoutAsync)(ms, signal); } __name(scheduleLongTimeout, "scheduleLongTimeout"); function cancelNextScheduledRun(reason) { if (controller != null) { log.warn(`cancel(${reason}) canceling next scheduled run`); controller.abort(reason); controller = null; } } __name(cancelNextScheduledRun, "cancelNextScheduledRun"); async function getNextExpiringEntity() { try { const result = await options.getNextExpiringEntity(); if (result == null) { log.info("no expiring entity found"); } else { log.info( `next expiring entity is ${result.id} at ${result.expiresAtMs}` ); } return result; } catch (error) { log.error( "failed to get next expiring entity", Errors.toLogFormat(error) ); return null; } } __name(getNextExpiringEntity, "getNextExpiringEntity"); async function cleanupExpiredEntities(expectSomeDeletions) { try { log.info("deleting expired entities"); const deletedEntityIds = await options.cleanupExpiredEntities(); const logFn = expectSomeDeletions && deletedEntityIds.length === 0 ? log.warn : log.info; logFn( `deleted ${deletedEntityIds.length} entities:`, deletedEntityIds.join(", ") ); } catch (error) { log.error("cleanupExpiredEntities errored", Errors.toLogFormat(error)); } } __name(cleanupExpiredEntities, "cleanupExpiredEntities"); async function runOnceImmediately(expectSomeDeletions) { runningPromise ??= cleanupExpiredEntities(expectSomeDeletions); try { await runningPromise; } finally { runningPromise = null; } } __name(runOnceImmediately, "runOnceImmediately"); async function scheduleNextRun() { (0, import_assert_std.strictAssert)( controller == null, "Cannot schedule next run until after previously scheduled run has fired" ); const nextExpiringEntity = await getNextExpiringEntity(); if (nextExpiringEntity == null) { return true; } const nextExpirationTime = nextExpiringEntity.expiresAtMs; const currentTime = getCurrentTime(); if (nextExpirationTime <= currentTime) { log.info("expiration time is in past, running immediately"); await runOnceImmediately(true); return false; } const nextExpirationDelay = nextExpirationTime - currentTime; log.info( `scheduling next run for ${nextExpirationTime} in ${nextExpirationDelay}ms` ); try { controller = new AbortController(); await scheduleLongTimeout(nextExpirationDelay, controller.signal); log.info("scheduled timer fired, running"); } catch (error) { log.warn( "scheduled timer was canceled, not running", Errors.toLogFormat(error) ); return true; } finally { controller = null; } await runOnceImmediately(true); return false; } __name(scheduleNextRun, "scheduleNextRun"); async function scheduleRunsUntilDrained() { let shouldStop = false; while (!shouldStop) { shouldStop = await scheduleNextRun(); } } __name(scheduleRunsUntilDrained, "scheduleRunsUntilDrained"); let unsubscribeCallback = null; function startSubscription() { try { unsubscribeCallback = options.subscribeToTriggers(trigger); } catch (error) { log.error("failed to subscribe", Errors.toLogFormat(error)); } } __name(startSubscription, "startSubscription"); function cleanupSubscription() { try { unsubscribeCallback?.(); } catch (error) { log.error("failed to unsubscribe", Errors.toLogFormat(error)); } } __name(cleanupSubscription, "cleanupSubscription"); let serviceState = 0 /* NEVER_STARTED */; async function trigger(reason) { if (serviceState === 0 /* NEVER_STARTED */) { log.warn(`trigger(${reason}) service not started, doing nothing`); return; } if (serviceState === 1 /* STARTED */) { log.info(`trigger(${reason}) running`); } if (serviceState === 2 /* STOPPED */) { log.warn(`trigger(${reason}) service stopped, doing nothing`); return; } cancelNextScheduledRun(reason); await runOnceImmediately(false); (0, import_drop_std.drop)(scheduleRunsUntilDrained()); } __name(trigger, "trigger"); async function start(reason) { switch (serviceState) { case 0 /* NEVER_STARTED */: log.info(`start(${reason}) starting`); break; case 1 /* STARTED */: log.warn(`start(${reason}) already started, doing nothing`); return; case 2 /* STOPPED */: log.info(`start(${reason}) starting, previously stopped`); break; default: throw (0, import_missingCaseError_std.missingCaseError)(serviceState); } serviceState = 1 /* STARTED */; await runOnceImmediately(false); startSubscription(); (0, import_drop_std.drop)(scheduleRunsUntilDrained()); } __name(start, "start"); function stopCleanup(reason) { switch (serviceState) { case 0 /* NEVER_STARTED */: log.info(`stop(${reason}) never started, doing nothing`); return; case 1 /* STARTED */: log.info(`stop(${reason}) stopping`); break; case 2 /* STOPPED */: log.warn(`stop(${reason}) already stopped, doing nothing`); return; default: throw (0, import_missingCaseError_std.missingCaseError)(serviceState); } serviceState = 2 /* STOPPED */; cleanupSubscription(); cancelNextScheduledRun(reason); } __name(stopCleanup, "stopCleanup"); async function stop(reason) { const wasRunning = serviceState === 1 /* STARTED */; stopCleanup(reason); if (wasRunning) { await runOnceImmediately(false); } } __name(stop, "stop"); function stopImmediately(reason) { const wasRunning = serviceState === 1 /* STARTED */; if (wasRunning) { stopCleanup(reason); } } __name(stopImmediately, "stopImmediately"); return { start, trigger, stop, stopImmediately }; } __name(createExpiringEntityCleanupService, "createExpiringEntityCleanupService"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { createExpiringEntityCleanupService }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var globalMessageAudio_std_exports = {}; __export(globalMessageAudio_std_exports, { globalMessageAudio: () => globalMessageAudio }); module.exports = __toCommonJS(globalMessageAudio_std_exports); var import_lodash = __toESM(require("lodash")); var import_isAbortError_std = require("../util/isAbortError.std.js"); const { noop } = import_lodash.default; class GlobalMessageAudio { static { __name(this, "GlobalMessageAudio"); } #audio = new Audio(); #url; // true immediately after play() is called, even if still loading #playing = false; #onLoadedMetadata = noop; #onTimeUpdate = noop; #onEnded = noop; #onDurationChange = noop; #onError = noop; constructor() { this.#audio.addEventListener( "loadedmetadata", () => this.#onLoadedMetadata() ); this.#audio.addEventListener("timeupdate", () => this.#onTimeUpdate()); this.#audio.addEventListener( "durationchange", () => this.#onDurationChange() ); this.#audio.addEventListener("ended", () => this.#onEnded()); } load({ url, playbackRate, onLoadedMetadata, onTimeUpdate, onDurationChange, onEnded, onError }) { this.#url = url; this.#onLoadedMetadata = onLoadedMetadata; this.#onTimeUpdate = onTimeUpdate; this.#onDurationChange = onDurationChange; this.#onEnded = onEnded; this.#onError = onError; this.#audio.src = this.#url; this.#audio.playbackRate = playbackRate; } play() { this.#playing = true; this.#audio.play().catch((error) => { if (!(0, import_isAbortError_std.isAbortError)(error)) { this.#onError(error); } }); } pause() { this.#audio.pause(); this.#playing = false; } get playbackRate() { return this.#audio.playbackRate; } set playbackRate(rate) { this.#audio.playbackRate = rate; } get playing() { return this.#playing; } get url() { return this.#url; } get duration() { return Number.isNaN(this.#audio.duration) || this.#audio.duration === 0 ? void 0 : this.#audio.duration; } get currentTime() { return this.#audio.currentTime; } set currentTime(value) { this.#audio.currentTime = value; } } const globalMessageAudio = new GlobalMessageAudio(); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { globalMessageAudio }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var ourProfileKey_std_exports = {}; __export(ourProfileKey_std_exports, { OurProfileKeyService: () => OurProfileKeyService, ourProfileKeyService: () => ourProfileKeyService }); module.exports = __toCommonJS(ourProfileKey_std_exports); var import_assert_std = require("../util/assert.std.js"); var import_log_std = require("../logging/log.std.js"); const log = (0, import_log_std.createLogger)("ourProfileKey"); class OurProfileKeyService { static { __name(this, "OurProfileKeyService"); } getPromise; #promisesBlockingGet = []; #storage; initialize(storage) { log.info("Our profile key service: initializing"); const storageReadyPromise = new Promise((resolve) => { storage.onready(() => { resolve(); }); }); this.#promisesBlockingGet = [storageReadyPromise]; this.#storage = storage; } get() { if (this.getPromise) { log.info( "Our profile key service: was already fetching. Piggybacking off of that" ); } else { log.info("Our profile key service: kicking off a new fetch"); this.getPromise = this.#doGet(); } return this.getPromise; } async set(newValue) { (0, import_assert_std.assertDev)(this.#storage, "OurProfileKeyService was not initialized"); if (newValue != null) { (0, import_assert_std.strictAssert)( newValue.byteLength > 0, "Our profile key service: Profile key cannot be empty" ); log.info("Our profile key service: updating profile key"); await this.#storage.put("profileKey", newValue); } else { log.info("Our profile key service: removing profile key"); await this.#storage.remove("profileKey"); } } blockGetWithPromise(promise) { this.#promisesBlockingGet.push(promise); } async #doGet() { log.info( `Our profile key service: waiting for ${this.#promisesBlockingGet.length} promises before fetching` ); await Promise.allSettled(this.#promisesBlockingGet); this.#promisesBlockingGet = []; delete this.getPromise; (0, import_assert_std.assertDev)(this.#storage, "OurProfileKeyService was not initialized"); log.info("Our profile key service: fetching profile key from storage"); const result = this.#storage.get("profileKey"); if (result === void 0 || result instanceof Uint8Array) { return result; } (0, import_assert_std.assertDev)( false, "Profile key in storage was defined, but not an Uint8Array. Returning undefined" ); return void 0; } } const ourProfileKeyService = new OurProfileKeyService(); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { OurProfileKeyService, ourProfileKeyService }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var retryPlaceholders_std_exports = {}; __export(retryPlaceholders_std_exports, { RetryPlaceholders: () => RetryPlaceholders, STORAGE_KEY: () => STORAGE_KEY, getDeltaIntoPast: () => getDeltaIntoPast, getItemId: () => getItemId, retryPlaceholders: () => retryPlaceholders }); module.exports = __toCommonJS(retryPlaceholders_std_exports); var import_zod = require("zod"); var import_lodash = __toESM(require("lodash")); var import_log_std = require("../logging/log.std.js"); var import_ServiceId_std = require("../types/ServiceId.std.js"); var import_schemas_std = require("../util/schemas.std.js"); var import_index_std = require("../util/durations/index.std.js"); const { groupBy } = import_lodash.default; const log = (0, import_log_std.createLogger)("retryPlaceholders"); const retryItemSchema = import_zod.z.object({ conversationId: import_zod.z.string(), sentAt: import_zod.z.number(), receivedAt: import_zod.z.number(), receivedAtCounter: import_zod.z.number(), senderAci: import_ServiceId_std.aciSchema, wasOpened: import_zod.z.boolean().optional() }).passthrough(); const retryItemListSchema = import_zod.z.array(retryItemSchema); function getItemId(conversationId, sentAt) { return `${conversationId}--${sentAt}`; } __name(getItemId, "getItemId"); const STORAGE_KEY = "retryPlaceholders"; function getDeltaIntoPast(delta) { return Date.now() - (delta || import_index_std.HOUR); } __name(getDeltaIntoPast, "getDeltaIntoPast"); class RetryPlaceholders { static { __name(this, "RetryPlaceholders"); } #isStarted = false; #items = new Array(); #byConversation = {}; #byMessage = /* @__PURE__ */ new Map(); #retryReceiptLifespan; #storage; constructor(options = {}) { this.#retryReceiptLifespan = options.retryReceiptLifespan || import_index_std.HOUR; } start(storage) { if (this.#isStarted) { throw new Error("RetryPlaceholders: already started"); } const parsed = (0, import_schemas_std.safeParseStrict)( retryItemListSchema, storage.get(STORAGE_KEY, new Array()) ); if (!parsed.success) { log.warn( `constructor: Data fetched from storage did not match schema: ${JSON.stringify( parsed.error.flatten() )}` ); } this.#items = parsed.success ? parsed.data : []; this.#sortByExpiresAtAsc(); this.#byConversation = this.#makeByConversationLookup(); this.#byMessage = this.#makeByMessageLookup(); this.#isStarted = true; this.#storage = storage; log.info( `constructor: Started with ${this.#items.length} items, lifespan of ${this.#retryReceiptLifespan}` ); } // Arranging local data for efficiency #sortByExpiresAtAsc() { this.#items.sort( (left, right) => left.receivedAt - right.receivedAt ); } #makeByConversationLookup() { return groupBy(this.#items, (item) => item.conversationId); } #makeByMessageLookup() { const lookup = /* @__PURE__ */ new Map(); this.#items.forEach((item) => { lookup.set(getItemId(item.conversationId, item.sentAt), item); }); return lookup; } #makeLookups() { this.#byConversation = this.#makeByConversationLookup(); this.#byMessage = this.#makeByMessageLookup(); } // Basic data management async add(item) { if (!this.#isStarted) { throw new Error("RetryPlaceholders: not started"); } const parsed = (0, import_schemas_std.safeParseStrict)(retryItemSchema, item); if (!parsed.success) { throw new Error( `RetryPlaceholders.add: Item did not match schema ${JSON.stringify( parsed.error.flatten() )}` ); } this.#items.push(item); this.#sortByExpiresAtAsc(); this.#makeLookups(); await this.save(); } async save() { if (!this.#isStarted || this.#storage == null) { throw new Error("RetryPlaceholders: not started"); } await this.#storage.put(STORAGE_KEY, this.#items); } // Finding items in different ways getCount() { if (!this.#isStarted) { throw new Error("RetryPlaceholders: not started"); } return this.#items.length; } getNextToExpire() { if (!this.#isStarted) { throw new Error("RetryPlaceholders: not started"); } return this.#items[0]; } async getExpiredAndRemove() { if (!this.#isStarted) { throw new Error("RetryPlaceholders: not started"); } const expiration = getDeltaIntoPast(this.#retryReceiptLifespan); const max = this.#items.length; const result = []; for (let i = 0; i < max; i += 1) { const item = this.#items[i]; if (item.receivedAt <= expiration) { result.push(item); } else { break; } } log.info(`getExpiredAndRemove: Found ${result.length} expired items`); this.#items.splice(0, result.length); this.#makeLookups(); await this.save(); return result; } async findByConversationAndMarkOpened(conversationId) { if (!this.#isStarted) { throw new Error("RetryPlaceholders: not started"); } let changed = 0; const items = this.#byConversation[conversationId]; (items || []).forEach((item) => { if (!item.wasOpened) { changed += 1; item.wasOpened = true; } }); if (changed > 0) { log.info( `findByConversationAndMarkOpened: Updated ${changed} items for conversation ${conversationId}` ); await this.save(); } } async findByMessageAndRemove(conversationId, sentAt) { if (!this.#isStarted) { throw new Error("RetryPlaceholders: not started"); } const result = this.#byMessage.get(getItemId(conversationId, sentAt)); if (!result) { return void 0; } const index = this.#items.findIndex((item) => item === result); this.#items.splice(index, 1); this.#makeLookups(); log.info( `findByMessageAndRemove: Removing ${sentAt} from conversation ${conversationId}` ); await this.save(); return result; } } const retryPlaceholders = new RetryPlaceholders({ retryReceiptLifespan: import_index_std.HOUR }); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { RetryPlaceholders, STORAGE_KEY, getDeltaIntoPast, getItemId, retryPlaceholders }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var singleServePromise_std_exports = {}; __export(singleServePromise_std_exports, { get: () => get, set: () => set }); module.exports = __toCommonJS(singleServePromise_std_exports); var import_uuid = require("uuid"); const promises = /* @__PURE__ */ new Map(); function set(explodedPromise) { let uuid = (0, import_uuid.v4)(); while (promises.has(uuid)) { uuid = (0, import_uuid.v4)(); } promises.set(uuid, { promise: explodedPromise.promise, resolve: /* @__PURE__ */ __name((value) => { promises.delete(uuid); explodedPromise.resolve(value); }, "resolve"), reject: /* @__PURE__ */ __name((err) => { promises.delete(uuid); explodedPromise.reject(err); }, "reject") }); return uuid; } __name(set, "set"); function get(uuid) { return promises.get(uuid); } __name(get, "get"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { get, set }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var storageConstants_std_exports = {}; __export(storageConstants_std_exports, { MAX_READ_KEYS: () => MAX_READ_KEYS }); module.exports = __toCommonJS(storageConstants_std_exports); const MAX_READ_KEYS = 2500; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { MAX_READ_KEYS }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var Interface_std_exports = {}; __export(Interface_std_exports, { AttachmentDownloadSource: () => AttachmentDownloadSource, MESSAGE_ATTACHMENT_COLUMNS: () => MESSAGE_ATTACHMENT_COLUMNS, MESSAGE_COLUMNS: () => MESSAGE_COLUMNS, MESSAGE_COLUMNS_FRAGMENT: () => MESSAGE_COLUMNS_FRAGMENT, MESSAGE_NON_PRIMARY_KEY_COLUMNS: () => MESSAGE_NON_PRIMARY_KEY_COLUMNS, StickerPackStatuses: () => StickerPackStatuses }); module.exports = __toCommonJS(Interface_std_exports); var import_assert_std = require("../util/assert.std.js"); var import_util_std = require("./util.std.js"); const MESSAGE_PRIMARY_KEY_COLUMNS = ["id"]; const MESSAGE_NON_PRIMARY_KEY_COLUMNS = [ "json", "body", "conversationId", "expirationStartTimestamp", "expireTimer", "hasAttachments", "hasFileAttachments", "hasVisualMediaAttachments", "hasUnreadPollVotes", "isChangeCreatedByUs", "isErased", "isViewOnce", "mentionsMe", "received_at", "received_at_ms", "schemaVersion", "serverGuid", "sent_at", "source", "sourceServiceId", "sourceDevice", "storyId", "type", "readStatus", "seenStatus", "serverTimestamp", "timestamp", "unidentifiedDeliveryReceived" ]; const MESSAGE_COLUMNS = [ ...MESSAGE_PRIMARY_KEY_COLUMNS, ...MESSAGE_NON_PRIMARY_KEY_COLUMNS ]; const MESSAGE_COLUMNS_FRAGMENT = (0, import_util_std.sqlJoin)( MESSAGE_COLUMNS.map((column) => { return import_util_std.sqlFragment`messages.${(0, import_util_std.sqlId)(column)}`; }) ); const StickerPackStatuses = [ "known", "ephemeral", "downloaded", "installed", "pending", "error" ]; var AttachmentDownloadSource = /* @__PURE__ */ ((AttachmentDownloadSource2) => { AttachmentDownloadSource2["BACKUP_IMPORT_WITH_MEDIA"] = "backup_import"; AttachmentDownloadSource2["BACKUP_IMPORT_NO_MEDIA"] = "backup_import_no_media"; AttachmentDownloadSource2["STANDARD"] = "standard"; AttachmentDownloadSource2["BACKFILL"] = "backfill"; return AttachmentDownloadSource2; })(AttachmentDownloadSource || {}); const MESSAGE_ATTACHMENT_COLUMNS = [ "messageId", "conversationId", "messageType", "receivedAt", "receivedAtMs", "sentAt", "attachmentType", "orderInMessage", "editHistoryIndex", "clientUuid", "size", "duration", "contentType", "path", "localKey", "plaintextHash", "caption", "fileName", "blurHash", "height", "width", "digest", "key", "flags", "downloadPath", "transitCdnKey", "transitCdnNumber", "transitCdnUploadTimestamp", "backupCdnNumber", "incrementalMac", "incrementalMacChunkSize", "thumbnailPath", "thumbnailSize", "thumbnailContentType", "thumbnailLocalKey", "thumbnailVersion", "screenshotPath", "screenshotSize", "screenshotContentType", "screenshotLocalKey", "screenshotVersion", "backupThumbnailPath", "backupThumbnailSize", "backupThumbnailContentType", "backupThumbnailLocalKey", "backupThumbnailVersion", "storyTextAttachmentJson", "localBackupPath", "isCorrupted", "isViewOnce", "backfillError", "error", "wasTooBig", "copiedFromQuotedAttachment", "version", "pending" ]; const testDBRefTypeMatchesColumnNames = true; (0, import_assert_std.strictAssert)( testDBRefTypeMatchesColumnNames, "attachment_columns must match DB fields type" ); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { AttachmentDownloadSource, MESSAGE_ATTACHMENT_COLUMNS, MESSAGE_COLUMNS, MESSAGE_COLUMNS_FRAGMENT, MESSAGE_NON_PRIMARY_KEY_COLUMNS, StickerPackStatuses }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var Server_node_exports = {}; __export(Server_node_exports, { DataReader: () => DataReader, DataWriter: () => DataWriter, _storyIdPredicate: () => _storyIdPredicate, dequeueOldestSyncTasks: () => dequeueOldestSyncTasks, getJobsInQueue: () => getJobsInQueue, getMessageById: () => getMessageById, getMostRecentAddressableMessages: () => getMostRecentAddressableMessages, getMostRecentAddressableNondisappearingMessages: () => getMostRecentAddressableNondisappearingMessages, incrementAllSyncTaskAttempts: () => incrementAllSyncTaskAttempts, incrementMessagesMigrationAttempts: () => incrementMessagesMigrationAttempts, initialize: () => initialize, insertJob: () => insertJob, markAllCallHistoryRead: () => markAllCallHistoryRead, migrateConversationMessages: () => migrateConversationMessages, removeDB: () => removeDB, removeSyncTaskById: () => removeSyncTaskById, saveSyncTasks: () => saveSyncTasks, setupTests: () => setupTests }); module.exports = __toCommonJS(Server_node_exports); var import_sqlcipher = __toESM(require("@signalapp/sqlcipher")); var import_node_crypto = require("node:crypto"); var import_node_fs = require("node:fs"); var import_node_path = require("node:path"); var import_zod = require("zod"); var import_lodash = __toESM(require("lodash")); var import_BadgeCategory_std = require("../badges/BadgeCategory.std.js"); var import_BadgeImageTheme_std = require("../badges/BadgeImageTheme.std.js"); var import_formatCountForLogging_std = require("../logging/formatCountForLogging.std.js"); var import_MessageReadStatus_std = require("../messages/MessageReadStatus.std.js"); var import_Reactions_std = require("../types/Reactions.std.js"); var import_ServiceId_std = require("../types/ServiceId.std.js"); var import_StorageUIKeys_std = require("../types/StorageUIKeys.std.js"); var Errors = __toESM(require("../types/errors.std.js")); var import_assert_std = require("../util/assert.std.js"); var import_missingCaseError_std = require("../util/missingCaseError.std.js"); var import_combineNames_std = require("../util/combineNames.std.js"); var import_consoleLogger_std = require("../util/consoleLogger.std.js"); var import_dropNull_std = require("../util/dropNull.std.js"); var import_isNormalNumber_std = require("../util/isNormalNumber.std.js"); var import_isNotNil_std = require("../util/isNotNil.std.js"); var import_parseIntOrThrow_std = require("../util/parseIntOrThrow.std.js"); var import_index_node = require("./migrations/index.node.js"); var import_util_std = require("./util.std.js"); var import_hydration_std = require("./hydration.std.js"); var import_index_std = require("../protobuf/index.std.js"); var import_MessageSeenStatus_std = require("../MessageSeenStatus.std.js"); var import_AttachmentBackup_std = require("../types/AttachmentBackup.std.js"); var import_AttachmentDownload_std = require("../types/AttachmentDownload.std.js"); var import_CallDisposition_std = require("../types/CallDisposition.std.js"); var import_privacy_node = require("../util/privacy.node.js"); var import_schemas_std = require("../util/schemas.std.js"); var import_search_std = require("../util/search.std.js"); var import_syncTasks_types_std = require("../util/syncTasks.types.std.js"); var import_Interface_std = require("./Interface.std.js"); var import_callLinks_node = require("./server/callLinks.node.js"); var import_donationReceipts_std = require("./server/donationReceipts.std.js"); var import_groupSendEndorsements_std = require("./server/groupSendEndorsements.std.js"); var import_chatFolders_std = require("./server/chatFolders.std.js"); var import_pinnedMessages_std = require("./server/pinnedMessages.std.js"); var import_megaphones_std = require("./server/megaphones.std.js"); var import_keyTransparency_std = require("./server/keyTransparency.std.js"); var import_expirationTimer_std = require("../util/expirationTimer.std.js"); var durations = __toESM(require("../util/durations/index.std.js")); var import_Attachment_std = require("../util/Attachment.std.js"); var import_generateMessageId_node = require("../util/generateMessageId.node.js"); var import_sqlLogger_node = require("./sqlLogger.node.js"); var import_messageAttachments_std = require("./server/messageAttachments.std.js"); var import_messageFilePaths_std = require("../util/messageFilePaths.std.js"); var import_search_polls_std = require("./migrations/1500-search-polls.std.js"); var import_Crypto_std = require("../types/Crypto.std.js"); const { forEach, fromPairs, groupBy, isBoolean, isNil, isNumber, isString, last, map, mapValues, noop, omit, partition, pick, sortBy } = import_lodash.default; const ATTACHMENT_DOWNLOADS_COLUMNS = [ "messageId", "attachmentType", "attachmentSignature", "receivedAt", "sentAt", "contentType", "size", "active", "attempts", "retryAfter", "lastAttemptTimestamp", "attachmentJson", "ciphertextSize", "originalSource", "source" ]; const DataReader = { close: closeReadable, getIdentityKeyById, getAllIdentityKeys, getKyberPreKeyById, getAllKyberPreKeys, getPreKeyById, getAllPreKeys, getSignedPreKeyById, getAllSignedPreKeys, getItemById, getAllItems, getSenderKeyById, getAllSenderKeys, getAllSentProtos, _getAllSentProtoRecipients, _getAllSentProtoMessageIds, getAllSessions, getAllKyberTriples, getConversationCount, getConversationById, getAllConversations, getAllConversationIds, getGroupSendCombinedEndorsementExpiration: import_groupSendEndorsements_std.getGroupSendCombinedEndorsementExpiration, getGroupSendEndorsementsData: import_groupSendEndorsements_std.getGroupSendEndorsementsData, getGroupSendMemberEndorsement: import_groupSendEndorsements_std.getGroupSendMemberEndorsement, searchMessages, getMessageCount, getStoryCount, getRecentStoryReplies, countStoryReadsByConversation, getReactionByTimestamp, _getAllReactions, getMessageByAuthorAciAndSentAt, getMessageBySender, getMessageById, getMessagesById, _getAllMessages, _getAllEditedMessages, getAllMessageIds, getMessagesBySentAt, getExpiredMessages, getMessagesUnexpectedlyMissingExpirationStartTimestamp, getSoonestMessageExpiry, getNextTapToViewMessageTimestampToAgeOut, getTapToViewMessagesNeedingErase, getOlderMessagesByConversation, getAllStories, getNewerMessagesByConversation, getOldestUnreadMentionOfMeForConversation, getTotalUnreadForConversation, getTotalUnreadMentionsOfMeForConversation, getMessageMetricsForConversation, getConversationRangeCenteredOnMessage, getConversationMessageStats, getLastConversationMessage, getAllCallHistory, getCallHistoryUnreadCount, getCallHistoryMessageByCallId, getCallHistory, getCallHistoryGroupsCount, getCallHistoryGroups, hasGroupCallHistoryMessage, hasMedia, getSortedMedia, getSortedNonAttachmentMedia, getSortedDocuments, getAllNotificationProfiles, getNotificationProfileById, getAllDonationReceipts: import_donationReceipts_std.getAllDonationReceipts, getDonationReceiptById: import_donationReceipts_std.getDonationReceiptById, getAllChatFolders: import_chatFolders_std.getAllChatFolders, getCurrentChatFolders: import_chatFolders_std.getCurrentChatFolders, getChatFolder: import_chatFolders_std.getChatFolder, hasAllChatsChatFolder: import_chatFolders_std.hasAllChatsChatFolder, getOldestDeletedChatFolder: import_chatFolders_std.getOldestDeletedChatFolder, getAllMegaphones: import_megaphones_std.getAllMegaphones, getAllMegaphoneIds: import_megaphones_std.getAllMegaphoneIds, hasMegaphone: import_megaphones_std.hasMegaphone, getAllKTAcis: import_keyTransparency_std.getAllKTAcis, getKTAccountData: import_keyTransparency_std.getKTAccountData, getAllPinnedMessages: import_pinnedMessages_std.getAllPinnedMessages, getPinnedMessagesPreloadDataForConversation: import_pinnedMessages_std.getPinnedMessagesPreloadDataForConversation, getNextExpiringPinnedMessageAcrossConversations: import_pinnedMessages_std.getNextExpiringPinnedMessageAcrossConversations, callLinkExists: import_callLinks_node.callLinkExists, defunctCallLinkExists: import_callLinks_node.defunctCallLinkExists, getAllCallLinks: import_callLinks_node.getAllCallLinks, getCallLinkByRoomId: import_callLinks_node.getCallLinkByRoomId, getCallLinkRecordByRoomId: import_callLinks_node.getCallLinkRecordByRoomId, getAllAdminCallLinks: import_callLinks_node.getAllAdminCallLinks, getAllCallLinkRecordsWithAdminKey: import_callLinks_node.getAllCallLinkRecordsWithAdminKey, getAllDefunctCallLinksWithAdminKey: import_callLinks_node.getAllDefunctCallLinksWithAdminKey, getAllMarkedDeletedCallLinkRoomIds: import_callLinks_node.getAllMarkedDeletedCallLinkRoomIds, getMessagesBetween, getNearbyMessageFromDeletedSet, getMostRecentAddressableMessages, getMostRecentAddressableNondisappearingMessages, getUnprocessedCount, _getAttachmentDownloadJob, getStickerCount, getAllStickerPacks, getInstalledStickerPacks, getUninstalledStickerPacks, getStickerPackInfo, getAllStickers, getRecentStickers, getRecentEmojis, getRecentGifs, getAllBadges, getAllBadgeImageFileLocalPaths, getAllMegaphoneImageLocalPaths: import_megaphones_std.getAllMegaphoneImageLocalPaths, getAllStoryDistributionsWithMembers, getStoryDistributionWithMembers, _getAllStoryDistributions, _getAllStoryDistributionMembers, _getAllStoryReads, getLastStoryReadsForAuthor, getMessagesNeedingUpgrade, getMessageServerGuidsForSpam, getJobsInQueue, wasGroupCallRingPreviouslyCanceled, getMaxMessageCounter, getStatisticsForLogging, getMostRecentAttachmentUploadData, getBackupCdnObjectMetadata, getBackupAttachmentDownloadProgress, getAttachmentReferencesForMessages: import_hydration_std.getAttachmentReferencesForMessages, getMessageCountBySchemaVersion, getMessageSampleForSchemaVersion, isAttachmentSafeToDelete, getAllProtectedAttachmentPaths, // Server-only getKnownMessageAttachments, finishGetKnownMessageAttachments, pageMessages, finishPageMessages, getKnownDownloads, getKnownConversationAttachments, __dangerouslyRunAbitraryReadOnlySqlQuery }; const DataWriter = { close: closeWritable, removeIndexedDBFiles, createOrUpdateIdentityKey, bulkAddIdentityKeys, removeIdentityKeyById, removeAllIdentityKeys, createOrUpdateKyberPreKey, bulkAddKyberPreKeys, removeKyberPreKeyById, removeKyberPreKeysByServiceId, removeAllKyberPreKeys, createOrUpdatePreKey, bulkAddPreKeys, removePreKeyById, removePreKeysByServiceId, removeAllPreKeys, createOrUpdateSignedPreKey, bulkAddSignedPreKeys, removeSignedPreKeyById, removeSignedPreKeysByServiceId, removeAllSignedPreKeys, createOrUpdateItem, removeItemById, removeAllItems, createOrUpdateSenderKey, removeAllSenderKeys, removeSenderKeyById, insertSentProto, deleteSentProtosOlderThan, deleteSentProtoByMessageId, insertProtoRecipients, deleteSentProtoRecipient, removeAllSentProtos, getSentProtoByRecipient, createOrUpdateSession, createOrUpdateSessions, commitDecryptResult, removeSessionById, removeSessionsByConversation, removeSessionsByServiceId, removeAllSessions, saveConversation, saveConversations, updateConversation, updateConversations, removeConversation, _removeAllConversations, updateAllConversationColors, removeAllProfileKeyCredentials, getUnreadByConversationAndMarkRead, getUnreadReactionsAndMarkRead, getUnreadPollVotesAndMarkRead, replaceAllEndorsementsForGroup: import_groupSendEndorsements_std.replaceAllEndorsementsForGroup, deleteAllEndorsementsForGroup: import_groupSendEndorsements_std.deleteAllEndorsementsForGroup, saveMessage, saveMessages, saveMessagesIndividually, removeMessage, removeMessages, markReactionAsRead, markPollVoteAsRead, addReaction, removeReactionFromConversation, _removeAllReactions, _removeAllMessages, _removeMessage: removeMessage, getUnreadEditedMessagesAndMarkRead, clearCallHistory, _removeAllCallHistory, markCallHistoryDeleted, cleanupCallHistoryMessages, markCallHistoryRead, markAllCallHistoryRead, markAllCallHistoryReadInConversation, saveCallHistory, markCallHistoryMissed, insertCallLink: import_callLinks_node.insertCallLink, insertOrUpdateCallLinkFromSync: import_callLinks_node.insertOrUpdateCallLinkFromSync, updateCallLink: import_callLinks_node.updateCallLink, updateCallLinkState: import_callLinks_node.updateCallLinkState, updateCallLinkStateAndEpoch: import_callLinks_node.updateCallLinkStateAndEpoch, beginDeleteAllCallLinks: import_callLinks_node.beginDeleteAllCallLinks, beginDeleteCallLink: import_callLinks_node.beginDeleteCallLink, deleteCallHistoryByRoomId: import_callLinks_node.deleteCallHistoryByRoomId, deleteCallLinkAndHistory: import_callLinks_node.deleteCallLinkAndHistory, finalizeDeleteCallLink: import_callLinks_node.finalizeDeleteCallLink, _removeAllCallLinks: import_callLinks_node._removeAllCallLinks, deleteCallLinkFromSync: import_callLinks_node.deleteCallLinkFromSync, insertDefunctCallLink: import_callLinks_node.insertDefunctCallLink, updateDefunctCallLink: import_callLinks_node.updateDefunctCallLink, migrateConversationMessages, saveEditedMessage, saveEditedMessages, incrementMessagesMigrationAttempts, removeSyncTaskById, removeSyncTasks, saveSyncTasks, incrementAllSyncTaskAttempts, dequeueOldestSyncTasks, getUnprocessedByIdsAndIncrementAttempts, getAllUnprocessedIds, removeUnprocessed, removeAllUnprocessed, getNextAttachmentDownloadJobs, saveAttachmentDownloadJob, saveAttachmentDownloadJobs, resetAttachmentDownloadActive, resetBackupAttachmentDownloadJobsRetryAfter, removeAttachmentDownloadJob, removeAttachmentDownloadJobsForMessage, removeAllBackupAttachmentDownloadJobs, resetBackupAttachmentDownloadStats, getAndProtectExistingAttachmentPath, _protectAttachmentPathFromDeletion, resetProtectedAttachmentPaths, getNextAttachmentBackupJobs, saveAttachmentBackupJob, markAllAttachmentBackupJobsInactive, removeAttachmentBackupJob, clearAllAttachmentBackupJobs, clearAllBackupCdnObjectMetadata, saveBackupCdnObjectMetadata, createOrUpdateStickerPack, createOrUpdateStickerPacks, updateStickerPackStatus, updateStickerPackInfo, createOrUpdateSticker, createOrUpdateStickers, updateStickerLastUsed, addStickerPackReference, deleteStickerPackReference, deleteStickerPack, getUnresolvedStickerPackReferences, addUninstalledStickerPack, addUninstalledStickerPacks, installStickerPack, uninstallStickerPack, clearAllErrorStickerPackAttempts, updateEmojiUsage, addRecentGif, removeRecentGif, updateOrCreateBadges, badgeImageFileDownloaded, getRecentStaleRingsAndMarkOlderMissed, _deleteAllStoryDistributions, createNewStoryDistribution, modifyStoryDistribution, modifyStoryDistributionMembers, modifyStoryDistributionWithMembers, deleteStoryDistribution, _deleteAllStoryReads, addNewStoryRead, _deleteAllNotificationProfiles, createNotificationProfile, deleteNotificationProfileById, markNotificationProfileDeleted, updateNotificationProfile, _deleteAllDonationReceipts: import_donationReceipts_std._deleteAllDonationReceipts, deleteDonationReceiptById: import_donationReceipts_std.deleteDonationReceiptById, createDonationReceipt: import_donationReceipts_std.createDonationReceipt, createChatFolder: import_chatFolders_std.createChatFolder, createAllChatsChatFolder: import_chatFolders_std.createAllChatsChatFolder, upsertAllChatsChatFolderFromSync: import_chatFolders_std.upsertAllChatsChatFolderFromSync, updateChatFolder: import_chatFolders_std.updateChatFolder, updateChatFolderToggleChat: import_chatFolders_std.updateChatFolderToggleChat, updateChatFolderPositions: import_chatFolders_std.updateChatFolderPositions, updateChatFolderDeletedAtTimestampMsFromSync: import_chatFolders_std.updateChatFolderDeletedAtTimestampMsFromSync, markChatFolderDeleted: import_chatFolders_std.markChatFolderDeleted, deleteExpiredChatFolders: import_chatFolders_std.deleteExpiredChatFolders, createMegaphone: import_megaphones_std.createMegaphone, updateMegaphone: import_megaphones_std.updateMegaphone, deleteMegaphone: import_megaphones_std.deleteMegaphone, finishMegaphone: import_megaphones_std.finishMegaphone, snoozeMegaphone: import_megaphones_std.snoozeMegaphone, internalDeleteAllMegaphones: import_megaphones_std.internalDeleteAllMegaphones, setKTAccountData: import_keyTransparency_std.setKTAccountData, removeAllKTAccountData: import_keyTransparency_std.removeAllKTAccountData, appendPinnedMessage: import_pinnedMessages_std.appendPinnedMessage, deletePinnedMessageByMessageId: import_pinnedMessages_std.deletePinnedMessageByMessageId, deleteAllExpiredPinnedMessagesBefore: import_pinnedMessages_std.deleteAllExpiredPinnedMessagesBefore, removeAll, removeAllConfiguration, eraseStorageServiceState, insertJob, deleteJob, processGroupCallRingCancellation, cleanExpiredGroupCallRingCancellations, disableMessageInsertTriggers, enableMessageInsertTriggersAndBackfill, ensureMessageInsertTriggersAreEnabled, disableFSync, enableFSyncAndCheckpoint, _testOnlyRemoveMessageAttachments, // Server-only removeKnownStickers, removeKnownDraftAttachments, runCorruptionChecks }; function rowToConversation(row) { const { expireTimerVersion } = row; const parsedJson = JSON.parse(row.json); let profileLastFetchedAt; if ((0, import_isNormalNumber_std.isNormalNumber)(row.profileLastFetchedAt)) { profileLastFetchedAt = row.profileLastFetchedAt; } else { (0, import_assert_std.assertDev)( isNil(row.profileLastFetchedAt), "profileLastFetchedAt contained invalid data; defaulting to undefined" ); profileLastFetchedAt = void 0; } return { ...parsedJson, expireTimerVersion, profileLastFetchedAt }; } __name(rowToConversation, "rowToConversation"); function rowToSticker(row) { return { ...row, isCoverOnly: Boolean(row.isCoverOnly), emoji: (0, import_dropNull_std.dropNull)(row.emoji), version: row.version || 1, localKey: (0, import_dropNull_std.dropNull)(row.localKey), size: (0, import_dropNull_std.dropNull)(row.size) }; } __name(rowToSticker, "rowToSticker"); function keyDatabase(db, key) { db.pragma(`key = "x'${key}'"`); } __name(keyDatabase, "keyDatabase"); function switchToWAL(db) { db.pragma("journal_mode = WAL"); db.pragma("synchronous = FULL"); } __name(switchToWAL, "switchToWAL"); function migrateSchemaVersion(db) { const userVersion = (0, import_util_std.getUserVersion)(db); if (userVersion > 0) { return; } const schemaVersion = (0, import_util_std.getSchemaVersion)(db); const newUserVersion = schemaVersion > 18 ? 16 : schemaVersion; logger.info( `migrateSchemaVersion: Migrating from schema_version ${schemaVersion} to user_version ${newUserVersion}` ); (0, import_util_std.setUserVersion)(db, newUserVersion); } __name(migrateSchemaVersion, "migrateSchemaVersion"); function openAndMigrateDatabase(filePath, key) { let db; try { db = new import_sqlcipher.default(filePath, { cacheStatements: true }); keyDatabase(db, key); switchToWAL(db); migrateSchemaVersion(db); return db; } catch (error) { if (db) { db.close(); } logger.info("migrateDatabase: Migration without cipher change failed"); } db = new import_sqlcipher.default(filePath); try { keyDatabase(db, key); db.pragma("cipher_compatibility = 3"); migrateSchemaVersion(db); db.close(); db = new import_sqlcipher.default(filePath); keyDatabase(db, key); db.pragma("cipher_migrate"); switchToWAL(db); } catch (error) { try { db.close(); } catch { } throw error; } return db; } __name(openAndMigrateDatabase, "openAndMigrateDatabase"); const INVALID_KEY = /[^0-9A-Fa-f]/; function openAndSetUpSQLCipher(filePath, { key }) { const match = INVALID_KEY.exec(key); if (match) { throw new Error(`setupSQLCipher: key '${key}' is not valid`); } const db = openAndMigrateDatabase(filePath, key); try { db.pragma("foreign_keys = ON"); } catch (error) { try { db.close(); } catch { } throw error; } try { db.pragma("fullfsync = false"); db.pragma("checkpoint_fullfsync = true"); } catch (error) { logger.warn( "openAndSetUpSQLCipher: Unable to set fullfsync", Errors.toLogFormat(error) ); } db.initTokenizer(); return db; } __name(openAndSetUpSQLCipher, "openAndSetUpSQLCipher"); let logger = import_sqlLogger_node.sqlLogger; let databaseFilePath; let indexedDBPath; (0, import_sqlcipher.setLogger)((code, message) => { if (code === "SQLITE_SCHEMA") { return; } if (code === "SQLITE_NOTICE") { logger.info(`sqlite(${code}): ${message}`); return; } logger.warn(`sqlite(${code}): ${message}`); }); function initialize({ configDir, key, isPrimary }) { if (!isString(configDir)) { throw new Error("initialize: configDir is required!"); } if (!isString(key)) { throw new Error("initialize: key is required!"); } indexedDBPath = (0, import_node_path.join)(configDir, "IndexedDB"); const dbDir = (0, import_node_path.join)(configDir, "sql"); (0, import_node_fs.mkdirSync)(dbDir, { recursive: true }); databaseFilePath = (0, import_node_path.join)(dbDir, "db.sqlite"); let db; try { db = openAndSetUpSQLCipher(databaseFilePath, { key }); if (isPrimary) { (0, import_index_node.updateSchema)(db, logger); } getMessageCount(db); return db; } catch (error) { logger.error("Database startup error:", error.stack); db?.close(); throw error; } } __name(initialize, "initialize"); function setupTests(db) { const silentLogger = { ...import_consoleLogger_std.consoleLogger, info: noop, child() { return silentLogger; } }; logger = silentLogger; (0, import_index_node.updateSchema)(db, logger); } __name(setupTests, "setupTests"); function closeReadable(db) { db.close(); } __name(closeReadable, "closeReadable"); function closeWritable(db) { db.pragma("optimize"); db.close(); } __name(closeWritable, "closeWritable"); function removeDB() { if (!databaseFilePath) { throw new Error( "removeDB: Cannot erase database without a databaseFilePath!" ); } logger.warn("removeDB: Removing all database files"); (0, import_node_fs.rmSync)(databaseFilePath, { recursive: true, force: true }); (0, import_node_fs.rmSync)(`${databaseFilePath}-shm`, { recursive: true, force: true }); (0, import_node_fs.rmSync)(`${databaseFilePath}-wal`, { recursive: true, force: true }); } __name(removeDB, "removeDB"); function removeIndexedDBFiles(_db) { if (!indexedDBPath) { throw new Error( "removeIndexedDBFiles: Need to initialize and set indexedDBPath first!" ); } const pattern = (0, import_node_path.join)(indexedDBPath, "*.leveldb"); (0, import_node_fs.rmSync)(pattern, { recursive: true, force: true }); indexedDBPath = void 0; } __name(removeIndexedDBFiles, "removeIndexedDBFiles"); function toUnsafeWritableDB(db, _reason) { return db; } __name(toUnsafeWritableDB, "toUnsafeWritableDB"); const IDENTITY_KEYS_TABLE = "identityKeys"; function createOrUpdateIdentityKey(db, data) { return (0, import_util_std.createOrUpdate)(db, IDENTITY_KEYS_TABLE, data); } __name(createOrUpdateIdentityKey, "createOrUpdateIdentityKey"); function getIdentityKeyById(db, id) { return (0, import_util_std.getById)(db, IDENTITY_KEYS_TABLE, id); } __name(getIdentityKeyById, "getIdentityKeyById"); function bulkAddIdentityKeys(db, array) { return (0, import_util_std.bulkAdd)(db, IDENTITY_KEYS_TABLE, array); } __name(bulkAddIdentityKeys, "bulkAddIdentityKeys"); function removeIdentityKeyById(db, id) { return (0, import_util_std.removeById)(db, IDENTITY_KEYS_TABLE, id); } __name(removeIdentityKeyById, "removeIdentityKeyById"); function removeAllIdentityKeys(db) { return (0, import_util_std.removeAllFromTable)(db, IDENTITY_KEYS_TABLE); } __name(removeAllIdentityKeys, "removeAllIdentityKeys"); function getAllIdentityKeys(db) { return (0, import_util_std.getAllFromTable)(db, IDENTITY_KEYS_TABLE); } __name(getAllIdentityKeys, "getAllIdentityKeys"); const KYBER_PRE_KEYS_TABLE = "kyberPreKeys"; function createOrUpdateKyberPreKey(db, data) { return (0, import_util_std.createOrUpdate)(db, KYBER_PRE_KEYS_TABLE, data); } __name(createOrUpdateKyberPreKey, "createOrUpdateKyberPreKey"); function getKyberPreKeyById(db, id) { return (0, import_util_std.getById)(db, KYBER_PRE_KEYS_TABLE, id); } __name(getKyberPreKeyById, "getKyberPreKeyById"); function bulkAddKyberPreKeys(db, array) { return (0, import_util_std.bulkAdd)(db, KYBER_PRE_KEYS_TABLE, array); } __name(bulkAddKyberPreKeys, "bulkAddKyberPreKeys"); function removeKyberPreKeyById(db, id) { return (0, import_util_std.removeById)(db, KYBER_PRE_KEYS_TABLE, id); } __name(removeKyberPreKeyById, "removeKyberPreKeyById"); function removeKyberPreKeysByServiceId(db, serviceId) { db.prepare("DELETE FROM kyberPreKeys WHERE ourServiceId IS $serviceId;").run({ serviceId }); } __name(removeKyberPreKeysByServiceId, "removeKyberPreKeysByServiceId"); function markKyberTripleSeenOrFail(db, { id, signedPreKeyId, baseKey }) { const [query, parameters] = import_util_std.sql` INSERT OR FAIL INTO kyberPreKey_triples (id, signedPreKeyId, baseKey) VALUES (${id}, ${signedPreKeyId}, ${baseKey}); `; try { db.prepare(query).run(parameters); } catch (error) { if (error.code === "SQLITE_CONSTRAINT_UNIQUE") { throw new Error(`Duplicate kyber triple ${id}:${signedPreKeyId}`); } throw error; } } __name(markKyberTripleSeenOrFail, "markKyberTripleSeenOrFail"); function removeAllKyberPreKeys(db) { return (0, import_util_std.removeAllFromTable)(db, KYBER_PRE_KEYS_TABLE); } __name(removeAllKyberPreKeys, "removeAllKyberPreKeys"); function getAllKyberPreKeys(db) { return (0, import_util_std.getAllFromTable)(db, KYBER_PRE_KEYS_TABLE); } __name(getAllKyberPreKeys, "getAllKyberPreKeys"); const PRE_KEYS_TABLE = "preKeys"; function createOrUpdatePreKey(db, data) { return (0, import_util_std.createOrUpdate)(db, PRE_KEYS_TABLE, data); } __name(createOrUpdatePreKey, "createOrUpdatePreKey"); function getPreKeyById(db, id) { return (0, import_util_std.getById)(db, PRE_KEYS_TABLE, id); } __name(getPreKeyById, "getPreKeyById"); function bulkAddPreKeys(db, array) { return (0, import_util_std.bulkAdd)(db, PRE_KEYS_TABLE, array); } __name(bulkAddPreKeys, "bulkAddPreKeys"); function removePreKeyById(db, id) { return (0, import_util_std.removeById)(db, PRE_KEYS_TABLE, id); } __name(removePreKeyById, "removePreKeyById"); function removePreKeysByServiceId(db, serviceId) { db.prepare("DELETE FROM preKeys WHERE ourServiceId IS $serviceId;").run({ serviceId }); } __name(removePreKeysByServiceId, "removePreKeysByServiceId"); function removeAllPreKeys(db) { return (0, import_util_std.removeAllFromTable)(db, PRE_KEYS_TABLE); } __name(removeAllPreKeys, "removeAllPreKeys"); function getAllPreKeys(db) { return (0, import_util_std.getAllFromTable)(db, PRE_KEYS_TABLE); } __name(getAllPreKeys, "getAllPreKeys"); const SIGNED_PRE_KEYS_TABLE = "signedPreKeys"; function createOrUpdateSignedPreKey(db, data) { return (0, import_util_std.createOrUpdate)(db, SIGNED_PRE_KEYS_TABLE, data); } __name(createOrUpdateSignedPreKey, "createOrUpdateSignedPreKey"); function getSignedPreKeyById(db, id) { return (0, import_util_std.getById)(db, SIGNED_PRE_KEYS_TABLE, id); } __name(getSignedPreKeyById, "getSignedPreKeyById"); function bulkAddSignedPreKeys(db, array) { return (0, import_util_std.bulkAdd)(db, SIGNED_PRE_KEYS_TABLE, array); } __name(bulkAddSignedPreKeys, "bulkAddSignedPreKeys"); function removeSignedPreKeyById(db, id) { return (0, import_util_std.removeById)(db, SIGNED_PRE_KEYS_TABLE, id); } __name(removeSignedPreKeyById, "removeSignedPreKeyById"); function removeSignedPreKeysByServiceId(db, serviceId) { db.prepare("DELETE FROM signedPreKeys WHERE ourServiceId IS $serviceId;").run( { serviceId } ); } __name(removeSignedPreKeysByServiceId, "removeSignedPreKeysByServiceId"); function removeAllSignedPreKeys(db) { return (0, import_util_std.removeAllFromTable)(db, SIGNED_PRE_KEYS_TABLE); } __name(removeAllSignedPreKeys, "removeAllSignedPreKeys"); function getAllSignedPreKeys(db) { const rows = db.prepare( ` SELECT json FROM signedPreKeys ORDER BY id ASC; ` ).all(); return rows.map((row) => (0, import_util_std.jsonToObject)(row.json)); } __name(getAllSignedPreKeys, "getAllSignedPreKeys"); const ITEMS_TABLE = "items"; function createOrUpdateItem(db, data) { return (0, import_util_std.createOrUpdate)(db, ITEMS_TABLE, data); } __name(createOrUpdateItem, "createOrUpdateItem"); function getItemById(db, id) { return (0, import_util_std.getById)(db, ITEMS_TABLE, id); } __name(getItemById, "getItemById"); function getAllItems(db) { const rows = db.prepare("SELECT json FROM items ORDER BY id ASC;").all(); const items = rows.map((row) => (0, import_util_std.jsonToObject)(row.json)); const result = /* @__PURE__ */ Object.create(null); for (const { id, value } of items) { result[id] = value; } return result; } __name(getAllItems, "getAllItems"); function removeItemById(db, id) { return (0, import_util_std.removeById)(db, ITEMS_TABLE, id); } __name(removeItemById, "removeItemById"); function removeAllItems(db) { return (0, import_util_std.removeAllFromTable)(db, ITEMS_TABLE); } __name(removeAllItems, "removeAllItems"); function createOrUpdateSenderKey(db, key) { db.prepare( ` INSERT OR REPLACE INTO senderKeys ( id, senderId, distributionId, data, lastUpdatedDate ) values ( $id, $senderId, $distributionId, $data, $lastUpdatedDate ) ` ).run(key); } __name(createOrUpdateSenderKey, "createOrUpdateSenderKey"); function getSenderKeyById(db, id) { return db.prepare("SELECT * FROM senderKeys WHERE id = $id").get({ id }); } __name(getSenderKeyById, "getSenderKeyById"); function removeAllSenderKeys(db) { db.prepare("DELETE FROM senderKeys").run(); } __name(removeAllSenderKeys, "removeAllSenderKeys"); function getAllSenderKeys(db) { return db.prepare("SELECT * FROM senderKeys").all(); } __name(getAllSenderKeys, "getAllSenderKeys"); function removeSenderKeyById(db, id) { db.prepare("DELETE FROM senderKeys WHERE id = $id").run({ id }); } __name(removeSenderKeyById, "removeSenderKeyById"); function insertSentProto(db, proto, options) { const { recipients, messageIds } = options; return db.transaction(() => { const info = db.prepare( ` INSERT INTO sendLogPayloads ( contentHint, proto, timestamp, urgent, hasPniSignatureMessage ) VALUES ( $contentHint, $proto, $timestamp, $urgent, $hasPniSignatureMessage ); ` ).run({ ...proto, urgent: proto.urgent ? 1 : 0, hasPniSignatureMessage: proto.hasPniSignatureMessage ? 1 : 0 }); const id = (0, import_parseIntOrThrow_std.parseIntOrThrow)( info.lastInsertRowid, "insertSentProto/lastInsertRowid" ); const recipientStatement = db.prepare( ` INSERT INTO sendLogRecipients ( payloadId, recipientServiceId, deviceId ) VALUES ( $id, $recipientServiceId, $deviceId ); ` ); const recipientServiceIds = Object.keys(recipients); for (const recipientServiceId of recipientServiceIds) { (0, import_assert_std.strictAssert)( (0, import_ServiceId_std.isServiceIdString)(recipientServiceId), "Recipient must be a service id" ); const deviceIds = recipients[recipientServiceId]; for (const deviceId of deviceIds) { recipientStatement.run({ id, recipientServiceId, deviceId }); } } const messageStatement = db.prepare( ` INSERT INTO sendLogMessageIds ( payloadId, messageId ) VALUES ( $id, $messageId ); ` ); for (const messageId of new Set(messageIds)) { messageStatement.run({ id, messageId }); } return id; })(); } __name(insertSentProto, "insertSentProto"); function deleteSentProtosOlderThan(db, timestamp) { db.prepare( ` DELETE FROM sendLogPayloads WHERE timestamp IS NULL OR timestamp < $timestamp; ` ).run({ timestamp }); } __name(deleteSentProtosOlderThan, "deleteSentProtosOlderThan"); function deleteSentProtoByMessageId(db, messageId) { db.prepare( ` DELETE FROM sendLogPayloads WHERE id IN ( SELECT payloadId FROM sendLogMessageIds WHERE messageId = $messageId ); ` ).run({ messageId }); } __name(deleteSentProtoByMessageId, "deleteSentProtoByMessageId"); function insertProtoRecipients(db, { id, recipientServiceId, deviceIds }) { db.transaction(() => { const statement = db.prepare( ` INSERT INTO sendLogRecipients ( payloadId, recipientServiceId, deviceId ) VALUES ( $id, $recipientServiceId, $deviceId ); ` ); for (const deviceId of deviceIds) { statement.run({ id, recipientServiceId, deviceId }); } })(); } __name(insertProtoRecipients, "insertProtoRecipients"); function deleteSentProtoRecipient(db, options) { const items = Array.isArray(options) ? options : [options]; return db.transaction(() => { const successfulPhoneNumberShares = new Array(); for (const item of items) { const { timestamp, recipientServiceId, deviceId } = item; const rows = db.prepare( ` SELECT sendLogPayloads.id, sendLogPayloads.hasPniSignatureMessage FROM sendLogPayloads INNER JOIN sendLogRecipients ON sendLogRecipients.payloadId = sendLogPayloads.id WHERE sendLogPayloads.timestamp = $timestamp AND sendLogRecipients.recipientServiceId = $recipientServiceId AND sendLogRecipients.deviceId = $deviceId; ` ).all({ timestamp, recipientServiceId, deviceId }); if (!rows.length) { continue; } if (rows.length > 1) { logger.warn( `deleteSentProtoRecipient: More than one payload matches recipient and timestamp ${timestamp}. Using the first.` ); } const { id, hasPniSignatureMessage } = rows[0]; db.prepare( ` DELETE FROM sendLogRecipients WHERE payloadId = $id AND recipientServiceId = $recipientServiceId AND deviceId = $deviceId; ` ).run({ id, recipientServiceId, deviceId }); const remainingDevices = db.prepare( ` SELECT count(1) FROM sendLogRecipients WHERE payloadId = $id AND recipientServiceId = $recipientServiceId; `, { pluck: true } ).get({ id, recipientServiceId }) ?? 0; if (remainingDevices === 0 && hasPniSignatureMessage) { logger.info( `deleteSentProtoRecipient: Successfully shared phone number with ${recipientServiceId} through message ${timestamp}` ); successfulPhoneNumberShares.push(recipientServiceId); } (0, import_assert_std.strictAssert)( isNumber(remainingDevices), "deleteSentProtoRecipient: select count() returned non-number!" ); const remainingTotal = db.prepare( "SELECT count(1) FROM sendLogRecipients WHERE payloadId = $id;", { pluck: true } ).get({ id }); (0, import_assert_std.strictAssert)( isNumber(remainingTotal), "deleteSentProtoRecipient: select count() returned non-number!" ); if (remainingTotal > 0) { continue; } logger.info( `deleteSentProtoRecipient: Deleting proto payload for timestamp ${timestamp}` ); db.prepare("DELETE FROM sendLogPayloads WHERE id = $id;").run({ id }); } return { successfulPhoneNumberShares }; })(); } __name(deleteSentProtoRecipient, "deleteSentProtoRecipient"); function getSentProtoByRecipient(db, { now, recipientServiceId, timestamp }) { const HOUR = 1e3 * 60 * 60; const oneDayAgo = now - HOUR * 24; deleteSentProtosOlderThan(db, oneDayAgo); const row = db.prepare( ` SELECT sendLogPayloads.*, GROUP_CONCAT(DISTINCT sendLogMessageIds.messageId) AS messageIds FROM sendLogPayloads INNER JOIN sendLogRecipients ON sendLogRecipients.payloadId = sendLogPayloads.id LEFT JOIN sendLogMessageIds ON sendLogMessageIds.payloadId = sendLogPayloads.id WHERE sendLogPayloads.timestamp = $timestamp AND sendLogRecipients.recipientServiceId = $recipientServiceId GROUP BY sendLogPayloads.id; ` ).get({ timestamp, recipientServiceId }); if (!row) { return void 0; } const { messageIds } = row; return { ...row, urgent: isNumber(row.urgent) ? Boolean(row.urgent) : true, hasPniSignatureMessage: isNumber(row.hasPniSignatureMessage) ? Boolean(row.hasPniSignatureMessage) : true, messageIds: messageIds ? messageIds.split(",") : [] }; } __name(getSentProtoByRecipient, "getSentProtoByRecipient"); function removeAllSentProtos(db) { db.prepare("DELETE FROM sendLogPayloads;").run(); } __name(removeAllSentProtos, "removeAllSentProtos"); function getAllSentProtos(db) { const rows = db.prepare("SELECT * FROM sendLogPayloads;").all(); return rows.map((row) => ({ ...row, urgent: isNumber(row.urgent) ? Boolean(row.urgent) : true, hasPniSignatureMessage: isNumber(row.hasPniSignatureMessage) ? Boolean(row.hasPniSignatureMessage) : true })); } __name(getAllSentProtos, "getAllSentProtos"); function _getAllSentProtoRecipients(db) { return db.prepare("SELECT * FROM sendLogRecipients;").all(); } __name(_getAllSentProtoRecipients, "_getAllSentProtoRecipients"); function _getAllSentProtoMessageIds(db) { return db.prepare("SELECT * FROM sendLogMessageIds;").all(); } __name(_getAllSentProtoMessageIds, "_getAllSentProtoMessageIds"); const SESSIONS_TABLE = "sessions"; function createOrUpdateSession(db, data) { const { id, conversationId, ourServiceId, serviceId, deviceId, record } = data; if (!id) { throw new Error( "createOrUpdateSession: Provided data did not have a truthy id" ); } if (!conversationId) { throw new Error( "createOrUpdateSession: Provided data did not have a truthy conversationId" ); } db.prepare( ` INSERT OR REPLACE INTO sessions ( id, conversationId, ourServiceId, serviceId, deviceId, record ) values ( $id, $conversationId, $ourServiceId, $serviceId, $deviceId, $record ) ` ).run({ id, conversationId, ourServiceId, serviceId, deviceId, record }); } __name(createOrUpdateSession, "createOrUpdateSession"); function createOrUpdateSessions(db, array) { db.transaction(() => { for (const item of array) { createOrUpdateSession(db, item); } })(); } __name(createOrUpdateSessions, "createOrUpdateSessions"); function commitDecryptResult(db, { kyberPreKeysToRemove, preKeysToRemove, senderKeys, sessions, unprocessed, kyberTriples }) { db.transaction(() => { if (kyberPreKeysToRemove.length > 0) { const kyberPreKeyChanges = removeKyberPreKeyById( db, kyberPreKeysToRemove ); if (kyberPreKeyChanges === kyberPreKeysToRemove.length) { logger.info( `commitDecryptResult: Removed ${kyberPreKeyChanges} kyberPreKeys` ); } else { logger.error( `commitDecryptResult: Changed ${kyberPreKeyChanges} keys, but had ${kyberPreKeysToRemove.length} kyberPreKeys to remove` ); } } if (preKeysToRemove.length > 0) { const preKeyChanges = removePreKeyById(db, preKeysToRemove); if (preKeyChanges === preKeysToRemove.length) { logger.info(`commitDecryptResult: Removed ${preKeyChanges} preKeys`); } else { logger.error( `commitDecryptResult: Changed ${preKeyChanges} keys, but had ${preKeysToRemove.length} preKeys to remove` ); } } for (const item of senderKeys) { createOrUpdateSenderKey(db, item); } for (const item of sessions) { createOrUpdateSession(db, item); } for (const item of unprocessed) { saveUnprocessed(db, item); } for (const item of kyberTriples) { markKyberTripleSeenOrFail(db, item); } })(); } __name(commitDecryptResult, "commitDecryptResult"); function removeSessionById(db, id) { return (0, import_util_std.removeById)(db, SESSIONS_TABLE, id); } __name(removeSessionById, "removeSessionById"); function removeSessionsByConversation(db, conversationId) { db.prepare( ` DELETE FROM sessions WHERE conversationId = $conversationId; ` ).run({ conversationId }); } __name(removeSessionsByConversation, "removeSessionsByConversation"); function removeSessionsByServiceId(db, serviceId) { db.prepare( ` DELETE FROM sessions WHERE serviceId = $serviceId; ` ).run({ serviceId }); } __name(removeSessionsByServiceId, "removeSessionsByServiceId"); function removeAllSessions(db) { return (0, import_util_std.removeAllFromTable)(db, SESSIONS_TABLE); } __name(removeAllSessions, "removeAllSessions"); function getAllSessions(db) { return db.prepare("SELECT * FROM sessions").all(); } __name(getAllSessions, "getAllSessions"); function getAllKyberTriples(db) { return db.prepare("SELECT * FROM kyberPreKey_triples").all(); } __name(getAllKyberTriples, "getAllKyberTriples"); function getConversationCount(db) { return (0, import_util_std.getCountFromTable)(db, "conversations"); } __name(getConversationCount, "getConversationCount"); function getConversationMembersList({ members, membersV2 }) { if (membersV2) { return membersV2.map((item) => item.aci).join(" "); } if (members) { return members.join(" "); } return null; } __name(getConversationMembersList, "getConversationMembersList"); function saveConversation(db, data) { const { active_at, e164, groupId, id, name, profileFamilyName, profileName, profileLastFetchedAt, type, serviceId, expireTimerVersion } = data; const membersList = getConversationMembersList(data); db.prepare( ` INSERT INTO conversations ( id, json, e164, serviceId, groupId, active_at, type, members, name, profileName, profileFamilyName, profileFullName, profileLastFetchedAt, expireTimerVersion ) values ( $id, $json, $e164, $serviceId, $groupId, $active_at, $type, $members, $name, $profileName, $profileFamilyName, $profileFullName, $profileLastFetchedAt, $expireTimerVersion ); ` ).run({ id, json: (0, import_util_std.objectToJSON)( omit(data, ["profileLastFetchedAt", "expireTimerVersion"]) ), e164: e164 || null, serviceId: serviceId || null, groupId: groupId || null, active_at: active_at || null, type, members: membersList, name: name || null, profileName: profileName || null, profileFamilyName: profileFamilyName || null, profileFullName: (0, import_combineNames_std.combineNames)(profileName, profileFamilyName) || null, profileLastFetchedAt: profileLastFetchedAt || null, expireTimerVersion }); } __name(saveConversation, "saveConversation"); function saveConversations(db, arrayOfConversations) { db.transaction(() => { for (const conversation of arrayOfConversations) { saveConversation(db, conversation); } })(); } __name(saveConversations, "saveConversations"); function updateConversation(db, data) { const { id, active_at, type, name, profileName, profileFamilyName, profileLastFetchedAt, e164, serviceId, expireTimerVersion } = data; const membersList = getConversationMembersList(data); db.prepare( ` UPDATE conversations SET json = $json, e164 = $e164, serviceId = $serviceId, active_at = $active_at, type = $type, members = $members, name = $name, profileName = $profileName, profileFamilyName = $profileFamilyName, profileFullName = $profileFullName, profileLastFetchedAt = $profileLastFetchedAt, expireTimerVersion = $expireTimerVersion WHERE id = $id; ` ).run({ id, json: (0, import_util_std.objectToJSON)(omit(data, ["profileLastFetchedAt"])), e164: e164 || null, serviceId: serviceId || null, active_at: active_at || null, type, members: membersList, name: name || null, profileName: profileName || null, profileFamilyName: profileFamilyName || null, profileFullName: (0, import_combineNames_std.combineNames)(profileName, profileFamilyName) || null, profileLastFetchedAt: profileLastFetchedAt || null, expireTimerVersion }); } __name(updateConversation, "updateConversation"); function updateConversations(db, array) { db.transaction(() => { for (const item of array) { updateConversation(db, item); } })(); } __name(updateConversations, "updateConversations"); function removeConversations(db, ids, persistent) { db.prepare( ` DELETE FROM conversations WHERE id IN ( ${ids.map(() => "?").join(", ")} ); `, { persistent } ).run(ids); } __name(removeConversations, "removeConversations"); function removeConversation(db, id) { if (!Array.isArray(id)) { db.prepare("DELETE FROM conversations WHERE id = $id;").run({ id }); return; } if (!id.length) { throw new Error("removeConversation: No ids to delete!"); } (0, import_util_std.batchMultiVarQuery)( db, id, (ids, persistent) => removeConversations(db, ids, persistent) ); } __name(removeConversation, "removeConversation"); function _removeAllConversations(db) { db.prepare("DELETE from conversations;").run(); } __name(_removeAllConversations, "_removeAllConversations"); function getConversationById(db, id) { const row = db.prepare( ` SELECT json, profileLastFetchedAt, expireTimerVersion FROM conversations WHERE id = $id ` ).get({ id }); if (!row) { return void 0; } return rowToConversation(row); } __name(getConversationById, "getConversationById"); function getAllConversations(db) { const rows = db.prepare( ` SELECT json, profileLastFetchedAt, expireTimerVersion FROM conversations ORDER BY id ASC; ` ).all(); return rows.map((row) => rowToConversation(row)); } __name(getAllConversations, "getAllConversations"); function getAllConversationIds(db) { const rows = db.prepare( ` SELECT id FROM conversations ORDER BY id ASC; ` ).all(); return rows.map((row) => row.id); } __name(getAllConversationIds, "getAllConversationIds"); function searchMessages(db, { query, options, conversationId, contactServiceIdsMatchingQuery }) { const { limit = conversationId ? 100 : 500 } = options ?? {}; const writable = toUnsafeWritableDB(db, "only temp table use"); const normalizedQuery = writable.signalTokenize(query).map((token) => `"${token.replace(/"/g, '""')}"*`).join(" "); if (!normalizedQuery) { return []; } return writable.transaction(() => { writable.exec( ` CREATE TEMP TABLE tmp_results(rowid INTEGER PRIMARY KEY ASC); CREATE TEMP TABLE tmp_filtered_results(rowid INTEGER PRIMARY KEY ASC); ` ); writable.prepare( ` INSERT INTO tmp_results (rowid) SELECT rowid FROM messages_fts WHERE messages_fts.body MATCH $query; ` ).run({ query: normalizedQuery }); if (conversationId === void 0) { writable.prepare( ` INSERT INTO tmp_filtered_results (rowid) SELECT tmp_results.rowid FROM tmp_results INNER JOIN messages ON messages.rowid = tmp_results.rowid ORDER BY messages.received_at DESC, messages.sent_at DESC LIMIT $limit; ` ).run({ limit }); } else { writable.prepare( ` INSERT INTO tmp_filtered_results (rowid) SELECT tmp_results.rowid FROM tmp_results INNER JOIN messages ON messages.rowid = tmp_results.rowid WHERE messages.conversationId = $conversationId ORDER BY messages.received_at DESC, messages.sent_at DESC LIMIT $limit; ` ).run({ conversationId, limit }); } const ftsFragment = import_util_std.sqlFragment` SELECT messages.rowid, ${import_Interface_std.MESSAGE_COLUMNS_FRAGMENT}, snippet(messages_fts, -1, ${import_search_std.SNIPPET_LEFT_PLACEHOLDER}, ${import_search_std.SNIPPET_RIGHT_PLACEHOLDER}, ${import_search_std.SNIPPET_TRUNCATION_PLACEHOLDER}, 10) AS ftsSnippet FROM tmp_filtered_results INNER JOIN messages_fts ON messages_fts.rowid = tmp_filtered_results.rowid INNER JOIN messages ON messages.rowid = tmp_filtered_results.rowid WHERE messages_fts.body MATCH ${normalizedQuery} ORDER BY messages.received_at DESC, messages.sent_at DESC LIMIT ${limit} `; let queryResult; if (!contactServiceIdsMatchingQuery?.length) { const [sqlQuery, params] = import_util_std.sql`${ftsFragment};`; queryResult = writable.prepare(sqlQuery).all(params); } else { const coalescedColumns = (0, import_util_std.sqlJoin)( import_Interface_std.MESSAGE_COLUMNS.map((name) => { const id = (0, import_util_std.sqlId)(name); return import_util_std.sqlFragment` COALESCE(messages.${id}, ftsResults.${id}) AS ${id} `; }) ); const [sqlQuery, params] = import_util_std.sql` SELECT messages.rowid as rowid, ${coalescedColumns}, ftsResults.ftsSnippet, mentionAci, start as mentionStart, length as mentionLength FROM mentions INNER JOIN messages ON messages.id = mentions.messageId AND mentions.mentionAci IN ( ${(0, import_util_std.sqlJoin)(contactServiceIdsMatchingQuery)} ) AND ${conversationId ? import_util_std.sqlFragment`messages.conversationId = ${conversationId}` : "1 IS 1"} AND messages.isViewOnce IS NOT 1 AND messages.storyId IS NULL FULL OUTER JOIN ( ${ftsFragment} ) as ftsResults USING (rowid) GROUP BY rowid ORDER BY received_at DESC, sent_at DESC LIMIT ${limit}; `; queryResult = writable.prepare(sqlQuery).all(params); } writable.exec( ` DROP TABLE tmp_results; DROP TABLE tmp_filtered_results; ` ); const hydrated = (0, import_hydration_std.hydrateMessages)(db, queryResult); return queryResult.map((row, idx) => { return { ...hydrated[idx], ftsSnippet: row.ftsSnippet, mentionAci: row.mentionAci, mentionStart: row.mentionStart, mentionLength: row.mentionLength }; }); })(); } __name(searchMessages, "searchMessages"); function getStoryCount(db, conversationId) { return db.prepare( ` SELECT count(1) FROM messages WHERE conversationId = $conversationId AND isStory = 1; `, { pluck: true } ).get({ conversationId }) ?? 0; } __name(getStoryCount, "getStoryCount"); function getMessageCount(db, conversationId) { if (conversationId === void 0) { return (0, import_util_std.getCountFromTable)(db, "messages"); } const count = db.prepare( ` SELECT count(1) FROM messages WHERE conversationId = $conversationId; `, { pluck: true } ).get({ conversationId }); return count ?? 0; } __name(getMessageCount, "getMessageCount"); function hasUserInitiatedMessages(db, conversationId) { const exists = db.prepare( ` SELECT EXISTS( SELECT 1 FROM messages INDEXED BY message_user_initiated WHERE conversationId IS $conversationId AND isUserInitiatedMessage IS 1 ); `, { pluck: true } ).get({ conversationId }); return exists !== 0; } __name(hasUserInitiatedMessages, "hasUserInitiatedMessages"); function getMostRecentAddressableMessages(db, conversationId, limit = 5) { return db.transaction(() => { const [query, parameters] = import_util_std.sql` SELECT ${import_Interface_std.MESSAGE_COLUMNS_FRAGMENT} FROM messages INDEXED BY messages_by_date_addressable WHERE conversationId IS ${conversationId} AND isAddressableMessage = 1 ORDER BY received_at DESC, sent_at DESC LIMIT ${limit}; `; const rows = db.prepare(query).all(parameters); return (0, import_hydration_std.hydrateMessages)(db, rows); })(); } __name(getMostRecentAddressableMessages, "getMostRecentAddressableMessages"); function getMostRecentAddressableNondisappearingMessages(db, conversationId, limit = 5) { return db.transaction(() => { const [query, parameters] = import_util_std.sql` SELECT ${import_Interface_std.MESSAGE_COLUMNS_FRAGMENT} FROM messages INDEXED BY messages_by_date_addressable_nondisappearing WHERE expireTimer IS NULL AND conversationId IS ${conversationId} AND isAddressableMessage = 1 ORDER BY received_at DESC, sent_at DESC LIMIT ${limit}; `; const rows = db.prepare(query).all(parameters); return (0, import_hydration_std.hydrateMessages)(db, rows); })(); } __name(getMostRecentAddressableNondisappearingMessages, "getMostRecentAddressableNondisappearingMessages"); function removeSyncTaskById(db, id) { const [query, parameters] = import_util_std.sql` DELETE FROM syncTasks WHERE id IS ${id} `; db.prepare(query).run(parameters); } __name(removeSyncTaskById, "removeSyncTaskById"); function removeSyncTaskBatch(db, ids, persistent) { db.prepare( ` DELETE FROM syncTasks WHERE id IN ( ${ids.map(() => "?").join(", ")} ); `, { persistent } ).run(ids); } __name(removeSyncTaskBatch, "removeSyncTaskBatch"); function removeSyncTasks(db, ids) { (0, import_util_std.batchMultiVarQuery)( db, ids, (batch, persistent) => removeSyncTaskBatch(db, batch, persistent) ); } __name(removeSyncTasks, "removeSyncTasks"); function saveSyncTasks(db, tasks) { return db.transaction(() => { tasks.forEach((task) => saveSyncTask(db, task)); })(); } __name(saveSyncTasks, "saveSyncTasks"); function saveSyncTask(db, task) { const { id, attempts, createdAt, data, envelopeId, sentAt, type } = task; const [query, parameters] = import_util_std.sql` INSERT INTO syncTasks ( id, attempts, createdAt, data, envelopeId, sentAt, type ) VALUES ( ${id}, ${attempts}, ${createdAt}, ${(0, import_util_std.objectToJSON)(data)}, ${envelopeId}, ${sentAt}, ${type} ) `; db.prepare(query).run(parameters); } __name(saveSyncTask, "saveSyncTask"); function incrementAllSyncTaskAttempts(db) { const [updateQuery, updateParams] = import_util_std.sql` UPDATE syncTasks SET attempts = attempts + 1 `; return db.transaction(() => { db.prepare(updateQuery).run(updateParams); })(); } __name(incrementAllSyncTaskAttempts, "incrementAllSyncTaskAttempts"); function dequeueOldestSyncTasks(db, options) { const { previousRowId, incrementAttempts = true, syncTaskTypes } = options; return db.transaction(() => { const orderBy = import_util_std.sqlFragment`ORDER BY rowid ASC`; const limit = import_util_std.sqlFragment`LIMIT 10000`; let predicate = import_util_std.sqlFragment`rowid > ${previousRowId ?? 0}`; if (syncTaskTypes && syncTaskTypes.length > 0) { predicate = import_util_std.sqlFragment`${predicate} AND type IN (${(0, import_util_std.sqlJoin)(syncTaskTypes)})`; } const [deleteOldQuery, deleteOldParams] = import_util_std.sql` DELETE FROM syncTasks WHERE attempts >= ${import_syncTasks_types_std.MAX_SYNC_TASK_ATTEMPTS} AND createdAt < ${Date.now() - durations.DAY * 2} `; const result = db.prepare(deleteOldQuery).run(deleteOldParams); if (result.changes > 0) { logger.info( `dequeueOldestSyncTasks: Deleted ${result.changes} expired sync tasks` ); } const [selectAllQuery, selectAllParams] = import_util_std.sql` SELECT rowid, * FROM syncTasks WHERE ${predicate} ${orderBy} ${limit} `; const rows = db.prepare(selectAllQuery).all(selectAllParams); if (!rows.length) { return { tasks: [], lastRowId: null }; } const firstRowId = rows.at(0)?.rowid; const lastRowId = rows.at(-1)?.rowid; (0, import_assert_std.strictAssert)(firstRowId, "dequeueOldestSyncTasks: firstRowId is null"); (0, import_assert_std.strictAssert)(lastRowId, "dequeueOldestSyncTasks: lastRowId is null"); let tasks = rows.map((row) => { const { rowid: _rowid, ...rest } = row; return { ...rest, data: (0, import_util_std.jsonToObject)(row.data) }; }); if (incrementAttempts) { let updatePredicate = import_util_std.sqlFragment`rowid >= ${firstRowId} AND rowid <= ${lastRowId}`; if (syncTaskTypes && syncTaskTypes.length > 0) { updatePredicate = import_util_std.sqlFragment`${updatePredicate} AND type IN (${(0, import_util_std.sqlJoin)(syncTaskTypes)})`; } const [updateQuery, updateParams] = import_util_std.sql` UPDATE syncTasks SET attempts = attempts + 1 WHERE ${updatePredicate} RETURNING id, attempts; `; const res = db.prepare(updateQuery).all(updateParams); if (Array.isArray(res)) { const idToAttempts = new Map( res.map(({ id, attempts }) => [id, attempts]) ); tasks = tasks.map((task) => { const { id } = task; const attempts = idToAttempts.get(id) ?? task.attempts; return { ...task, attempts }; }); } else { logger.error( "dequeueOldestSyncTasks: failed to get sync task attempts" ); } } return { tasks, lastRowId }; })(); } __name(dequeueOldestSyncTasks, "dequeueOldestSyncTasks"); function saveMessageAttachmentsForRootOrEditedVersion(db, message, { editHistoryIndex }) { const { id: messageId, type: messageType, conversationId, sent_at: sentAt, received_at: receivedAt, received_at_ms: receivedAtMs, isViewOnce } = message; const mainAttachments = message.attachments; if (mainAttachments) { for (let i = 0; i < mainAttachments.length; i += 1) { const attachment = mainAttachments[i]; saveMessageAttachment({ db, messageId, messageType, conversationId, sentAt, receivedAt, receivedAtMs, attachmentType: "attachment", attachment, orderInMessage: i, editHistoryIndex, isViewOnce }); } } const { bodyAttachment } = message; if (bodyAttachment) { saveMessageAttachment({ db, messageId, messageType, conversationId, sentAt, receivedAt, receivedAtMs, attachmentType: "long-message", attachment: bodyAttachment, orderInMessage: 0, editHistoryIndex, isViewOnce }); } const previewAttachments = message.preview?.map((preview) => preview.image); if (previewAttachments) { for (let i = 0; i < previewAttachments.length; i += 1) { const attachment = previewAttachments[i]; if (!attachment) { continue; } saveMessageAttachment({ db, messageId, messageType, conversationId, sentAt, receivedAt, receivedAtMs, attachmentType: "preview", attachment, orderInMessage: i, editHistoryIndex, isViewOnce }); } } const quoteAttachments = message.quote?.attachments; if (quoteAttachments) { for (let i = 0; i < quoteAttachments.length; i += 1) { const attachment = quoteAttachments[i]; if (!attachment?.thumbnail) { continue; } saveMessageAttachment({ db, messageId, messageType, conversationId, sentAt, receivedAt, receivedAtMs, attachmentType: "quote", attachment: attachment.thumbnail, orderInMessage: i, editHistoryIndex, isViewOnce }); } } const contactAttachments = message.contact?.map( (contact) => contact.avatar?.avatar ); if (contactAttachments) { for (let i = 0; i < contactAttachments.length; i += 1) { const attachment = contactAttachments[i]; if (!attachment) { continue; } saveMessageAttachment({ db, messageId, messageType, conversationId, sentAt, receivedAt, receivedAtMs, attachmentType: "contact", attachment, orderInMessage: i, editHistoryIndex, isViewOnce }); } } const stickerAttachment = message.sticker?.data; if (stickerAttachment) { saveMessageAttachment({ db, messageId, messageType, conversationId, sentAt, receivedAt, receivedAtMs, attachmentType: "sticker", attachment: stickerAttachment, orderInMessage: 0, editHistoryIndex, isViewOnce }); } } __name(saveMessageAttachmentsForRootOrEditedVersion, "saveMessageAttachmentsForRootOrEditedVersion"); function saveMessageAttachments(db, message) { const messageId = message.id; const [deleteQuery, deleteParams] = import_util_std.sql` DELETE FROM message_attachments WHERE messageId = ${messageId}; `; db.prepare(deleteQuery).run(deleteParams); saveMessageAttachmentsForRootOrEditedVersion(db, message, { editHistoryIndex: null }); message.editHistory?.forEach((editHistory, idx) => { saveMessageAttachmentsForRootOrEditedVersion( db, { id: message.id, type: message.type, conversationId: message.conversationId, sent_at: editHistory.timestamp, isViewOnce: message.isViewOnce, ...editHistory }, { editHistoryIndex: idx } ); }); } __name(saveMessageAttachments, "saveMessageAttachments"); function saveMessageAttachment({ db, messageId, messageType, conversationId, sentAt, receivedAt, receivedAtMs, attachmentType, attachment, orderInMessage, editHistoryIndex, isViewOnce }) { const unparsedValues = { messageId, messageType, editHistoryIndex: editHistoryIndex ?? import_hydration_std.ROOT_MESSAGE_ATTACHMENT_EDIT_HISTORY_INDEX, attachmentType, orderInMessage, conversationId, sentAt, receivedAt, receivedAtMs, clientUuid: attachment.clientUuid, size: attachment.size, duration: attachment.duration, contentType: attachment.contentType, path: attachment.path, localKey: attachment.localKey, plaintextHash: attachment.plaintextHash, caption: attachment.caption, blurHash: attachment.blurHash, height: attachment.height, width: attachment.width, digest: attachment.digest, key: attachment.key, fileName: attachment.fileName, downloadPath: attachment.downloadPath, transitCdnKey: attachment.cdnKey ?? attachment.cdnId, transitCdnNumber: attachment.cdnNumber, transitCdnUploadTimestamp: attachment.uploadTimestamp, backupCdnNumber: attachment.backupCdnNumber, incrementalMac: attachment.incrementalMac, incrementalMacChunkSize: attachment.chunkSize, thumbnailPath: attachment.thumbnail?.path, thumbnailSize: attachment.thumbnail?.size, thumbnailContentType: attachment.thumbnail?.contentType, thumbnailLocalKey: attachment.thumbnail?.localKey, thumbnailVersion: attachment.thumbnail?.version, screenshotPath: attachment.screenshot?.path, screenshotSize: attachment.screenshot?.size, screenshotContentType: attachment.screenshot?.contentType, screenshotLocalKey: attachment.screenshot?.localKey, screenshotVersion: attachment.screenshot?.version, backupThumbnailPath: attachment.thumbnailFromBackup?.path, backupThumbnailSize: attachment.thumbnailFromBackup?.size, backupThumbnailContentType: attachment.thumbnailFromBackup?.contentType, backupThumbnailLocalKey: attachment.thumbnailFromBackup?.localKey, backupThumbnailVersion: attachment.thumbnailFromBackup?.version, storyTextAttachmentJson: attachment.textAttachment ? (0, import_util_std.objectToJSON)(attachment.textAttachment) : void 0, localBackupPath: attachment.localBackupPath, flags: attachment.flags, error: (0, import_util_std.convertOptionalBooleanToInteger)(attachment.error), wasTooBig: (0, import_util_std.convertOptionalBooleanToInteger)(attachment.wasTooBig), backfillError: (0, import_util_std.convertOptionalBooleanToInteger)(attachment.backfillError), isCorrupted: (0, import_util_std.convertOptionalBooleanToInteger)(attachment.isCorrupted), isViewOnce: (0, import_util_std.convertOptionalBooleanToInteger)(isViewOnce), copiedFromQuotedAttachment: "copied" in attachment ? (0, import_util_std.convertOptionalBooleanToInteger)(attachment.copied) : void 0, version: attachment.version, pending: (0, import_util_std.convertOptionalBooleanToInteger)(attachment.pending) }; try { const values = (0, import_dropNull_std.shallowConvertUndefinedToNull)(unparsedValues); db.prepare( ` INSERT OR REPLACE INTO message_attachments (${import_Interface_std.MESSAGE_ATTACHMENT_COLUMNS.join(", ")}) VALUES (${import_Interface_std.MESSAGE_ATTACHMENT_COLUMNS.map((name) => `$${name}`).join(", ")}); ` ).run(values); } catch (e) { logger.error( "Failed to save to message_attachments", Errors.toLogFormat(e) ); const values = (0, import_schemas_std.parseLoose)( import_messageAttachments_std.permissiveMessageAttachmentSchema, unparsedValues ); db.prepare( ` INSERT OR REPLACE INTO message_attachments (${import_Interface_std.MESSAGE_ATTACHMENT_COLUMNS.join(", ")}) VALUES (${import_Interface_std.MESSAGE_ATTACHMENT_COLUMNS.map((name) => `$${name}`).join(", ")}); ` ).run(values); logger.info("Recovered from invalid message_attachment save"); } } __name(saveMessageAttachment, "saveMessageAttachment"); function getAndProtectExistingAttachmentPath(db, { plaintextHash, version, contentType, messageId }) { if (!(0, import_Crypto_std.isValidPlaintextHash)(plaintextHash)) { logger.error("getAndProtectExistingAttachmentPath: Invalid plaintextHash"); return; } if (version < 2) { logger.error( "getAndProtectExistingAttachmentPath: Invalid version", version ); return; } const [query, params] = import_util_std.sql` SELECT path, version, localKey, width, height, thumbnailPath, thumbnailLocalKey, thumbnailVersion, thumbnailContentType, thumbnailSize, screenshotPath, screenshotLocalKey, screenshotVersion, screenshotContentType, screenshotSize FROM message_attachments WHERE plaintextHash = ${plaintextHash} AND path IS NOT NULL AND version = ${version} AND contentType = ${contentType} LIMIT 1; `; const existingData = db.prepare(query).get(params); if (!existingData) { return void 0; } const [protectQuery, protectParams] = import_util_std.sql` WITH existingMessageAttachmentPaths(path) AS ( VALUES (${existingData.path}), (${existingData.thumbnailPath}), (${existingData.screenshotPath}) ) INSERT OR REPLACE INTO attachments_protected_from_deletion(path, messageId) SELECT path, ${messageId} FROM existingMessageAttachmentPaths WHERE path IS NOT NULL; `; db.prepare(protectQuery).run(protectParams); return existingData; } __name(getAndProtectExistingAttachmentPath, "getAndProtectExistingAttachmentPath"); function _protectAttachmentPathFromDeletion(db, { path, messageId }) { const [protectQuery, protectParams] = import_util_std.sql` INSERT OR REPLACE INTO attachments_protected_from_deletion (path, messageId) VALUES (${path}, ${messageId}); `; db.prepare(protectQuery).run(protectParams); } __name(_protectAttachmentPathFromDeletion, "_protectAttachmentPathFromDeletion"); function resetProtectedAttachmentPaths(db) { db.prepare("DELETE FROM attachments_protected_from_deletion").run(); } __name(resetProtectedAttachmentPaths, "resetProtectedAttachmentPaths"); function getAllProtectedAttachmentPaths(db) { return db.prepare("SELECT path FROM attachments_protected_from_deletion", { pluck: true }).all(); } __name(getAllProtectedAttachmentPaths, "getAllProtectedAttachmentPaths"); function isAttachmentSafeToDelete(db, path) { const [query, params] = import_util_std.sql` SELECT EXISTS ( SELECT 1 FROM attachments_protected_from_deletion WHERE path = ${path} UNION ALL SELECT 1 FROM message_attachments WHERE path = ${path} OR thumbnailPath = ${path} OR screenshotPath = ${path} OR backupThumbnailPath = ${path} ); `; return db.prepare(query, { pluck: true }).get(params) === 0; } __name(isAttachmentSafeToDelete, "isAttachmentSafeToDelete"); function getMostRecentAttachmentUploadData(db, plaintextHash) { const [query, params] = import_util_std.sql` SELECT key, digest, transitCdnKey AS cdnKey, transitCdnNumber AS cdnNumber, transitCdnUploadTimestamp AS uploadTimestamp, incrementalMac, incrementalMacChunkSize as chunkSize FROM message_attachments INDEXED BY message_attachments_plaintextHash WHERE plaintextHash = ${plaintextHash} AND key IS NOT NULL AND digest IS NOT NULL AND transitCdnKey IS NOT NULL AND transitCdnNumber IS NOT NULL AND transitCdnUploadTimestamp IS NOT NULL ORDER BY transitCdnUploadTimestamp DESC LIMIT 1 `; return db.prepare(query).get(params); } __name(getMostRecentAttachmentUploadData, "getMostRecentAttachmentUploadData"); function _testOnlyRemoveMessageAttachments(db, timestamp) { const [query, params] = import_util_std.sql` DELETE FROM message_attachments WHERE sentAt = ${timestamp};`; db.prepare(query).run(params); } __name(_testOnlyRemoveMessageAttachments, "_testOnlyRemoveMessageAttachments"); function saveMessage(db, message, options) { const { alreadyInTransaction, forceSave, jobToInsert, ourAci } = options; if (!alreadyInTransaction) { return db.transaction(() => { return saveMessage(db, message, { ...options, alreadyInTransaction: true }); })(); } const { body, conversationId, id, isErased, isViewOnce, mentionsMe, received_at, received_at_ms, schemaVersion, sent_at, serverGuid, source, sourceServiceId, sourceDevice, storyId, timestamp, type, readStatus, expireTimer, expirationStartTimestamp, seenStatus: originalSeenStatus, serverTimestamp, unidentifiedDeliveryReceived, hasUnreadPollVotes, ...json } = message; const { attachments, groupV2Change } = message; let seenStatus = originalSeenStatus; if (attachments) { (0, import_assert_std.strictAssert)( attachments.every( (attachment) => !attachment.data && !attachment.screenshotData && !attachment.screenshot?.data && !attachment.thumbnail?.data ), "Attempting to save a message with binary attachment data" ); } if (readStatus === import_MessageReadStatus_std.ReadStatus.Unread && seenStatus !== import_MessageSeenStatus_std.SeenStatus.Unseen) { logger.warn( `saveMessage: Message ${id}/${type} is unread but had seenStatus=${seenStatus}. Forcing to UnseenStatus.Unseen.` ); message = { ...message, seenStatus: import_MessageSeenStatus_std.SeenStatus.Unseen }; seenStatus = import_MessageSeenStatus_std.SeenStatus.Unseen; } const dataToSaveAsJSON = { ...json }; const hasRequiredFields = conversationId != null && sent_at != null; if (!hasRequiredFields) { logger.error( "saveMessage: saving message without conversationId or sent_at!", { conversationId, sent_at } ); } const normalizeAttachmentData = hasRequiredFields && options._testOnlyAvoidNormalizingAttachments !== true; if (normalizeAttachmentData) { delete dataToSaveAsJSON.attachments; delete dataToSaveAsJSON.bodyAttachment; delete dataToSaveAsJSON.preview; delete dataToSaveAsJSON.quote; delete dataToSaveAsJSON.contact; delete dataToSaveAsJSON.sticker; delete dataToSaveAsJSON.editHistory; dataToSaveAsJSON.preview = message.preview?.map( (preview) => omit(preview, "image") ); dataToSaveAsJSON.quote = message.quote ? { ...message.quote, attachments: message.quote.attachments.map( (quoteAttachment) => omit(quoteAttachment, "thumbnail") ) } : void 0; dataToSaveAsJSON.contact = message.contact?.map((contact) => ({ ...contact, avatar: omit(contact.avatar, "avatar") })); dataToSaveAsJSON.sticker = message.sticker ? omit(message.sticker, "data") : void 0; dataToSaveAsJSON.editHistory = message.editHistory?.map((editHistory) => { const editHistoryWithoutAttachments = { ...editHistory }; delete editHistoryWithoutAttachments.attachments; delete editHistoryWithoutAttachments.bodyAttachment; editHistoryWithoutAttachments.quote = editHistory.quote ? { ...editHistory.quote, attachments: editHistory.quote.attachments.map( (quoteAttachment) => omit(quoteAttachment, "thumbnail") ) } : void 0; editHistoryWithoutAttachments.preview = editHistory.preview?.map( (preview) => omit(preview, "image") ); return editHistoryWithoutAttachments; }); } const downloadedAttachments = message.attachments?.filter( (attachment) => attachment.path != null ); const payloadWithoutJson = { id, body: body || null, conversationId, expirationStartTimestamp: expirationStartTimestamp || null, expireTimer: expireTimer || null, // TODO (DESKTOP-8711) hasAttachments: (downloadedAttachments?.length ?? 0) > 0 ? 1 : 0, hasFileAttachments: downloadedAttachments?.some(import_Attachment_std.isFile) ? 1 : 0, hasVisualMediaAttachments: downloadedAttachments?.some(import_Attachment_std.isVisualMedia) ? 1 : 0, hasUnreadPollVotes: hasUnreadPollVotes ? 1 : 0, isChangeCreatedByUs: groupV2Change?.from === ourAci ? 1 : 0, isErased: isErased ? 1 : 0, isViewOnce: isViewOnce ? 1 : 0, mentionsMe: mentionsMe ? 1 : 0, received_at: received_at || null, received_at_ms: received_at_ms || null, schemaVersion: schemaVersion || 0, serverGuid: serverGuid || null, sent_at: sent_at || null, source: source || null, sourceServiceId: sourceServiceId || null, sourceDevice: sourceDevice || null, storyId: storyId || null, type: type || null, timestamp: timestamp ?? 0, readStatus: readStatus ?? null, seenStatus: seenStatus ?? import_MessageSeenStatus_std.SeenStatus.NotApplicable, serverTimestamp: serverTimestamp ?? null, unidentifiedDeliveryReceived: unidentifiedDeliveryReceived ? 1 : 0 }; if (id && !forceSave) { const result = db.prepare( // UPDATE queries that set the value of a primary key column can be very slow when // that key is referenced via a foreign key constraint, so we are careful to // exclude it here. ` UPDATE messages SET ${import_Interface_std.MESSAGE_NON_PRIMARY_KEY_COLUMNS.map((name) => `${name} = $${name}`).join(", ")} WHERE id = $id; ` ).run({ ...payloadWithoutJson, json: (0, import_util_std.objectToJSON)(dataToSaveAsJSON) }); if (result.changes === 0) { return id; } if (normalizeAttachmentData) { saveMessageAttachments(db, message); } if (jobToInsert) { insertJob(db, jobToInsert); } (0, import_assert_std.strictAssert)(result.changes === 1, "One row should have been changed"); return id; } const createdId = id || (0, import_generateMessageId_node.generateMessageId)(message.received_at).id; db.prepare( ` INSERT INTO messages ( ${import_Interface_std.MESSAGE_COLUMNS.join(", ")} ) VALUES ( ${import_Interface_std.MESSAGE_COLUMNS.map((name) => `$${name}`).join(", ")} ); ` ).run({ ...payloadWithoutJson, id: createdId, json: (0, import_util_std.objectToJSON)(dataToSaveAsJSON) }); if (normalizeAttachmentData) { saveMessageAttachments(db, message); } if (jobToInsert) { insertJob(db, jobToInsert); } return createdId; } __name(saveMessage, "saveMessage"); function saveMessages(db, arrayOfMessages, options) { return db.transaction(() => { const result = new Array(); for (const message of arrayOfMessages) { result.push( saveMessage(db, message, { ...options, alreadyInTransaction: true }) ); } return result; })(); } __name(saveMessages, "saveMessages"); function saveMessagesIndividually(db, arrayOfMessages, options) { try { saveMessages(db, arrayOfMessages, options); return { failedIndices: [] }; } catch (e) { logger.error( "saveMessagesIndividually: Failed to save messages in one transaction, falling over to individual saves" ); } return db.transaction(() => { const failedIndices = []; arrayOfMessages.forEach((message, index) => { try { saveMessage(db, message, options); } catch (e) { logger.error( "saveMessagesIndividually: failed to save message", Errors.toLogFormat(e) ); failedIndices.push(index); } }); return { failedIndices }; })(); } __name(saveMessagesIndividually, "saveMessagesIndividually"); function removeMessage(db, id) { db.prepare("DELETE FROM messages WHERE id = $id;").run({ id }); } __name(removeMessage, "removeMessage"); function removeMessagesBatch(db, ids, persistent) { db.prepare( ` DELETE FROM messages WHERE id IN ( ${ids.map(() => "?").join(", ")} ); `, { persistent } ).run(ids); } __name(removeMessagesBatch, "removeMessagesBatch"); function removeMessages(db, ids) { (0, import_util_std.batchMultiVarQuery)( db, ids, (batch, persistent) => removeMessagesBatch(db, batch, persistent) ); } __name(removeMessages, "removeMessages"); function getMessageById(db, id) { return db.transaction(() => { const row = db.prepare( ` SELECT ${import_Interface_std.MESSAGE_COLUMNS.join(", ")} FROM messages WHERE id = $id; ` ).get({ id }); if (!row) { return void 0; } return (0, import_hydration_std.hydrateMessage)(db, row); })(); } __name(getMessageById, "getMessageById"); function getMessagesById(db, messageIds) { return db.transaction( () => (0, import_util_std.batchMultiVarQuery)( db, messageIds, (batch, persistent) => { const query = db.prepare( ` SELECT ${import_Interface_std.MESSAGE_COLUMNS.join(", ")} FROM messages WHERE id IN ( ${Array(batch.length).fill("?").join(",")} );`, { persistent } ); const rows = query.all(batch); return (0, import_hydration_std.hydrateMessages)(db, rows); } ) )(); } __name(getMessagesById, "getMessagesById"); function _getAllMessages(db) { return db.transaction(() => { const rows = db.prepare( ` SELECT ${import_Interface_std.MESSAGE_COLUMNS.join(", ")} FROM messages ORDER BY id ASC ` ).all(); return (0, import_hydration_std.hydrateMessages)(db, rows); })(); } __name(_getAllMessages, "_getAllMessages"); function _removeAllMessages(db) { db.exec(` DELETE FROM messages; INSERT INTO messages_fts(messages_fts) VALUES('optimize'); `); } __name(_removeAllMessages, "_removeAllMessages"); function getAllMessageIds(db) { const rows = db.prepare("SELECT id FROM messages ORDER BY id ASC;").all(); return rows.map((row) => row.id); } __name(getAllMessageIds, "getAllMessageIds"); function getMessageByAuthorAciAndSentAt(db, ourAci, authorAci, sentAtTimestamp, options) { return db.transaction(() => { const isSentByUs = ourAci === authorAci; const senderPredicate = isSentByUs ? import_util_std.sqlFragment`(messages.sourceServiceId = ${authorAci} OR messages.type IS 'outgoing')` : import_util_std.sqlFragment`(messages.sourceServiceId = ${authorAci})`; const editedMessagesQuery = import_util_std.sqlFragment` SELECT ${import_Interface_std.MESSAGE_COLUMNS_FRAGMENT} FROM edited_messages INNER JOIN messages ON messages.id = edited_messages.messageId WHERE ${senderPredicate} AND edited_messages.sentAt = ${sentAtTimestamp} `; const messagesQuery = import_util_std.sqlFragment` SELECT ${import_Interface_std.MESSAGE_COLUMNS_FRAGMENT} FROM messages WHERE ${senderPredicate} AND messages.sent_at = ${sentAtTimestamp} `; const [query, params] = options.includeEdits ? import_util_std.sql`${editedMessagesQuery} UNION ${messagesQuery} LIMIT 2;` : import_util_std.sql`${messagesQuery} LIMIT 2;`; const rows = db.prepare(query).all(params); if (rows.length > 1) { logger.warn( `getMessageByAuthorAciAndSentAt(${authorAci}, ${sentAtTimestamp}): More than one message found` ); } if (rows.length < 1) { return null; } return (0, import_hydration_std.hydrateMessage)(db, rows[0]); })(); } __name(getMessageByAuthorAciAndSentAt, "getMessageByAuthorAciAndSentAt"); function getMessageBySender(db, { source, sourceServiceId, sourceDevice, sent_at }) { return db.transaction(() => { const rows = db.prepare( ` SELECT ${import_Interface_std.MESSAGE_COLUMNS.join(", ")} FROM messages WHERE (source = $source OR sourceServiceId = $sourceServiceId) AND sourceDevice = $sourceDevice AND sent_at = $sent_at LIMIT 2; ` ).all({ source: source || null, sourceServiceId: sourceServiceId || null, sourceDevice: sourceDevice || null, sent_at }); if (rows.length > 1) { logger.warn("getMessageBySender: More than one message found for", { sent_at, source, sourceServiceId, sourceDevice }); } if (rows.length < 1) { return void 0; } return (0, import_hydration_std.hydrateMessage)(db, rows[0]); })(); } __name(getMessageBySender, "getMessageBySender"); function _storyIdPredicate(storyId, includeStoryReplies) { return _storyIdPredicateAndInfo(storyId, includeStoryReplies).predicate; } __name(_storyIdPredicate, "_storyIdPredicate"); function _storyIdPredicateAndInfo(storyId, includeStoryReplies) { if (includeStoryReplies && storyId === void 0) { return { predicate: import_util_std.sqlFragment`NULL IS NULL`, isFilteringOnStoryId: false }; } return { predicate: import_util_std.sqlFragment`storyId IS ${storyId ?? null}`, isFilteringOnStoryId: true }; } __name(_storyIdPredicateAndInfo, "_storyIdPredicateAndInfo"); function getUnreadByConversationAndMarkRead(db, { conversationId, includeStoryReplies, readMessageReceivedAt, storyId, readAt, now = Date.now() }) { return db.transaction(() => { const expirationStartTimestamp = Math.min(now, readAt ?? Infinity); const { predicate: storyReplyFilter, isFilteringOnStoryId } = _storyIdPredicateAndInfo(storyId, includeStoryReplies); const updateExpirationFragment = import_util_std.sqlFragment` UPDATE messages INDEXED BY messages_conversationId_expirationStartTimestamp SET expirationStartTimestamp = ${expirationStartTimestamp} WHERE conversationId = ${conversationId} AND ${storyReplyFilter} AND type IS NOT 'outgoing' AND hasExpireTimer IS 1 AND received_at <= ${readMessageReceivedAt} `; const [updateNullEpirationStartQuery, updateNullExpirationStartParams] = import_util_std.sql` ${updateExpirationFragment} AND expirationStartTimestamp IS NULL; `; db.prepare(updateNullEpirationStartQuery).run( updateNullExpirationStartParams ); const [updateLateExpirationStartQuery, updateLateExpirationStartParams] = import_util_std.sql` ${updateExpirationFragment} AND expirationStartTimestamp > ${expirationStartTimestamp}; `; db.prepare(updateLateExpirationStartQuery).run( updateLateExpirationStartParams ); const indexToUse = isFilteringOnStoryId ? import_util_std.sqlFragment`messages_unseen_with_story` : import_util_std.sqlFragment`messages_unseen_no_story`; const [selectQuery, selectParams] = import_util_std.sql` SELECT id, readStatus, expirationStartTimestamp, sent_at, source, sourceServiceId, type FROM messages INDEXED BY ${indexToUse} WHERE conversationId = ${conversationId} AND seenStatus = ${import_MessageSeenStatus_std.SeenStatus.Unseen} AND isStory = 0 AND ${storyReplyFilter} AND received_at <= ${readMessageReceivedAt} ORDER BY received_at DESC, sent_at DESC; `; const rows = db.prepare(selectQuery).all(selectParams); const [updateStatusQuery, updateStatusParams] = import_util_std.sql` UPDATE messages INDEXED BY ${indexToUse} SET readStatus = ${import_MessageReadStatus_std.ReadStatus.Read}, seenStatus = ${import_MessageSeenStatus_std.SeenStatus.Seen} WHERE conversationId = ${conversationId} AND seenStatus = ${import_MessageSeenStatus_std.SeenStatus.Unseen} AND isStory = 0 AND ${storyReplyFilter} AND received_at <= ${readMessageReceivedAt}; `; db.prepare(updateStatusQuery).run(updateStatusParams); return rows.map((msg) => { return { originalReadStatus: msg.readStatus == null ? void 0 : msg.readStatus, readStatus: import_MessageReadStatus_std.ReadStatus.Read, seenStatus: import_MessageSeenStatus_std.SeenStatus.Seen, id: msg.id, expirationStartTimestamp: (0, import_dropNull_std.dropNull)(msg.expirationStartTimestamp), sent_at: msg.sent_at || 0, source: (0, import_dropNull_std.dropNull)(msg.source), sourceServiceId: (0, import_dropNull_std.dropNull)(msg.sourceServiceId), type: msg.type }; }); })(); } __name(getUnreadByConversationAndMarkRead, "getUnreadByConversationAndMarkRead"); function getUnreadReactionsAndMarkRead(db, { conversationId, readMessageReceivedAt, storyId }) { return db.prepare( ` UPDATE reactions INDEXED BY reactions_unread SET unread = 0 WHERE conversationId = $conversationId AND unread >= 1 AND EXISTS ( SELECT 1 FROM messages WHERE messages.id = reactions.messageId AND messages.received_at <= $readMessageReceivedAt AND messages.storyId IS $storyId ) RETURNING targetAuthorAci, targetTimestamp, messageId; ` ).all({ conversationId, readMessageReceivedAt, storyId: storyId || null }); } __name(getUnreadReactionsAndMarkRead, "getUnreadReactionsAndMarkRead"); function markReactionAsRead(db, targetAuthorServiceId, targetTimestamp) { return db.transaction(() => { const readReaction = db.prepare( ` SELECT * FROM reactions WHERE targetAuthorAci = $targetAuthorAci AND targetTimestamp = $targetTimestamp AND unread = 1 ORDER BY rowId DESC LIMIT 1; ` ).get({ targetAuthorAci: targetAuthorServiceId, targetTimestamp }); db.prepare( ` UPDATE reactions SET unread = 0 WHERE targetAuthorAci = $targetAuthorAci AND targetTimestamp = $targetTimestamp; ` ).run({ targetAuthorAci: targetAuthorServiceId, targetTimestamp }); return readReaction; })(); } __name(markReactionAsRead, "markReactionAsRead"); function getUnreadPollVotesAndMarkRead(db, { conversationId, readMessageReceivedAt }) { return db.transaction(() => { const unreadPollVoteMessages = db.prepare( ` UPDATE messages INDEXED BY messages_unread_poll_votes SET hasUnreadPollVotes = 0 WHERE conversationId = $conversationId AND hasUnreadPollVotes = 1 AND received_at <= $readMessageReceivedAt AND type IS 'outgoing' RETURNING id, conversationId, sent_at AS targetTimestamp, type; ` ).all({ conversationId, readMessageReceivedAt }); return unreadPollVoteMessages; })(); } __name(getUnreadPollVotesAndMarkRead, "getUnreadPollVotesAndMarkRead"); function markPollVoteAsRead(db, targetTimestamp) { return db.transaction(() => { const row = db.prepare( ` UPDATE messages SET hasUnreadPollVotes = 0 WHERE sent_at = $sent_at AND hasUnreadPollVotes = 1 AND type IS 'outgoing' RETURNING ${import_Interface_std.MESSAGE_COLUMNS.join(", ")}; ` ).get({ sent_at: targetTimestamp }); if (!row) { return void 0; } return (0, import_hydration_std.hydrateMessage)(db, row); })(); } __name(markPollVoteAsRead, "markPollVoteAsRead"); function getReactionByTimestamp(db, fromId, timestamp) { const [query, params] = import_util_std.sql` SELECT * FROM reactions WHERE fromId IS ${fromId} AND timestamp IS ${timestamp} `; return db.prepare(query).get(params); } __name(getReactionByTimestamp, "getReactionByTimestamp"); function addReaction(db, { conversationId, emoji, fromId, messageId, messageReceivedAt, targetAuthorAci, targetTimestamp, timestamp }, { readStatus }) { db.prepare( `INSERT INTO reactions ( conversationId, emoji, fromId, messageId, messageReceivedAt, targetAuthorAci, targetTimestamp, timestamp, unread ) VALUES ( $conversationId, $emoji, $fromId, $messageId, $messageReceivedAt, $targetAuthorAci, $targetTimestamp, $timestamp, $unread );` ).run({ conversationId, emoji, fromId, messageId, messageReceivedAt, targetAuthorAci, targetTimestamp, timestamp, unread: readStatus === import_Reactions_std.ReactionReadStatus.Unread ? 1 : 0 }); } __name(addReaction, "addReaction"); function removeReactionFromConversation(db, { emoji, fromId, targetAuthorServiceId, targetTimestamp }) { db.prepare( `DELETE FROM reactions WHERE emoji = $emoji AND fromId = $fromId AND targetAuthorAci = $targetAuthorAci AND targetTimestamp = $targetTimestamp;` ).run({ emoji, fromId, targetAuthorAci: targetAuthorServiceId, targetTimestamp }); } __name(removeReactionFromConversation, "removeReactionFromConversation"); function _getAllReactions(db) { return db.prepare("SELECT * from reactions;").all(); } __name(_getAllReactions, "_getAllReactions"); function _removeAllReactions(db) { db.prepare("DELETE from reactions;").run(); } __name(_removeAllReactions, "_removeAllReactions"); var AdjacentDirection = /* @__PURE__ */ ((AdjacentDirection2) => { AdjacentDirection2["Older"] = "Older"; AdjacentDirection2["Newer"] = "Newer"; return AdjacentDirection2; })(AdjacentDirection || {}); function getRecentStoryReplies(db, storyId, { limit = 100, messageId, receivedAt = Number.MAX_VALUE, sentAt = Number.MAX_VALUE } = {}) { const timeFilters = { first: import_util_std.sqlFragment`received_at = ${receivedAt} AND sent_at < ${sentAt}`, second: import_util_std.sqlFragment`received_at < ${receivedAt}` }; const createQuery = /* @__PURE__ */ __name((timeFilter) => import_util_std.sqlFragment` SELECT ${import_Interface_std.MESSAGE_COLUMNS_FRAGMENT} FROM messages WHERE (${messageId ?? null} IS NULL OR id IS NOT ${messageId ?? null}) AND isStory IS 0 AND storyId IS ${storyId} AND ( ${timeFilter} ) `, "createQuery"); const template = import_util_std.sqlFragment` SELECT first.* FROM (${createQuery(timeFilters.first)}) as first UNION ALL SELECT second.* FROM (${createQuery(timeFilters.second)}) as second ORDER BY received_at DESC, sent_at DESC `; const [query, params] = import_util_std.sql`${template} LIMIT ${limit}`; return db.transaction(() => { const rows = db.prepare(query).all(params); return (0, import_hydration_std.hydrateMessages)(db, rows); })(); } __name(getRecentStoryReplies, "getRecentStoryReplies"); function getAdjacentMessagesByConversation(db, direction, { conversationId, includeStoryReplies, limit = 100, messageId, receivedAt = direction === "Older" /* Older */ ? Number.MAX_VALUE : 0, sentAt = direction === "Older" /* Older */ ? Number.MAX_VALUE : 0, requireVisualMediaAttachments, requireFileAttachments, storyId }) { let timeFilters; let timeOrder; if (direction === "Older" /* Older */) { timeFilters = { first: import_util_std.sqlFragment`received_at = ${receivedAt} AND sent_at < ${sentAt}`, second: import_util_std.sqlFragment`received_at < ${receivedAt}` }; timeOrder = import_util_std.sqlFragment`DESC`; } else { timeFilters = { first: import_util_std.sqlFragment`received_at = ${receivedAt} AND sent_at > ${sentAt}`, second: import_util_std.sqlFragment`received_at > ${receivedAt}` }; timeOrder = import_util_std.sqlFragment`ASC`; } const requireDifferentMessage = direction === "Older" /* Older */ || requireVisualMediaAttachments || requireFileAttachments; const createQuery = /* @__PURE__ */ __name((timeFilter) => import_util_std.sqlFragment` SELECT ${import_Interface_std.MESSAGE_COLUMNS_FRAGMENT} FROM messages WHERE conversationId = ${conversationId} AND ${requireDifferentMessage ? import_util_std.sqlFragment`(${messageId ?? null} IS NULL OR id IS NOT ${messageId ?? null}) AND` : import_util_std.sqlFragment``} ${requireVisualMediaAttachments ? import_util_std.sqlFragment`hasVisualMediaAttachments IS 1 AND isViewOnce IS 0 AND` : import_util_std.sqlFragment``} ${requireFileAttachments ? import_util_std.sqlFragment`hasFileAttachments IS 1 AND isViewOnce IS 0 AND` : import_util_std.sqlFragment``} isStory IS 0 AND (${_storyIdPredicate(storyId, includeStoryReplies)}) AND ( ${timeFilter} ) ORDER BY received_at ${timeOrder}, sent_at ${timeOrder} `, "createQuery"); const [query, params] = import_util_std.sql` SELECT first.* FROM (${createQuery(timeFilters.first)}) as first UNION ALL SELECT second.* FROM (${createQuery(timeFilters.second)}) as second LIMIT ${limit} `; return db.transaction(() => { const results = db.prepare(query).all(params); if (direction === "Older" /* Older */) { results.reverse(); } return (0, import_hydration_std.hydrateMessages)(db, results); })(); } __name(getAdjacentMessagesByConversation, "getAdjacentMessagesByConversation"); function getOlderMessagesByConversation(db, options) { return getAdjacentMessagesByConversation( db, "Older" /* Older */, options ); } __name(getOlderMessagesByConversation, "getOlderMessagesByConversation"); function getAllStories(db, { conversationId, sourceServiceId }) { return db.transaction(() => { const [storiesQuery, storiesParams] = import_util_std.sql` SELECT ${import_Interface_std.MESSAGE_COLUMNS_FRAGMENT} FROM messages WHERE isStory = 1 AND (${conversationId ?? null} IS NULL OR conversationId IS ${conversationId ?? null}) AND (${sourceServiceId ?? null} IS NULL OR sourceServiceId IS ${sourceServiceId ?? null}) ORDER BY received_at ASC, sent_at ASC; `; const rows = db.prepare(storiesQuery).all(storiesParams); const [repliesQuery, repliesParams] = import_util_std.sql` SELECT DISTINCT storyId FROM messages WHERE storyId IS NOT NULL `; const replies = db.prepare(repliesQuery, { pluck: true }).all(repliesParams); const [repliesFromSelfQuery, repliesFromSelfParams] = import_util_std.sql` SELECT DISTINCT storyId FROM messages WHERE ( storyId IS NOT NULL AND type IS 'outgoing' ) `; const repliesFromSelf = db.prepare(repliesFromSelfQuery, { pluck: true }).all(repliesFromSelfParams); const repliesLookup = new Set(replies); const repliesFromSelfLookup = new Set(repliesFromSelf); return (0, import_hydration_std.hydrateMessages)(db, rows).map((msg) => ({ ...msg, hasReplies: Boolean(repliesLookup.has(msg.id)), hasRepliesFromSelf: Boolean(repliesFromSelfLookup.has(msg.id)) })); })(); } __name(getAllStories, "getAllStories"); function getNewerMessagesByConversation(db, options) { return getAdjacentMessagesByConversation( db, "Newer" /* Newer */, options ); } __name(getNewerMessagesByConversation, "getNewerMessagesByConversation"); function getOldestMessageForConversation(db, conversationId, { storyId, includeStoryReplies }) { const [query, params] = import_util_std.sql` SELECT received_at, sent_at, id FROM messages WHERE conversationId = ${conversationId} AND isStory IS 0 AND (${_storyIdPredicate(storyId, includeStoryReplies)}) ORDER BY received_at ASC, sent_at ASC LIMIT 1; `; const row = db.prepare(query).get(params); if (!row) { return void 0; } return row; } __name(getOldestMessageForConversation, "getOldestMessageForConversation"); function getNewestMessageForConversation(db, conversationId, { storyId, includeStoryReplies }) { const [query, params] = import_util_std.sql` SELECT received_at, sent_at, id FROM messages WHERE conversationId = ${conversationId} AND isStory IS 0 AND (${_storyIdPredicate(storyId, includeStoryReplies)}) ORDER BY received_at DESC, sent_at DESC LIMIT 1; `; const row = db.prepare(query).get(params); if (!row) { return void 0; } return row; } __name(getNewestMessageForConversation, "getNewestMessageForConversation"); function getMessagesBetween(db, conversationId, options) { const storyId = void 0; const { after, before, includeStoryReplies } = options; const [query, params] = import_util_std.sql` SELECT id FROM messages WHERE conversationId = ${conversationId} AND (${_storyIdPredicate(storyId, includeStoryReplies)}) AND isStory IS 0 AND ( received_at > ${after.received_at} OR (received_at = ${after.received_at} AND sent_at > ${after.sent_at}) ) AND ( received_at < ${before.received_at} OR (received_at = ${before.received_at} AND sent_at < ${before.sent_at}) ) ORDER BY received_at ASC, sent_at ASC; `; const rows = db.prepare(query).all(params); return rows.map((row) => row.id); } __name(getMessagesBetween, "getMessagesBetween"); function getNearbyMessageFromDeletedSet(db, { conversationId, lastSelectedMessage, deletedMessageIds, storyId, includeStoryReplies }) { function runQuery(after2) { const dir = after2 ? import_util_std.sqlFragment`ASC` : import_util_std.sqlFragment`DESC`; const compare = after2 ? import_util_std.sqlFragment`>` : import_util_std.sqlFragment`<`; const { received_at, sent_at } = lastSelectedMessage; const [query, params] = import_util_std.sql` SELECT id FROM messages WHERE conversationId = ${conversationId} AND (${_storyIdPredicate(storyId, includeStoryReplies)}) AND isStory IS 0 AND id NOT IN (${(0, import_util_std.sqlJoin)(deletedMessageIds)}) AND type IN ('incoming', 'outgoing') AND ( (received_at = ${received_at} AND sent_at ${compare} ${sent_at}) OR received_at ${compare} ${received_at} ) ORDER BY received_at ${dir}, sent_at ${dir} LIMIT 1 `; return db.prepare(query, { pluck: true }).get(params); } __name(runQuery, "runQuery"); const after = runQuery(true); if (after != null) { return after; } const before = runQuery(false); if (before != null) { return before; } return null; } __name(getNearbyMessageFromDeletedSet, "getNearbyMessageFromDeletedSet"); function getLastConversationActivity(db, { conversationId, includeStoryReplies }) { return db.transaction(() => { const row = db.prepare( ` SELECT ${import_Interface_std.MESSAGE_COLUMNS.join(", ")} FROM messages INDEXED BY messages_activity WHERE conversationId IS $conversationId AND shouldAffectActivity IS 1 AND isTimerChangeFromSync IS 0 AND ${includeStoryReplies ? "" : "storyId IS NULL AND"} isGroupLeaveEventFromOther IS 0 ORDER BY received_at DESC, sent_at DESC LIMIT 1; ` ).get({ conversationId }); if (!row) { return void 0; } return (0, import_hydration_std.hydrateMessage)(db, row); })(); } __name(getLastConversationActivity, "getLastConversationActivity"); function getLastConversationPreview(db, { conversationId, includeStoryReplies }) { const index = includeStoryReplies ? "messages_preview" : "messages_preview_without_story"; return db.transaction(() => { const row = db.prepare( ` SELECT ${import_Interface_std.MESSAGE_COLUMNS.join(", ")}, expiresAt FROM ( SELECT ${import_Interface_std.MESSAGE_COLUMNS.join(", ")}, expiresAt FROM messages INDEXED BY ${index} WHERE conversationId IS $conversationId AND shouldAffectPreview IS 1 AND isGroupLeaveEventFromOther IS 0 ${includeStoryReplies ? "" : "AND storyId IS NULL"} ORDER BY received_at DESC, sent_at DESC ) WHERE likely(expiresAt > $now) LIMIT 1 ` ).get({ conversationId, now: Date.now() }); return row ? (0, import_hydration_std.hydrateMessage)(db, row) : void 0; })(); } __name(getLastConversationPreview, "getLastConversationPreview"); function getConversationMessageStats(db, { conversationId, includeStoryReplies }) { return db.transaction(() => { return { activity: getLastConversationActivity(db, { conversationId, includeStoryReplies }), preview: getLastConversationPreview(db, { conversationId, includeStoryReplies }), hasUserInitiatedMessages: hasUserInitiatedMessages(db, conversationId) }; })(); } __name(getConversationMessageStats, "getConversationMessageStats"); function getLastConversationMessage(db, { conversationId }) { return db.transaction(() => { const row = db.prepare( ` SELECT ${import_Interface_std.MESSAGE_COLUMNS.join(", ")} FROM messages WHERE conversationId = $conversationId ORDER BY received_at DESC, sent_at DESC LIMIT 1; ` ).get({ conversationId }); if (!row) { return void 0; } return (0, import_hydration_std.hydrateMessage)(db, row); })(); } __name(getLastConversationMessage, "getLastConversationMessage"); function getOldestUnseenMessageForConversation(db, conversationId, { storyId, includeStoryReplies }) { const [query, params] = import_util_std.sql` SELECT received_at, sent_at, id FROM messages WHERE conversationId = ${conversationId} AND seenStatus = ${import_MessageSeenStatus_std.SeenStatus.Unseen} AND isStory IS 0 AND (${_storyIdPredicate(storyId, includeStoryReplies)}) ORDER BY received_at ASC, sent_at ASC LIMIT 1; `; const row = db.prepare(query).get(params); if (!row) { return void 0; } return row; } __name(getOldestUnseenMessageForConversation, "getOldestUnseenMessageForConversation"); function getOldestUnreadMentionOfMeForConversation(db, conversationId, options) { const [query, params] = import_util_std.sql` SELECT received_at, sent_at, id FROM messages WHERE conversationId = ${conversationId} AND readStatus = ${import_MessageReadStatus_std.ReadStatus.Unread} AND mentionsMe IS 1 AND isStory IS 0 AND (${_storyIdPredicate(options.storyId, options.includeStoryReplies)}) ORDER BY received_at ASC, sent_at ASC LIMIT 1; `; return db.prepare(query).get(params); } __name(getOldestUnreadMentionOfMeForConversation, "getOldestUnreadMentionOfMeForConversation"); function getTotalUnreadForConversation(db, conversationId, { storyId, includeStoryReplies }) { const [query, params] = import_util_std.sql` SELECT count(1) FROM messages WHERE conversationId = ${conversationId} AND readStatus = ${import_MessageReadStatus_std.ReadStatus.Unread} AND isStory IS 0 AND (${_storyIdPredicate(storyId, includeStoryReplies)}) `; const row = db.prepare(query, { pluck: true }).get(params); return row ?? 0; } __name(getTotalUnreadForConversation, "getTotalUnreadForConversation"); function getTotalUnreadMentionsOfMeForConversation(db, conversationId, { storyId, includeStoryReplies }) { const [query, params] = import_util_std.sql` SELECT count(1) FROM messages WHERE conversationId = ${conversationId} AND readStatus = ${import_MessageReadStatus_std.ReadStatus.Unread} AND mentionsMe IS 1 AND isStory IS 0 AND (${_storyIdPredicate(storyId, includeStoryReplies)}) `; const row = db.prepare(query, { pluck: true }).get(params); return row ?? 0; } __name(getTotalUnreadMentionsOfMeForConversation, "getTotalUnreadMentionsOfMeForConversation"); function getTotalUnseenForConversation(db, conversationId, { storyId, includeStoryReplies }) { const [query, params] = import_util_std.sql` SELECT count(1) FROM messages WHERE conversationId = ${conversationId} AND seenStatus = ${import_MessageSeenStatus_std.SeenStatus.Unseen} AND isStory IS 0 AND (${_storyIdPredicate(storyId, includeStoryReplies)}) `; const row = db.prepare(query, { pluck: true }).get(params); return row ?? 0; } __name(getTotalUnseenForConversation, "getTotalUnseenForConversation"); function getMessageMetricsForConversation(db, options) { const { conversationId } = options; const oldest = getOldestMessageForConversation(db, conversationId, options); const newest = getNewestMessageForConversation(db, conversationId, options); const oldestUnseen = getOldestUnseenMessageForConversation( db, conversationId, options ); const totalUnseen = getTotalUnseenForConversation( db, conversationId, options ); return { oldest, newest, oldestUnseen, totalUnseen }; } __name(getMessageMetricsForConversation, "getMessageMetricsForConversation"); function getConversationRangeCenteredOnMessage(db, options) { return db.transaction(() => { return { older: getAdjacentMessagesByConversation( db, "Older" /* Older */, options ), newer: getAdjacentMessagesByConversation( db, "Newer" /* Newer */, options ), metrics: getMessageMetricsForConversation(db, options) }; })(); } __name(getConversationRangeCenteredOnMessage, "getConversationRangeCenteredOnMessage"); function getAllCallHistory(db) { const [query] = import_util_std.sql` SELECT * FROM callsHistory; `; return db.prepare(query).all(); } __name(getAllCallHistory, "getAllCallHistory"); function _removeAllCallHistory(db) { const [query, params] = import_util_std.sql` DELETE FROM callsHistory; `; db.prepare(query).run(params); } __name(_removeAllCallHistory, "_removeAllCallHistory"); function clearCallHistory(db, target) { return db.transaction(() => { const callHistory = getCallHistoryForCallLogEventTarget(db, target); if (callHistory == null) { logger.warn("clearCallHistory: Target call not found"); return []; } const { timestamp } = callHistory; const [selectAdminCallLinksQuery, selectAdminCallLinksParams] = import_util_std.sql` SELECT roomId FROM callLinks WHERE callLinks.adminKey IS NOT NULL; `; const adminCallLinkIds = db.prepare(selectAdminCallLinksQuery, { pluck: true }).all(selectAdminCallLinksParams); const adminCallLinkIdsFragment = (0, import_util_std.sqlJoin)(adminCallLinkIds); const [selectCallsQuery, selectCallsParams] = import_util_std.sql` SELECT callsHistory.callId FROM callsHistory WHERE ( -- Prior calls (callsHistory.timestamp <= ${timestamp}) -- Unused call links OR ( callsHistory.mode IS ${CALL_MODE_ADHOC} AND callsHistory.status IS ${CALL_STATUS_PENDING} ) ) AND callsHistory.peerId NOT IN (${adminCallLinkIdsFragment}); `; const deletedCallIds = db.prepare(selectCallsQuery, { pluck: true }).all(selectCallsParams); let deletedMessageIds = []; (0, import_util_std.batchMultiVarQuery)(db, deletedCallIds, (ids, persistent) => { const idsFragment = (0, import_util_std.sqlJoin)(ids); const [clearCallsHistoryQuery, clearCallsHistoryParams] = import_util_std.sql` UPDATE callsHistory SET status = ${import_CallDisposition_std.DirectCallStatus.Deleted}, timestamp = ${Date.now()} WHERE callsHistory.callId IN (${idsFragment}); `; db.prepare(clearCallsHistoryQuery, { persistent }).run( clearCallsHistoryParams ); const [deleteMessagesQuery, deleteMessagesParams] = import_util_std.sql` DELETE FROM messages WHERE messages.type IS 'call-history' AND messages.callId IN (${idsFragment}) RETURNING id; `; const batchDeletedMessageIds = db.prepare(deleteMessagesQuery, { pluck: true, persistent }).all(deleteMessagesParams); deletedMessageIds = deletedMessageIds.concat(batchDeletedMessageIds); }); return deletedMessageIds; })(); } __name(clearCallHistory, "clearCallHistory"); function markCallHistoryDeleted(db, callId) { const [query, params] = import_util_std.sql` UPDATE callsHistory SET status = ${import_CallDisposition_std.DirectCallStatus.Deleted}, timestamp = ${Date.now()} WHERE callId = ${callId} `; db.prepare(query).run(params); } __name(markCallHistoryDeleted, "markCallHistoryDeleted"); function cleanupCallHistoryMessages(db) { return db.transaction(() => { const [query, params] = import_util_std.sql` DELETE FROM messages WHERE messages.id IN ( SELECT messages.id FROM messages LEFT JOIN callsHistory ON callsHistory.callId IS messages.callId WHERE messages.type IS 'call-history' AND callsHistory.status IS ${CALL_STATUS_DELETED} ) `; db.prepare(query).run(params); })(); } __name(cleanupCallHistoryMessages, "cleanupCallHistoryMessages"); function getCallHistoryMessageByCallId(db, options) { return db.transaction(() => { const [query, params] = import_util_std.sql` SELECT ${import_Interface_std.MESSAGE_COLUMNS_FRAGMENT} FROM messages WHERE conversationId = ${options.conversationId} AND type = 'call-history' AND callId = ${options.callId} `; const row = db.prepare(query).get(params); if (row == null) { return; } return (0, import_hydration_std.hydrateMessage)(db, row); })(); } __name(getCallHistoryMessageByCallId, "getCallHistoryMessageByCallId"); function getCallHistory(db, callId, peerId) { const [query, params] = import_util_std.sql` SELECT * FROM callsHistory WHERE callId IS ${callId} AND peerId IS ${peerId}; `; const row = db.prepare(query).get(params); if (row == null) { return; } return (0, import_schemas_std.parseUnknown)(import_CallDisposition_std.callHistoryDetailsSchema, row); } __name(getCallHistory, "getCallHistory"); const READ_STATUS_READ = (0, import_util_std.sqlConstant)(import_MessageReadStatus_std.ReadStatus.Read); const SEEN_STATUS_UNSEEN = (0, import_util_std.sqlConstant)(import_MessageSeenStatus_std.SeenStatus.Unseen); const SEEN_STATUS_SEEN = (0, import_util_std.sqlConstant)(import_MessageSeenStatus_std.SeenStatus.Seen); const CALL_STATUS_MISSED = (0, import_util_std.sqlConstant)(import_CallDisposition_std.CallStatusValue.Missed); const CALL_STATUS_DELETED = (0, import_util_std.sqlConstant)(import_CallDisposition_std.CallStatusValue.Deleted); const CALL_STATUS_PENDING = (0, import_util_std.sqlConstant)(import_CallDisposition_std.CallStatusValue.Pending); const CALL_STATUS_INCOMING = (0, import_util_std.sqlConstant)(import_CallDisposition_std.CallDirection.Incoming); const CALL_MODE_ADHOC = (0, import_util_std.sqlConstant)(import_CallDisposition_std.CallMode.Adhoc); const FOUR_HOURS_IN_MS = (0, import_util_std.sqlConstant)(4 * 60 * 60 * 1e3); function getCallHistoryUnreadCount(db) { const [query, params] = import_util_std.sql` SELECT count(*) FROM messages INNER JOIN callsHistory ON callsHistory.callId = messages.callId WHERE messages.type IS 'call-history' AND messages.seenStatus IS ${SEEN_STATUS_UNSEEN} AND callsHistory.status IS ${CALL_STATUS_MISSED} AND callsHistory.direction IS ${CALL_STATUS_INCOMING} `; const row = db.prepare(query, { pluck: true }).get(params); return row ?? 0; } __name(getCallHistoryUnreadCount, "getCallHistoryUnreadCount"); function markCallHistoryRead(db, callId) { const jsonPatch = JSON.stringify({ seenStatus: import_MessageSeenStatus_std.SeenStatus.Seen }); const [query, params] = import_util_std.sql` UPDATE messages SET seenStatus = ${SEEN_STATUS_SEEN}, json = json_patch(json, ${jsonPatch}) WHERE type IS 'call-history' AND callId IS ${callId} `; db.prepare(query).run(params); } __name(markCallHistoryRead, "markCallHistoryRead"); function getCallHistoryForCallLogEventTarget(db, target) { const { callId, timestamp } = target; if ("peerId" in target) { const { peerId } = target; let row; if (callId == null || peerId == null) { const predicate = peerId != null ? import_util_std.sqlFragment`callsHistory.peerId IS ${target.peerId}` : import_util_std.sqlFragment`TRUE`; const [selectQuery, selectParams] = import_util_std.sql` SELECT * FROM callsHistory WHERE ${predicate} AND callsHistory.timestamp <= ${timestamp} ORDER BY callsHistory.timestamp DESC LIMIT 1 `; row = db.prepare(selectQuery).get(selectParams); } else { const [selectQuery, selectParams] = import_util_std.sql` SELECT * FROM callsHistory WHERE callsHistory.peerId IS ${target.peerId} AND callsHistory.callId IS ${target.callId} LIMIT 1 `; row = db.prepare(selectQuery).get(selectParams); } if (row == null) { return null; } return (0, import_schemas_std.parseUnknown)(import_CallDisposition_std.callHistoryDetailsSchema, row); } if ("peerIdAsConversationId" in target && "peerIdAsRoomId" in target) { const resultForConversation = getCallHistoryForCallLogEventTarget(db, { callId, timestamp, peerId: target.peerIdAsConversationId }); if (resultForConversation) { return resultForConversation; } const resultForCallLink = getCallHistoryForCallLogEventTarget(db, { callId, timestamp, peerId: target.peerIdAsRoomId }); if (resultForCallLink) { return resultForCallLink; } return null; } throw new Error( "Either peerId, or peerIdAsConversationId and peerIdAsRoomId must be present" ); } __name(getCallHistoryForCallLogEventTarget, "getCallHistoryForCallLogEventTarget"); function getConversationIdForCallHistory(db, callHistory) { const { peerId, mode } = callHistory; if (mode === import_CallDisposition_std.CallMode.Adhoc) { throw new Error( "getConversationIdForCallHistory: Adhoc calls do not have conversations" ); } const predicate = mode === import_CallDisposition_std.CallMode.Direct ? import_util_std.sqlFragment`serviceId IS ${peerId}` : import_util_std.sqlFragment`groupId IS ${peerId}`; const [selectConversationIdQuery, selectConversationIdParams] = import_util_std.sql` SELECT id FROM conversations WHERE ${predicate} `; const conversationId = db.prepare(selectConversationIdQuery, { pluck: true }).get(selectConversationIdParams); if (typeof conversationId !== "string") { logger.warn("getConversationIdForCallHistory: Unknown conversation"); return null; } return conversationId ?? null; } __name(getConversationIdForCallHistory, "getConversationIdForCallHistory"); function getMessageReceivedAtForCall(db, callId, conversationId) { const [selectQuery, selectParams] = import_util_std.sql` SELECT messages.received_at FROM messages WHERE messages.type IS 'call-history' AND messages.conversationId IS ${conversationId} AND messages.callId IS ${callId} LIMIT 1 `; const receivedAt = db.prepare(selectQuery, { pluck: true }).get(selectParams); if (receivedAt == null) { logger.warn("getMessageReceivedAtForCall: Target call message not found"); return void 0; } return receivedAt; } __name(getMessageReceivedAtForCall, "getMessageReceivedAtForCall"); function markAllCallHistoryRead(db, target, inConversation = false) { return db.transaction(() => { const callHistory = getCallHistoryForCallLogEventTarget(db, target); if (callHistory == null) { logger.warn("markAllCallHistoryRead: Target call not found"); return 0; } const { callId } = callHistory; (0, import_assert_std.strictAssert)( target.callId == null || callId === target.callId, "Call ID must be the same as target if supplied" ); let predicate; let receivedAt; if (callHistory.mode === import_CallDisposition_std.CallMode.Adhoc) { (0, import_assert_std.strictAssert)( !inConversation, "markAllCallHistoryRead: Not possible to mark read in conversation for Adhoc calls" ); receivedAt = callHistory.timestamp; predicate = import_util_std.sqlFragment`TRUE`; } else { const conversationId = getConversationIdForCallHistory(db, callHistory); if (conversationId == null) { logger.warn("markAllCallHistoryRead: Conversation not found for call"); return 0; } logger.info( `markAllCallHistoryRead: Found conversation ${conversationId}` ); receivedAt = getMessageReceivedAtForCall(db, callId, conversationId); predicate = inConversation ? import_util_std.sqlFragment`messages.conversationId IS ${conversationId}` : import_util_std.sqlFragment`TRUE`; } if (receivedAt == null) { logger.warn("markAllCallHistoryRead: Message not found for call"); return 0; } const jsonPatch = JSON.stringify({ readStatus: import_MessageReadStatus_std.ReadStatus.Read, seenStatus: import_MessageSeenStatus_std.SeenStatus.Seen }); logger.info( `markAllCallHistoryRead: Marking calls before ${receivedAt} read` ); const [updateQuery, updateParams] = import_util_std.sql` UPDATE messages SET readStatus = ${READ_STATUS_READ}, seenStatus = ${SEEN_STATUS_SEEN}, json = json_patch(json, ${jsonPatch}) WHERE messages.type IS 'call-history' AND ${predicate} AND messages.seenStatus IS ${SEEN_STATUS_UNSEEN} AND messages.received_at <= ${receivedAt}; `; const result = db.prepare(updateQuery).run(updateParams); return result.changes; })(); } __name(markAllCallHistoryRead, "markAllCallHistoryRead"); function markAllCallHistoryReadInConversation(db, target) { return markAllCallHistoryRead(db, target, true); } __name(markAllCallHistoryReadInConversation, "markAllCallHistoryReadInConversation"); function getCallHistoryGroupData(db, isCount, filter, pagination) { return db.transaction(() => { const { limit, offset } = pagination; const { status, conversationIds, callLinkRoomIds } = filter; const isUsingTempTable = conversationIds != null || callLinkRoomIds != null; if (isUsingTempTable) { const [createTempTable] = import_util_std.sql` CREATE TEMP TABLE temp_callHistory_filtered_peers ( conversationId TEXT, serviceId TEXT, groupId TEXT, callLinkRoomId TEXT ); `; db.exec(createTempTable); if (conversationIds != null) { (0, import_assert_std.strictAssert)(conversationIds.length > 0, "can't filter by empty array"); (0, import_util_std.batchMultiVarQuery)(db, conversationIds, (ids, persistent) => { const idList = (0, import_util_std.sqlJoin)(ids.map((id) => import_util_std.sqlFragment`${id}`)); const [insertQuery, insertParams] = import_util_std.sql` INSERT INTO temp_callHistory_filtered_peers (conversationId, serviceId, groupId) SELECT id, serviceId, groupId FROM conversations WHERE conversations.id IN (${idList}); `; db.prepare(insertQuery, { persistent }).run(insertParams); }); } if (callLinkRoomIds != null) { (0, import_assert_std.strictAssert)(callLinkRoomIds.length > 0, "can't filter by empty array"); (0, import_util_std.batchMultiVarQuery)(db, callLinkRoomIds, (ids, persistent) => { const idList = (0, import_util_std.sqlJoin)(ids.map((id) => import_util_std.sqlFragment`(${id})`)); const [insertQuery, insertParams] = import_util_std.sql` INSERT INTO temp_callHistory_filtered_peers (callLinkRoomId) VALUES ${idList}; `; db.prepare(insertQuery, { persistent }).run(insertParams); }); } } const innerJoin = isUsingTempTable ? import_util_std.sqlFragment` INNER JOIN temp_callHistory_filtered_peers ON ( temp_callHistory_filtered_peers.conversationId IS c.peerId OR temp_callHistory_filtered_peers.serviceId IS c.peerId OR temp_callHistory_filtered_peers.groupId IS c.peerId OR temp_callHistory_filtered_peers.callLinkRoomId IS c.peerId ) ` : import_util_std.sqlFragment``; const filterClause = status === import_CallDisposition_std.CallHistoryFilterStatus.All ? import_util_std.sqlFragment`status IS NOT ${CALL_STATUS_DELETED}` : import_util_std.sqlFragment` direction IS ${CALL_STATUS_INCOMING} AND status IS ${CALL_STATUS_MISSED} AND status IS NOT ${CALL_STATUS_DELETED} `; const offsetLimit = limit > 0 ? import_util_std.sqlFragment`LIMIT ${limit} OFFSET ${offset}` : import_util_std.sqlFragment``; const projection = isCount ? import_util_std.sqlFragment`COUNT(*) OVER() AS count` : import_util_std.sqlFragment`peerId, ringerId, mode, type, direction, status, timestamp, possibleChildren, inPeriod`; const [query, params] = import_util_std.sql` SELECT ${projection} FROM ( -- 1. 'callAndGroupInfo': This section collects metadata to determine the -- parent and children of each call. We can identify the real parents of calls -- within the query, but we need to build the children at runtime. WITH callAndGroupInfo AS ( SELECT *, -- 1a. 'possibleParent': This identifies the first call that _could_ be -- considered the current call's parent. Note: The 'possibleParent' is not -- necessarily the true parent if there is another call between them that -- isn't a part of the group. ( SELECT callId FROM callsHistory WHERE callsHistory.direction IS c.direction AND callsHistory.type IS c.type AND callsHistory.peerId IS c.peerId AND (callsHistory.timestamp - ${FOUR_HOURS_IN_MS}) <= c.timestamp AND callsHistory.timestamp >= c.timestamp -- Tracking Android & Desktop separately to make the queries easier to compare -- Android Constraints: AND ( (callsHistory.status IS c.status AND callsHistory.status IS ${CALL_STATUS_MISSED}) OR (callsHistory.status IS NOT ${CALL_STATUS_MISSED} AND c.status IS NOT ${CALL_STATUS_MISSED}) ) -- Desktop Constraints: AND callsHistory.status IS c.status AND ${filterClause} ORDER BY timestamp DESC ) as possibleParent, -- 1b. 'possibleChildren': This identifies all possible calls that can -- be grouped with the current call. Note: This current call is not -- necessarily the parent, and not all possible children will end up as -- children as they might have another parent ( SELECT JSON_GROUP_ARRAY( JSON_OBJECT( 'callId', callId, 'timestamp', timestamp ) ) FROM callsHistory WHERE callsHistory.direction IS c.direction AND callsHistory.type IS c.type AND callsHistory.peerId IS c.peerId AND (c.timestamp - ${FOUR_HOURS_IN_MS}) <= callsHistory.timestamp AND c.timestamp >= callsHistory.timestamp -- Tracking Android & Desktop separately to make the queries easier to compare -- Android Constraints: AND ( (callsHistory.status IS c.status AND callsHistory.status IS ${CALL_STATUS_MISSED}) OR (callsHistory.status IS NOT ${CALL_STATUS_MISSED} AND c.status IS NOT ${CALL_STATUS_MISSED}) ) -- Desktop Constraints: AND callsHistory.status IS c.status AND ${filterClause} ORDER BY timestamp DESC ) as possibleChildren, -- 1c. 'inPeriod': This identifies all calls in a time period after the -- current call. They may or may not be a part of the group. ( SELECT GROUP_CONCAT(callId) FROM callsHistory WHERE (c.timestamp - ${FOUR_HOURS_IN_MS}) <= callsHistory.timestamp AND c.timestamp >= callsHistory.timestamp AND ${filterClause} ) AS inPeriod FROM callsHistory AS c ${innerJoin} WHERE ${filterClause} ORDER BY timestamp DESC ) -- 2. 'isParent': We need to identify the true parent of the group in cases -- where the previous call is not a part of the group. SELECT *, CASE WHEN LAG (possibleParent, 1, 0) OVER ( -- Note: This is an optimization assuming that we've already got 'timestamp DESC' ordering -- from the query above. If we find that ordering isn't always correct, we can uncomment this: -- ORDER BY timestamp DESC ) != possibleParent THEN callId ELSE possibleParent END AS parent FROM callAndGroupInfo ) AS parentCallAndGroupInfo WHERE parent = parentCallAndGroupInfo.callId GROUP BY CASE -- By spec, limit adhoc call history to the most recent call WHEN mode IS ${CALL_MODE_ADHOC} THEN peerId ELSE callId END ORDER BY parentCallAndGroupInfo.timestamp DESC ${offsetLimit}; `; const result = isCount ? db.prepare(query, { pluck: true }).get(params) : db.prepare(query).all(params); if (isUsingTempTable) { const [dropTempTableQuery] = import_util_std.sql` DROP TABLE temp_callHistory_filtered_peers; `; db.exec(dropTempTableQuery); } return result; })(); } __name(getCallHistoryGroupData, "getCallHistoryGroupData"); const countSchema = import_zod.z.number().int().nonnegative(); function getCallHistoryGroupsCount(db, filter) { const writable = toUnsafeWritableDB(db, "only temp table use"); const result = getCallHistoryGroupData(writable, true, filter, { limit: 0, offset: 0 }); if (result == null) { return 0; } return (0, import_schemas_std.parseUnknown)(countSchema, result); } __name(getCallHistoryGroupsCount, "getCallHistoryGroupsCount"); const groupsDataSchema = import_zod.z.array( import_CallDisposition_std.callHistoryGroupSchema.omit({ children: true }).extend({ possibleChildren: import_zod.z.string(), inPeriod: import_zod.z.string() }) ); const possibleChildrenSchema = import_zod.z.array( import_CallDisposition_std.callHistoryDetailsSchema.pick({ callId: true, timestamp: true }) ); function getCallHistoryGroups(db, filter, pagination) { const writable = toUnsafeWritableDB(db, "only temp table use"); const groupsData = (0, import_schemas_std.parseUnknown)( groupsDataSchema, getCallHistoryGroupData(writable, false, filter, pagination) ); const taken = /* @__PURE__ */ new Set(); return groupsData.map((groupData) => { return { ...groupData, possibleChildren: (0, import_schemas_std.parseUnknown)( possibleChildrenSchema, JSON.parse(groupData.possibleChildren) ), inPeriod: new Set(groupData.inPeriod.split(",")) }; }).reverse().map((group) => { const { possibleChildren, inPeriod, type, ...rest } = group; const children = []; for (const child of possibleChildren) { if (!taken.has(child.callId) && inPeriod.has(child.callId)) { children.push(child); taken.add(child.callId); if (type === import_CallDisposition_std.CallType.Adhoc) { break; } } } return (0, import_schemas_std.parseStrict)(import_CallDisposition_std.callHistoryGroupSchema, { ...rest, type, children }); }).reverse(); } __name(getCallHistoryGroups, "getCallHistoryGroups"); function saveCallHistory(db, callHistory) { const [insertQuery, insertParams] = import_util_std.sql` INSERT OR REPLACE INTO callsHistory ( callId, peerId, ringerId, startedById, mode, type, direction, status, timestamp, endedTimestamp ) VALUES ( ${callHistory.callId}, ${callHistory.peerId}, ${callHistory.ringerId}, ${callHistory.startedById}, ${callHistory.mode}, ${callHistory.type}, ${callHistory.direction}, ${callHistory.status}, ${callHistory.timestamp}, ${callHistory.endedTimestamp} ); `; db.prepare(insertQuery).run(insertParams); } __name(saveCallHistory, "saveCallHistory"); function hasGroupCallHistoryMessage(db, conversationId, eraId) { const exists = db.prepare( ` SELECT EXISTS( SELECT 1 FROM messages WHERE conversationId = $conversationId AND type = 'call-history' AND json_extract(json, '$.callHistoryDetails.callMode') = 'Group' AND json_extract(json, '$.callHistoryDetails.eraId') = $eraId ); `, { pluck: true } ).get({ conversationId, eraId }); return exists === 1; } __name(hasGroupCallHistoryMessage, "hasGroupCallHistoryMessage"); function hasMedia(db, conversationId) { return db.transaction(() => { let hasAttachments; let hasPreviews; let hasContacts; { const [query, params] = import_util_std.sql` SELECT EXISTS( SELECT 1 FROM message_attachments INDEXED BY message_attachments_getOlderMedia WHERE conversationId IS ${conversationId} AND editHistoryIndex IS -1 AND attachmentType IS 'attachment' AND messageType IN ('incoming', 'outgoing') AND isViewOnce IS NOT 1 AND contentType IS NOT NULL AND contentType IS NOT '' AND contentType IS NOT 'text/x-signal-plain' ); `; hasAttachments = db.prepare(query, { pluck: true }).get(params) === 1; } { const [query, params] = import_util_std.sql` SELECT EXISTS( SELECT 1 FROM messages INDEXED BY messages_hasPreviews WHERE conversationId IS ${conversationId} AND type IN ('incoming', 'outgoing') AND isViewOnce IS NOT 1 AND hasPreviews IS 1 ); `; hasPreviews = db.prepare(query, { pluck: true }).get(params) === 1; } { const [query, params] = import_util_std.sql` SELECT EXISTS( SELECT 1 FROM messages INDEXED BY messages_hasContacts WHERE conversationId IS ${conversationId} AND type IN ('incoming', 'outgoing') AND isViewOnce IS NOT 1 AND hasContacts IS 1 ); `; hasContacts = db.prepare(query, { pluck: true }).get(params) === 1; } return hasAttachments || hasPreviews || hasContacts; })(); } __name(hasMedia, "hasMedia"); const { VOICE_MESSAGE } = import_index_std.SignalService.AttachmentPointer.Flags; function getSortedMedia(db, { order, conversationId, limit, messageId, receivedAt: givenReceivedAt, sentAt: givenSentAt, size: givenSize, type }) { let index; let sortFilters; let orderFragment; if (order === "older") { const maxReceivedAt = givenReceivedAt ?? Number.MAX_VALUE; const maxSentAt = givenSentAt ?? Number.MAX_VALUE; index = import_util_std.sqlFragment`message_attachments_getOlderMedia`; sortFilters = { first: import_util_std.sqlFragment` message_attachments.receivedAt = ${maxReceivedAt} AND message_attachments.sentAt < ${maxSentAt} `, second: import_util_std.sqlFragment`message_attachments.receivedAt < ${maxReceivedAt}` }; orderFragment = import_util_std.sqlFragment` message_attachments.receivedAt DESC, message_attachments.sentAt DESC `; } else if (order === "newer") { const minReceivedAt = givenReceivedAt ?? Number.MIN_VALUE; const minSentAt = givenSentAt ?? Number.MIN_VALUE; index = import_util_std.sqlFragment`message_attachments_getOlderMedia`; sortFilters = { first: import_util_std.sqlFragment` message_attachments.receivedAt = ${minReceivedAt} AND message_attachments.sentAt > ${minSentAt} `, second: import_util_std.sqlFragment`message_attachments.receivedAt > ${minReceivedAt}` }; orderFragment = import_util_std.sqlFragment` message_attachments.receivedAt ASC, message_attachments.sentAt ASC `; } else if (order === "bigger") { const maxSize = givenSize ?? Number.MAX_VALUE; const maxReceivedAt = givenReceivedAt ?? Number.MAX_VALUE; const maxSentAt = givenSentAt ?? Number.MAX_VALUE; index = import_util_std.sqlFragment`message_attachments_sortBiggerMedia`; sortFilters = { first: import_util_std.sqlFragment` message_attachments.size = ${maxSize} AND message_attachments.receivedAt = ${maxReceivedAt} AND message_attachments.sentAt < ${maxSentAt} `, second: import_util_std.sqlFragment` message_attachments.size = ${maxSize} AND message_attachments.receivedAt < ${maxReceivedAt} `, third: import_util_std.sqlFragment` message_attachments.size < ${maxSize} ` }; orderFragment = import_util_std.sqlFragment` message_attachments.size DESC, message_attachments.receivedAt DESC, message_attachments.sentAt DESC `; } else { throw (0, import_missingCaseError_std.missingCaseError)(order); } let contentFilter; if (type === "media") { contentFilter = import_util_std.sqlFragment` message_attachments.flags IS NOT ${VOICE_MESSAGE} AND ( message_attachments.contentType LIKE 'image/%' OR message_attachments.contentType LIKE 'video/%' ) `; } else if (type === "audio") { contentFilter = import_util_std.sqlFragment` message_attachments.flags IS ${VOICE_MESSAGE} OR message_attachments.contentType LIKE 'audio/%' `; } else if (type === "documents") { contentFilter = import_util_std.sqlFragment` message_attachments.flags IS NOT ${VOICE_MESSAGE} AND message_attachments.contentType IS NOT NULL AND message_attachments.contentType IS NOT '' AND message_attachments.contentType IS NOT 'text/x-signal-plain' AND message_attachments.contentType NOT LIKE 'audio/%' AND message_attachments.contentType NOT LIKE 'image/%' AND message_attachments.contentType NOT LIKE 'video/%' `; } else { throw (0, import_missingCaseError_std.missingCaseError)(type); } const createQuery = /* @__PURE__ */ __name((sortFilter) => import_util_std.sqlFragment` SELECT message_attachments.*, messages.json -> '$.sendStateByConversationId' AS messageSendState, messages.json -> '$.errors' AS messageErrors, messages.isErased AS messageIsErased, messages.readStatus AS messageReadStatus, messages.source AS messageSource, messages.sourceServiceId AS messageSourceServiceId FROM message_attachments INDEXED BY ${index} INNER JOIN messages ON messages.id = message_attachments.messageId WHERE message_attachments.conversationId IS ${conversationId} AND message_attachments.editHistoryIndex IS -1 AND message_attachments.attachmentType IS 'attachment' AND ( ${sortFilter} ) AND (${contentFilter}) AND message_attachments.isViewOnce IS NOT 1 AND message_attachments.messageType IN ('incoming', 'outgoing') AND (${messageId ?? null} IS NULL OR message_attachments.messageId IS NOT ${messageId ?? null}) ORDER BY ${orderFragment} LIMIT ${limit} `, "createQuery"); let template; if (order === "older" || order === "newer") { template = import_util_std.sql` SELECT first.* FROM (${createQuery(sortFilters.first)}) as first UNION ALL SELECT second.* FROM (${createQuery(sortFilters.second)}) as second `; } else if (order === "bigger") { (0, import_assert_std.strictAssert)(sortFilters.third != null, "file size filter is required"); template = import_util_std.sql` SELECT first.* FROM (${createQuery(sortFilters.first)}) as first UNION ALL SELECT second.* FROM (${createQuery(sortFilters.second)}) as second UNION ALL SELECT third.* FROM (${createQuery(sortFilters.third)}) as third `; } else { throw (0, import_missingCaseError_std.missingCaseError)(order); } const [query, params] = template; const results = db.prepare(query).all(params); return results.map((attachment) => { const { orderInMessage, messageType, messageSource, messageSourceServiceId, messageSendState, messageErrors, messageIsErased, messageReadStatus, sentAt, receivedAt, receivedAtMs } = attachment; return { type: "mediaItem", message: { id: attachment.messageId, type: messageType, source: messageSource ?? void 0, sourceServiceId: messageSourceServiceId ?? void 0, conversationId, receivedAt, receivedAtMs: receivedAtMs ?? void 0, sentAt, sendStateByConversationId: messageSendState == null ? void 0 : JSON.parse(messageSendState), errors: messageErrors == null ? void 0 : JSON.parse(messageErrors), isErased: messageIsErased === 1, readStatus: messageReadStatus ?? void 0 }, index: orderInMessage, attachment: (0, import_hydration_std.convertAttachmentDBFieldsToAttachmentType)(attachment) }; }); } __name(getSortedMedia, "getSortedMedia"); function getSortedNonAttachmentMedia(db, { conversationId, limit, messageId, receivedAt: maxReceivedAt = Number.MAX_VALUE, sentAt: maxSentAt = Number.MAX_VALUE, type }) { const timeFilters = { first: import_util_std.sqlFragment`received_at = ${maxReceivedAt} AND sent_at < ${maxSentAt}`, second: import_util_std.sqlFragment`received_at < ${maxReceivedAt}` }; let index; let predicate; if (type === "links") { index = import_util_std.sqlFragment`messages_hasPreviews`; predicate = import_util_std.sqlFragment`hasPreviews IS 1`; } else if (type === "contacts") { index = import_util_std.sqlFragment`messages_hasContacts`; predicate = import_util_std.sqlFragment`hasContacts IS 1`; } else { throw (0, import_missingCaseError_std.missingCaseError)(type); } const createQuery = /* @__PURE__ */ __name((timeFilter) => import_util_std.sqlFragment` SELECT ${import_Interface_std.MESSAGE_COLUMNS_FRAGMENT} FROM messages INDEXED BY ${index} WHERE conversationId IS ${conversationId} AND (${predicate}) AND isViewOnce IS NOT 1 AND type IN ('incoming', 'outgoing') AND (${messageId ?? null} IS NULL OR id IS NOT ${messageId ?? null}) AND (${timeFilter}) ORDER BY received_at DESC, sent_at DESC LIMIT ${limit} `, "createQuery"); const [query, params] = import_util_std.sql` SELECT first.* FROM (${createQuery(timeFilters.first)}) as first UNION ALL SELECT second.* FROM (${createQuery(timeFilters.second)}) as second `; const rows = db.prepare(query).all(params); return (0, import_hydration_std.hydrateMessages)(db, rows).map((row) => { const message = { id: row.id, type: row.type, conversationId, source: row.source, sourceServiceId: row.sourceServiceId, receivedAt: row.received_at, receivedAtMs: row.received_at_ms ?? void 0, sentAt: row.sent_at, errors: (0, import_dropNull_std.dropNull)(row.errors), sendStateByConversationId: row.sendStateByConversationId, readStatus: row.readStatus, isErased: !!row.isErased }; if (type === "links") { (0, import_assert_std.strictAssert)( row.preview != null && row.preview.length >= 1, `getSortedNonAttachmentMedia: got message without preview ${row.id}` ); return { type: "link", message, preview: row.preview[0] }; } if (type === "contacts") { (0, import_assert_std.strictAssert)( row.contact != null && row.contact.length >= 1, `getSortedNonAttachmentMedia: got message without contact ${row.id}` ); return { type: "contact", message, contact: row.contact[0] }; } throw (0, import_missingCaseError_std.missingCaseError)(type); }); } __name(getSortedNonAttachmentMedia, "getSortedNonAttachmentMedia"); function getSortedDocuments(db, options) { return db.transaction(() => { const documents = getSortedMedia(db, { ...options, order: "older", type: "documents" }); const contacts = getSortedNonAttachmentMedia(db, { ...options, type: "contacts" }); return sortBy( documents.concat( contacts ), [(raw) => raw.message.receivedAt, (raw) => raw.message.sentAt], ["DESC", "DESC"] ).slice(0, options.limit); })(); } __name(getSortedDocuments, "getSortedDocuments"); function _markCallHistoryMissed(db, callIds) { (0, import_util_std.batchMultiVarQuery)(db, callIds, (batch, persistent) => { const [updateQuery, updateParams] = import_util_std.sql` UPDATE callsHistory SET status = ${(0, import_util_std.sqlConstant)(import_CallDisposition_std.GroupCallStatus.Missed)} WHERE callId IN (${(0, import_util_std.sqlJoin)(batch)}) `; return db.prepare(updateQuery, { persistent }).run(updateParams); }); } __name(_markCallHistoryMissed, "_markCallHistoryMissed"); function markCallHistoryMissed(db, callIds) { return db.transaction(() => _markCallHistoryMissed(db, callIds))(); } __name(markCallHistoryMissed, "markCallHistoryMissed"); function getRecentStaleRingsAndMarkOlderMissed(db) { return db.transaction(() => { const [selectQuery, selectParams] = import_util_std.sql` SELECT callId, peerId FROM callsHistory WHERE type = ${(0, import_util_std.sqlConstant)(import_CallDisposition_std.CallType.Group)} AND status = ${(0, import_util_std.sqlConstant)(import_CallDisposition_std.GroupCallStatus.Ringing)} ORDER BY timestamp DESC `; const ringingCalls = db.prepare(selectQuery).all(selectParams); const seen = /* @__PURE__ */ new Set(); const [latestCalls, pastCalls] = partition(ringingCalls, (result) => { if (seen.size >= 10) { return false; } if (seen.has(result.peerId)) { return false; } seen.add(result.peerId); return true; }); _markCallHistoryMissed( db, pastCalls.map((result) => result.callId) ); return latestCalls; })(); } __name(getRecentStaleRingsAndMarkOlderMissed, "getRecentStaleRingsAndMarkOlderMissed"); function migrateConversationMessages(db, obsoleteId, currentId) { const PAGE_SIZE = 1e3; const getPage = db.prepare(` SELECT rowid, json -> '$.sendStateByConversationId' AS sendStateJson, json -> '$.editHistory' AS editHistoryJson FROM messages WHERE conversationId IS $obsoleteId ORDER BY rowid LIMIT $pageSize OFFSET $offset`); const updateOne = db.prepare(` UPDATE messages SET conversationId = $currentId, json = json_patch(json, $patch) WHERE rowid IS $rowid `); db.transaction(() => { for (let offset = 0; true; offset += PAGE_SIZE) { const parts = getPage.all({ obsoleteId, pageSize: PAGE_SIZE, offset }); for (const { rowid, sendStateJson, editHistoryJson } of parts) { const editHistory = JSON.parse(editHistoryJson || "[]"); const sendState = JSON.parse(sendStateJson || "{}"); const patch = { conversationId: currentId, sendStateByConversationId: { [obsoleteId]: null, [currentId]: sendState[obsoleteId] }, // Unlike above here we have to provide the full object with all // existing properties because arrays can't be patched and can only // be replaced. editHistory: editHistory.map( ({ sendStateByConversationId, ...rest }) => { const existingState = sendStateByConversationId?.[obsoleteId]; if (!existingState) { return rest; } return { ...rest, sendStateByConversationId: { ...sendStateByConversationId, [obsoleteId]: void 0, [currentId]: existingState } }; } ) }; updateOne.run({ rowid, patch: JSON.stringify(patch), currentId }); } if (parts.length < PAGE_SIZE) { break; } } })(); } __name(migrateConversationMessages, "migrateConversationMessages"); function getMessagesBySentAt(db, sentAt) { return db.transaction(() => { const [query, params] = import_util_std.sql` SELECT ${import_Interface_std.MESSAGE_COLUMNS_FRAGMENT} FROM edited_messages INNER JOIN messages ON messages.id = edited_messages.messageId WHERE edited_messages.sentAt = ${sentAt} UNION SELECT ${import_Interface_std.MESSAGE_COLUMNS_FRAGMENT} FROM messages WHERE sent_at = ${sentAt} ORDER BY messages.received_at DESC, messages.sent_at DESC; `; const rows = db.prepare(query).all(params); return (0, import_hydration_std.hydrateMessages)(db, rows); })(); } __name(getMessagesBySentAt, "getMessagesBySentAt"); function getExpiredMessages(db) { return db.transaction(() => { const now = Date.now(); const rows = db.prepare( ` SELECT ${import_Interface_std.MESSAGE_COLUMNS.join(", ")}, expiresAt FROM messages WHERE expiresAt <= $now ORDER BY expiresAt ASC; ` ).all({ now }); return (0, import_hydration_std.hydrateMessages)(db, rows); })(); } __name(getExpiredMessages, "getExpiredMessages"); function getMessagesUnexpectedlyMissingExpirationStartTimestamp(db) { return db.transaction(() => { const rows = db.prepare( ` SELECT ${import_Interface_std.MESSAGE_COLUMNS.join(", ")} FROM messages INDEXED BY messages_unexpectedly_missing_expiration_start_timestamp WHERE expireTimer > 0 AND expirationStartTimestamp IS NULL AND ( readStatus = ${import_MessageReadStatus_std.ReadStatus.Read} OR readStatus = ${import_MessageReadStatus_std.ReadStatus.Viewed} OR readStatus IS NULL ) ` ).all(); return (0, import_hydration_std.hydrateMessages)(db, rows); })(); } __name(getMessagesUnexpectedlyMissingExpirationStartTimestamp, "getMessagesUnexpectedlyMissingExpirationStartTimestamp"); function getSoonestMessageExpiry(db) { const result = db.prepare( ` SELECT MIN(expiresAt) FROM messages; `, { pluck: true } ).get(); if (result != null && result >= Number.MAX_SAFE_INTEGER) { return void 0; } return result || void 0; } __name(getSoonestMessageExpiry, "getSoonestMessageExpiry"); function getNextTapToViewMessageTimestampToAgeOut(db) { return db.transaction(() => { const row = db.prepare( ` SELECT ${import_Interface_std.MESSAGE_COLUMNS.join(", ")} FROM messages WHERE -- we want this query to use the messages_view_once index rather than received_at likelihood(isViewOnce = 1, 0.01) AND (isErased IS NULL OR isErased != 1) ORDER BY received_at ASC, sent_at ASC LIMIT 1; ` ).get(); if (!row) { return void 0; } const data = (0, import_hydration_std.hydrateMessage)(db, row); const result = data.received_at_ms; return (0, import_isNormalNumber_std.isNormalNumber)(result) ? result : void 0; })(); } __name(getNextTapToViewMessageTimestampToAgeOut, "getNextTapToViewMessageTimestampToAgeOut"); function getTapToViewMessagesNeedingErase(db, maxTimestamp) { return db.transaction(() => { const rows = db.prepare( ` SELECT ${import_Interface_std.MESSAGE_COLUMNS.join(", ")} FROM messages WHERE isViewOnce = 1 AND (isErased IS NULL OR isErased != 1) AND ( IFNULL(received_at_ms, 0) <= $maxTimestamp ) ` ).all({ maxTimestamp }); return (0, import_hydration_std.hydrateMessages)(db, rows); })(); } __name(getTapToViewMessagesNeedingErase, "getTapToViewMessagesNeedingErase"); const MAX_UNPROCESSED_ATTEMPTS = 10; function saveUnprocessed(db, data) { const { id, timestamp, receivedAtDate, receivedAtCounter, attempts, type, isEncrypted, content, messageAgeSec, source, sourceServiceId, sourceDevice, destinationServiceId, updatedPni, serverGuid, serverTimestamp, urgent, story, reportingToken, groupId } = data; if (!id) { throw new Error("saveUnprocessed: id was falsey"); } db.prepare( ` INSERT OR REPLACE INTO unprocessed ( id, timestamp, receivedAtCounter, receivedAtDate, attempts, type, isEncrypted, content, messageAgeSec, source, sourceServiceId, sourceDevice, destinationServiceId, updatedPni, serverGuid, serverTimestamp, urgent, story, reportingToken, groupId ) values ( $id, $timestamp, $receivedAtCounter, $receivedAtDate, $attempts, $type, $isEncrypted, $content, $messageAgeSec, $source, $sourceServiceId, $sourceDevice, $destinationServiceId, $updatedPni, $serverGuid, $serverTimestamp, $urgent, $story, $reportingToken, $groupId ); ` ).run({ id, timestamp, receivedAtCounter, receivedAtDate, attempts, type, isEncrypted: isEncrypted ? 1 : 0, content, messageAgeSec, source: source || null, sourceServiceId: sourceServiceId || null, sourceDevice: sourceDevice || null, destinationServiceId, updatedPni: updatedPni || null, serverGuid, serverTimestamp, urgent: urgent || !isBoolean(urgent) ? 1 : 0, story: story ? 1 : 0, reportingToken: reportingToken || null, groupId: groupId || null }); return id; } __name(saveUnprocessed, "saveUnprocessed"); function getUnprocessedCount(db) { return (0, import_util_std.getCountFromTable)(db, "unprocessed"); } __name(getUnprocessedCount, "getUnprocessedCount"); function getAllUnprocessedIds(db) { return db.transaction(() => { const { changes: deletedStaleCount } = db.prepare( "DELETE FROM unprocessed WHERE receivedAtDate < $messageQueueCutoff" ).run({ messageQueueCutoff: Date.now() - 45 * durations.DAY }); if (deletedStaleCount !== 0) { logger.warn( `getAllUnprocessedAndIncrementAttempts: deleting ${deletedStaleCount} old unprocessed envelopes` ); } const { changes: deletedInvalidCount } = db.prepare( ` DELETE FROM unprocessed WHERE attempts >= $MAX_UNPROCESSED_ATTEMPTS ` ).run({ MAX_UNPROCESSED_ATTEMPTS }); if (deletedInvalidCount !== 0) { logger.warn( `getAllUnprocessedAndIncrementAttempts: deleting ${deletedInvalidCount} invalid unprocessed envelopes` ); } return db.prepare( ` SELECT id FROM unprocessed ORDER BY receivedAtCounter ASC `, { pluck: true } ).all(); })(); } __name(getAllUnprocessedIds, "getAllUnprocessedIds"); function getUnprocessedByIdsAndIncrementAttempts(db, ids) { logger.info("getUnprocessedByIdsAndIncrementAttempts", { totalIds: ids.length }); (0, import_util_std.batchMultiVarQuery)(db, ids, (batch, persistent) => { return db.prepare( ` UPDATE unprocessed SET attempts = attempts + 1 WHERE id IN (${batch.map(() => "?").join(", ")}) `, { persistent } ).run(batch); }); return (0, import_util_std.batchMultiVarQuery)(db, ids, (batch, persistent) => { return db.prepare( ` SELECT * FROM unprocessed WHERE id IN (${batch.map(() => "?").join(", ")}) ORDER BY receivedAtCounter ASC; `, { persistent } ).all(batch).map((row) => ({ ...row, urgent: isNumber(row.urgent) ? Boolean(row.urgent) : true, story: Boolean(row.story), isEncrypted: Boolean(row.isEncrypted) })); }); } __name(getUnprocessedByIdsAndIncrementAttempts, "getUnprocessedByIdsAndIncrementAttempts"); function removeUnprocesseds(db, ids, persistent) { db.prepare( ` DELETE FROM unprocessed WHERE id IN ( ${ids.map(() => "?").join(", ")} ); `, { persistent } ).run(ids); } __name(removeUnprocesseds, "removeUnprocesseds"); function removeUnprocessed(db, id) { if (!Array.isArray(id)) { db.prepare("DELETE FROM unprocessed WHERE id = $id;").run({ id }); return; } if (!id.length) { return; } (0, import_util_std.batchMultiVarQuery)( db, id, (batch, persistent) => removeUnprocesseds(db, batch, persistent) ); } __name(removeUnprocessed, "removeUnprocessed"); function removeAllUnprocessed(db) { db.prepare("DELETE FROM unprocessed;").run(); } __name(removeAllUnprocessed, "removeAllUnprocessed"); function _getAttachmentDownloadJob(db, job) { const [query, params] = import_util_std.sql` SELECT * FROM attachment_downloads WHERE messageId = ${job.messageId} AND attachmentType = ${job.attachmentType} AND attachmentSignature = ${job.attachmentSignature}; `; const row = db.prepare(query).get(params); if (row === void 0) { return void 0; } const { attachmentJson, ...fields } = row; return (0, import_schemas_std.parseUnknown)(import_AttachmentDownload_std.attachmentDownloadJobSchema, { ...fields, active: Boolean(row.active), attachment: JSON.parse(attachmentJson), ciphertextSize: row.ciphertextSize || 0 }); } __name(_getAttachmentDownloadJob, "_getAttachmentDownloadJob"); function removeAllBackupAttachmentDownloadJobs(db) { const [query, params] = import_util_std.sql` DELETE FROM attachment_downloads WHERE source = ${import_Interface_std.AttachmentDownloadSource.BACKUP_IMPORT_WITH_MEDIA} OR source = ${import_Interface_std.AttachmentDownloadSource.BACKUP_IMPORT_NO_MEDIA};`; db.prepare(query).run(params); } __name(removeAllBackupAttachmentDownloadJobs, "removeAllBackupAttachmentDownloadJobs"); function resetBackupAttachmentDownloadStats(db) { const [query, params] = import_util_std.sql` INSERT OR REPLACE INTO attachment_downloads_backup_stats (id, totalBytes, completedBytes) VALUES (0,0,0); `; db.prepare(query).run(params); } __name(resetBackupAttachmentDownloadStats, "resetBackupAttachmentDownloadStats"); function getBackupAttachmentDownloadProgress(db) { const [query, params] = import_util_std.sql` SELECT totalBytes, completedBytes FROM attachment_downloads_backup_stats WHERE id = 0; `; return db.prepare(query).get(params) ?? { totalBytes: 0, completedBytes: 0 }; } __name(getBackupAttachmentDownloadProgress, "getBackupAttachmentDownloadProgress"); function getNextAttachmentDownloadJobs(db, { limit = 3, sources, prioritizeMessageIds, timestamp = Date.now(), maxLastAttemptForPrioritizedMessages }) { let priorityJobs = new Array(); const sourceWhereFragment = sources ? import_util_std.sqlFragment` source IN (${(0, import_util_std.sqlJoin)(sources)}) ` : import_util_std.sqlFragment` TRUE `; if (prioritizeMessageIds?.length) { const [priorityQuery, priorityParams] = import_util_std.sql` SELECT * FROM attachment_downloads -- very few rows will match messageIds, so in this case we want to optimize -- the WHERE clause rather than the ORDER BY INDEXED BY attachment_downloads_active_messageId WHERE active = 0 AND -- for priority messages, we want to retry based on the last attempt, rather than retryAfter (lastAttemptTimestamp is NULL OR lastAttemptTimestamp <= ${maxLastAttemptForPrioritizedMessages ?? timestamp - durations.HOUR}) AND messageId IN (${(0, import_util_std.sqlJoin)(prioritizeMessageIds)}) AND ${sourceWhereFragment} -- for priority messages, let's load them oldest first; this helps, e.g. for stories where we -- want the oldest one first ORDER BY receivedAt ASC LIMIT ${limit} `; priorityJobs = db.prepare(priorityQuery).all(priorityParams); } const numJobsRemaining = limit - priorityJobs.length; let standardJobs = []; if (numJobsRemaining > 0) { const [query, params] = import_util_std.sql` SELECT * FROM attachment_downloads WHERE active = 0 AND (retryAfter is NULL OR retryAfter <= ${timestamp}) AND ${sourceWhereFragment} ORDER BY receivedAt DESC LIMIT ${numJobsRemaining} `; standardJobs = db.prepare(query).all(params); } const allJobs = priorityJobs.concat(standardJobs); const INNER_ERROR = "jsonToObject or SchemaParse error"; try { return allJobs.map((row) => { try { return (0, import_schemas_std.parseUnknown)(import_AttachmentDownload_std.attachmentDownloadJobSchema, { ...row, active: Boolean(row.active), attachment: (0, import_util_std.jsonToObject)(row.attachmentJson) }); } catch (error) { logger.error( `getNextAttachmentDownloadJobs: Error with job for message ${row.messageId}, deleting.` ); removeAttachmentDownloadJob(db, row); throw new Error(error); } }); } catch (error) { if ("message" in error && error.message === INNER_ERROR) { return getNextAttachmentDownloadJobs(db, { limit, prioritizeMessageIds, timestamp, maxLastAttemptForPrioritizedMessages }); } throw error; } } __name(getNextAttachmentDownloadJobs, "getNextAttachmentDownloadJobs"); function saveAttachmentDownloadJobs(db, jobs) { const errors = []; db.transaction(() => { for (const job of jobs) { try { saveAttachmentDownloadJob(db, job); } catch (e) { errors.push(e); } } })(); if (errors.length === 0) { return; } if (errors.length === 1) { throw errors[0]; } throw new AggregateError( errors, `Multiple errors while saving attachment download jobs: ${errors.map((e) => e.message).join("\n")}` ); } __name(saveAttachmentDownloadJobs, "saveAttachmentDownloadJobs"); function saveAttachmentDownloadJob(db, job) { return db.transaction(() => { const [messageExistsQuery, messageExistsParams] = import_util_std.sql` SELECT EXISTS( SELECT 1 FROM messages WHERE messages.id = ${job.messageId} ); `; const messageExists = db.prepare(messageExistsQuery, { pluck: true }).get(messageExistsParams); if (messageExists !== 1) { logger.warn("saveAttachmentDownloadJob: message does not exist, bailing"); return; } const jobToInsert = { messageId: job.messageId, attachmentType: job.attachmentType, attachmentSignature: job.attachmentSignature, receivedAt: job.receivedAt, sentAt: job.sentAt, contentType: job.contentType, size: job.size, active: job.active ? 1 : 0, attempts: job.attempts, retryAfter: job.retryAfter, lastAttemptTimestamp: job.lastAttemptTimestamp, attachmentJson: (0, import_util_std.objectToJSON)(job.attachment), ciphertextSize: job.ciphertextSize, originalSource: job.originalSource, source: job.source }; db.prepare( ` INSERT INTO attachment_downloads (${ATTACHMENT_DOWNLOADS_COLUMNS.join(", ")}) VALUES (${ATTACHMENT_DOWNLOADS_COLUMNS.map((name) => `$${name}`).join(", ")}) ON CONFLICT DO UPDATE SET -- preserve originalSource ${ATTACHMENT_DOWNLOADS_COLUMNS.filter( (name) => name !== "originalSource" ).map((name) => `${name} = $${name}`).join(", ")} ` ).run(jobToInsert); })(); } __name(saveAttachmentDownloadJob, "saveAttachmentDownloadJob"); function resetAttachmentDownloadActive(db) { db.prepare( ` UPDATE attachment_downloads SET active = 0 WHERE active != 0; ` ).run(); } __name(resetAttachmentDownloadActive, "resetAttachmentDownloadActive"); function resetBackupAttachmentDownloadJobsRetryAfter(db) { db.prepare( ` UPDATE attachment_downloads SET retryAfter = NULL WHERE originalSource = 'backup_import' ` ).run(); } __name(resetBackupAttachmentDownloadJobsRetryAfter, "resetBackupAttachmentDownloadJobsRetryAfter"); function removeAttachmentDownloadJob(db, job) { const [query, params] = import_util_std.sql` DELETE FROM attachment_downloads WHERE messageId = ${job.messageId} AND attachmentType = ${job.attachmentType} AND attachmentSignature = ${job.attachmentSignature}; `; db.prepare(query).run(params); } __name(removeAttachmentDownloadJob, "removeAttachmentDownloadJob"); function removeAttachmentDownloadJobsForMessage(db, messageId) { const [query, params] = import_util_std.sql` DELETE FROM attachment_downloads WHERE messageId = ${messageId} `; db.prepare(query).run(params); } __name(removeAttachmentDownloadJobsForMessage, "removeAttachmentDownloadJobsForMessage"); function clearAllAttachmentBackupJobs(db) { db.prepare("DELETE FROM attachment_backup_jobs;").run(); } __name(clearAllAttachmentBackupJobs, "clearAllAttachmentBackupJobs"); function markAllAttachmentBackupJobsInactive(db) { db.prepare( ` UPDATE attachment_backup_jobs SET active = 0; ` ).run(); } __name(markAllAttachmentBackupJobsInactive, "markAllAttachmentBackupJobsInactive"); function saveAttachmentBackupJob(db, job) { const [query, params] = import_util_std.sql` INSERT OR REPLACE INTO attachment_backup_jobs ( active, attempts, data, lastAttemptTimestamp, mediaName, receivedAt, retryAfter, type ) VALUES ( ${job.active ? 1 : 0}, ${job.attempts}, ${(0, import_util_std.objectToJSON)(job.data)}, ${job.lastAttemptTimestamp}, ${job.mediaName}, ${job.receivedAt}, ${job.retryAfter}, ${job.type} ); `; db.prepare(query).run(params); } __name(saveAttachmentBackupJob, "saveAttachmentBackupJob"); function getNextAttachmentBackupJobs(db, { limit, timestamp = Date.now() }) { const [query, params] = import_util_std.sql` SELECT * FROM attachment_backup_jobs WHERE active = 0 AND (retryAfter is NULL OR retryAfter <= ${timestamp}) ORDER BY -- type is "standard" or "thumbnail"; we prefer "standard" jobs type ASC, receivedAt DESC LIMIT ${limit} `; const rows = db.prepare(query).all(params); return rows.map((row) => { const parseResult = (0, import_schemas_std.safeParseUnknown)(import_AttachmentBackup_std.attachmentBackupJobSchema, { ...row, active: Boolean(row.active), data: (0, import_util_std.jsonToObject)(row.data) }); if (!parseResult.success) { const redactedMediaName = (0, import_privacy_node.redactGenericText)(row.mediaName); logger.error( `getNextAttachmentBackupJobs: invalid data, removing. mediaName: ${redactedMediaName}`, Errors.toLogFormat(parseResult.error) ); removeAttachmentBackupJob(db, { mediaName: row.mediaName }); return null; } return parseResult.data; }).filter(import_isNotNil_std.isNotNil); } __name(getNextAttachmentBackupJobs, "getNextAttachmentBackupJobs"); function removeAttachmentBackupJob(db, job) { const [query, params] = import_util_std.sql` DELETE FROM attachment_backup_jobs WHERE mediaName = ${job.mediaName}; `; db.prepare(query).run(params); } __name(removeAttachmentBackupJob, "removeAttachmentBackupJob"); function clearAllBackupCdnObjectMetadata(db) { db.prepare("DELETE FROM backup_cdn_object_metadata;").run(); } __name(clearAllBackupCdnObjectMetadata, "clearAllBackupCdnObjectMetadata"); function saveBackupCdnObjectMetadata(db, storedMediaObjects) { db.transaction(() => { for (const obj of storedMediaObjects) { const { mediaId, cdnNumber, sizeOnBackupCdn } = obj; const [query, params] = import_util_std.sql` INSERT OR REPLACE INTO backup_cdn_object_metadata ( mediaId, cdnNumber, sizeOnBackupCdn ) VALUES ( ${mediaId}, ${cdnNumber}, ${sizeOnBackupCdn} ); `; db.prepare(query).run(params); } })(); } __name(saveBackupCdnObjectMetadata, "saveBackupCdnObjectMetadata"); function getBackupCdnObjectMetadata(db, mediaId) { const [query, params] = import_util_std.sql` SELECT * FROM backup_cdn_object_metadata WHERE mediaId = ${mediaId} `; return db.prepare(query).get(params); } __name(getBackupCdnObjectMetadata, "getBackupCdnObjectMetadata"); function createOrUpdateStickerPack(db, pack) { const { attemptedStatus, author, coverStickerId, createdAt, downloadAttempts, id, installedAt, key, lastUsed, status, stickerCount, title } = pack; if (!id) { throw new Error( "createOrUpdateStickerPack: Provided data did not have a truthy id" ); } const row = db.prepare( ` SELECT id FROM sticker_packs WHERE id = $id; ` ).get({ id }); const payload = { attemptedStatus: attemptedStatus ?? null, author, coverStickerId, createdAt: createdAt || Date.now(), downloadAttempts: downloadAttempts || 1, id, installedAt: installedAt ?? null, key, lastUsed: lastUsed || null, status, stickerCount, title }; if (row) { db.prepare( ` UPDATE sticker_packs SET attemptedStatus = $attemptedStatus, author = $author, coverStickerId = $coverStickerId, createdAt = $createdAt, downloadAttempts = $downloadAttempts, installedAt = $installedAt, key = $key, lastUsed = $lastUsed, status = $status, stickerCount = $stickerCount, title = $title WHERE id = $id; ` ).run(payload); return; } let { position } = pack; if (!isNumber(position)) { position = db.prepare( ` SELECT IFNULL(MAX(position) + 1, 0) FROM sticker_packs `, { pluck: true } ).get(); } db.prepare( ` INSERT INTO sticker_packs ( attemptedStatus, author, coverStickerId, createdAt, downloadAttempts, id, installedAt, key, lastUsed, status, stickerCount, title, position ) values ( $attemptedStatus, $author, $coverStickerId, $createdAt, $downloadAttempts, $id, $installedAt, $key, $lastUsed, $status, $stickerCount, $title, $position ) ` ).run({ ...payload, position: position ?? 0 }); } __name(createOrUpdateStickerPack, "createOrUpdateStickerPack"); function createOrUpdateStickerPacks(db, packs) { db.transaction(() => { for (const pack of packs) { createOrUpdateStickerPack(db, pack); } })(); } __name(createOrUpdateStickerPacks, "createOrUpdateStickerPacks"); function updateStickerPackStatus(db, id, status, options) { const timestamp = options ? options.timestamp || Date.now() : Date.now(); const installedAt = status === "installed" ? timestamp : null; return db.transaction(() => { const [select, selectParams] = import_util_std.sql` SELECT status FROM sticker_packs WHERE id IS ${id}; `; const oldStatus = db.prepare(select, { pluck: true }).get(selectParams) ?? null; const [update, updateParams] = import_util_std.sql` UPDATE sticker_packs SET status = ${status}, installedAt = ${installedAt} WHERE id IS ${id} `; db.prepare(update).run(updateParams); return oldStatus; })(); } __name(updateStickerPackStatus, "updateStickerPackStatus"); function updateStickerPackInfo(db, { id, storageID, storageVersion, storageUnknownFields, storageNeedsSync, uninstalledAt, position }) { if (uninstalledAt) { db.prepare( ` UPDATE uninstalled_sticker_packs SET storageID = $storageID, storageVersion = $storageVersion, storageUnknownFields = $storageUnknownFields, storageNeedsSync = $storageNeedsSync WHERE id = $id; ` ).run({ id, storageID: storageID ?? null, storageVersion: storageVersion ?? null, storageUnknownFields: storageUnknownFields ?? null, storageNeedsSync: storageNeedsSync ? 1 : 0 }); } else { db.prepare( ` UPDATE sticker_packs SET storageID = $storageID, storageVersion = $storageVersion, storageUnknownFields = $storageUnknownFields, storageNeedsSync = $storageNeedsSync, position = $position WHERE id = $id; ` ).run({ id, storageID: storageID ?? null, storageVersion: storageVersion ?? null, storageUnknownFields: storageUnknownFields ?? null, storageNeedsSync: storageNeedsSync ? 1 : 0, position: position || 0 }); } } __name(updateStickerPackInfo, "updateStickerPackInfo"); function clearAllErrorStickerPackAttempts(db) { db.prepare( ` UPDATE sticker_packs SET downloadAttempts = 0 WHERE status = 'error'; ` ).run(); } __name(clearAllErrorStickerPackAttempts, "clearAllErrorStickerPackAttempts"); function createOrUpdateSticker(db, sticker) { const { emoji, height, id, isCoverOnly, lastUsed, packId, path, width, version, localKey, size } = sticker; if (!isNumber(id)) { throw new Error( "createOrUpdateSticker: Provided data did not have a numeric id" ); } if (!packId) { throw new Error( "createOrUpdateSticker: Provided data did not have a truthy id" ); } db.prepare( ` INSERT OR REPLACE INTO stickers ( emoji, height, id, isCoverOnly, lastUsed, packId, path, width, version, localKey, size ) values ( $emoji, $height, $id, $isCoverOnly, $lastUsed, $packId, $path, $width, $version, $localKey, $size ) ` ).run({ emoji: emoji ?? null, height, id, isCoverOnly: isCoverOnly ? 1 : 0, lastUsed: lastUsed || null, packId, path, width, version: version || 1, localKey: localKey || null, size: size || null }); } __name(createOrUpdateSticker, "createOrUpdateSticker"); function createOrUpdateStickers(db, stickers) { db.transaction(() => { for (const sticker of stickers) { createOrUpdateSticker(db, sticker); } })(); } __name(createOrUpdateStickers, "createOrUpdateStickers"); function updateStickerLastUsed(db, packId, stickerId, lastUsed) { db.prepare( ` UPDATE stickers SET lastUsed = $lastUsed WHERE id = $id AND packId = $packId; ` ).run({ id: stickerId, packId, lastUsed }); db.prepare( ` UPDATE sticker_packs SET lastUsed = $lastUsed WHERE id = $id; ` ).run({ id: packId, lastUsed }); } __name(updateStickerLastUsed, "updateStickerLastUsed"); function addStickerPackReference(db, { messageId, packId, stickerId, isUnresolved }) { if (!messageId) { throw new Error( "addStickerPackReference: Provided data did not have a truthy messageId" ); } if (!packId) { throw new Error( "addStickerPackReference: Provided data did not have a truthy packId" ); } db.transaction(() => { const [select, selectParams] = import_util_std.sql` SELECT EXISTS ( SELECT 1 FROM sticker_packs WHERE id IS ${packId} ) `; const exists = db.prepare(select, { pluck: true }).get(selectParams) === 1; if (!exists) { logger.warn("addStickerPackReference: did not find referenced pack"); return; } const [insert, insertParams] = import_util_std.sql` INSERT OR REPLACE INTO sticker_references ( messageId, packId, stickerId, isUnresolved ) values ( ${messageId}, ${packId}, ${stickerId}, ${isUnresolved ? 1 : 0} ) `; db.prepare(insert).run(insertParams); })(); } __name(addStickerPackReference, "addStickerPackReference"); function deleteStickerPackReference(db, { messageId, packId }) { return db.transaction(() => { db.prepare( ` DELETE FROM sticker_references WHERE messageId = $messageId AND packId = $packId; ` ).run({ messageId, packId }); const count = db.prepare( ` SELECT count(1) FROM sticker_references WHERE packId = $packId; `, { pluck: true } ).get({ packId }) ?? 0; if (count > 0) { return void 0; } const packRow = db.prepare( ` SELECT status FROM sticker_packs WHERE id = $packId; ` ).get({ packId }); if (!packRow) { logger.warn("deleteStickerPackReference: did not find referenced pack"); return void 0; } const { status } = packRow; if (status === "installed") { return void 0; } const stickerPathRows = db.prepare( ` SELECT path FROM stickers WHERE packId = $packId; ` ).all({ packId }); db.prepare( ` DELETE FROM sticker_packs WHERE id = $packId; ` ).run({ packId }); return (stickerPathRows || []).map((row) => row.path); })(); } __name(deleteStickerPackReference, "deleteStickerPackReference"); function getUnresolvedStickerPackReferences(db, packId) { return db.transaction(() => { const [query, params] = import_util_std.sql` UPDATE sticker_references SET isUnresolved = 0 WHERE packId IS ${packId} AND isUnresolved IS 1 RETURNING messageId, stickerId; `; const rows = db.prepare(query).all(params); return rows.map(({ messageId, stickerId }) => ({ messageId, packId, stickerId, isUnresolved: true })); })(); } __name(getUnresolvedStickerPackReferences, "getUnresolvedStickerPackReferences"); function deleteStickerPack(db, packId) { if (!packId) { throw new Error( "deleteStickerPack: Provided data did not have a truthy packId" ); } return db.transaction(() => { const stickerPathRows = db.prepare( ` SELECT path FROM stickers WHERE packId = $packId; ` ).all({ packId }); db.prepare( ` DELETE FROM sticker_packs WHERE id = $packId; ` ).run({ packId }); return (stickerPathRows || []).map((row) => row.path); })(); } __name(deleteStickerPack, "deleteStickerPack"); function getStickerCount(db) { return (0, import_util_std.getCountFromTable)(db, "stickers"); } __name(getStickerCount, "getStickerCount"); function getAllStickerPacks(db) { const rows = db.prepare( ` SELECT * FROM sticker_packs ORDER BY position ASC, id ASC ` ).all(); return rows.map((row) => { return { ...row, storageNeedsSync: row.storageNeedsSync === 1, stickers: {}, // The columns have STRING type so if they have numeric value, sqlite // will return integers. author: String(row.author), title: String(row.title) }; }); } __name(getAllStickerPacks, "getAllStickerPacks"); function addUninstalledStickerPack(db, pack) { db.prepare( ` INSERT OR REPLACE INTO uninstalled_sticker_packs ( id, uninstalledAt, storageID, storageVersion, storageUnknownFields, storageNeedsSync ) VALUES ( $id, $uninstalledAt, $storageID, $storageVersion, $unknownFields, $storageNeedsSync ) ` ).run({ id: pack.id, uninstalledAt: pack.uninstalledAt, storageID: pack.storageID ?? null, storageVersion: pack.storageVersion ?? null, unknownFields: pack.storageUnknownFields ?? null, storageNeedsSync: pack.storageNeedsSync ? 1 : 0 }); } __name(addUninstalledStickerPack, "addUninstalledStickerPack"); function addUninstalledStickerPacks(db, packs) { return db.transaction(() => { for (const pack of packs) { addUninstalledStickerPack(db, pack); } })(); } __name(addUninstalledStickerPacks, "addUninstalledStickerPacks"); function removeUninstalledStickerPack(db, packId) { const [query, params] = import_util_std.sql` DELETE FROM uninstalled_sticker_packs WHERE id IS ${packId} `; db.prepare(query).run(params); } __name(removeUninstalledStickerPack, "removeUninstalledStickerPack"); function getUninstalledStickerPacks(db) { const rows = db.prepare("SELECT * FROM uninstalled_sticker_packs ORDER BY id ASC").all(); return rows.map((row) => ({ ...row, storageNeedsSync: row.storageNeedsSync === 1 })); } __name(getUninstalledStickerPacks, "getUninstalledStickerPacks"); function getInstalledStickerPacks(db) { const rows = db.prepare( ` SELECT * FROM sticker_packs WHERE status IS 'installed' OR storageID IS NOT NULL ORDER BY id ASC ` ).all(); return rows.map((row) => ({ ...row, storageNeedsSync: row.storageNeedsSync === 1, stickers: {} })); } __name(getInstalledStickerPacks, "getInstalledStickerPacks"); function getStickerPackInfo(db, packId) { return db.transaction(() => { const uninstalled = db.prepare( ` SELECT * FROM uninstalled_sticker_packs WHERE id IS $packId ` ).get({ packId }); if (uninstalled) { return { ...uninstalled, storageNeedsSync: uninstalled.storageNeedsSync === 1, key: void 0, position: void 0 }; } const installed = db.prepare( ` SELECT id, key, position, storageID, storageVersion, storageUnknownFields FROM sticker_packs WHERE id IS $packId ` ).get({ packId }); if (installed) { return { ...installed, storageNeedsSync: installed.storageNeedsSync === 1, uninstalledAt: void 0 }; } return void 0; })(); } __name(getStickerPackInfo, "getStickerPackInfo"); function installStickerPack(db, packId, timestamp) { return db.transaction(() => { const status = "installed"; removeUninstalledStickerPack(db, packId); const oldStatus = updateStickerPackStatus(db, packId, status, { timestamp }); const wasPreviouslyUninstalled = oldStatus !== "installed"; if (wasPreviouslyUninstalled) { const [query, params] = import_util_std.sql` UPDATE sticker_packs SET storageNeedsSync = 1 WHERE id IS ${packId}; `; db.prepare(query).run(params); } return wasPreviouslyUninstalled; })(); } __name(installStickerPack, "installStickerPack"); function uninstallStickerPack(db, packId, timestamp) { return db.transaction(() => { const status = "downloaded"; const oldStatus = updateStickerPackStatus(db, packId, status); const wasPreviouslyInstalled = oldStatus === "installed"; const [query, params] = import_util_std.sql` UPDATE sticker_packs SET storageID = NULL, storageVersion = NULL, storageUnknownFields = NULL, storageNeedsSync = 0 WHERE id = ${packId} `; db.prepare(query).run(params); addUninstalledStickerPack(db, { id: packId, uninstalledAt: timestamp, storageNeedsSync: wasPreviouslyInstalled }); return wasPreviouslyInstalled; })(); } __name(uninstallStickerPack, "uninstallStickerPack"); function getAllStickers(db) { const rows = db.prepare( ` SELECT * FROM stickers ORDER BY packId ASC, id ASC ` ).all(); return (rows || []).map((row) => rowToSticker(row)); } __name(getAllStickers, "getAllStickers"); function getRecentStickers(db, { limit } = {}) { const rows = db.prepare( ` SELECT stickers.* FROM stickers JOIN sticker_packs on stickers.packId = sticker_packs.id WHERE stickers.lastUsed > 0 AND sticker_packs.status = 'installed' ORDER BY stickers.lastUsed DESC LIMIT $limit ` ).all({ limit: limit || 24 }); return (rows || []).map((row) => rowToSticker(row)); } __name(getRecentStickers, "getRecentStickers"); function updateEmojiUsage(db, shortName, timeUsed = Date.now()) { db.transaction(() => { const rows = db.prepare( ` SELECT * FROM emojis WHERE shortName = $shortName; ` ).get({ shortName }); if (rows) { db.prepare( ` UPDATE emojis SET lastUsage = $timeUsed WHERE shortName = $shortName; ` ).run({ shortName, timeUsed }); } else { db.prepare( ` INSERT INTO emojis(shortName, lastUsage) VALUES ($shortName, $timeUsed); ` ).run({ shortName, timeUsed }); } })(); } __name(updateEmojiUsage, "updateEmojiUsage"); function getRecentEmojis(db, limit = 32) { const rows = db.prepare( ` SELECT * FROM emojis ORDER BY lastUsage DESC LIMIT $limit; ` ).all({ limit }); return rows || []; } __name(getRecentEmojis, "getRecentEmojis"); const RecentGifsRow = import_zod.z.object({ id: import_zod.z.string(), title: import_zod.z.string(), description: import_zod.z.string(), previewMedia_url: import_zod.z.string(), previewMedia_width: import_zod.z.number().int(), previewMedia_height: import_zod.z.number().int(), attachmentMedia_url: import_zod.z.string(), attachmentMedia_width: import_zod.z.number().int(), attachmentMedia_height: import_zod.z.number().int(), lastUsedAt: import_zod.z.number().int() }); function getRecentGifs(db, limit) { const [query, params] = import_util_std.sql` SELECT * FROM recentGifs ORDER BY lastUsedAt DESC LIMIT ${limit} `; return db.prepare(query).all(params).map((raw) => { const row = (0, import_schemas_std.parseUnknown)(RecentGifsRow, raw); return { id: row.id, title: row.title, description: row.description, previewMedia: { url: row.previewMedia_url, width: row.previewMedia_width, height: row.previewMedia_height }, attachmentMedia: { url: row.attachmentMedia_url, width: row.attachmentMedia_width, height: row.attachmentMedia_height } }; }); } __name(getRecentGifs, "getRecentGifs"); function addRecentGif(db, gif, lastUsedAt, maxRecents) { const [insertQuery, insertParams] = import_util_std.sql` INSERT OR REPLACE INTO recentGifs ( id, title, description, previewMedia_url, previewMedia_width, previewMedia_height, attachmentMedia_url, attachmentMedia_width, attachmentMedia_height, lastUsedAt ) VALUES ( ${gif.id}, ${gif.title}, ${gif.description}, ${gif.previewMedia.url}, ${gif.previewMedia.width}, ${gif.previewMedia.height}, ${gif.attachmentMedia.url}, ${gif.attachmentMedia.width}, ${gif.attachmentMedia.height}, ${lastUsedAt} ); `; const [deleteQuery, deleteParams] = import_util_std.sql` DELETE FROM recentGifs WHERE id NOT IN ( SELECT id FROM recentGifs ORDER BY lastUsedAt DESC LIMIT ${maxRecents} ); `; db.transaction(() => { db.prepare(insertQuery).run(insertParams); db.prepare(deleteQuery).run(deleteParams); })(); } __name(addRecentGif, "addRecentGif"); function removeRecentGif(db, gifId) { const [query, params] = import_util_std.sql` DELETE FROM recentGifs WHERE id = ${gifId} `; db.prepare(query).run(params); } __name(removeRecentGif, "removeRecentGif"); function getAllBadges(db) { return db.transaction(() => { const badgeRows = db.prepare("SELECT * FROM badges").all(); const badgeImageFileRows = db.prepare("SELECT * FROM badgeImageFiles").all(); const badgeImagesByBadge = /* @__PURE__ */ new Map(); for (const badgeImageFileRow of badgeImageFileRows) { const { badgeId, order, localPath, url, theme } = badgeImageFileRow; const badgeImages = badgeImagesByBadge.get(badgeId) || []; badgeImages[order] = { ...badgeImages[order] || {}, [(0, import_BadgeImageTheme_std.parseBadgeImageTheme)(theme)]: { localPath: (0, import_dropNull_std.dropNull)(localPath), url } }; badgeImagesByBadge.set(badgeId, badgeImages); } return badgeRows.map((badgeRow) => ({ id: badgeRow.id, category: (0, import_BadgeCategory_std.parseBadgeCategory)(badgeRow.category), name: badgeRow.name, descriptionTemplate: badgeRow.descriptionTemplate, images: (badgeImagesByBadge.get(badgeRow.id) || []).filter(import_isNotNil_std.isNotNil) })); })(); } __name(getAllBadges, "getAllBadges"); function updateOrCreateBadges(db, badges) { const insertBadge = db.prepare( ` INSERT OR REPLACE INTO badges ( id, category, name, descriptionTemplate ) VALUES ( $id, $category, $name, $descriptionTemplate ); ` ); const getImageFilesForBadge = db.prepare( "SELECT url, localPath FROM badgeImageFiles WHERE badgeId = $badgeId" ); const insertBadgeImageFile = db.prepare( ` INSERT INTO badgeImageFiles ( badgeId, 'order', url, localPath, theme ) VALUES ( $badgeId, $order, $url, $localPath, $theme ); ` ); db.transaction(() => { badges.forEach((badge) => { const { id: badgeId } = badge; const oldLocalPaths = /* @__PURE__ */ new Map(); for (const { url, localPath } of getImageFilesForBadge.all({ badgeId })) { if (localPath) { oldLocalPaths.set(url, localPath); } } insertBadge.run({ id: badgeId, category: badge.category, name: badge.name, descriptionTemplate: badge.descriptionTemplate }); for (const [order, image] of badge.images.entries()) { for (const [theme, imageFile] of Object.entries(image)) { insertBadgeImageFile.run({ badgeId, localPath: imageFile.localPath || oldLocalPaths.get(imageFile.url) || null, order, theme, url: imageFile.url }); } } }); })(); } __name(updateOrCreateBadges, "updateOrCreateBadges"); function badgeImageFileDownloaded(db, url, localPath) { db.prepare( "UPDATE badgeImageFiles SET localPath = $localPath WHERE url = $url" ).run({ url, localPath }); } __name(badgeImageFileDownloaded, "badgeImageFileDownloaded"); function getAllBadgeImageFileLocalPaths(db) { const localPaths = db.prepare( "SELECT localPath FROM badgeImageFiles WHERE localPath IS NOT NULL", { pluck: true } ).all(); return new Set(localPaths); } __name(getAllBadgeImageFileLocalPaths, "getAllBadgeImageFileLocalPaths"); function runCorruptionChecks(db, isRetrying = false) { let ok = true; try { const result = db.pragma("integrity_check"); if (result.length === 1 && result.at(0)?.integrity_check === "ok") { logger.info("runCorruptionChecks: general integrity is ok"); } else { logger.error("runCorruptionChecks: general integrity is not ok", result); ok = false; } } catch (error) { logger.error( "runCorruptionChecks: general integrity check error", Errors.toLogFormat(error) ); ok = false; } try { db.exec("INSERT INTO messages_fts(messages_fts) VALUES('integrity-check')"); logger.info("runCorruptionChecks: FTS5 integrity ok"); } catch (error) { logger.error( "runCorruptionChecks: FTS5 integrity check error.", Errors.toLogFormat(error) ); ok = false; if (!isRetrying) { try { db.exec("INSERT INTO messages_fts(messages_fts) VALUES('rebuild');"); logger.info("runCorruptionChecks: FTS5 index rebuilt"); } catch (rebuildError) { logger.error( "runCorruptionChecks: FTS5 recovery failed", Errors.toLogFormat(rebuildError) ); return false; } logger.info("runCorruptionChecks: retrying"); return runCorruptionChecks(db, true); } } return ok; } __name(runCorruptionChecks, "runCorruptionChecks"); function hydrateStoryDistribution(fromDatabase) { return { ...omit(fromDatabase, "senderKeyInfoJson"), allowsReplies: Boolean(fromDatabase.allowsReplies), deletedAtTimestamp: fromDatabase.deletedAtTimestamp || void 0, isBlockList: Boolean(fromDatabase.isBlockList), senderKeyInfo: fromDatabase.senderKeyInfoJson ? JSON.parse(fromDatabase.senderKeyInfoJson) : void 0, storageID: fromDatabase.storageID || void 0, storageVersion: fromDatabase.storageVersion || void 0, storageNeedsSync: Boolean(fromDatabase.storageNeedsSync), storageUnknownFields: fromDatabase.storageUnknownFields || void 0 }; } __name(hydrateStoryDistribution, "hydrateStoryDistribution"); function freezeStoryDistribution(story) { return { ...omit(story, "senderKeyInfo"), allowsReplies: story.allowsReplies ? 1 : 0, deletedAtTimestamp: story.deletedAtTimestamp || null, isBlockList: story.isBlockList ? 1 : 0, senderKeyInfoJson: story.senderKeyInfo ? JSON.stringify(story.senderKeyInfo) : null, storageID: story.storageID || null, storageVersion: story.storageVersion || null, storageNeedsSync: story.storageNeedsSync ? 1 : 0, storageUnknownFields: story.storageUnknownFields || null }; } __name(freezeStoryDistribution, "freezeStoryDistribution"); function _getAllStoryDistributions(db) { const storyDistributions = db.prepare("SELECT * FROM storyDistributions;").all(); return storyDistributions.map(hydrateStoryDistribution); } __name(_getAllStoryDistributions, "_getAllStoryDistributions"); function _getAllStoryDistributionMembers(db) { return db.prepare("SELECT * FROM storyDistributionMembers;").all(); } __name(_getAllStoryDistributionMembers, "_getAllStoryDistributionMembers"); function _deleteAllStoryDistributions(db) { db.prepare("DELETE FROM storyDistributions;").run(); } __name(_deleteAllStoryDistributions, "_deleteAllStoryDistributions"); function createNewStoryDistribution(db, distribution) { (0, import_assert_std.strictAssert)( distribution.name, "Distribution list does not have a valid name" ); db.transaction(() => { const payload = freezeStoryDistribution(distribution); db.prepare( ` INSERT INTO storyDistributions( id, name, deletedAtTimestamp, allowsReplies, isBlockList, senderKeyInfoJson, storageID, storageVersion, storageUnknownFields, storageNeedsSync ) VALUES ( $id, $name, $deletedAtTimestamp, $allowsReplies, $isBlockList, $senderKeyInfoJson, $storageID, $storageVersion, $storageUnknownFields, $storageNeedsSync ); ` ).run(payload); const { id: listId, members } = distribution; const memberInsertStatement = db.prepare( ` INSERT OR REPLACE INTO storyDistributionMembers ( listId, serviceId ) VALUES ( $listId, $serviceId ); ` ); for (const serviceId of members) { memberInsertStatement.run({ listId, serviceId }); } })(); } __name(createNewStoryDistribution, "createNewStoryDistribution"); function getAllStoryDistributionsWithMembers(db) { const allDistributions = _getAllStoryDistributions(db); const allMembers = _getAllStoryDistributionMembers(db); const byListId = groupBy(allMembers, (member) => member.listId); return allDistributions.map((list) => ({ ...list, members: (byListId[list.id] || []).map((member) => member.serviceId) })); } __name(getAllStoryDistributionsWithMembers, "getAllStoryDistributionsWithMembers"); function getStoryDistributionWithMembers(db, id) { const storyDistribution = db.prepare("SELECT * FROM storyDistributions WHERE id = $id;").get({ id }); if (!storyDistribution) { return void 0; } const members = db.prepare( "SELECT serviceId FROM storyDistributionMembers WHERE listId = $id;" ).all({ id }); return { ...hydrateStoryDistribution(storyDistribution), members: members.map(({ serviceId }) => serviceId) }; } __name(getStoryDistributionWithMembers, "getStoryDistributionWithMembers"); function modifyStoryDistribution(db, distribution) { const payload = freezeStoryDistribution(distribution); if (payload.deletedAtTimestamp) { (0, import_assert_std.strictAssert)( !payload.name, "Attempt to delete distribution list but still has a name" ); } else { (0, import_assert_std.strictAssert)( payload.name, "Cannot clear distribution list name without deletedAtTimestamp set" ); } db.prepare( ` UPDATE storyDistributions SET name = $name, deletedAtTimestamp = $deletedAtTimestamp, allowsReplies = $allowsReplies, isBlockList = $isBlockList, senderKeyInfoJson = $senderKeyInfoJson, storageID = $storageID, storageVersion = $storageVersion, storageUnknownFields = $storageUnknownFields, storageNeedsSync = $storageNeedsSync WHERE id = $id ` ).run(payload); } __name(modifyStoryDistribution, "modifyStoryDistribution"); function modifyStoryDistributionMembers(db, listId, { toAdd, toRemove }) { const memberInsertStatement = db.prepare( ` INSERT OR REPLACE INTO storyDistributionMembers ( listId, serviceId ) VALUES ( $listId, $serviceId ); ` ); for (const serviceId of toAdd) { memberInsertStatement.run({ listId, serviceId }); } (0, import_util_std.batchMultiVarQuery)( db, toRemove, (serviceIds, persistent) => { const serviceIdSet = (0, import_util_std.sqlJoin)(serviceIds); const [sqlQuery, sqlParams] = import_util_std.sql` DELETE FROM storyDistributionMembers WHERE listId = ${listId} AND serviceId IN (${serviceIdSet}); `; db.prepare(sqlQuery, { persistent }).run(sqlParams); } ); } __name(modifyStoryDistributionMembers, "modifyStoryDistributionMembers"); function modifyStoryDistributionWithMembers(db, distribution, { toAdd, toRemove }) { if (toAdd.length || toRemove.length) { db.transaction(() => { modifyStoryDistribution(db, distribution); modifyStoryDistributionMembers(db, distribution.id, { toAdd, toRemove }); })(); } else { modifyStoryDistribution(db, distribution); } } __name(modifyStoryDistributionWithMembers, "modifyStoryDistributionWithMembers"); function deleteStoryDistribution(db, id) { db.prepare("DELETE FROM storyDistributions WHERE id = $id;").run({ id }); } __name(deleteStoryDistribution, "deleteStoryDistribution"); function _getAllStoryReads(db) { return db.prepare("SELECT * FROM storyReads;").all(); } __name(_getAllStoryReads, "_getAllStoryReads"); function _deleteAllStoryReads(db) { db.prepare("DELETE FROM storyReads;").run(); } __name(_deleteAllStoryReads, "_deleteAllStoryReads"); function addNewStoryRead(db, read) { db.prepare( ` INSERT OR REPLACE INTO storyReads( authorId, conversationId, storyId, storyReadDate ) VALUES ( $authorId, $conversationId, $storyId, $storyReadDate ); ` ).run(read); } __name(addNewStoryRead, "addNewStoryRead"); function getLastStoryReadsForAuthor(db, { authorId, conversationId, limit: initialLimit }) { const limit = initialLimit || 5; return db.prepare( ` SELECT * FROM storyReads WHERE authorId = $authorId AND ($conversationId IS NULL OR conversationId = $conversationId) ORDER BY storyReadDate DESC LIMIT $limit; ` ).all({ authorId, conversationId: conversationId || null, limit }); } __name(getLastStoryReadsForAuthor, "getLastStoryReadsForAuthor"); function countStoryReadsByConversation(db, conversationId) { return db.prepare( ` SELECT count(1) FROM storyReads WHERE conversationId = $conversationId; `, { pluck: true } ).get({ conversationId }) ?? 0; } __name(countStoryReadsByConversation, "countStoryReadsByConversation"); function hydrateNotificationProfile(profile) { return { ...omit(profile, ["allowedMembersJson", "scheduleDaysEnabledJson"]), emoji: profile.emoji || void 0, allowAllCalls: Boolean(profile.allowAllCalls), allowAllMentions: Boolean(profile.allowAllMentions), scheduleEnabled: Boolean(profile.scheduleEnabled), allowedMembers: profile.allowedMembersJson ? new Set(JSON.parse(profile.allowedMembersJson)) : /* @__PURE__ */ new Set(), scheduleStartTime: profile.scheduleStartTime || void 0, scheduleEndTime: profile.scheduleEndTime || void 0, scheduleDaysEnabled: profile.scheduleDaysEnabledJson ? JSON.parse(profile.scheduleDaysEnabledJson) : void 0, deletedAtTimestampMs: profile.deletedAtTimestampMs || void 0, storageID: profile.storageID || void 0, storageVersion: profile.storageVersion || void 0, storageNeedsSync: Boolean(profile.storageNeedsSync), storageUnknownFields: profile.storageUnknownFields || void 0 }; } __name(hydrateNotificationProfile, "hydrateNotificationProfile"); function freezeNotificationProfile(profile) { return { ...omit(profile, ["allowedMembers", "scheduleDaysEnabled"]), emoji: profile.emoji || null, allowAllCalls: profile.allowAllCalls ? 1 : 0, allowAllMentions: profile.allowAllMentions ? 1 : 0, scheduleEnabled: profile.scheduleEnabled ? 1 : 0, allowedMembersJson: profile.allowedMembers ? JSON.stringify(Array.from(profile.allowedMembers)) : null, scheduleStartTime: profile.scheduleStartTime || null, scheduleEndTime: profile.scheduleEndTime || null, scheduleDaysEnabledJson: profile.scheduleDaysEnabled ? JSON.stringify(profile.scheduleDaysEnabled) : null, deletedAtTimestampMs: profile.deletedAtTimestampMs || null, storageID: profile.storageID || null, storageVersion: profile.storageVersion || null, storageNeedsSync: profile.storageNeedsSync ? 1 : 0, storageUnknownFields: profile.storageUnknownFields || null }; } __name(freezeNotificationProfile, "freezeNotificationProfile"); function getAllNotificationProfiles(db) { const notificationProfiles = db.prepare("SELECT * FROM notificationProfiles ORDER BY createdAtMs DESC;").all(); return notificationProfiles.map(hydrateNotificationProfile); } __name(getAllNotificationProfiles, "getAllNotificationProfiles"); function getNotificationProfileById(db, id) { const [query, parameters] = import_util_std.sql`SELECT * FROM notificationProfiles WHERE id = ${id}`; const fromDatabase = db.prepare(query).get(parameters); if (fromDatabase) { return hydrateNotificationProfile(fromDatabase); } return void 0; } __name(getNotificationProfileById, "getNotificationProfileById"); function _deleteAllNotificationProfiles(db) { db.prepare("DELETE FROM notificationProfiles;").run(); } __name(_deleteAllNotificationProfiles, "_deleteAllNotificationProfiles"); function deleteNotificationProfileById(db, id) { const [query, parameters] = import_util_std.sql`DELETE FROM notificationProfiles WHERE id = ${id}`; db.prepare(query).run(parameters); } __name(deleteNotificationProfileById, "deleteNotificationProfileById"); function markNotificationProfileDeleted(db, id) { const now = (/* @__PURE__ */ new Date()).getTime(); const [query, parameters] = import_util_std.sql` UPDATE notificationProfiles SET deletedAtTimestampMs = ${now}, storageNeedsSync = 1 WHERE id = ${id} AND deletedAtTimestampMs IS NULL RETURNING deletedAtTimestampMs`; const record = db.prepare(query).get(parameters); return record?.deletedAtTimestampMs; } __name(markNotificationProfileDeleted, "markNotificationProfileDeleted"); function createNotificationProfile(db, profile) { (0, import_assert_std.strictAssert)(profile.name, "Notification profile does not have a valid name"); const forDatabase = freezeNotificationProfile(profile); db.prepare( ` INSERT INTO notificationProfiles( id, name, emoji, color, createdAtMs, allowAllCalls, allowAllMentions, allowedMembersJson, scheduleEnabled, scheduleStartTime, scheduleEndTime, scheduleDaysEnabledJson, deletedAtTimestampMs, storageID, storageVersion, storageUnknownFields, storageNeedsSync ) VALUES ( $id, $name, $emoji, $color, $createdAtMs, $allowAllCalls, $allowAllMentions, $allowedMembersJson, $scheduleEnabled, $scheduleStartTime, $scheduleEndTime, $scheduleDaysEnabledJson, $deletedAtTimestampMs, $storageID, $storageVersion, $storageUnknownFields, $storageNeedsSync ); ` ).run(forDatabase); } __name(createNotificationProfile, "createNotificationProfile"); function updateNotificationProfile(db, profile) { (0, import_assert_std.strictAssert)(profile.name, "Notification profile does not have a valid name"); db.transaction(() => { const forDatabase = freezeNotificationProfile(profile); db.prepare( ` UPDATE notificationProfiles SET name = $name, emoji = $emoji, color = $color, createdAtMs = $createdAtMs, allowAllCalls = $allowAllCalls, allowAllMentions = $allowAllMentions, allowedMembersJson = $allowedMembersJson, scheduleEnabled = $scheduleEnabled, scheduleStartTime = $scheduleStartTime, scheduleEndTime = $scheduleEndTime, scheduleDaysEnabledJson = $scheduleDaysEnabledJson, deletedAtTimestampMs = $deletedAtTimestampMs, storageID = $storageID, storageVersion = $storageVersion, storageUnknownFields = $storageUnknownFields, storageNeedsSync = $storageNeedsSync WHERE id = $id; ` ).run(forDatabase); })(); } __name(updateNotificationProfile, "updateNotificationProfile"); function removeAll(db) { db.transaction(() => { db.exec(` --- Remove messages delete trigger for performance DROP TRIGGER messages_on_delete; DELETE FROM attachment_downloads; DELETE FROM attachment_backup_jobs; DELETE FROM attachment_downloads_backup_stats; DELETE FROM attachments_protected_from_deletion; DELETE FROM backup_cdn_object_metadata; DELETE FROM badgeImageFiles; DELETE FROM badges; DELETE FROM callLinks; DELETE FROM callsHistory; DELETE FROM chatFolders; DELETE FROM conversations; DELETE FROM defunctCallLinks; DELETE FROM donationReceipts; DELETE FROM emojis; DELETE FROM groupCallRingCancellations; DELETE FROM groupSendCombinedEndorsement; DELETE FROM groupSendMemberEndorsement; DELETE FROM identityKeys; DELETE FROM items; DELETE FROM jobs; DELETE FROM key_transparency_account_data; DELETE FROM kyberPreKeys; DELETE FROM megaphones; DELETE FROM message_attachments; DELETE FROM messages_fts; DELETE FROM messages; DELETE FROM notificationProfiles; DELETE FROM pinnedMessages; DELETE FROM preKeys; DELETE FROM reactions; DELETE FROM recentGifs; DELETE FROM senderKeys; DELETE FROM sendLogMessageIds; DELETE FROM sendLogPayloads; DELETE FROM sendLogRecipients; DELETE FROM sessions; DELETE FROM signedPreKeys; DELETE FROM sticker_packs; DELETE FROM sticker_references; DELETE FROM stickers; DELETE FROM storyDistributionMembers; DELETE FROM storyDistributions; DELETE FROM storyReads; DELETE FROM syncTasks; DELETE FROM unprocessed; DELETE FROM uninstalled_sticker_packs; INSERT INTO messages_fts(messages_fts) VALUES('optimize'); --- Re-create the messages delete trigger --- See migration 45 CREATE TRIGGER messages_on_delete AFTER DELETE ON messages BEGIN DELETE FROM messages_fts WHERE rowid = old.rowid; DELETE FROM sendLogPayloads WHERE id IN ( SELECT payloadId FROM sendLogMessageIds WHERE messageId = old.id ); DELETE FROM reactions WHERE rowid IN ( SELECT rowid FROM reactions WHERE messageId = old.id ); DELETE FROM storyReads WHERE storyId = old.storyId; END; `); resetBackupAttachmentDownloadStats(db); })(); } __name(removeAll, "removeAll"); function removeAllConfiguration(db) { db.transaction(() => { db.exec( ` DELETE FROM attachment_backup_jobs; DELETE FROM attachment_downloads; DELETE FROM backup_cdn_object_metadata; DELETE FROM groupSendCombinedEndorsement; DELETE FROM groupSendMemberEndorsement; DELETE FROM jobs; DELETE FROM key_transparency_account_data; DELETE FROM kyberPreKeys; DELETE FROM preKeys; DELETE FROM senderKeys; DELETE FROM sendLogMessageIds; DELETE FROM sendLogPayloads; DELETE FROM sendLogRecipients; DELETE FROM sessions; DELETE FROM signedPreKeys; DELETE FROM syncTasks; DELETE FROM unprocessed; ` ); const itemIds = db.prepare("SELECT id FROM items", { pluck: true }).all(); const allowedSet = new Set(import_StorageUIKeys_std.STORAGE_UI_KEYS); for (const id of itemIds) { if (!allowedSet.has(id)) { (0, import_util_std.removeById)(db, "items", id); } } db.exec( ` UPDATE storyDistributions SET senderKeyInfoJson = NULL; ` ); const [updateConversationsQuery, updateConversationsParams] = import_util_std.sql` UPDATE conversations SET expireTimerVersion = ${import_expirationTimer_std.INITIAL_EXPIRE_TIMER_VERSION}, json = json_remove( json, '$.senderKeyInfo', '$.storageID', '$.needsStorageServiceSync', '$.storageUnknownFields', '$.expireTimerVersion' ); `; db.prepare(updateConversationsQuery).run(updateConversationsParams); })(); } __name(removeAllConfiguration, "removeAllConfiguration"); function eraseStorageServiceState(db) { db.exec(` -- Conversations UPDATE conversations SET json = json_remove(json, '$.storageID', '$.needsStorageServiceSync', '$.storageUnknownFields'); -- Stickers UPDATE sticker_packs SET storageID = null, storageVersion = null, storageUnknownFields = null, storageNeedsSync = 0; UPDATE uninstalled_sticker_packs SET storageID = null, storageVersion = null, storageUnknownFields = null, storageNeedsSync = 0; -- Story Distribution Lists UPDATE storyDistributions SET storageID = null, storageVersion = null, storageUnknownFields = null, storageNeedsSync = 0; -- Call links UPDATE callLinks SET storageID = null, storageVersion = null, storageUnknownFields = null, storageNeedsSync = 0; -- Chat Folders UPDATE chatFolders SET storageID = null, storageVersion = null, storageUnknownFields = null, storageNeedsSync = 0; -- Notification Profiles UPDATE notificationProfiles SET storageID = null, storageVersion = null, storageUnknownFields = null, storageNeedsSync = 0; `); } __name(eraseStorageServiceState, "eraseStorageServiceState"); const MAX_MESSAGE_MIGRATION_ATTEMPTS = 5; function getMessagesNeedingUpgrade(db, limit, { maxVersion }) { return db.transaction(() => { const rows = db.prepare( ` SELECT ${import_Interface_std.MESSAGE_COLUMNS.join(", ")} FROM messages WHERE (schemaVersion IS NULL OR schemaVersion < $maxVersion) AND IFNULL( json_extract(json, '$.schemaMigrationAttempts'), 0 ) < $maxAttempts LIMIT $limit; ` ).all({ maxVersion, maxAttempts: MAX_MESSAGE_MIGRATION_ATTEMPTS, limit }); return (0, import_hydration_std.hydrateMessages)(db, rows); })(); } __name(getMessagesNeedingUpgrade, "getMessagesNeedingUpgrade"); function incrementMessagesMigrationAttempts(db, messageIds) { (0, import_util_std.batchMultiVarQuery)( db, messageIds, (batch, persistent) => { const idSet = (0, import_util_std.sqlJoin)(batch); const [sqlQuery, sqlParams] = import_util_std.sql` UPDATE messages SET json = json_set( json, '$.schemaMigrationAttempts', IFNULL(json -> '$.schemaMigrationAttempts', 0) + 1 ) WHERE id IN (${idSet}) `; db.prepare(sqlQuery, { persistent }).run(sqlParams); } ); } __name(incrementMessagesMigrationAttempts, "incrementMessagesMigrationAttempts"); function getMessageServerGuidsForSpam(db, conversationId) { return db.prepare( ` SELECT serverGuid FROM messages WHERE conversationId = $conversationId AND type = 'incoming' AND serverGuid IS NOT NULL ORDER BY received_at DESC, sent_at DESC LIMIT 3; `, { pluck: true } ).all({ conversationId }); } __name(getMessageServerGuidsForSpam, "getMessageServerGuidsForSpam"); function getExternalFilesForConversation(conversation) { const { avatar, profileAvatar } = conversation; const files = []; if (avatar && avatar.path) { files.push(avatar.path); } if (profileAvatar && profileAvatar.path) { files.push(profileAvatar.path); } return files; } __name(getExternalFilesForConversation, "getExternalFilesForConversation"); function getExternalDraftFilesForConversation(conversation) { const draftAttachments = conversation.draftAttachments || []; const files = []; forEach(draftAttachments, (attachment) => { if (attachment.pending) { return; } const { path: file, screenshotPath } = attachment; if (file) { files.push(file); } if (screenshotPath) { files.push(screenshotPath); } }); return files; } __name(getExternalDraftFilesForConversation, "getExternalDraftFilesForConversation"); function getKnownMessageAttachments(db, cursor) { const innerCursor = cursor; const attachments = /* @__PURE__ */ new Set(); const downloads = /* @__PURE__ */ new Set(); const { messages, cursor: newCursor } = pageMessages(db, innerCursor); for (const message of messages) { const { externalAttachments, externalDownloads } = (0, import_messageFilePaths_std.getFilePathsReferencedByMessage)(message); externalAttachments.forEach((file) => attachments.add(file)); externalDownloads.forEach((file) => downloads.add(file)); } return { attachments: Array.from(attachments), downloads: Array.from(downloads), cursor: newCursor }; } __name(getKnownMessageAttachments, "getKnownMessageAttachments"); function finishGetKnownMessageAttachments(db, cursor) { const innerCursor = cursor; finishPageMessages(db, innerCursor); } __name(finishGetKnownMessageAttachments, "finishGetKnownMessageAttachments"); function pageMessages(db, cursor) { const writable = toUnsafeWritableDB(db, "only temp table use"); const chunkSize = 1e3; return writable.transaction(() => { let count = cursor?.count ?? 0; (0, import_assert_std.strictAssert)(!cursor?.done, "pageMessages: iteration cannot be restarted"); let runId; if (cursor === void 0) { runId = (0, import_node_crypto.randomBytes)(8).toString("hex"); const total = getMessageCount(db); logger.info( `pageMessages(${runId}): Starting iteration through ${total} messages` ); writable.exec( ` CREATE TEMP TABLE tmp_${runId}_updated_messages (rowid INTEGER PRIMARY KEY, received_at INTEGER, sent_at INTEGER); CREATE INDEX tmp_${runId}_updated_messages_received_at ON tmp_${runId}_updated_messages (received_at ASC, sent_at ASC); INSERT INTO tmp_${runId}_updated_messages (rowid, received_at, sent_at) SELECT rowid, received_at, sent_at FROM messages ORDER BY received_at ASC, sent_at ASC; CREATE TEMP TRIGGER tmp_${runId}_message_updates UPDATE OF json ON messages BEGIN INSERT OR IGNORE INTO tmp_${runId}_updated_messages (rowid, received_at, sent_at) VALUES (NEW.rowid, NEW.received_at, NEW.sent_at); END; CREATE TEMP TRIGGER tmp_${runId}_message_inserts AFTER INSERT ON messages BEGIN INSERT OR IGNORE INTO tmp_${runId}_updated_messages (rowid, received_at, sent_at) VALUES (NEW.rowid, NEW.received_at, NEW.sent_at); END; ` ); } else { ({ runId } = cursor); } const rowids = writable.prepare( ` DELETE FROM tmp_${runId}_updated_messages RETURNING rowid ORDER BY received_at ASC, sent_at ASC LIMIT $chunkSize; `, { pluck: true } ).all({ chunkSize }); const messages = (0, import_util_std.batchMultiVarQuery)( writable, rowids, (batch, persistent) => { const query = writable.prepare( ` SELECT ${import_Interface_std.MESSAGE_COLUMNS.join(", ")} FROM messages WHERE rowid IN (${Array(batch.length).fill("?").join(",")}); `, { persistent } ); const rows = query.all(batch); return (0, import_hydration_std.hydrateMessages)(db, rows); } ); count += messages.length; const done = rowids.length < chunkSize; const newCursor = { runId, count, done }; return { messages, cursor: newCursor }; })(); } __name(pageMessages, "pageMessages"); function finishPageMessages(db, { runId, count, done }) { const writable = toUnsafeWritableDB(db, "only temp table use"); const logId = `finishPageMessages(${runId})`; if (!done) { logger.warn(`${logId}: iteration not finished`); } logger.info(`${logId}: reached the end after processing ${count} messages`); writable.exec(` DROP TABLE tmp_${runId}_updated_messages; DROP TRIGGER tmp_${runId}_message_updates; DROP TRIGGER tmp_${runId}_message_inserts; `); } __name(finishPageMessages, "finishPageMessages"); function getKnownDownloads(db) { const result = []; const backup = getItemById(db, "backupDownloadPath"); if (backup) { result.push(backup.value); } return result; } __name(getKnownDownloads, "getKnownDownloads"); function getKnownConversationAttachments(db) { const result = /* @__PURE__ */ new Set(); const chunkSize = 500; let complete = false; let id = ""; const conversationTotal = getConversationCount(db); logger.info( `getKnownConversationAttachments: About to iterate through ${conversationTotal}` ); const fetchConversations = db.prepare( ` SELECT json FROM conversations WHERE id > $id ORDER BY id ASC LIMIT $chunkSize; ` ); while (!complete) { const rows = fetchConversations.all({ id, chunkSize }); const conversations = map( rows, (row) => (0, import_util_std.jsonToObject)(row.json) ); conversations.forEach((conversation) => { const externalFiles = getExternalFilesForConversation(conversation); externalFiles.forEach((file) => result.add(file)); }); const lastMessage = last(conversations); if (lastMessage) { ({ id } = lastMessage); } complete = conversations.length < chunkSize; } logger.info("getKnownConversationAttachments: Done processing"); return Array.from(result); } __name(getKnownConversationAttachments, "getKnownConversationAttachments"); function removeKnownStickers(db, allStickers) { const lookup = fromPairs( map(allStickers, (file) => [file, true]) ); const chunkSize = 50; const total = getStickerCount(db); logger.info( `removeKnownStickers: About to iterate through ${total} stickers` ); let count = 0; let complete = false; let rowid = 0; while (!complete) { const rows = db.prepare( ` SELECT rowid, path FROM stickers WHERE rowid > $rowid ORDER BY rowid ASC LIMIT $chunkSize; ` ).all({ rowid, chunkSize }); const files = rows.map((row) => row.path); files.forEach((file) => { delete lookup[file]; }); const lastSticker = last(rows); if (lastSticker) { ({ rowid } = lastSticker); } complete = rows.length < chunkSize; count += rows.length; } logger.info(`removeKnownStickers: Done processing ${count} stickers`); return Object.keys(lookup); } __name(removeKnownStickers, "removeKnownStickers"); function removeKnownDraftAttachments(db, allStickers) { const lookup = fromPairs( map(allStickers, (file) => [file, true]) ); const chunkSize = 50; const total = getConversationCount(db); logger.info( `removeKnownDraftAttachments: About to iterate through ${total} conversations` ); let complete = false; let count = 0; let id = 0; while (!complete) { const rows = db.prepare( ` SELECT json FROM conversations WHERE id > $id ORDER BY id ASC LIMIT $chunkSize; ` ).all({ id, chunkSize }); const conversations = rows.map( (row) => (0, import_util_std.jsonToObject)(row.json) ); conversations.forEach((conversation) => { const externalFiles = getExternalDraftFilesForConversation(conversation); externalFiles.forEach((file) => { delete lookup[file]; }); }); const lastMessage = last(conversations); if (lastMessage) { ({ id } = lastMessage); } complete = conversations.length < chunkSize; count += conversations.length; } logger.info( `removeKnownDraftAttachments: Done processing ${count} conversations` ); return Object.keys(lookup); } __name(removeKnownDraftAttachments, "removeKnownDraftAttachments"); function getJobsInQueue(db, queueType) { return db.prepare( ` SELECT id, timestamp, data FROM jobs WHERE queueType = $queueType ORDER BY timestamp; ` ).all({ queueType }).map((row) => ({ id: row.id, queueType, timestamp: row.timestamp, data: (0, import_isNotNil_std.isNotNil)(row.data) ? JSON.parse(row.data) : void 0 })); } __name(getJobsInQueue, "getJobsInQueue"); function insertJob(db, job) { db.prepare( ` INSERT INTO jobs (id, queueType, timestamp, data) VALUES ($id, $queueType, $timestamp, $data); ` ).run({ id: job.id, queueType: job.queueType, timestamp: job.timestamp, data: (0, import_isNotNil_std.isNotNil)(job.data) ? JSON.stringify(job.data) : null }); } __name(insertJob, "insertJob"); function deleteJob(db, id) { db.prepare("DELETE FROM jobs WHERE id = $id").run({ id }); } __name(deleteJob, "deleteJob"); function wasGroupCallRingPreviouslyCanceled(db, ringId) { return db.prepare( ` SELECT EXISTS ( SELECT 1 FROM groupCallRingCancellations WHERE ringId = $ringId AND createdAt >= $ringsOlderThanThisAreIgnored ); `, { pluck: true, bigint: true } ).get({ ringId, ringsOlderThanThisAreIgnored: Date.now() - MAX_GROUP_CALL_RING_AGE }) === 1n; } __name(wasGroupCallRingPreviouslyCanceled, "wasGroupCallRingPreviouslyCanceled"); function processGroupCallRingCancellation(db, ringId) { db.prepare( ` INSERT INTO groupCallRingCancellations (ringId, createdAt) VALUES ($ringId, $createdAt) ON CONFLICT (ringId) DO NOTHING; `, { bigint: true } ).run({ ringId, createdAt: Date.now() }); } __name(processGroupCallRingCancellation, "processGroupCallRingCancellation"); const MAX_GROUP_CALL_RING_AGE = 30 * durations.MINUTE; function cleanExpiredGroupCallRingCancellations(db) { db.prepare( ` DELETE FROM groupCallRingCancellations WHERE createdAt < $expiredRingTime; ` ).run({ expiredRingTime: Date.now() - MAX_GROUP_CALL_RING_AGE }); } __name(cleanExpiredGroupCallRingCancellations, "cleanExpiredGroupCallRingCancellations"); function getMaxMessageCounter(db) { return db.prepare( ` SELECT MAX(counter) FROM ( SELECT MAX(received_at) AS counter FROM messages UNION SELECT MAX(timestamp) AS counter FROM unprocessed ) `, { pluck: true } ).get(); } __name(getMaxMessageCounter, "getMaxMessageCounter"); function getStatisticsForLogging(db) { const counts = { messageCount: getMessageCount(db), conversationCount: getConversationCount(db), sessionCount: (0, import_util_std.getCountFromTable)(db, "sessions"), senderKeyCount: (0, import_util_std.getCountFromTable)(db, "senderKeys") }; return mapValues(counts, import_formatCountForLogging_std.formatCountForLogging); } __name(getStatisticsForLogging, "getStatisticsForLogging"); function updateAllConversationColors(db, conversationColor, customColorData) { db.prepare( ` UPDATE conversations SET json = JSON_PATCH(json, $patch); ` ).run({ patch: JSON.stringify({ conversationColor: conversationColor || null, customColor: customColorData?.value || null, customColorId: customColorData?.id || null }) }); } __name(updateAllConversationColors, "updateAllConversationColors"); function removeAllProfileKeyCredentials(db) { db.exec( ` UPDATE conversations SET json = json_remove(json, '$.profileKeyCredential') ` ); } __name(removeAllProfileKeyCredentials, "removeAllProfileKeyCredentials"); function saveEditedMessages(db, mainMessage, ourAci, history) { db.transaction(() => { saveMessage(db, mainMessage, { ourAci, alreadyInTransaction: true }); try { for (const { conversationId, messageId, readStatus, sentAt } of history) { const [query, params] = import_util_std.sql` INSERT INTO edited_messages ( conversationId, messageId, sentAt, readStatus ) VALUES ( ${conversationId}, ${messageId}, ${sentAt}, ${readStatus ?? null} ); `; db.prepare(query).run(params); } } catch (e) { const [messageExistsQuery, messageExistsParams] = import_util_std.sql` SELECT EXISTS( SELECT 1 FROM messages WHERE messages.id = ${mainMessage.id} ); `; const messageExists = db.prepare(messageExistsQuery, { pluck: true }).get(messageExistsParams); if (messageExists !== 1) { logger.warn( "saveEditedMessages: save failed because message does not exist" ); } else { throw e; } } })(); } __name(saveEditedMessages, "saveEditedMessages"); function saveEditedMessage(db, mainMessage, ourAci, editedMessage) { return saveEditedMessages(db, mainMessage, ourAci, [editedMessage]); } __name(saveEditedMessage, "saveEditedMessage"); function _getAllEditedMessages(db) { return db.prepare( ` SELECT * FROM edited_messages; ` ).all({}); } __name(_getAllEditedMessages, "_getAllEditedMessages"); function getUnreadEditedMessagesAndMarkRead(db, { conversationId, readMessageReceivedAt }) { return db.transaction(() => { const editedColumns = (0, import_util_std.sqlJoin)( import_Interface_std.MESSAGE_COLUMNS.filter((name) => { return name !== "sent_at" && name !== "readStatus"; }).map((name) => { return import_util_std.sqlFragment`messages.${(0, import_util_std.sqlId)(name)}`; }) ); const [selectQuery, selectParams] = import_util_std.sql` SELECT ${editedColumns}, edited_messages.sentAt as sent_at, edited_messages.readStatus FROM edited_messages JOIN messages ON messages.id = edited_messages.messageId WHERE edited_messages.readStatus = ${import_MessageReadStatus_std.ReadStatus.Unread} AND edited_messages.conversationId = ${conversationId} AND messages.received_at <= ${readMessageReceivedAt} ORDER BY messages.received_at DESC, messages.sent_at DESC; `; const rows = db.prepare(selectQuery).all(selectParams); if (rows.length) { const newestSentAt = rows[0].sent_at; const [updateStatusQuery, updateStatusParams] = import_util_std.sql` UPDATE edited_messages SET readStatus = ${import_MessageReadStatus_std.ReadStatus.Read} WHERE readStatus = ${import_MessageReadStatus_std.ReadStatus.Unread} AND conversationId = ${conversationId} AND sentAt <= ${newestSentAt}; `; db.prepare(updateStatusQuery).run(updateStatusParams); } return (0, import_hydration_std.hydrateMessages)(db, rows).map((msg) => { return { originalReadStatus: msg.readStatus ?? void 0, readStatus: import_MessageReadStatus_std.ReadStatus.Read, seenStatus: import_MessageSeenStatus_std.SeenStatus.Seen, ...pick(msg, [ "conversationId", "expirationStartTimestamp", "id", "received_at", "sent_at", "source", "sourceServiceId", "timestamp", "type" ]) }; }); })(); } __name(getUnreadEditedMessagesAndMarkRead, "getUnreadEditedMessagesAndMarkRead"); function getMessageCountBySchemaVersion(db) { const [query, params] = import_util_std.sql` SELECT schemaVersion, COUNT(1) as count from messages GROUP BY schemaVersion; `; const rows = db.prepare(query).all(params); return rows.sort((a, b) => a.schemaVersion - b.schemaVersion); } __name(getMessageCountBySchemaVersion, "getMessageCountBySchemaVersion"); function getMessageSampleForSchemaVersion(db, version) { return db.transaction(() => { const [query, params] = import_util_std.sql` SELECT * from messages WHERE schemaVersion = ${version} ORDER BY RANDOM() LIMIT 2; `; const rows = db.prepare(query).all(params); return (0, import_hydration_std.hydrateMessages)(db, rows); })(); } __name(getMessageSampleForSchemaVersion, "getMessageSampleForSchemaVersion"); function disableMessageInsertTriggers(db) { db.transaction(() => { createOrUpdateItem(db, { id: "messageInsertTriggersDisabled", value: true }); db.exec("DROP TRIGGER IF EXISTS messages_on_insert;"); db.exec("DROP TRIGGER IF EXISTS messages_on_insert_insert_mentions;"); })(); } __name(disableMessageInsertTriggers, "disableMessageInsertTriggers"); const selectMentionsFromMessages = ` SELECT messages.id, bodyRanges.value ->> 'mentionAci' as mentionAci, bodyRanges.value ->> 'start' as start, bodyRanges.value ->> 'length' as length FROM messages, json_each(messages.json ->> 'bodyRanges') as bodyRanges WHERE bodyRanges.value ->> 'mentionAci' IS NOT NULL `; function disableFSync(db) { db.pragma("checkpoint_fullfsync = false"); db.pragma("synchronous = OFF"); } __name(disableFSync, "disableFSync"); function enableFSyncAndCheckpoint(db) { db.pragma("checkpoint_fullfsync = true"); db.pragma("synchronous = FULL"); db.pragma("wal_checkpoint(FULL)"); } __name(enableFSyncAndCheckpoint, "enableFSyncAndCheckpoint"); function enableMessageInsertTriggersAndBackfill(db) { db.transaction(() => { backfillMentionsTable(db); backfillMessagesFtsTable(db); db.exec("DROP TRIGGER IF EXISTS messages_on_insert"); db.exec(import_search_polls_std.createMessagesOnInsertTrigger); db.exec("DROP TRIGGER IF EXISTS messages_on_insert_insert_mentions"); db.exec(` CREATE TRIGGER messages_on_insert_insert_mentions AFTER INSERT ON messages BEGIN INSERT INTO mentions (messageId, mentionAci, start, length) ${selectMentionsFromMessages} AND messages.id = new.id; END; `); createOrUpdateItem(db, { id: "messageInsertTriggersDisabled", value: false }); })(); } __name(enableMessageInsertTriggersAndBackfill, "enableMessageInsertTriggersAndBackfill"); function backfillMessagesFtsTable(db) { db.exec(` DELETE FROM messages_fts; INSERT OR REPLACE INTO messages_fts (rowid, body) SELECT rowid, searchableText FROM messages WHERE isSearchable = 1; `); } __name(backfillMessagesFtsTable, "backfillMessagesFtsTable"); function backfillMentionsTable(db) { db.exec(` DELETE FROM mentions; INSERT INTO mentions (messageId, mentionAci, start, length) ${selectMentionsFromMessages}; `); } __name(backfillMentionsTable, "backfillMentionsTable"); function ensureMessageInsertTriggersAreEnabled(db) { db.transaction(() => { const storedItem = getItemById(db, "messageInsertTriggersDisabled"); const triggersDisabled = storedItem?.value; if (triggersDisabled) { logger.warn( "Message insert triggers were disabled; reenabling and backfilling data" ); enableMessageInsertTriggersAndBackfill(db); } })(); } __name(ensureMessageInsertTriggersAreEnabled, "ensureMessageInsertTriggersAreEnabled"); function __dangerouslyRunAbitraryReadOnlySqlQuery(db, readOnlySqlQuery) { let results; try { db.pragma("query_only = on"); results = db.prepare(readOnlySqlQuery).all(); } finally { db.pragma("query_only = off"); } return results; } __name(__dangerouslyRunAbitraryReadOnlySqlQuery, "__dangerouslyRunAbitraryReadOnlySqlQuery"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { DataReader, DataWriter, _storyIdPredicate, dequeueOldestSyncTasks, getJobsInQueue, getMessageById, getMostRecentAddressableMessages, getMostRecentAddressableNondisappearingMessages, incrementAllSyncTaskAttempts, incrementMessagesMigrationAttempts, initialize, insertJob, markAllCallHistoryRead, migrateConversationMessages, removeDB, removeSyncTaskById, saveSyncTasks, setupTests }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var cleanDataForIpc_std_exports = {}; __export(cleanDataForIpc_std_exports, { cleanDataForIpc: () => cleanDataForIpc }); module.exports = __toCommonJS(cleanDataForIpc_std_exports); var import_lodash = __toESM(require("lodash")); var import_log_std = require("../logging/log.std.js"); var import_iterables_std = require("../util/iterables.std.js"); const { isPlainObject } = import_lodash.default; const log = (0, import_log_std.createLogger)("cleanDataForIpc"); function cleanDataForIpc(data) { const pathsChanged = []; const cleaned = cleanDataInner(data, "root", pathsChanged, 0); return { cleaned, pathsChanged }; } __name(cleanDataForIpc, "cleanDataForIpc"); function cleanDataInner(data, path, pathsChanged, depth) { if (depth > 10) { log.error( `cleanDataInner: Reached maximum depth ${depth}; path is ${path}` ); return { cleaned: data, pathsChanged }; } switch (typeof data) { case "undefined": case "boolean": case "number": case "string": return data; case "bigint": pathsChanged.push(path); return data.toString(); case "function": return void 0; case "object": { if (data === null) { return null; } if (Array.isArray(data)) { const result2 = []; data.forEach((item, index) => { const indexPath = `${path}.${index}`; if (item == null) { pathsChanged.push(indexPath); } else { result2.push( cleanDataInner(item, indexPath, pathsChanged, depth + 1) ); } }); return result2; } if (data instanceof Map) { const result2 = {}; pathsChanged.push(path); data.forEach((value, key) => { if (typeof key === "string") { result2[key] = cleanDataInner( value, `${path}.`, pathsChanged, depth + 1 ); } else { pathsChanged.push(`${path}.`); } }); return result2; } if (data instanceof Date) { pathsChanged.push(path); return Number.isNaN(data.valueOf()) ? void 0 : data.toISOString(); } if (data instanceof ArrayBuffer) { pathsChanged.push(path); return void 0; } if (data instanceof Uint8Array) { return data; } const dataAsRecord = data; if ("toNumber" in dataAsRecord && typeof dataAsRecord.toNumber === "function") { return cleanDataInner( dataAsRecord.toNumber(), path, pathsChanged, depth + 1 ); } if ((0, import_iterables_std.isIterable)(dataAsRecord)) { const result2 = []; let index = 0; pathsChanged.push(path); for (const value of dataAsRecord) { result2.push( cleanDataInner( value, `${path}.`, pathsChanged, depth + 1 ) ); index += 1; } return result2; } if (!isPlainObject(data)) { pathsChanged.push(path); } const result = {}; Object.entries(dataAsRecord).forEach(([key, value]) => { result[key] = cleanDataInner( value, `${path}.${key}`, pathsChanged, depth + 1 ); }); return result; } default: { pathsChanged.push(path); return void 0; } } } __name(cleanDataInner, "cleanDataInner"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { cleanDataForIpc }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var errors_std_exports = {}; __export(errors_std_exports, { SqliteErrorKind: () => SqliteErrorKind, parseSqliteError: () => parseSqliteError }); module.exports = __toCommonJS(errors_std_exports); var SqliteErrorKind = /* @__PURE__ */ ((SqliteErrorKind2) => { SqliteErrorKind2["Corrupted"] = "Corrupted"; SqliteErrorKind2["Readonly"] = "Readonly"; SqliteErrorKind2["Logic"] = "Logic"; SqliteErrorKind2["Unknown"] = "Unknown"; return SqliteErrorKind2; })(SqliteErrorKind || {}); function parseSqliteError(error) { const message = error?.message; if (!message) { return "Unknown" /* Unknown */; } if (message.includes("SQLITE_CORRUPT") || message.includes("database disk image is malformed") || message.includes("file is not a database")) { return "Corrupted" /* Corrupted */; } if (message.includes("SQLITE_READONLY") || message.includes("attempt to write a readonly database")) { return "Readonly" /* Readonly */; } if (message.includes("SQL logic error")) { return "Logic" /* Logic */; } return "Unknown" /* Unknown */; } __name(parseSqliteError, "parseSqliteError"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { SqliteErrorKind, parseSqliteError }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var hydration_std_exports = {}; __export(hydration_std_exports, { ROOT_MESSAGE_ATTACHMENT_EDIT_HISTORY_INDEX: () => ROOT_MESSAGE_ATTACHMENT_EDIT_HISTORY_INDEX, convertAttachmentDBFieldsToAttachmentType: () => convertAttachmentDBFieldsToAttachmentType, getAttachmentReferencesForMessages: () => getAttachmentReferencesForMessages, hydrateMessage: () => hydrateMessage, hydrateMessageTableColumns: () => hydrateMessageTableColumns, hydrateMessages: () => hydrateMessages }); module.exports = __toCommonJS(hydration_std_exports); var import_lodash = __toESM(require("lodash")); var import_dropNull_std = require("../util/dropNull.std.js"); var import_util_std = require("./util.std.js"); var import_MIME_std = require("../types/MIME.std.js"); var import_assert_std = require("../util/assert.std.js"); var import_log_std = require("../logging/log.std.js"); const { groupBy } = import_lodash.default; const ROOT_MESSAGE_ATTACHMENT_EDIT_HISTORY_INDEX = -1; const log = (0, import_log_std.createLogger)("hydrateMessage"); function toBoolean(value) { if (value == null) { return void 0; } return value === 1; } __name(toBoolean, "toBoolean"); function hydrateMessage(db, row) { return hydrateMessages(db, [row])[0]; } __name(hydrateMessage, "hydrateMessage"); function hydrateMessages(db, unhydratedMessages) { const messagesWithColumnsHydrated = unhydratedMessages.map((msg) => { const base = { ...hydrateMessageTableColumns(msg), hasAttachments: msg.hasAttachments === 1, hasFileAttachments: msg.hasFileAttachments === 1, hasVisualMediaAttachments: msg.hasVisualMediaAttachments === 1 }; if (msg.hasUnreadPollVotes === 1) { return { ...base, hasUnreadPollVotes: true }; } return base; }); return hydrateMessagesWithAttachments(db, messagesWithColumnsHydrated); } __name(hydrateMessages, "hydrateMessages"); function hydrateMessageTableColumns(row) { const { json, id, body, conversationId, expirationStartTimestamp, expireTimer, isErased, isViewOnce, mentionsMe, received_at, received_at_ms, schemaVersion, serverGuid, sent_at, source, sourceServiceId, sourceDevice, storyId, type, readStatus, seenStatus, timestamp, serverTimestamp, unidentifiedDeliveryReceived } = row; return { ...JSON.parse(json), id, body: (0, import_dropNull_std.dropNull)(body), conversationId: conversationId || "", expirationStartTimestamp: (0, import_dropNull_std.dropNull)(expirationStartTimestamp), expireTimer: (0, import_dropNull_std.dropNull)(expireTimer), isErased: toBoolean(isErased), isViewOnce: toBoolean(isViewOnce), mentionsMe: toBoolean(mentionsMe), received_at: received_at || 0, received_at_ms: (0, import_dropNull_std.dropNull)(received_at_ms), schemaVersion: (0, import_dropNull_std.dropNull)(schemaVersion), serverGuid: (0, import_dropNull_std.dropNull)(serverGuid), sent_at: sent_at || 0, source: (0, import_dropNull_std.dropNull)(source), sourceServiceId: (0, import_dropNull_std.dropNull)(sourceServiceId), sourceDevice: (0, import_dropNull_std.dropNull)(sourceDevice), storyId: (0, import_dropNull_std.dropNull)(storyId), type, readStatus: readStatus == null ? void 0 : readStatus, seenStatus: seenStatus == null ? void 0 : seenStatus, timestamp: timestamp || 0, serverTimestamp: (0, import_dropNull_std.dropNull)(serverTimestamp), unidentifiedDeliveryReceived: toBoolean(unidentifiedDeliveryReceived) }; } __name(hydrateMessageTableColumns, "hydrateMessageTableColumns"); function getAttachmentReferencesForMessages(db, messageIds) { return (0, import_util_std.batchMultiVarQuery)( db, messageIds, (messageIdBatch, persistent) => { const [query, params] = import_util_std.sql` SELECT * FROM message_attachments WHERE messageId IN (${(0, import_util_std.sqlJoin)(messageIdBatch)}); `; return db.prepare(query, { persistent }).all(params); } ); } __name(getAttachmentReferencesForMessages, "getAttachmentReferencesForMessages"); function hydrateMessagesWithAttachments(db, messagesWithoutAttachments) { const attachmentReferencesForAllMessages = getAttachmentReferencesForMessages( db, messagesWithoutAttachments.map((msg) => msg.id) ); const attachmentReferencesByMessage = groupBy( attachmentReferencesForAllMessages, "messageId" ); return messagesWithoutAttachments.map((msgWithExtraFields) => { const { hasAttachments, hasFileAttachments, hasVisualMediaAttachments, ...msg } = msgWithExtraFields; const attachmentReferences = attachmentReferencesByMessage[msg.id] ?? []; if (!attachmentReferences.length) { if (msg.attachments?.length) { return msg; } if (msg.isErased || msg.deletedForEveryone || msg.isViewOnce) { return msg; } if (msg.type !== "incoming" && msg.type !== "outgoing") { return msg; } if (!hasAttachments && !hasFileAttachments && !hasVisualMediaAttachments) { return msg; } log.warn( `Retrieved message that should have attachments but missing message_attachment rows, timestamp: ${msg.timestamp}` ); return { ...msg, attachments: [ { error: true, size: 0, width: hasVisualMediaAttachments ? 150 : void 0, height: hasVisualMediaAttachments ? 150 : void 0, contentType: hasVisualMediaAttachments ? import_MIME_std.IMAGE_PNG : import_MIME_std.APPLICATION_OCTET_STREAM } ] }; } const attachmentsByEditHistoryIndex = groupBy( attachmentReferences, "editHistoryIndex" ); const message = hydrateMessageRootOrRevisionWithAttachments( msg, attachmentsByEditHistoryIndex[ROOT_MESSAGE_ATTACHMENT_EDIT_HISTORY_INDEX] ?? [] ); if (message.editHistory) { message.editHistory = message.editHistory.map((editHistory, idx) => { return hydrateMessageRootOrRevisionWithAttachments( editHistory, attachmentsByEditHistoryIndex[idx] ?? [] ); }); } return message; }); } __name(hydrateMessagesWithAttachments, "hydrateMessagesWithAttachments"); function hydrateMessageRootOrRevisionWithAttachments(message, messageAttachments) { const attachmentsByType = groupBy( messageAttachments, "attachmentType" ); const standardAttachments = attachmentsByType.attachment ?? []; const bodyAttachments = attachmentsByType["long-message"] ?? []; const quoteAttachments = attachmentsByType.quote ?? []; const previewAttachments = attachmentsByType.preview ?? []; const contactAttachments = attachmentsByType.contact ?? []; const stickerAttachment = (attachmentsByType.sticker ?? []).find( (sticker) => sticker.orderInMessage === 0 ); const hydratedMessage = structuredClone(message); if (standardAttachments.length) { hydratedMessage.attachments = standardAttachments.sort((a, b) => a.orderInMessage - b.orderInMessage).map(convertAttachmentDBFieldsToAttachmentType); } if (bodyAttachments[0]) { hydratedMessage.bodyAttachment = convertAttachmentDBFieldsToAttachmentType( bodyAttachments[0] ); } hydratedMessage.quote?.attachments.forEach((quoteAttachment, idx) => { const quoteThumbnail = quoteAttachments.find( (attachment) => attachment.orderInMessage === idx ); if (quoteThumbnail) { quoteAttachment.thumbnail = convertAttachmentDBFieldsToAttachmentType(quoteThumbnail); } }); hydratedMessage.preview?.forEach((preview, idx) => { const previewAttachment = previewAttachments.find( (attachment) => attachment.orderInMessage === idx ); if (previewAttachment) { preview.image = convertAttachmentDBFieldsToAttachmentType(previewAttachment); } }); hydratedMessage.contact?.forEach((contact, idx) => { const contactAttachment = contactAttachments.find( (attachment) => attachment.orderInMessage === idx ); if (contactAttachment && contact.avatar) { contact.avatar.avatar = convertAttachmentDBFieldsToAttachmentType(contactAttachment); } }); if (hydratedMessage.sticker && stickerAttachment) { hydratedMessage.sticker.data = convertAttachmentDBFieldsToAttachmentType(stickerAttachment); } return hydratedMessage; } __name(hydrateMessageRootOrRevisionWithAttachments, "hydrateMessageRootOrRevisionWithAttachments"); function convertAttachmentDBFieldsToAttachmentType(dbFields) { const messageAttachment = (0, import_dropNull_std.shallowDropNull)(dbFields); (0, import_assert_std.strictAssert)(messageAttachment != null, "must exist"); const { clientUuid, size, duration, contentType, plaintextHash, path, localKey, caption, blurHash, height, width, digest, key, downloadPath, flags, fileName, version, incrementalMac, incrementalMacChunkSize: chunkSize, transitCdnKey: cdnKey, transitCdnNumber: cdnNumber, transitCdnUploadTimestamp: uploadTimestamp, error, pending, wasTooBig, isCorrupted, backfillError, storyTextAttachmentJson, copiedFromQuotedAttachment, localBackupPath } = messageAttachment; const result = { clientUuid, size, duration, contentType: (0, import_MIME_std.stringToMIMEType)(contentType), plaintextHash, path, localKey, caption, blurHash, height, width, digest, key, downloadPath, localBackupPath, flags, fileName, version, incrementalMac, chunkSize, cdnKey, cdnNumber, uploadTimestamp, pending: (0, import_util_std.convertOptionalIntegerToBoolean)(pending), error: (0, import_util_std.convertOptionalIntegerToBoolean)(error), wasTooBig: (0, import_util_std.convertOptionalIntegerToBoolean)(wasTooBig), copied: (0, import_util_std.convertOptionalIntegerToBoolean)(copiedFromQuotedAttachment), isCorrupted: (0, import_util_std.convertOptionalIntegerToBoolean)(isCorrupted), backfillError: (0, import_util_std.convertOptionalIntegerToBoolean)(backfillError), textAttachment: storyTextAttachmentJson ? (0, import_util_std.jsonToObject)(storyTextAttachmentJson) : void 0, backupCdnNumber: messageAttachment.backupCdnNumber, ...messageAttachment.thumbnailPath ? { thumbnail: { path: messageAttachment.thumbnailPath, size: messageAttachment.thumbnailSize ?? 0, contentType: messageAttachment.thumbnailContentType ? (0, import_MIME_std.stringToMIMEType)(messageAttachment.thumbnailContentType) : import_MIME_std.IMAGE_JPEG, localKey: messageAttachment.thumbnailLocalKey, version: messageAttachment.thumbnailVersion } } : {}, ...messageAttachment.screenshotPath ? { screenshot: { path: messageAttachment.screenshotPath, size: messageAttachment.screenshotSize ?? 0, contentType: messageAttachment.screenshotContentType ? (0, import_MIME_std.stringToMIMEType)(messageAttachment.screenshotContentType) : import_MIME_std.IMAGE_JPEG, localKey: messageAttachment.screenshotLocalKey, version: messageAttachment.screenshotVersion } } : {}, ...messageAttachment.backupThumbnailPath ? { thumbnailFromBackup: { path: messageAttachment.backupThumbnailPath, size: messageAttachment.backupThumbnailSize ?? 0, contentType: messageAttachment.backupThumbnailContentType ? (0, import_MIME_std.stringToMIMEType)(messageAttachment.backupThumbnailContentType) : import_MIME_std.IMAGE_JPEG, localKey: messageAttachment.backupThumbnailLocalKey, version: messageAttachment.backupThumbnailVersion } } : {} }; return result; } __name(convertAttachmentDBFieldsToAttachmentType, "convertAttachmentDBFieldsToAttachmentType"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { ROOT_MESSAGE_ATTACHMENT_EDIT_HISTORY_INDEX, convertAttachmentDBFieldsToAttachmentType, getAttachmentReferencesForMessages, hydrateMessage, hydrateMessageTableColumns, hydrateMessages }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var main_main_exports = {}; __export(main_main_exports, { MainSQL: () => MainSQL }); module.exports = __toCommonJS(main_main_exports); var import_node_path = require("node:path"); var import_node_worker_threads = require("node:worker_threads"); var import_node_util = require("node:util"); var import_electron = require("electron"); var import_assert_std = require("../util/assert.std.js"); var import_explodePromise_std = require("../util/explodePromise.std.js"); var Errors = __toESM(require("../types/errors.std.js")); var import_errors_std = require("./errors.std.js"); const MIN_TRACE_DURATION = 40; const WORKER_COUNT = 4; const PAGING_QUERIES = /* @__PURE__ */ new Set([ "pageMessages", "finishPageMessages", "getKnownMessageAttachments", "finishGetKnownMessageAttachments" ]); class MainSQL { static { __name(this, "MainSQL"); } #pool = new Array(); #pauseWaiters; #isReady = false; #onReady; #onExit; // Promise resolve callbacks for corruption and readonly errors. #errorResolvers = new Array(); #seq = 0; #logger; // eslint-disable-next-line @typescript-eslint/no-explicit-any #onResponse = /* @__PURE__ */ new Map(); #shouldLogQueryTime; #shouldTrackQueryStats = false; #queryStats; constructor() { const exitPromises = new Array(); for (let i = 0; i < WORKER_COUNT; i += 1) { const { worker, onExit } = this.#createWorker(); this.#pool.push({ worker, load: 0 }); exitPromises.push(onExit); } this.#onExit = Promise.all(exitPromises); const timeQueryEnvVar = process.env.TIME_QUERIES; this.#shouldLogQueryTime = (queryName) => { return timeQueryEnvVar === queryName || timeQueryEnvVar === "1"; }; } async initialize({ appVersion, configDir, key, logger }) { if (this.#isReady || this.#onReady) { throw new Error("Already initialized"); } this.#logger = logger; this.#onReady = (async () => { const primary = this.#pool[0]; const rest = this.#pool.slice(1); await this.#send(primary, { type: "init", options: { appVersion, configDir, key }, isPrimary: true }); await Promise.all( rest.map( (worker) => this.#send(worker, { type: "init", options: { appVersion, configDir, key }, isPrimary: false }) ) ); })(); await this.#onReady; this.#onReady = void 0; this.#isReady = true; } pauseWriteAccess() { (0, import_assert_std.strictAssert)(this.#pauseWaiters == null, "Already paused"); this.#pauseWaiters = []; } resumeWriteAccess() { const pauseWaiters = this.#pauseWaiters; if (pauseWaiters == null) { return; } this.#pauseWaiters = void 0; for (const waiter of pauseWaiters) { waiter(); } } whenCorrupted() { const { promise, resolve } = (0, import_explodePromise_std.explodePromise)(); this.#errorResolvers.push({ kind: import_errors_std.SqliteErrorKind.Corrupted, resolve, once: true }); return promise; } whenReadonly() { const { promise, resolve } = (0, import_explodePromise_std.explodePromise)(); this.#errorResolvers.push({ kind: import_errors_std.SqliteErrorKind.Readonly, resolve, once: true }); return promise; } onUnknownSqlError(callback) { this.#errorResolvers.push({ kind: import_errors_std.SqliteErrorKind.Unknown, resolve: callback }); } async close() { if (this.#onReady) { try { await this.#onReady; } catch (err) { this.#logger?.error( `MainSQL close, failed: ${Errors.toLogFormat(err)}` ); return; } } if (!this.#isReady) { throw new Error("Not initialized"); } await this.#terminate({ type: "close" }); await this.#onExit; } async removeDB() { await this.#terminate({ type: "removeDB" }); } async sqlRead(method, ...args) { const isPaging = PAGING_QUERIES.has(method); const entry = isPaging ? this.#pool[0] : this.#getWorker(); (0, import_assert_std.strictAssert)(entry != null, "Must have a pool entry"); const { result, duration } = await this.#send(entry, { type: "sqlCall:read", method, args }); this.#traceDuration(method, duration); return result; } async sqlWrite(method, ...args) { while (this.#pauseWaiters != null) { const { promise, resolve } = (0, import_explodePromise_std.explodePromise)(); this.#pauseWaiters.push(resolve); await promise; } const primary = this.#pool[0]; const { result, duration } = await this.#send(primary, { type: "sqlCall:write", method, args }); this.#traceDuration(method, duration); return result; } startTrackingQueryStats() { if (this.#shouldTrackQueryStats) { this.#logQueryStats({}); this.#logger?.info("Resetting query stats"); } this.#resetQueryStats(); this.#shouldTrackQueryStats = true; } stopTrackingQueryStats(options) { if (this.#shouldTrackQueryStats) { this.#logQueryStats(options); } this.#queryStats = void 0; this.#shouldTrackQueryStats = false; } async #send(entry, request) { let errorId = request.type; if (request.type === "sqlCall:read" || request.type === "sqlCall:write") { errorId = `${request.type}(${request.method})`; if (this.#onReady) { await this.#onReady; } if (!this.#isReady) { throw new Error("Not initialized"); } } const seq = this.#seq; this.#seq = this.#seq + 1 >>> 0; const { promise: result, resolve, reject } = (0, import_explodePromise_std.explodePromise)(); this.#onResponse.set(seq, { errorId, resolve, reject }); const wrappedRequest = { seq, request }; entry.worker.postMessage(wrappedRequest); try { entry.load += 1; return await result; } finally { entry.load -= 1; } } async #terminate(request) { const primary = this.#pool[0]; const rest = this.#pool.slice(1); await Promise.all(rest.map((worker) => this.#send(worker, request))); await this.#send(primary, request); } #onError(errorKind, error) { const resolvers = new Array(); this.#errorResolvers = this.#errorResolvers.filter((entry) => { if (entry.kind === errorKind) { resolvers.push(entry.resolve); if (entry.once) { return false; } } return true; }); for (const resolve of resolvers) { resolve(error); } } #resetQueryStats() { this.#queryStats = { start: Date.now(), statsByQuery: /* @__PURE__ */ new Map() }; } #roundDuration(duration) { return Math.round(100 * duration) / 100; } #logQueryStats({ maxQueriesToLog = 10, epochName }) { if (!this.#queryStats) { return; } const epochDuration = Date.now() - this.#queryStats.start; const sortedByCumulativeDuration = [ ...this.#queryStats.statsByQuery.values() ].sort((a, b) => (b.cumulative ?? 0) - (a.cumulative ?? 0)); const cumulativeDuration = sortedByCumulativeDuration.reduce( (sum, stats) => sum + stats.cumulative, 0 ); this.#logger?.info( `Top ${maxQueriesToLog} queries by cumulative duration (ms) over last ${epochDuration}ms${epochName ? ` during '${epochName}'` : ""}: ${sortedByCumulativeDuration.slice(0, maxQueriesToLog).map((stats) => { return `${stats.queryName}: cumulative ${this.#roundDuration(stats.cumulative)} | average: ${this.#roundDuration(stats.cumulative / (stats.count || 1))} | max: ${this.#roundDuration(stats.max)} | count: ${stats.count}`; }).join(" ||| ")}; Total cumulative duration of all SQL queries during this epoch: ${this.#roundDuration(cumulativeDuration)}ms` ); } #traceDuration(method, duration) { if (this.#shouldTrackQueryStats) { if (!this.#queryStats) { this.#resetQueryStats(); } (0, import_assert_std.strictAssert)(this.#queryStats, "has been initialized"); let currentStats = this.#queryStats.statsByQuery.get(method); if (!currentStats) { currentStats = { count: 0, cumulative: 0, queryName: method, max: 0 }; this.#queryStats.statsByQuery.set(method, currentStats); } currentStats.count += 1; currentStats.cumulative += duration; currentStats.max = Math.max(currentStats.max, duration); } if (this.#shouldLogQueryTime(method) && !import_electron.app.isPackaged) { const twoDecimals = this.#roundDuration(duration); this.#logger?.info(`MainSQL query: ${method}, duration=${twoDecimals}ms`); } if (duration > MIN_TRACE_DURATION) { (0, import_assert_std.strictAssert)(this.#logger !== void 0, "Logger not initialized"); this.#logger.info( `MainSQL: slow query ${method} duration=${Math.round(duration)}ms` ); } } #createWorker() { const scriptPath = (0, import_node_path.join)( import_electron.app.getAppPath(), "ts", "sql", "mainWorker.node.js" ); const worker = new import_node_worker_threads.Worker(scriptPath); worker.on("message", (wrappedResponse) => { if (wrappedResponse.type === "log") { const { level, args } = wrappedResponse; (0, import_assert_std.strictAssert)(this.#logger !== void 0, "Logger not initialized"); this.#logger[level](`MainSQL: ${(0, import_node_util.format)(...args)}`); return; } const { seq, error, errorKind, response } = wrappedResponse; const entry = this.#onResponse.get(seq); this.#onResponse.delete(seq); if (!entry) { throw new Error(`Unexpected worker response with seq: ${seq}`); } if (error) { const errorObj = new Error(`${entry.errorId}: ${error.message}`); errorObj.stack = `${entry.errorId}: ${error.stack}`; errorObj.name = error.name; this.#onError(errorKind ?? import_errors_std.SqliteErrorKind.Unknown, errorObj); entry.reject(errorObj); } else { entry.resolve(response); } }); const { promise: onExit, resolve: resolveOnExit } = (0, import_explodePromise_std.explodePromise)(); worker.once("exit", resolveOnExit); return { worker, onExit }; } // Find first pool entry with minimal load #getWorker() { let min = this.#pool[0]; for (const entry of this.#pool) { if (min && min.load < entry.load) { continue; } min = entry; } return min; } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { MainSQL }); "use strict"; var __defProp = Object.defineProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var import_node_worker_threads = require("node:worker_threads"); var import_Server_node = require("./Server.node.js"); var import_errors_std = require("./errors.std.js"); var import_sqlLogger_node = require("./sqlLogger.node.js"); if (!import_node_worker_threads.parentPort) { throw new Error("Must run as a worker thread"); } const port = import_node_worker_threads.parentPort; function respond(seq, response) { const wrappedResponse = { type: "response", seq, error: void 0, errorKind: void 0, response }; port.postMessage(wrappedResponse); } __name(respond, "respond"); let db; let isPrimary = false; let isRemoved = false; const onMessage = /* @__PURE__ */ __name(({ seq, request }, isRetrying = false) => { try { if (request.type === "init") { isPrimary = request.isPrimary; isRemoved = false; db = (0, import_Server_node.initialize)({ ...request.options, isPrimary }); respond(seq, void 0); return; } if (isRemoved && request.type === "close") { respond(seq, void 0); process.exit(0); return; } if (request.type === "removeDB") { try { if (db) { if (isPrimary) { import_Server_node.DataWriter.close(db); } else { import_Server_node.DataReader.close(db); } db = void 0; } } catch (error) { import_sqlLogger_node.sqlLogger.error("Failed to close database before removal"); } if (isPrimary) { (0, import_Server_node.removeDB)(); } isRemoved = true; respond(seq, void 0); return; } if (!db) { throw new Error("Not initialized"); } if (request.type === "close") { if (isPrimary) { import_Server_node.DataWriter.close(db); } else { import_Server_node.DataReader.close(db); } db = void 0; respond(seq, void 0); process.exit(0); return; } if (request.type === "sqlCall:read" || request.type === "sqlCall:write") { const DataInterface = request.type === "sqlCall:read" ? import_Server_node.DataReader : import_Server_node.DataWriter; const method = DataInterface[request.method]; if (typeof method !== "function") { throw new Error(`Invalid sql method: ${request.method} ${method}`); } const start = performance.now(); const result = method(db, ...request.args); const end = performance.now(); respond(seq, { result, duration: end - start }); } else { throw new Error("Unexpected request type"); } } catch (error) { const errorKind = (0, import_errors_std.parseSqliteError)(error); if ((errorKind === import_errors_std.SqliteErrorKind.Corrupted || errorKind === import_errors_std.SqliteErrorKind.Logic) && db != null) { const wasRecovered = import_Server_node.DataWriter.runCorruptionChecks(db); if (wasRecovered && !isRetrying && // Don't retry 'init'/'close'/'removeDB' automatically and notify user // about the database error (even on successful recovery). (request.type === "sqlCall:read" || request.type === "sqlCall:write")) { import_sqlLogger_node.sqlLogger.error(`Retrying request: ${request.type}`); return onMessage({ seq, request }, true); } } const wrappedResponse = { type: "response", seq, error: { name: error.name, message: error.message, stack: error.stack }, errorKind, response: void 0 }; port.postMessage(wrappedResponse); } }, "onMessage"); port.on("message", (message) => onMessage(message)); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var mark_unread_call_history_messages_as_unseen_std_exports = {}; __export(mark_unread_call_history_messages_as_unseen_std_exports, { default: () => updateToSchemaVersion1000 }); module.exports = __toCommonJS(mark_unread_call_history_messages_as_unseen_std_exports); var import_MessageReadStatus_std = require("../../messages/MessageReadStatus.std.js"); var import_MessageSeenStatus_std = require("../../MessageSeenStatus.std.js"); var import_assert_std = require("../../util/assert.std.js"); var import_util_std = require("../util.std.js"); const READ_STATUS_UNREAD = (0, import_util_std.sqlConstant)(import_MessageReadStatus_std.ReadStatus.Unread); const READ_STATUS_READ = (0, import_util_std.sqlConstant)(import_MessageReadStatus_std.ReadStatus.Read); const SEEN_STATUS_UNSEEN = (0, import_util_std.sqlConstant)(import_MessageSeenStatus_std.SeenStatus.Unseen); function updateToSchemaVersion1000(db) { const [selectQuery] = import_util_std.sql` SELECT id FROM messages WHERE messages.type = 'call-history' AND messages.readStatus IS ${READ_STATUS_UNREAD} `; const rows = db.prepare(selectQuery).all(); for (const row of rows) { const { id } = row; (0, import_assert_std.strictAssert)(id != null, "message id must exist"); const [updateQuery, updateParams] = import_util_std.sql` UPDATE messages SET json = JSON_PATCH(json, ${JSON.stringify({ readStatus: import_MessageReadStatus_std.ReadStatus.Read, seenStatus: import_MessageSeenStatus_std.SeenStatus.Unseen })}), readStatus = ${READ_STATUS_READ}, seenStatus = ${SEEN_STATUS_UNSEEN} WHERE id = ${id} `; db.prepare(updateQuery).run(updateParams); } } __name(updateToSchemaVersion1000, "updateToSchemaVersion1000"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var call_links_table_std_exports = {}; __export(call_links_table_std_exports, { default: () => updateToSchemaVersion1010 }); module.exports = __toCommonJS(call_links_table_std_exports); var import_util_std = require("../util.std.js"); function updateToSchemaVersion1010(db) { const [createTable] = import_util_std.sql` CREATE TABLE callLinks ( roomId TEXT NOT NULL PRIMARY KEY, rootKey BLOB NOT NULL, adminKey BLOB, name TEXT NOT NULL, -- Enum which stores CallLinkRestrictions from ringrtc restrictions INTEGER NOT NULL, revoked INTEGER NOT NULL, expiration INTEGER ) STRICT; `; db.exec(createTable); } __name(updateToSchemaVersion1010, "updateToSchemaVersion1010"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var self_merges_std_exports = {}; __export(self_merges_std_exports, { default: () => updateToSchemaVersion1020 }); module.exports = __toCommonJS(self_merges_std_exports); var import_util_std = require("../util.std.js"); var import_uuid_keys_std = require("./41-uuid-keys.std.js"); function updateToSchemaVersion1020(db, logger) { const ourAci = (0, import_uuid_keys_std.getOurUuid)(db); if (ourAci == null) { logger.info("not linked"); return; } const [selectQuery, selectParams] = import_util_std.sql` SELECT id FROM conversations WHERE serviceId IS ${ourAci} `; const ourConversationId = db.prepare(selectQuery, { pluck: true }).get(selectParams); if (ourConversationId == null) { logger.error("no conversation"); return; } const [deleteQuery, deleteParams] = import_util_std.sql` DELETE FROM messages WHERE conversationId IS ${ourConversationId} AND type IS 'conversation-merge' `; const { changes } = db.prepare(deleteQuery).run(deleteParams); if (changes !== 0) { logger.warn(`removed ${changes} self merges`); } } __name(updateToSchemaVersion1020, "updateToSchemaVersion1020"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var unblock_event_std_exports = {}; __export(unblock_event_std_exports, { default: () => updateToSchemaVersion1030 }); module.exports = __toCommonJS(unblock_event_std_exports); var import_util_std = require("../util.std.js"); function updateToSchemaVersion1030(db) { const shouldAffectActivityOrPreview = import_util_std.sqlFragment` type IS NULL OR type NOT IN ( 'change-number-notification', 'contact-removed-notification', 'conversation-merge', 'group-v1-migration', 'keychange', 'message-history-unsynced', 'profile-change', 'story', 'universal-timer-notification', 'verified-change' ) AND NOT ( type IS 'message-request-response-event' AND json_extract(json, '$.messageRequestResponseEvent') IN ('ACCEPT', 'BLOCK', 'UNBLOCK') ) `; const [updateShouldAffectPreview] = import_util_std.sql` --- These will be re-added below DROP INDEX messages_preview; DROP INDEX messages_preview_without_story; DROP INDEX messages_activity; DROP INDEX message_user_initiated; --- These will also be re-added below ALTER TABLE messages DROP COLUMN shouldAffectActivity; ALTER TABLE messages DROP COLUMN shouldAffectPreview; --- (change: added message-request-response-event->ACCEPT/BLOCK/UNBLOCK) ALTER TABLE messages ADD COLUMN shouldAffectPreview INTEGER GENERATED ALWAYS AS (${shouldAffectActivityOrPreview}); ALTER TABLE messages ADD COLUMN shouldAffectActivity INTEGER GENERATED ALWAYS AS (${shouldAffectActivityOrPreview}); --- From migration 88 CREATE INDEX messages_preview ON messages (conversationId, shouldAffectPreview, isGroupLeaveEventFromOther, received_at, sent_at); --- From migration 88 CREATE INDEX messages_preview_without_story ON messages (conversationId, shouldAffectPreview, isGroupLeaveEventFromOther, received_at, sent_at) WHERE storyId IS NULL; --- From migration 88 CREATE INDEX messages_activity ON messages (conversationId, shouldAffectActivity, isTimerChangeFromSync, isGroupLeaveEventFromOther, received_at, sent_at); --- From migration 81 CREATE INDEX message_user_initiated ON messages (conversationId, isUserInitiatedMessage); `; db.exec(updateShouldAffectPreview); } __name(updateToSchemaVersion1030, "updateToSchemaVersion1030"); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var undownloaded_backed_up_media_std_exports = {}; __export(undownloaded_backed_up_media_std_exports, { default: () => updateToSchemaVersion1040 }); module.exports = __toCommonJS(undownloaded_backed_up_media_std_exports); var z = __toESM(require("zod")); var import_AttachmentDownload_std = require("../../types/AttachmentDownload.std.js"); var import_util_std = require("../util.std.js"); var import_Interface_std = require("../Interface.std.js"); var import_schemas_std = require("../../util/schemas.std.js"); var import_MIME_std = require("../../types/MIME.std.js"); var import_JobManager_std = require("../../jobs/JobManager.std.js"); const attachmentDownloadJobSchemaV1040 = z.object({ attachment: z.object({ size: z.number(), contentType: import_MIME_std.MIMETypeSchema }).passthrough(), attachmentType: import_AttachmentDownload_std.messageAttachmentTypeSchema, ciphertextSize: z.number(), contentType: import_MIME_std.MIMETypeSchema, digest: z.string(), isManualDownload: z.boolean().optional(), messageId: z.string(), messageIdForLogging: z.string().optional(), receivedAt: z.number(), sentAt: z.number(), size: z.number(), source: z.nativeEnum(import_Interface_std.AttachmentDownloadSource) }).and(import_JobManager_std.jobManagerJobSchema); function updateToSchemaVersion1040(db, logger) { const existingJobs = db.prepare( ` SELECT id, timestamp, pending, json from attachment_downloads ` ).all(); logger.info(`loaded ${existingJobs.length} existing jobs`); db.exec(` CREATE TABLE tmp_attachment_downloads ( messageId TEXT NOT NULL REFERENCES messages(id) ON DELETE CASCADE, attachmentType TEXT NOT NULL, digest TEXT NOT NULL, receivedAt INTEGER NOT NULL, sentAt INTEGER NOT NULL, contentType TEXT NOT NULL, size INTEGER NOT NULL, attachmentJson TEXT NOT NULL, active INTEGER NOT NULL, attempts INTEGER NOT NULL, retryAfter INTEGER, lastAttemptTimestamp INTEGER, PRIMARY KEY (messageId, attachmentType, digest) ) STRICT; `); db.exec("DROP TABLE attachment_downloads;"); db.exec( "ALTER TABLE tmp_attachment_downloads RENAME TO attachment_downloads;" ); db.exec(` CREATE INDEX attachment_downloads_active_receivedAt ON attachment_downloads ( active, receivedAt ); `); db.exec(` CREATE INDEX attachment_downloads_active_messageId ON attachment_downloads ( active, messageId ); `); db.exec(` CREATE INDEX attachment_downloads_messageId ON attachment_downloads ( messageId ); `); const rowsToTransfer = []; for (const existingJob of existingJobs) { try { const existingJobData = (0, import_util_std.jsonToObject)(existingJob.json ?? ""); const updatedJob = { messageId: existingJobData.messageId, attachmentType: existingJobData.type, attachment: existingJobData.attachment, // The existing timestamp column works reasonably well in place of // actually retrieving the message's receivedAt receivedAt: existingJobData.timestamp ?? Date.now(), sentAt: existingJobData.timestamp ?? Date.now(), digest: existingJobData.attachment?.digest, contentType: existingJobData.attachment?.contentType, size: existingJobData.attachment?.size, active: false, // all jobs are inactive on app start attempts: existingJobData.attempts ?? 0, retryAfter: null, lastAttemptTimestamp: null, // adding due to changes in the schema source: import_Interface_std.AttachmentDownloadSource.STANDARD, ciphertextSize: 0 }; const parsed = (0, import_schemas_std.parsePartial)(attachmentDownloadJobSchemaV1040, updatedJob); rowsToTransfer.push(parsed); } catch { logger.warn( `unable to transfer job ${existingJob.id} to new table; invalid data` ); } } let numTransferred = 0; if (rowsToTransfer.length) { logger.info(`transferring ${rowsToTransfer.length} rows`); for (const row of rowsToTransfer) { const [insertQuery, insertParams] = import_util_std.sql` INSERT INTO attachment_downloads ( messageId, attachmentType, receivedAt, sentAt, digest, contentType, size, attachmentJson, active, attempts, retryAfter, lastAttemptTimestamp ) VALUES ( ${row.messageId}, ${row.attachmentType}, ${row.receivedAt}, ${row.sentAt}, ${row.digest}, ${row.contentType}, ${row.size}, ${(0, import_util_std.objectToJSON)(row.attachment)}, ${row.active ? 1 : 0}, ${row.attempts}, ${row.retryAfter}, ${row.lastAttemptTimestamp} ); `; try { db.prepare(insertQuery).run(insertParams); numTransferred += 1; } catch (error) { logger.error("error when transferring row", error); } } } logger.info( `transferred ${numTransferred} rows, removed ${existingJobs.length - numTransferred}` ); } __name(updateToSchemaVersion1040, "updateToSchemaVersion1040"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var group_send_endorsements_std_exports = {}; __export(group_send_endorsements_std_exports, { default: () => updateToSchemaVersion1050 }); module.exports = __toCommonJS(group_send_endorsements_std_exports); var import_util_std = require("../util.std.js"); function updateToSchemaVersion1050(db) { const [createTables] = import_util_std.sql` DROP TABLE IF EXISTS groupSendCombinedEndorsement; DROP TABLE IF EXISTS groupSendMemberEndorsement; -- From GroupSendEndorsementsResponse->ReceivedEndorsements in libsignal -- this is the combined endorsement for all group members CREATE TABLE groupSendCombinedEndorsement ( groupId TEXT NOT NULL PRIMARY KEY, -- Only one endorsement per group expiration INTEGER NOT NULL, -- Unix timestamp in seconds endorsement BLOB NOT NULL ) STRICT; -- From GroupSendEndorsementsResponse->ReceivedEndorsements in libsignal -- these are the individual endorsements for each group member CREATE TABLE groupSendMemberEndorsement ( groupId TEXT NOT NULL, memberAci TEXT NOT NULL, expiration INTEGER NOT NULL, -- Unix timestamp in seconds endorsement BLOB NOT NULL, PRIMARY KEY (groupId, memberAci) -- Only one endorsement per group member ) STRICT; `; db.exec(createTables); } __name(updateToSchemaVersion1050, "updateToSchemaVersion1050"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var addressable_messages_and_sync_tasks_std_exports = {}; __export(addressable_messages_and_sync_tasks_std_exports, { default: () => updateToSchemaVersion1060 }); module.exports = __toCommonJS(addressable_messages_and_sync_tasks_std_exports); function updateToSchemaVersion1060(db) { db.exec(` ALTER TABLE messages ADD COLUMN isAddressableMessage INTEGER GENERATED ALWAYS AS ( type IS NULL OR type IN ( 'incoming', 'outgoing' ) ); CREATE INDEX messages_by_date_addressable ON messages ( conversationId, isAddressableMessage, received_at, sent_at ); CREATE TABLE syncTasks( id TEXT PRIMARY KEY NOT NULL, attempts INTEGER NOT NULL, createdAt INTEGER NOT NULL, data TEXT NOT NULL, envelopeId TEXT NOT NULL, sentAt INTEGER NOT NULL, type TEXT NOT NULL ) STRICT; CREATE INDEX syncTasks_order ON syncTasks ( createdAt, sentAt, id ) `); } __name(updateToSchemaVersion1060, "updateToSchemaVersion1060"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var attachment_backup_std_exports = {}; __export(attachment_backup_std_exports, { default: () => updateToSchemaVersion1070 }); module.exports = __toCommonJS(attachment_backup_std_exports); function updateToSchemaVersion1070(db) { db.exec(` CREATE TABLE attachment_backup_jobs ( mediaName TEXT NOT NULL PRIMARY KEY, type TEXT NOT NULL, data TEXT NOT NULL, receivedAt INTEGER NOT NULL, -- job manager fields attempts INTEGER NOT NULL, active INTEGER NOT NULL, retryAfter INTEGER, lastAttemptTimestamp INTEGER ) STRICT; CREATE INDEX attachment_backup_jobs_receivedAt ON attachment_backup_jobs ( receivedAt ); CREATE INDEX attachment_backup_jobs_type_receivedAt ON attachment_backup_jobs ( type, receivedAt ); CREATE TABLE backup_cdn_object_metadata ( mediaId TEXT NOT NULL PRIMARY KEY, cdnNumber INTEGER NOT NULL, sizeOnBackupCdn INTEGER ) STRICT; `); } __name(updateToSchemaVersion1070, "updateToSchemaVersion1070"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var nondisappearing_addressable_std_exports = {}; __export(nondisappearing_addressable_std_exports, { default: () => updateToSchemaVersion1080 }); module.exports = __toCommonJS(nondisappearing_addressable_std_exports); function updateToSchemaVersion1080(db) { db.exec(` CREATE INDEX messages_by_date_addressable_nondisappearing ON messages ( conversationId, isAddressableMessage, received_at, sent_at ) WHERE expireTimer IS NULL; `); } __name(updateToSchemaVersion1080, "updateToSchemaVersion1080"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var message_delete_indexes_std_exports = {}; __export(message_delete_indexes_std_exports, { default: () => updateToSchemaVersion1090 }); module.exports = __toCommonJS(message_delete_indexes_std_exports); function updateToSchemaVersion1090(db) { db.exec(` CREATE INDEX reactions_messageId ON reactions (messageId); CREATE INDEX storyReads_storyId ON storyReads (storyId); `); } __name(updateToSchemaVersion1090, "updateToSchemaVersion1090"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var optimize_mark_call_history_read_in_conversation_std_exports = {}; __export(optimize_mark_call_history_read_in_conversation_std_exports, { default: () => updateToSchemaVersion1100 }); module.exports = __toCommonJS(optimize_mark_call_history_read_in_conversation_std_exports); var import_util_std = require("../util.std.js"); function updateToSchemaVersion1100(db) { const [query] = import_util_std.sql` -- Fix: Query went from readStatus to seenStatus but index wasn't updated DROP INDEX IF EXISTS messages_callHistory_readStatus; DROP INDEX IF EXISTS messages_callHistory_seenStatus; CREATE INDEX messages_callHistory_seenStatus ON messages (type, seenStatus) WHERE type IS 'call-history'; -- Update to index created in 89: add sent_at to make it covering, and where clause to make it smaller DROP INDEX IF EXISTS messages_call; CREATE INDEX messages_call ON messages (type, conversationId, callId, sent_at) WHERE type IS 'call-history'; -- Update to index created in 89: add callId and peerId to make it covering DROP INDEX IF EXISTS callsHistory_order; CREATE INDEX callsHistory_order ON callsHistory (timestamp DESC, callId, peerId); -- Update to index created in 89: add timestamp for querying by order and callId to make it covering DROP INDEX IF EXISTS callsHistory_byConversation; DROP INDEX IF EXISTS callsHistory_byConversation_order; CREATE INDEX callsHistory_byConversation_order ON callsHistory (peerId, timestamp DESC, callId); -- Optimize markAllCallHistoryRead DROP INDEX IF EXISTS messages_callHistory_markReadBefore; CREATE INDEX messages_callHistory_markReadBefore ON messages (type, seenStatus, sent_at DESC) WHERE type IS 'call-history'; -- Optimize markAllCallHistoryReadInConversation DROP INDEX IF EXISTS messages_callHistory_markReadByConversationBefore; CREATE INDEX messages_callHistory_markReadByConversationBefore ON messages (type, conversationId, seenStatus, sent_at DESC) WHERE type IS 'call-history'; `; db.exec(query); } __name(updateToSchemaVersion1100, "updateToSchemaVersion1100"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var sticker_local_key_std_exports = {}; __export(sticker_local_key_std_exports, { default: () => updateToSchemaVersion1110 }); module.exports = __toCommonJS(sticker_local_key_std_exports); function updateToSchemaVersion1110(db) { db.exec(` ALTER TABLE stickers ADD COLUMN version INTEGER NOT NULL DEFAULT 1; ALTER TABLE stickers ADD COLUMN localKey TEXT; ALTER TABLE stickers ADD COLUMN size INTEGER; `); } __name(updateToSchemaVersion1110, "updateToSchemaVersion1110"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var messages_foreign_keys_indexes_std_exports = {}; __export(messages_foreign_keys_indexes_std_exports, { default: () => updateToSchemaVersion1120 }); module.exports = __toCommonJS(messages_foreign_keys_indexes_std_exports); function updateToSchemaVersion1120(db) { db.exec(` CREATE INDEX edited_messages_messageId ON edited_messages(messageId); CREATE INDEX mentions_messageId ON mentions(messageId); `); } __name(updateToSchemaVersion1120, "updateToSchemaVersion1120"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var isStory_index_std_exports = {}; __export(isStory_index_std_exports, { default: () => updateToSchemaVersion1130 }); module.exports = __toCommonJS(isStory_index_std_exports); function updateToSchemaVersion1130(db) { db.exec(` CREATE INDEX messages_isStory ON messages(received_at, sent_at) WHERE isStory = 1; `); } __name(updateToSchemaVersion1130, "updateToSchemaVersion1130"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var call_links_deleted_column_std_exports = {}; __export(call_links_deleted_column_std_exports, { default: () => updateToSchemaVersion1140 }); module.exports = __toCommonJS(call_links_deleted_column_std_exports); function updateToSchemaVersion1140(db) { db.exec(` DROP INDEX IF EXISTS callLinks_deleted; ALTER TABLE callLinks ADD COLUMN deleted INTEGER NOT NULL DEFAULT 0; CREATE INDEX callLinks_deleted ON callLinks (deleted, roomId); `); } __name(updateToSchemaVersion1140, "updateToSchemaVersion1140"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var expire_timer_version_std_exports = {}; __export(expire_timer_version_std_exports, { default: () => updateToSchemaVersion1150 }); module.exports = __toCommonJS(expire_timer_version_std_exports); function updateToSchemaVersion1150(db) { db.exec(` -- All future conversations will start from '1' ALTER TABLE conversations ADD COLUMN expireTimerVersion INTEGER NOT NULL DEFAULT 1; -- All current conversations will start from '2' UPDATE conversations SET expireTimerVersion = 2; `); } __name(updateToSchemaVersion1150, "updateToSchemaVersion1150"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var optimize_calls_unread_count_std_exports = {}; __export(optimize_calls_unread_count_std_exports, { default: () => updateToSchemaVersion1160 }); module.exports = __toCommonJS(optimize_calls_unread_count_std_exports); var import_util_std = require("../util.std.js"); var import_CallDisposition_std = require("../../types/CallDisposition.std.js"); const CALL_STATUS_MISSED = (0, import_util_std.sqlConstant)(import_CallDisposition_std.CallStatusValue.Missed); const CALL_DIRECTION_INCOMING = (0, import_util_std.sqlConstant)(import_CallDisposition_std.CallDirection.Incoming); function updateToSchemaVersion1160(db) { const [query] = import_util_std.sql` DROP INDEX IF EXISTS callsHistory_incoming_missed; CREATE INDEX callsHistory_incoming_missed ON callsHistory (callId, status, direction) WHERE status IS ${CALL_STATUS_MISSED} AND direction IS ${CALL_DIRECTION_INCOMING}; `; db.exec(query); } __name(updateToSchemaVersion1160, "updateToSchemaVersion1160"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var update_call_history_unread_index_std_exports = {}; __export(update_call_history_unread_index_std_exports, { default: () => updateToSchemaVersion1170 }); module.exports = __toCommonJS(update_call_history_unread_index_std_exports); var import_util_std = require("../util.std.js"); function updateToSchemaVersion1170(db) { const [query] = import_util_std.sql` DROP INDEX IF EXISTS messages_callHistory_markReadBefore; CREATE INDEX messages_callHistory_markReadBefore ON messages (type, seenStatus, received_at DESC) WHERE type IS 'call-history'; `; db.exec(query); } __name(updateToSchemaVersion1170, "updateToSchemaVersion1170"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var add_attachment_download_source_std_exports = {}; __export(add_attachment_download_source_std_exports, { default: () => updateToSchemaVersion1180 }); module.exports = __toCommonJS(add_attachment_download_source_std_exports); var import_Interface_std = require("../Interface.std.js"); function updateToSchemaVersion1180(db) { db.exec(` ALTER TABLE attachment_downloads ADD COLUMN source TEXT NOT NULL DEFAULT ${import_Interface_std.AttachmentDownloadSource.STANDARD}; ALTER TABLE attachment_downloads -- this default value will be overridden by getNextAttachmentDownloadJobs ADD COLUMN ciphertextSize INTEGER NOT NULL DEFAULT 0; `); db.exec(` CREATE INDEX attachment_downloads_source_ciphertextSize ON attachment_downloads ( source, ciphertextSize ); `); } __name(updateToSchemaVersion1180, "updateToSchemaVersion1180"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var call_links_storage_std_exports = {}; __export(call_links_storage_std_exports, { default: () => updateToSchemaVersion1190 }); module.exports = __toCommonJS(call_links_storage_std_exports); function updateToSchemaVersion1190(db) { db.exec(` ALTER TABLE callLinks ADD COLUMN storageID TEXT; ALTER TABLE callLinks ADD COLUMN storageVersion INTEGER; ALTER TABLE callLinks ADD COLUMN storageUnknownFields BLOB; ALTER TABLE callLinks ADD COLUMN storageNeedsSync INTEGER NOT NULL DEFAULT 0; ALTER TABLE callLinks ADD COLUMN deletedAt INTEGER; `); db.prepare( ` UPDATE callLinks SET deletedAt = $deletedAt WHERE deleted = 1; ` ).run({ deletedAt: (/* @__PURE__ */ new Date()).getTime() }); } __name(updateToSchemaVersion1190, "updateToSchemaVersion1190"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var attachment_download_source_index_std_exports = {}; __export(attachment_download_source_index_std_exports, { default: () => updateToSchemaVersion1200 }); module.exports = __toCommonJS(attachment_download_source_index_std_exports); function updateToSchemaVersion1200(db) { db.exec(` CREATE INDEX attachment_downloads_active_source_receivedAt ON attachment_downloads ( active, source, receivedAt ); `); } __name(updateToSchemaVersion1200, "updateToSchemaVersion1200"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var call_history_started_id_std_exports = {}; __export(call_history_started_id_std_exports, { default: () => updateToSchemaVersion1210 }); module.exports = __toCommonJS(call_history_started_id_std_exports); function updateToSchemaVersion1210(db) { db.exec(` ALTER TABLE callsHistory ADD COLUMN startedById TEXT DEFAULT NULL; ALTER TABLE callsHistory ADD COLUMN endedTimestamp INTEGER DEFAULT NULL; `); } __name(updateToSchemaVersion1210, "updateToSchemaVersion1210"); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var blob_sessions_node_exports = {}; __export(blob_sessions_node_exports, { default: () => updateToSchemaVersion1220, version: () => version }); module.exports = __toCommonJS(blob_sessions_node_exports); var import_node_assert = __toESM(require("node:assert")); var import_zod = __toESM(require("zod")); var Errors = __toESM(require("../../types/errors.std.js")); var import_sessionTranslation_node = require("../../util/sessionTranslation.node.js"); var import_getOwn_std = require("../../util/getOwn.std.js"); var import_missingCaseError_std = require("../../util/missingCaseError.std.js"); const version = 1220; const identityKeyMapSchema = import_zod.default.record( import_zod.default.string(), import_zod.default.object({ privKey: import_zod.default.string().transform((x) => Buffer.from(x, "base64")), pubKey: import_zod.default.string().transform((x) => Buffer.from(x, "base64")) }) ); const registrationIdMapSchema = import_zod.default.record(import_zod.default.string(), import_zod.default.number()); const previousSessionJsonSchema = import_zod.default.object({ id: import_zod.default.string(), ourServiceId: import_zod.default.string(), serviceId: import_zod.default.string(), conversationId: import_zod.default.string(), deviceId: import_zod.default.number(), record: import_zod.default.string(), version: import_zod.default.literal(1).or(import_zod.default.literal(2)) }); function migrateSession(row, identityKeyMap, registrationIdMap, logger) { const { id, conversationId, ourServiceId, serviceId, json } = row; const session = previousSessionJsonSchema.parse(JSON.parse(json)); import_node_assert.default.strictEqual(session.id, id, "Invalid id"); import_node_assert.default.strictEqual( session.conversationId, conversationId, "Invalid conversationId" ); import_node_assert.default.strictEqual( session.ourServiceId, ourServiceId, "Invalid ourServiceId," ); import_node_assert.default.strictEqual(session.serviceId, serviceId, "Invalid serviceId"); if (session.version === 2) { return { id, conversationId, ourServiceId, serviceId, deviceId: session.deviceId, record: Buffer.from(session.record, "base64") }; } if (session.version === 1) { const keyPair = (0, import_getOwn_std.getOwn)(identityKeyMap, ourServiceId); if (!keyPair) { throw new Error("migrateSession: No identity key for ourself!"); } const localRegistrationId = (0, import_getOwn_std.getOwn)(registrationIdMap, ourServiceId); if (localRegistrationId == null) { throw new Error("_maybeMigrateSession: No registration id for ourself!"); } const localUserData = { identityKeyPublic: keyPair.pubKey, registrationId: localRegistrationId }; logger.info(`migrateSession: Migrating session with id ${id}`); const sessionProto = (0, import_sessionTranslation_node.sessionRecordToProtobuf)( JSON.parse(session.record), localUserData ); return { id, conversationId, ourServiceId, serviceId, deviceId: session.deviceId, record: Buffer.from((0, import_sessionTranslation_node.sessionStructureToBytes)(sessionProto)) }; } throw (0, import_missingCaseError_std.missingCaseError)(session.version); } __name(migrateSession, "migrateSession"); function updateToSchemaVersion1220(db, logger) { db.exec(` ALTER TABLE sessions RENAME TO old_sessions; CREATE TABLE sessions ( id TEXT NOT NULL PRIMARY KEY, ourServiceId TEXT NOT NULL, serviceId TEXT NOT NULL, conversationId TEXT NOT NULL, deviceId INTEGER NOT NULL, record BLOB NOT NULL ) STRICT; `); const getItem = db.prepare( ` SELECT json -> '$.value' FROM items WHERE id IS ? `, { pluck: true } ); const identityKeyMapJson = getItem.get(["identityKeyMap"]); const registrationIdMapJson = getItem.get(["registrationIdMap"]); if (!identityKeyMapJson || !registrationIdMapJson) { logger.info("no identity/registration id"); db.exec("DROP TABLE old_sessions"); return; } const identityKeyMap = identityKeyMapSchema.parse( JSON.parse(identityKeyMapJson) ); const registrationIdMap = registrationIdMapSchema.parse( JSON.parse(registrationIdMapJson) ); const getSessionsPage = db.prepare( "DELETE FROM old_sessions RETURNING * LIMIT 1000" ); const insertSession = db.prepare(` INSERT INTO sessions (id, ourServiceId, serviceId, conversationId, deviceId, record) VALUES ($id, $ourServiceId, $serviceId, $conversationId, $deviceId, $record) `); let migrated = 0; let failed = 0; while (true) { const rows = getSessionsPage.all(); if (rows.length === 0) { break; } for (const row of rows) { try { insertSession.run( migrateSession(row, identityKeyMap, registrationIdMap, logger) ); migrated += 1; } catch (error) { failed += 1; logger.error("failed to migrate session", Errors.toLogFormat(error)); } } } logger.info(`migrated ${migrated} sessions, ${failed} failed`); db.exec("DROP TABLE old_sessions"); } __name(updateToSchemaVersion1220, "updateToSchemaVersion1220"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { version }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var call_links_admin_key_index_std_exports = {}; __export(call_links_admin_key_index_std_exports, { default: () => updateToSchemaVersion1230 }); module.exports = __toCommonJS(call_links_admin_key_index_std_exports); function updateToSchemaVersion1230(db) { db.exec(` DROP INDEX IF EXISTS callLinks_adminKey; CREATE INDEX callLinks_adminKey ON callLinks (adminKey); `); } __name(updateToSchemaVersion1230, "updateToSchemaVersion1230"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var defunct_call_links_table_std_exports = {}; __export(defunct_call_links_table_std_exports, { default: () => updateToSchemaVersion1240 }); module.exports = __toCommonJS(defunct_call_links_table_std_exports); var import_util_std = require("../util.std.js"); function updateToSchemaVersion1240(db) { const [createTable] = import_util_std.sql` CREATE TABLE defunctCallLinks ( roomId TEXT NOT NULL PRIMARY KEY, rootKey BLOB NOT NULL, adminKey BLOB ) STRICT; `; db.exec(createTable); } __name(updateToSchemaVersion1240, "updateToSchemaVersion1240"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var defunct_call_links_storage_std_exports = {}; __export(defunct_call_links_storage_std_exports, { default: () => updateToSchemaVersion1250 }); module.exports = __toCommonJS(defunct_call_links_storage_std_exports); function updateToSchemaVersion1250(db) { db.exec(` ALTER TABLE defunctCallLinks ADD COLUMN storageID TEXT; ALTER TABLE defunctCallLinks ADD COLUMN storageVersion INTEGER; ALTER TABLE defunctCallLinks ADD COLUMN storageUnknownFields BLOB; ALTER TABLE defunctCallLinks ADD COLUMN storageNeedsSync INTEGER NOT NULL DEFAULT 0; `); } __name(updateToSchemaVersion1250, "updateToSchemaVersion1250"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var sync_tasks_rowid_std_exports = {}; __export(sync_tasks_rowid_std_exports, { default: () => updateToSchemaVersion1260 }); module.exports = __toCommonJS(sync_tasks_rowid_std_exports); var import_util_std = require("../util.std.js"); function updateToSchemaVersion1260(db) { const [query] = import_util_std.sql` DROP INDEX IF EXISTS syncTasks_order; CREATE INDEX syncTasks_delete ON syncTasks (attempts DESC); `; db.exec(query); } __name(updateToSchemaVersion1260, "updateToSchemaVersion1260"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var normalize_messages_std_exports = {}; __export(normalize_messages_std_exports, { default: () => updateToSchemaVersion1270 }); module.exports = __toCommonJS(normalize_messages_std_exports); var import_util_std = require("../util.std.js"); function updateToSchemaVersion1270(db) { const [query] = import_util_std.sql` ALTER TABLE messages ADD COLUMN timestamp INTEGER; ALTER TABLE messages ADD COLUMN received_at_ms INTEGER; ALTER TABLE messages ADD COLUMN unidentifiedDeliveryReceived INTEGER; ALTER TABLE messages ADD COLUMN serverTimestamp INTEGER; ALTER TABLE messages RENAME COLUMN source TO legacySource; ALTER TABLE messages ADD COLUMN source TEXT; UPDATE messages SET timestamp = json_extract(json, '$.timestamp'), received_at_ms = json_extract(json, '$.received_at_ms'), unidentifiedDeliveryReceived = json_extract(json, '$.unidentifiedDeliveryReceived'), serverTimestamp = json_extract(json, '$.serverTimestamp'), source = IFNULL(json_extract(json, '$.source'), '+' || legacySource); ALTER TABLE messages DROP COLUMN legacySource; `; db.exec(query); } __name(updateToSchemaVersion1270, "updateToSchemaVersion1270"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var blob_unprocessed_std_exports = {}; __export(blob_unprocessed_std_exports, { default: () => updateToSchemaVersion1280 }); module.exports = __toCommonJS(blob_unprocessed_std_exports); var import_uuid = require("uuid"); var import_ServiceId_std = require("../../types/ServiceId.std.js"); var import_index_std = require("../../protobuf/index.std.js"); var import_util_std = require("../util.std.js"); var import_uuid_keys_std = require("./41-uuid-keys.std.js"); function updateToSchemaVersion1280(db, logger) { const ourAci = (0, import_uuid_keys_std.getOurUuid)(db); let rows = db.prepare("SELECT * FROM unprocessed").all(); const [query] = import_util_std.sql` DROP TABLE unprocessed; CREATE TABLE unprocessed( id TEXT NOT NULL PRIMARY KEY ASC, type INTEGER NOT NULL, timestamp INTEGER NOT NULL, attempts INTEGER NOT NULL, receivedAtCounter INTEGER NOT NULL, urgent INTEGER NOT NULL, story INTEGER NOT NULL, serverGuid TEXT NOT NULL, serverTimestamp INTEGER NOT NULL, isEncrypted INTEGER NOT NULL, content BLOB NOT NULL, messageAgeSec INTEGER NOT NULL, destinationServiceId TEXT NOT NULL, -- Not present for 1:1 messages and not sealed messages groupId TEXT, -- Not present for sealed envelopes reportingToken BLOB, source TEXT, sourceServiceId TEXT, sourceDevice TEXT, -- Present only for PNP change number updatedPni TEXT ) STRICT; CREATE INDEX unprocessed_timestamp ON unprocessed (timestamp); CREATE INDEX unprocessed_byReceivedAtCounter ON unprocessed (receivedAtCounter); `; db.exec(query); const insertStmt = db.prepare(` INSERT INTO unprocessed (id, type, timestamp, attempts, receivedAtCounter, urgent, story, serverGuid, serverTimestamp, isEncrypted, content, source, messageAgeSec, sourceServiceId, sourceDevice, destinationServiceId, reportingToken) VALUES ($id, $type, $timestamp, $attempts, $receivedAtCounter, $urgent, $story, $serverGuid, $serverTimestamp, $isEncrypted, $content, $source, $messageAgeSec, $sourceServiceId, $sourceDevice, $destinationServiceId, $reportingToken); `); let oldEnvelopes = 0; if (!ourAci) { if (rows.length) { logger.warn(`no aci, dropping ${rows.length} envelopes`); rows = []; } } for (const row of rows) { const { id, envelope, decrypted, timestamp, attempts, version: envelopeVersion, receivedAtCounter, urgent, story, serverGuid, serverTimestamp, ...rest } = row; if (envelopeVersion !== 2 || !envelope) { oldEnvelopes += 1; continue; } try { const decoded = import_index_std.Migrations.Envelope.decode( Buffer.from(String(envelope), "base64") ); if (!decoded.content) { throw new Error("Missing envelope content"); } const content = decrypted ? Buffer.from(String(decrypted), "base64") : decoded.content; insertStmt.run({ ...rest, id, type: decoded.type ?? import_index_std.Migrations.Envelope.Type.UNKNOWN, content: content ?? null, isEncrypted: decrypted ? 0 : 1, timestamp: timestamp || Date.now(), attempts: attempts || 0, receivedAtCounter: receivedAtCounter || 0, urgent: urgent ? 1 : 0, story: story ? 1 : 0, serverGuid: serverGuid || (0, import_uuid.v7)(), serverTimestamp: serverTimestamp || 0, destinationServiceId: (0, import_ServiceId_std.normalizeServiceId)( decoded.destinationServiceId || ourAci, "Envelope.destinationServiceId" ) ?? null, updatedPni: (0, import_ServiceId_std.isUntaggedPniString)(decoded.updatedPni) ? (0, import_ServiceId_std.normalizePni)((0, import_ServiceId_std.toTaggedPni)(decoded.updatedPni), "Envelope.updatedPni") : null, // Sadly not captured previously messageAgeSec: 0, reportingToken: decoded.reportSpamToken?.length ? decoded.reportSpamToken : null }); } catch (error) { logger.warn("failed to migrate unprocessed", id, error); } } if (oldEnvelopes !== 0) { logger.warn(`dropped ${oldEnvelopes} envelopes`); } } __name(updateToSchemaVersion1280, "updateToSchemaVersion1280"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var int_unprocessed_source_device_std_exports = {}; __export(int_unprocessed_source_device_std_exports, { default: () => updateToSchemaVersion1290 }); module.exports = __toCommonJS(int_unprocessed_source_device_std_exports); var import_util_std = require("../util.std.js"); function updateToSchemaVersion1290(db) { const [query] = import_util_std.sql` ALTER TABLE unprocessed RENAME COLUMN sourceDevice TO legacySourceDevice; ALTER TABLE unprocessed ADD COLUMN sourceDevice INTEGER; UPDATE unprocessed SET sourceDevice = legacySourceDevice; ALTER TABLE unprocessed DROP COLUMN legacySourceDevice; `; db.exec(query); } __name(updateToSchemaVersion1290, "updateToSchemaVersion1290"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var sticker_pack_refs_std_exports = {}; __export(sticker_pack_refs_std_exports, { default: () => updateToSchemaVersion1300 }); module.exports = __toCommonJS(sticker_pack_refs_std_exports); var import_util_std = require("../util.std.js"); function updateToSchemaVersion1300(db) { const [query] = import_util_std.sql` ALTER TABLE sticker_references ADD COLUMN stickerId INTEGER NOT NULL DEFAULT -1; ALTER TABLE sticker_references ADD COLUMN isUnresolved INTEGER NOT NULL DEFAULT 0; CREATE INDEX unresolved_sticker_refs ON sticker_references (packId, stickerId) WHERE isUnresolved IS 1; `; db.exec(query); } __name(updateToSchemaVersion1300, "updateToSchemaVersion1300"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var muted_fixup_std_exports = {}; __export(muted_fixup_std_exports, { default: () => updateToSchemaVersion1310 }); module.exports = __toCommonJS(muted_fixup_std_exports); var import_util_std = require("../util.std.js"); const MAX_SAFE_DATE = 864e13; function updateToSchemaVersion1310(db, logger) { const [query, params] = import_util_std.sql` UPDATE conversations SET json = json_replace( json, '$.muteExpiresAt', 9007199254740991 -- max safe integer ) WHERE json ->> '$.muteExpiresAt' IS ${MAX_SAFE_DATE}; `; const { changes } = db.prepare(query).run(params); if (changes !== 0) { logger.warn(`fixed ${changes} conversations`); } } __name(updateToSchemaVersion1310, "updateToSchemaVersion1310"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var unprocessed_received_at_date_std_exports = {}; __export(unprocessed_received_at_date_std_exports, { default: () => updateToSchemaVersion1320 }); module.exports = __toCommonJS(unprocessed_received_at_date_std_exports); var import_util_std = require("../util.std.js"); function updateToSchemaVersion1320(db) { const [query] = import_util_std.sql` DROP INDEX unprocessed_timestamp; ALTER TABLE unprocessed ADD COLUMN receivedAtDate INTEGER DEFAULT 0 NOT NULL; UPDATE unprocessed SET receivedAtDate = timestamp; CREATE INDEX unprocessed_byReceivedAtDate ON unprocessed (receivedAtDate); `; db.exec(query); } __name(updateToSchemaVersion1320, "updateToSchemaVersion1320"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var sync_tasks_type_index_std_exports = {}; __export(sync_tasks_type_index_std_exports, { default: () => updateToSchemaVersion1330 }); module.exports = __toCommonJS(sync_tasks_type_index_std_exports); var import_util_std = require("../util.std.js"); function updateToSchemaVersion1330(db) { const [query] = import_util_std.sql` CREATE INDEX syncTasks_type ON syncTasks (type); `; db.exec(query); } __name(updateToSchemaVersion1330, "updateToSchemaVersion1330"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var recent_gifs_std_exports = {}; __export(recent_gifs_std_exports, { default: () => updateToSchemaVersion1340 }); module.exports = __toCommonJS(recent_gifs_std_exports); var import_util_std = require("../util.std.js"); function updateToSchemaVersion1340(db) { const [query] = import_util_std.sql` CREATE TABLE recentGifs ( id TEXT NOT NULL PRIMARY KEY, title TEXT NOT NULL, description TEXT NOT NULL, previewMedia_url TEXT NOT NULL, previewMedia_width INTEGER NOT NULL, previewMedia_height INTEGER NOT NULL, attachmentMedia_url TEXT NOT NULL, attachmentMedia_width INTEGER NOT NULL, attachmentMedia_height INTEGER NOT NULL, lastUsedAt INTEGER NOT NULL ) STRICT; CREATE INDEX recentGifs_order ON recentGifs ( lastUsedAt DESC ); `; db.exec(query); } __name(updateToSchemaVersion1340, "updateToSchemaVersion1340"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var notification_profiles_std_exports = {}; __export(notification_profiles_std_exports, { default: () => updateToSchemaVersion1350 }); module.exports = __toCommonJS(notification_profiles_std_exports); var import_util_std = require("../util.std.js"); function updateToSchemaVersion1350(db) { const [query] = import_util_std.sql` CREATE TABLE notificationProfiles( id TEXT PRIMARY KEY NOT NULL, name TEXT NOT NULL, emoji TEXT, /* A numeric representation of a color, like 0xAARRGGBB */ color INTEGER NOT NULL, createdAtMs INTEGER NOT NULL, allowAllCalls INTEGER NOT NULL, allowAllMentions INTEGER NOT NULL, /* A JSON array of conversationId strings */ allowedMembersJson TEXT NOT NULL, scheduleEnabled INTEGER NOT NULL, /* 24-hour clock int, 0000-2359 (e.g., 15, 900, 1130, 2345) */ scheduleStartTime INTEGER, scheduleEndTime INTEGER, /* A JSON object with true/false for each of the numbers in the Protobuf enum */ scheduleDaysEnabledJson TEXT, deletedAtTimestampMs INTEGER, storageID TEXT, storageVersion INTEGER, storageUnknownFields BLOB, storageNeedsSync INTEGER NOT NULL DEFAULT 0 ) STRICT; `; db.exec(query); } __name(updateToSchemaVersion1350, "updateToSchemaVersion1350"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var attachments_std_exports = {}; __export(attachments_std_exports, { default: () => updateToSchemaVersion1360 }); module.exports = __toCommonJS(attachments_std_exports); function updateToSchemaVersion1360(db) { db.exec(` DROP TABLE IF EXISTS message_attachments; `); db.exec(` CREATE TABLE message_attachments ( messageId TEXT NOT NULL REFERENCES messages(id) ON DELETE CASCADE, -- For editHistoryIndex to be part of the primary key, it cannot be NULL in strict tables. -- For that reason, we use a value of -1 to indicate that it is the root message (not in editHistory) editHistoryIndex INTEGER NOT NULL, attachmentType TEXT NOT NULL, -- 'long-message' | 'quote' | 'attachment' | 'preview' | 'contact' | 'sticker' orderInMessage INTEGER NOT NULL, conversationId TEXT NOT NULL, sentAt INTEGER NOT NULL, clientUuid TEXT, size INTEGER NOT NULL, contentType TEXT NOT NULL, path TEXT, plaintextHash TEXT, localKey TEXT, caption TEXT, fileName TEXT, blurHash TEXT, height INTEGER, width INTEGER, digest TEXT, key TEXT, iv TEXT, downloadPath TEXT, version INTEGER, incrementalMac TEXT, incrementalMacChunkSize INTEGER, transitCdnKey TEXT, transitCdnNumber INTEGER, transitCdnUploadTimestamp INTEGER, backupMediaName TEXT, backupCdnNumber INTEGER, isReencryptableToSameDigest INTEGER, reencryptionIv TEXT, reencryptionKey TEXT, reencryptionDigest TEXT, thumbnailPath TEXT, thumbnailSize INTEGER, thumbnailContentType TEXT, thumbnailLocalKey TEXT, thumbnailVersion INTEGER, screenshotPath TEXT, screenshotSize INTEGER, screenshotContentType TEXT, screenshotLocalKey TEXT, screenshotVersion INTEGER, backupThumbnailPath TEXT, backupThumbnailSize INTEGER, backupThumbnailContentType TEXT, backupThumbnailLocalKey TEXT, backupThumbnailVersion INTEGER, storyTextAttachmentJson TEXT, localBackupPath TEXT, flags INTEGER, error INTEGER, wasTooBig INTEGER, isCorrupted INTEGER, copiedFromQuotedAttachment INTEGER, pending INTEGER, backfillError INTEGER, PRIMARY KEY (messageId, editHistoryIndex, attachmentType, orderInMessage) ) STRICT; `); } __name(updateToSchemaVersion1360, "updateToSchemaVersion1360"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var message_attachment_indexes_std_exports = {}; __export(message_attachment_indexes_std_exports, { default: () => updateToSchemaVersion1370 }); module.exports = __toCommonJS(message_attachment_indexes_std_exports); function updateToSchemaVersion1370(db) { db.exec(` DROP INDEX IF EXISTS message_attachments_messageId; DROP INDEX IF EXISTS message_attachments_plaintextHash; DROP INDEX IF EXISTS message_attachments_path; DROP INDEX IF EXISTS message_attachments_all_thumbnailPath; DROP INDEX IF EXISTS message_attachments_all_screenshotPath; DROP INDEX IF EXISTS message_attachments_all_backupThumbnailPath; `); } __name(updateToSchemaVersion1370, "updateToSchemaVersion1370"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var donation_receipts_std_exports = {}; __export(donation_receipts_std_exports, { default: () => updateToSchemaVersion1380 }); module.exports = __toCommonJS(donation_receipts_std_exports); function updateToSchemaVersion1380(db) { db.exec(` CREATE TABLE donationReceipts( id TEXT NOT NULL PRIMARY KEY, currencyType TEXT NOT NULL, paymentAmount INTEGER NOT NULL, paymentDetailJson TEXT NOT NULL, paymentType TEXT NOT NULL, timestamp INTEGER NOT NULL ) STRICT; CREATE INDEX donationReceipts_byTimestamp on donationReceipts(timestamp); `); } __name(updateToSchemaVersion1380, "updateToSchemaVersion1380"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var attachment_download_keys_std_exports = {}; __export(attachment_download_keys_std_exports, { default: () => updateToSchemaVersion1390 }); module.exports = __toCommonJS(attachment_download_keys_std_exports); function updateToSchemaVersion1390(db) { db.exec(` ALTER TABLE attachment_downloads RENAME COLUMN digest TO attachmentSignature; `); db.exec(` ALTER TABLE message_attachments DROP COLUMN iv; ALTER TABLE message_attachments DROP COLUMN isReencryptableToSameDigest; ALTER TABLE message_attachments DROP COLUMN reencryptionIv; ALTER TABLE message_attachments DROP COLUMN reencryptionKey; ALTER TABLE message_attachments DROP COLUMN reencryptionDigest; ALTER TABLE message_attachments DROP COLUMN backupMediaName; `); db.exec(` UPDATE message_attachments SET backupCdnNumber = NULL; `); } __name(updateToSchemaVersion1390, "updateToSchemaVersion1390"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var simplify_receipts_std_exports = {}; __export(simplify_receipts_std_exports, { default: () => updateToSchemaVersion1400 }); module.exports = __toCommonJS(simplify_receipts_std_exports); function updateToSchemaVersion1400(db) { db.exec(` ALTER TABLE donationReceipts DROP COLUMN paymentDetailJson; ALTER TABLE donationReceipts DROP COLUMN paymentType; `); } __name(updateToSchemaVersion1400, "updateToSchemaVersion1400"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var remove_wallpaper_std_exports = {}; __export(remove_wallpaper_std_exports, { default: () => updateToSchemaVersion1410 }); module.exports = __toCommonJS(remove_wallpaper_std_exports); function updateToSchemaVersion1410(db) { db.exec(` UPDATE conversations SET json = json_remove(json, '$.wallpaperPreset', '$.wallpaperPhotoPointerBase64', '$.dimWallpaperInDarkMode', '$.autoBubbleColor' ); DELETE FROM items WHERE id IN ( 'defaultWallpaperPhotoPointer', 'defaultWallpaperPreset', 'defaultDimWallpaperInDarkMode', 'defaultAutoBubbleColor' ); `); } __name(updateToSchemaVersion1410, "updateToSchemaVersion1410"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var backup_downloads_std_exports = {}; __export(backup_downloads_std_exports, { default: () => updateToSchemaVersion1420 }); module.exports = __toCommonJS(backup_downloads_std_exports); var import_Interface_std = require("../Interface.std.js"); function updateToSchemaVersion1420(db) { db.exec(` ALTER TABLE attachment_downloads ADD COLUMN originalSource TEXT NOT NULL DEFAULT ${import_Interface_std.AttachmentDownloadSource.STANDARD}; UPDATE attachment_downloads SET originalSource = source; `); db.exec(` CREATE TABLE attachment_downloads_backup_stats ( id INTEGER PRIMARY KEY CHECK (id = 0), totalBytes INTEGER NOT NULL, completedBytes INTEGER NOT NULL ) STRICT; INSERT INTO attachment_downloads_backup_stats (id, totalBytes, completedBytes) VALUES (0, 0, 0); CREATE TRIGGER attachment_downloads_backup_job_insert AFTER INSERT ON attachment_downloads WHEN NEW.originalSource = 'backup_import' BEGIN UPDATE attachment_downloads_backup_stats SET totalBytes = totalBytes + NEW.ciphertextSize; END; CREATE TRIGGER attachment_downloads_backup_job_update AFTER UPDATE OF ciphertextSize ON attachment_downloads WHEN NEW.originalSource = 'backup_import' BEGIN UPDATE attachment_downloads_backup_stats SET totalBytes = MAX(0, totalBytes - OLD.ciphertextSize + NEW.ciphertextSize) WHERE id = 0; END; CREATE TRIGGER attachment_downloads_backup_job_delete AFTER DELETE ON attachment_downloads WHEN OLD.originalSource = 'backup_import' BEGIN UPDATE attachment_downloads_backup_stats SET completedBytes = completedBytes + OLD.ciphertextSize WHERE id = 0; END; `); } __name(updateToSchemaVersion1420, "updateToSchemaVersion1420"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var call_links_epoch_id_std_exports = {}; __export(call_links_epoch_id_std_exports, { default: () => updateToSchemaVersion1430 }); module.exports = __toCommonJS(call_links_epoch_id_std_exports); function updateToSchemaVersion1430(db) { db.exec(` ALTER TABLE callLinks ADD COLUMN epoch BLOB; `); db.exec(` ALTER TABLE defunctCallLinks ADD COLUMN epoch BLOB; `); } __name(updateToSchemaVersion1430, "updateToSchemaVersion1430"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var chat_folders_std_exports = {}; __export(chat_folders_std_exports, { default: () => updateToSchemaVersion1440 }); module.exports = __toCommonJS(chat_folders_std_exports); var import_util_std = require("../util.std.js"); function updateToSchemaVersion1440(db) { const [query] = import_util_std.sql` CREATE TABLE chatFolders ( id TEXT NOT NULL PRIMARY KEY, folderType INTEGER NOT NULL, name TEXT NOT NULL, position INTEGER NOT NULL, showOnlyUnread INTEGER NOT NULL, showMutedChats INTEGER NOT NULL, includeAllIndividualChats INTEGER NOT NULL, includeAllGroupChats INTEGER NOT NULL, includedConversationIds TEXT NOT NULL, excludedConversationIds TEXT NOT NULL, deletedAtTimestampMs INTEGER NOT NULL, storageID TEXT, storageVersion INTEGER, storageUnknownFields BLOB, storageNeedsSync INTEGER NOT NULL ) STRICT; CREATE INDEX chatFolders_by_position on chatFolders (position); `; db.exec(query); } __name(updateToSchemaVersion1440, "updateToSchemaVersion1440"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var all_media_std_exports = {}; __export(all_media_std_exports, { default: () => updateToSchemaVersion1450 }); module.exports = __toCommonJS(all_media_std_exports); function updateToSchemaVersion1450(db) { db.exec(` ALTER TABLE message_attachments ADD COLUMN messageType TEXT; ALTER TABLE message_attachments ADD COLUMN receivedAt INTEGER; ALTER TABLE message_attachments ADD COLUMN receivedAtMs INTEGER; ALTER TABLE message_attachments ADD COLUMN isViewOnce INTEGER; `); db.exec(` UPDATE message_attachments SET messageType = messages.type, receivedAt = messages.received_at, receivedAtMs = messages.received_at_ms, isViewOnce = messages.isViewOnce FROM ( SELECT id, type, received_at, received_at_ms, isViewOnce FROM messages ) AS messages WHERE message_attachments.messageId IS messages.id `); db.exec(` CREATE INDEX message_attachments_getOlderMedia ON message_attachments (conversationId, attachmentType, receivedAt DESC, sentAt DESC) WHERE editHistoryIndex IS -1 AND messageType IN ('incoming', 'outgoing') AND isViewOnce IS NOT 1 `); } __name(updateToSchemaVersion1450, "updateToSchemaVersion1450"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var attachment_duration_std_exports = {}; __export(attachment_duration_std_exports, { default: () => updateToSchemaVersion1460 }); module.exports = __toCommonJS(attachment_duration_std_exports); function updateToSchemaVersion1460(db) { db.exec(` ALTER TABLE message_attachments ADD COLUMN duration REAL; `); } __name(updateToSchemaVersion1460, "updateToSchemaVersion1460"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var kyber_triple_std_exports = {}; __export(kyber_triple_std_exports, { default: () => updateToSchemaVersion1460 }); module.exports = __toCommonJS(kyber_triple_std_exports); function updateToSchemaVersion1460(db) { db.exec(` CREATE TABLE kyberPreKey_triples ( id TEXT NOT NULL REFERENCES kyberPreKeys(id) ON DELETE CASCADE, signedPreKeyId INTEGER NOT NULL, baseKey BLOB NOT NULL, UNIQUE(id, signedPreKeyId, baseKey) ON CONFLICT FAIL ) STRICT; `); } __name(updateToSchemaVersion1460, "updateToSchemaVersion1460"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var chat_folders_remove_duplicates_std_exports = {}; __export(chat_folders_remove_duplicates_std_exports, { default: () => updateToSchemaVersion1480 }); module.exports = __toCommonJS(chat_folders_remove_duplicates_std_exports); var import_util_std = require("../util.std.js"); function updateToSchemaVersion1480(db, logger) { const [query, params] = import_util_std.sql` DELETE FROM chatFolders WHERE folderType IS 1 AND id NOT IN ( SELECT id FROM chatFolders WHERE folderType IS 1 ORDER BY storageVersion DESC LIMIT 1 ) `; const result = db.prepare(query).run(params); logger.info(`Removed ${result.changes} duplicate all chats chat folders`); } __name(updateToSchemaVersion1480, "updateToSchemaVersion1480"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var lowercase_notification_profiles_std_exports = {}; __export(lowercase_notification_profiles_std_exports, { default: () => updateToSchemaVersion1490 }); module.exports = __toCommonJS(lowercase_notification_profiles_std_exports); var import_util_std = require("../util.std.js"); function updateToSchemaVersion1490(db, logger) { const [query, params] = import_util_std.sql` DELETE FROM notificationProfiles WHERE id != lower(id); `; const result = db.prepare(query).run(params); logger.info( `Removed ${result.changes} notification profiles with non-lowercase ids` ); } __name(updateToSchemaVersion1490, "updateToSchemaVersion1490"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var search_polls_std_exports = {}; __export(search_polls_std_exports, { createMessagesOnInsertTrigger: () => createMessagesOnInsertTrigger, default: () => updateToSchemaVersion1500 }); module.exports = __toCommonJS(search_polls_std_exports); var import_util_std = require("../util.std.js"); const createMessagesOnInsertTrigger = import_util_std.sql` CREATE TRIGGER messages_on_insert AFTER INSERT ON messages WHEN new.isSearchable IS 1 BEGIN INSERT INTO messages_fts (rowid, body) VALUES (new.rowid, new.searchableText); END; `[0]; const createMessagesOnUpdateTrigger = import_util_std.sql` CREATE TRIGGER messages_on_update AFTER UPDATE ON messages WHEN new.isSearchable IS 1 AND old.searchableText IS NOT new.searchableText BEGIN UPDATE messages_fts SET body = new.searchableText WHERE rowId = new.rowId; END; `[0]; function updateToSchemaVersion1500(db) { db.exec( `ALTER TABLE messages ADD COLUMN isSearchable INT GENERATED ALWAYS AS (isViewOnce IS NOT 1 AND storyId IS NULL) VIRTUAL;` ); db.exec(` ALTER TABLE messages ADD COLUMN searchableText TEXT GENERATED ALWAYS AS ( CASE WHEN json->'poll' IS NOT NULL THEN json->'poll'->>'question' ELSE body END ) VIRTUAL; `); db.exec("DROP TRIGGER IF EXISTS messages_on_insert;"); db.exec(createMessagesOnInsertTrigger); db.exec("DROP TRIGGER IF EXISTS messages_on_update;"); db.exec(createMessagesOnUpdateTrigger); } __name(updateToSchemaVersion1500, "updateToSchemaVersion1500"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { createMessagesOnInsertTrigger }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var chat_folders_normalize_all_chats_std_exports = {}; __export(chat_folders_normalize_all_chats_std_exports, { default: () => updateToSchemaVersion1510 }); module.exports = __toCommonJS(chat_folders_normalize_all_chats_std_exports); var import_util_std = require("../util.std.js"); function updateToSchemaVersion1510(db, logger) { const FOLDER_TYPE_ALL = 1; const [query, params] = import_util_std.sql` UPDATE chatFolders SET includeAllIndividualChats = 1, includeAllGroupChats = 1, storageNeedsSync = 1 WHERE folderType = ${FOLDER_TYPE_ALL} AND ( includeAllIndividualChats IS 0 OR includeAllGroupChats IS 0 ) `; const result = db.prepare(query).run(params); logger.info(`Updated ${result.changes} all chats chat folders`); } __name(updateToSchemaVersion1510, "updateToSchemaVersion1510"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var poll_votes_unread_std_exports = {}; __export(poll_votes_unread_std_exports, { default: () => updateToSchemaVersion1510 }); module.exports = __toCommonJS(poll_votes_unread_std_exports); function updateToSchemaVersion1510(db) { db.exec(` -- Add hasUnreadPollVotes column to messages table ALTER TABLE messages ADD COLUMN hasUnreadPollVotes INTEGER NOT NULL DEFAULT 0; -- Create partial index for efficient queries -- Only indexes rows where hasUnreadPollVotes = 1 CREATE INDEX messages_unread_poll_votes ON messages ( conversationId, received_at ) WHERE hasUnreadPollVotes = 1 AND type IS 'outgoing'; `); } __name(updateToSchemaVersion1510, "updateToSchemaVersion1510"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var update_expiring_index_std_exports = {}; __export(update_expiring_index_std_exports, { default: () => updateToSchemaVersion1530 }); module.exports = __toCommonJS(update_expiring_index_std_exports); function updateToSchemaVersion1530(db) { db.exec(` ALTER TABLE messages ADD COLUMN hasExpireTimer INTEGER NOT NULL GENERATED ALWAYS AS (COALESCE(expireTimer, 0) > 0) VIRTUAL; `); } __name(updateToSchemaVersion1530, "updateToSchemaVersion1530"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var partial_expiring_index_std_exports = {}; __export(partial_expiring_index_std_exports, { default: () => updateToSchemaVersion1540 }); module.exports = __toCommonJS(partial_expiring_index_std_exports); function updateToSchemaVersion1540(db) { db.exec( "DROP INDEX IF EXISTS messages_conversationId_hasExpireTimer_expirationStartTimestamp;" ); db.exec(` CREATE INDEX messages_conversationId_expirationStartTimestamp ON messages (conversationId, expirationStartTimestamp) WHERE hasExpireTimer IS 1; `); } __name(updateToSchemaVersion1540, "updateToSchemaVersion1540"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var has_link_preview_std_exports = {}; __export(has_link_preview_std_exports, { default: () => updateToSchemaVersion1550 }); module.exports = __toCommonJS(has_link_preview_std_exports); function updateToSchemaVersion1550(db) { db.exec(` ALTER TABLE messages ADD COLUMN hasPreviews INTEGER NOT NULL GENERATED ALWAYS AS ( IFNULL(json_array_length(json, '$.preview'), 0) > 0 ); CREATE INDEX messages_hasPreviews ON messages (conversationId, received_at DESC, sent_at DESC) WHERE hasPreviews IS 1 AND isViewOnce IS NOT 1 AND type IN ('incoming', 'outgoing'); `); } __name(updateToSchemaVersion1550, "updateToSchemaVersion1550"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var pinned_messages_std_exports = {}; __export(pinned_messages_std_exports, { default: () => updateToSchemaVersion1560 }); module.exports = __toCommonJS(pinned_messages_std_exports); var import_util_std = require("../util.std.js"); function updateToSchemaVersion1560(db) { const [query] = import_util_std.sql` CREATE TABLE pinnedMessages ( id INTEGER PRIMARY KEY AUTOINCREMENT, conversationId TEXT NOT NULL REFERENCES conversations(id) ON DELETE CASCADE, messageId TEXT NOT NULL REFERENCES messages(id) ON DELETE CASCADE, messageSentAt INTEGER NOT NULL, messageSenderAci TEXT NOT NULL, pinnedByAci TEXT NOT NULL, pinnedAt INTEGER NOT NULL, expiresAt INTEGER, UNIQUE (conversationId, messageId) ) STRICT; CREATE INDEX pinnedMessages_byConversation ON pinnedMessages( conversationId, pinnedAt DESC, messageId ); CREATE INDEX pinnedMessages_byExpiresAt ON pinnedMessages( expiresAt ASC ) WHERE expiresAt IS NOT NULL; `; db.exec(query); } __name(updateToSchemaVersion1560, "updateToSchemaVersion1560"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var cleanup_polls_std_exports = {}; __export(cleanup_polls_std_exports, { default: () => updateToSchemaVersion1561 }); module.exports = __toCommonJS(cleanup_polls_std_exports); var import_util_std = require("../util.std.js"); function updateToSchemaVersion1561(db, logger) { const [query, params] = import_util_std.sql` UPDATE messages SET json = json_remove(json, '$.poll'), hasUnreadPollVotes = 0 WHERE isErased = 1 AND ( json->'poll' IS NOT NULL OR hasUnreadPollVotes IS NOT 0 ) `; const result = db.prepare(query).run(params); logger.info(`Updated ${result.changes} poll messages`); } __name(updateToSchemaVersion1561, "updateToSchemaVersion1561"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var pinned_messages_updates_std_exports = {}; __export(pinned_messages_updates_std_exports, { default: () => updateToSchemaVersion1570 }); module.exports = __toCommonJS(pinned_messages_updates_std_exports); var import_util_std = require("../util.std.js"); function updateToSchemaVersion1570(db) { const [query] = import_util_std.sql` -- We only need the 'messageId' column ALTER TABLE pinnedMessages DROP COLUMN messageSentAt; ALTER TABLE pinnedMessages DROP COLUMN messageSenderAci; -- We dont need to know who pinned the message ALTER TABLE pinnedMessages DROP COLUMN pinnedByAci; `; db.exec(query); } __name(updateToSchemaVersion1570, "updateToSchemaVersion1570"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var expired_group_replies_std_exports = {}; __export(expired_group_replies_std_exports, { default: () => updateToSchemaVersion1580 }); module.exports = __toCommonJS(expired_group_replies_std_exports); var import_util_std = require("../util.std.js"); function updateToSchemaVersion1580(db, logger) { const [query] = import_util_std.sql` DELETE FROM messages WHERE id IN ( SELECT messages.id from messages INNER JOIN conversations ON messages.conversationId = conversations.id WHERE conversations.type = 'group' AND messages.storyId IS NOT NULL AND NOT EXISTS ( SELECT 1 FROM messages AS messages_exists WHERE messages.storyId = messages_exists.id AND messages_exists.isErased IS NOT 1 ) ) `; const result = db.prepare(query).run(); if (result.changes > 0) { logger.warn( `Deleted ${result.changes} group story replies without matching stories` ); } } __name(updateToSchemaVersion1580, "updateToSchemaVersion1580"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var megaphones_std_exports = {}; __export(megaphones_std_exports, { default: () => updateToSchemaVersion1590 }); module.exports = __toCommonJS(megaphones_std_exports); var import_util_std = require("../util.std.js"); function updateToSchemaVersion1590(db) { const [query] = import_util_std.sql` CREATE TABLE megaphones ( id TEXT NOT NULL PRIMARY KEY, desktopMinVersion TEXT, priority INTEGER NOT NULL, dontShowBeforeEpochMs INTEGER NOT NULL, dontShowAfterEpochMs INTEGER NOT NULL, showForNumberOfDays INTEGER NOT NULL, primaryCtaId TEXT, secondaryCtaId TEXT, primaryCtaDataJson TEXT, secondaryCtaDataJson TEXT, conditionalId TEXT, title TEXT NOT NULL, body TEXT NOT NULL, primaryCtaText TEXT, secondaryCtaText TEXT, imagePath TEXT, localeFetched TEXT NOT NULL, shownAt INTEGER, snoozedAt INTEGER, snoozeCount INTEGER NOT NULL, isFinished INTEGER NOT NULL ) STRICT; `; db.exec(query); } __name(updateToSchemaVersion1590, "updateToSchemaVersion1590"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var deduplicate_usernames_std_exports = {}; __export(deduplicate_usernames_std_exports, { default: () => updateToSchemaVersion1600 }); module.exports = __toCommonJS(deduplicate_usernames_std_exports); var import_util_std = require("../util.std.js"); function updateToSchemaVersion1600(db, logger) { const jsonPatch = JSON.stringify({ username: null, needsStorageServiceSync: true }); const [query, params] = import_util_std.sql` WITH rowsKeepingUsername AS ( SELECT rowId, json ->> '$.username' AS username, MAX(active_at) FROM conversations WHERE username IS NOT NULL GROUP BY username ) UPDATE conversations AS c SET json = json_patch(json, ${jsonPatch}) WHERE json ->> '$.username' IS NOT NULL AND c.rowId NOT IN ( SELECT rowId from rowsKeepingUsername ); `; const result = db.prepare(query).run(params); if (result.changes > 0) { logger.warn( `Removed duplicate usernames from ${result.changes} conversations` ); } } __name(updateToSchemaVersion1600, "updateToSchemaVersion1600"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var has_contacts_std_exports = {}; __export(has_contacts_std_exports, { default: () => updateToSchemaVersion1610 }); module.exports = __toCommonJS(has_contacts_std_exports); function updateToSchemaVersion1610(db) { db.exec(` ALTER TABLE messages ADD COLUMN hasContacts INTEGER NOT NULL GENERATED ALWAYS AS ( IFNULL(json_array_length(json, '$.contact'), 0) > 0 ); CREATE INDEX messages_hasContacts ON messages (conversationId, received_at DESC, sent_at DESC) WHERE hasContacts IS 1 AND isViewOnce IS NOT 1 AND type IN ('incoming', 'outgoing'); `); } __name(updateToSchemaVersion1610, "updateToSchemaVersion1610"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var sort_bigger_media_std_exports = {}; __export(sort_bigger_media_std_exports, { default: () => updateToSchemaVersion1620 }); module.exports = __toCommonJS(sort_bigger_media_std_exports); function updateToSchemaVersion1620(db) { db.exec(` CREATE INDEX message_attachments_sortBiggerMedia ON message_attachments (conversationId, attachmentType, size DESC, receivedAt DESC, sentAt DESC) WHERE editHistoryIndex IS -1 AND messageType IN ('incoming', 'outgoing') AND isViewOnce IS NOT 1; `); } __name(updateToSchemaVersion1620, "updateToSchemaVersion1620"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var message_pin_message_data_std_exports = {}; __export(message_pin_message_data_std_exports, { default: () => updateToSchemaVersion1630 }); module.exports = __toCommonJS(message_pin_message_data_std_exports); var import_isAciString_std = require("../../util/isAciString.std.js"); var import_util_std = require("../util.std.js"); function getAllPins(db) { const [query, params] = import_util_std.sql` SELECT pin.id AS pinMessageId, target.sourceServiceId AS targetAuthorAci, target.sent_at AS targetSentTimestamp FROM messages AS pin LEFT JOIN messages AS target ON pin.json ->> '$.pinnedMessageId' = target.id WHERE pin.type IS 'pinned-message-notification' `; return db.prepare(query).all(params); } __name(getAllPins, "getAllPins"); function getReasonCannotUpdate(pin) { if (pin.targetSentTimestamp == null) { return "target message not found"; } if (pin.targetAuthorAci == null) { return "target message missing sourceServiceId"; } if (!(0, import_isAciString_std.isAciString)(pin.targetAuthorAci)) { return "target message sourceServiceId is not aci"; } return null; } __name(getReasonCannotUpdate, "getReasonCannotUpdate"); function updatePin(db, pin) { const [query, params] = import_util_std.sql` UPDATE messages SET json = json_patch(json, ${JSON.stringify({ pinnedMessageId: null, pinMessage: { targetAuthorAci: pin.targetAuthorAci, targetSentTimestamp: pin.targetSentTimestamp } })}) WHERE id = ${pin.pinMessageId}; `; db.prepare(query).run(params); } __name(updatePin, "updatePin"); function deletePin(db, pin) { const [query, params] = import_util_std.sql` DELETE FROM messages WHERE id = ${pin.pinMessageId}; `; db.prepare(query).run(params); } __name(deletePin, "deletePin"); function updateToSchemaVersion1630(db, logger) { for (const pin of getAllPins(db)) { const reason = getReasonCannotUpdate(pin); if (reason == null) { updatePin(db, pin); } else { deletePin(db, pin); logger.warn( `Dropped pin message ${pin.pinMessageId} (reason: ${reason})` ); } } } __name(updateToSchemaVersion1630, "updateToSchemaVersion1630"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var key_transparency_std_exports = {}; __export(key_transparency_std_exports, { default: () => updateToSchemaVersion1640 }); module.exports = __toCommonJS(key_transparency_std_exports); function updateToSchemaVersion1640(db) { db.exec(` CREATE TABLE key_transparency_account_data ( aci TEXT NOT NULL PRIMARY KEY, data BLOB NOT NULL ) STRICT; `); } __name(updateToSchemaVersion1640, "updateToSchemaVersion1640"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var protected_attachments_std_exports = {}; __export(protected_attachments_std_exports, { default: () => updateToSchemaVersion1650 }); module.exports = __toCommonJS(protected_attachments_std_exports); function updateToSchemaVersion1650(db) { db.exec(` CREATE TABLE attachments_protected_from_deletion ( path TEXT NOT NULL, UNIQUE (path) ) STRICT; `); db.exec(` CREATE INDEX message_attachments_plaintextHash ON message_attachments (plaintextHash); `); db.exec(` CREATE INDEX message_attachments_path ON message_attachments (path); `); db.exec(` CREATE INDEX message_attachments_thumbnailPath ON message_attachments (thumbnailPath); `); db.exec(` CREATE INDEX message_attachments_screenshotPath ON message_attachments (screenshotPath); `); db.exec(` CREATE INDEX message_attachments_backupThumbnailPath ON message_attachments (backupThumbnailPath); `); db.exec(` CREATE TRIGGER stop_protecting_attachments_after_update AFTER UPDATE OF path, thumbnailPath, screenshotPath, backupThumbnailPath ON message_attachments WHEN OLD.path IS NOT NEW.path OR OLD.thumbnailPath IS NOT NEW.thumbnailPath OR OLD.screenshotPath IS NOT NEW.screenshotPath OR OLD.backupThumbnailPath IS NOT NEW.backupThumbnailPath BEGIN DELETE FROM attachments_protected_from_deletion WHERE path IN (NEW.path, NEW.thumbnailPath, NEW.screenshotPath, NEW.backupThumbnailPath); END; `); db.exec(` CREATE TRIGGER stop_protecting_attachments_after_insert AFTER INSERT ON message_attachments BEGIN DELETE FROM attachments_protected_from_deletion WHERE path IN (NEW.path, NEW.thumbnailPath, NEW.screenshotPath, NEW.backupThumbnailPath); END; `); } __name(updateToSchemaVersion1650, "updateToSchemaVersion1650"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var protected_attachments_non_unique_std_exports = {}; __export(protected_attachments_non_unique_std_exports, { default: () => updateToSchemaVersion1660 }); module.exports = __toCommonJS(protected_attachments_non_unique_std_exports); function updateToSchemaVersion1660(db) { db.exec(` DROP TABLE attachments_protected_from_deletion; CREATE TABLE attachments_protected_from_deletion ( path TEXT NOT NULL, messageId TEXT NOT NULL, PRIMARY KEY (path, messageId) ) STRICT; `); db.exec(` DROP TRIGGER stop_protecting_attachments_after_update; CREATE TRIGGER stop_protecting_attachments_after_update AFTER UPDATE OF path, thumbnailPath, screenshotPath, backupThumbnailPath ON message_attachments WHEN OLD.path IS NOT NEW.path OR OLD.thumbnailPath IS NOT NEW.thumbnailPath OR OLD.screenshotPath IS NOT NEW.screenshotPath OR OLD.backupThumbnailPath IS NOT NEW.backupThumbnailPath BEGIN DELETE FROM attachments_protected_from_deletion WHERE messageId IS NEW.messageId AND path IN ( NEW.path, NEW.thumbnailPath, NEW.screenshotPath, NEW.backupThumbnailPath ); END; `); db.exec(` DROP TRIGGER stop_protecting_attachments_after_insert; CREATE TRIGGER stop_protecting_attachments_after_insert AFTER INSERT ON message_attachments BEGIN DELETE FROM attachments_protected_from_deletion WHERE messageId IS NEW.messageId AND path IN ( NEW.path, NEW.thumbnailPath, NEW.screenshotPath, NEW.backupThumbnailPath ); END; `); } __name(updateToSchemaVersion1660, "updateToSchemaVersion1660"); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var uuid_keys_std_exports = {}; __export(uuid_keys_std_exports, { default: () => updateToSchemaVersion41, getOurUuid: () => getOurUuid }); module.exports = __toCommonJS(uuid_keys_std_exports); var import_isValidUuid_std = require("../../util/isValidUuid.std.js"); var import_Helpers_std = __toESM(require("../../textsecure/Helpers.std.js")); var import_util_std = require("../util.std.js"); function getOurUuid(db) { const UUID_ID = "uuid_id"; const row = db.prepare("SELECT json FROM items WHERE id = $id;").get({ id: UUID_ID }); if (!row) { return void 0; } const { value } = JSON.parse(row.json); const [ourUuid] = import_Helpers_std.default.unencodeNumber(String(value).toLowerCase()); return ourUuid; } __name(getOurUuid, "getOurUuid"); function updateToSchemaVersion41(db, logger) { const getConversationUuid = db.prepare( ` SELECT uuid FROM conversations WHERE id = $conversationId `, { pluck: true } ); const getConversationStats = db.prepare( ` SELECT uuid, e164, active_at FROM conversations WHERE id = $conversationId ` ); const compareConvoRecency = /* @__PURE__ */ __name((a, b) => { const aStats = getConversationStats.get({ conversationId: a }); const bStats = getConversationStats.get({ conversationId: b }); const isAComplete = Boolean(aStats?.uuid && aStats?.e164); const isBComplete = Boolean(bStats?.uuid && bStats?.e164); if (!isAComplete && !isBComplete) { return 0; } if (!isAComplete) { return -1; } if (!isBComplete) { return 1; } return (aStats?.active_at ?? 0) - (bStats?.active_at ?? 0); }, "compareConvoRecency"); const clearSessionsAndKeys = /* @__PURE__ */ __name(() => { const keyCount = [ db.prepare("DELETE FROM senderKeys").run().changes, db.prepare("DELETE FROM sessions").run().changes, db.prepare("DELETE FROM signedPreKeys").run().changes, db.prepare("DELETE FROM preKeys").run().changes ].reduce((a, b) => a + b); (0, import_util_std.removeById)(db, "items", "identityKey"); (0, import_util_std.removeById)(db, "items", "registrationId"); return keyCount; }, "clearSessionsAndKeys"); const moveIdentityKeyToMap = /* @__PURE__ */ __name((ourUuid2) => { const identityKey = (0, import_util_std.getById)( db, "items", "identityKey" ); const registrationId = (0, import_util_std.getById)( db, "items", "registrationId" ); if (identityKey) { (0, import_util_std.createOrUpdate)(db, "items", { id: "identityKeyMap", value: { [ourUuid2]: identityKey.value } }); } if (registrationId) { (0, import_util_std.createOrUpdate)(db, "items", { id: "registrationIdMap", value: { [ourUuid2]: registrationId.value } }); } db.exec( ` DELETE FROM items WHERE id = 'identityKey' OR id = 'registrationId'; ` ); }, "moveIdentityKeyToMap"); const prefixKeys = /* @__PURE__ */ __name((ourUuid2) => { for (const table of ["signedPreKeys", "preKeys"]) { db.prepare( ` UPDATE ${table} SET id = $ourUuid || ':' || id, json = json_set( json, '$.id', $ourUuid || ':' || json_extract(json, '$.id'), '$.keyId', json_extract(json, '$.id'), '$.ourUuid', $ourUuid ) ` ).run({ ourUuid: ourUuid2 }); } }, "prefixKeys"); const updateSenderKeys = /* @__PURE__ */ __name((ourUuid2) => { const senderKeys = db.prepare("SELECT id, senderId, lastUpdatedDate FROM senderKeys").all(); logger.info(`Updating ${senderKeys.length} sender keys`); const updateSenderKey = db.prepare( ` UPDATE senderKeys SET id = $newId, senderId = $newSenderId WHERE id = $id ` ); const deleteSenderKey = db.prepare("DELETE FROM senderKeys WHERE id = $id"); const pastKeys = /* @__PURE__ */ new Map(); let updated = 0; let deleted = 0; let skipped = 0; for (const { id, senderId, lastUpdatedDate } of senderKeys) { const [conversationId] = import_Helpers_std.default.unencodeNumber(senderId); const uuid = getConversationUuid.get({ conversationId }); if (!uuid) { deleted += 1; deleteSenderKey.run({ id }); continue; } const newId = `${ourUuid2}:${id.replace(conversationId, uuid)}`; const existing = pastKeys.get(newId); if (existing) { skipped += 1; } else { updated += 1; } const isOlder = existing && (lastUpdatedDate < existing.lastUpdatedDate || compareConvoRecency(conversationId, existing.conversationId) < 0); if (isOlder) { deleteSenderKey.run({ id }); continue; } else if (existing) { deleteSenderKey.run({ id: newId }); } pastKeys.set(newId, { conversationId, lastUpdatedDate }); updateSenderKey.run({ id, newId, newSenderId: `${senderId.replace(conversationId, uuid)}` }); } logger.info( `Updated ${senderKeys.length} sender keys: updated: ${updated}, deleted: ${deleted}, skipped: ${skipped}` ); }, "updateSenderKeys"); const updateSessions = /* @__PURE__ */ __name((ourUuid2) => { const allSessions = db.prepare("SELECT id, conversationId FROM SESSIONS").all(); logger.info(`Updating ${allSessions.length} sessions`); const updateSession = db.prepare( ` UPDATE sessions SET id = $newId, ourUuid = $ourUuid, uuid = $uuid, json = json_set( sessions.json, '$.id', $newId, '$.uuid', $uuid, '$.ourUuid', $ourUuid ) WHERE id = $id ` ); const deleteSession = db.prepare("DELETE FROM sessions WHERE id = $id"); const pastSessions = /* @__PURE__ */ new Map(); let updated = 0; let deleted = 0; let skipped = 0; for (const { id, conversationId } of allSessions) { const uuid = getConversationUuid.get({ conversationId }); if (!uuid) { deleted += 1; deleteSession.run({ id }); continue; } const newId = `${ourUuid2}:${id.replace(conversationId, uuid)}`; const existing = pastSessions.get(newId); if (existing) { skipped += 1; } else { updated += 1; } const isOlder = existing && compareConvoRecency(conversationId, existing.conversationId) < 0; if (isOlder) { deleteSession.run({ id }); continue; } else if (existing) { deleteSession.run({ id: newId }); } pastSessions.set(newId, { conversationId }); updateSession.run({ id, newId, uuid, ourUuid: ourUuid2 }); } logger.info( `Updated ${allSessions.length} sessions: updated: ${updated}, deleted: ${deleted}, skipped: ${skipped}` ); }, "updateSessions"); const updateIdentityKeys = /* @__PURE__ */ __name(() => { const identityKeys = db.prepare("SELECT id FROM identityKeys").all(); logger.info(`Updating ${identityKeys.length} identity keys`); const updateIdentityKey = db.prepare( ` UPDATE OR REPLACE identityKeys SET id = $newId, json = json_set( identityKeys.json, '$.id', $newId ) WHERE id = $id ` ); let migrated = 0; for (const { id } of identityKeys) { const uuid = getConversationUuid.get({ conversationId: id }); let newId; if (uuid) { migrated += 1; newId = uuid; } else { newId = `conversation:${id}`; } updateIdentityKey.run({ id, newId }); } logger.info(`Migrated ${migrated} identity keys`); }, "updateIdentityKeys"); db.exec( ` -- Change type of 'id' column from INTEGER to STRING ALTER TABLE preKeys RENAME TO old_preKeys; ALTER TABLE signedPreKeys RENAME TO old_signedPreKeys; CREATE TABLE preKeys( id STRING PRIMARY KEY ASC, json TEXT ); CREATE TABLE signedPreKeys( id STRING PRIMARY KEY ASC, json TEXT ); -- sqlite handles the type conversion INSERT INTO preKeys SELECT * FROM old_preKeys; INSERT INTO signedPreKeys SELECT * FROM old_signedPreKeys; DROP TABLE old_preKeys; DROP TABLE old_signedPreKeys; -- Alter sessions ALTER TABLE sessions ADD COLUMN ourUuid STRING; ALTER TABLE sessions ADD COLUMN uuid STRING; ` ); const ourUuid = getOurUuid(db); if (!(0, import_isValidUuid_std.isValidUuid)(ourUuid)) { const deleteCount = clearSessionsAndKeys(); if (deleteCount > 0) { logger.error(`no uuid is available, erased ${deleteCount} sessions/keys`); } return; } prefixKeys(ourUuid); updateSenderKeys(ourUuid); updateSessions(ourUuid); moveIdentityKeyToMap(ourUuid); updateIdentityKeys(); } __name(updateToSchemaVersion41, "updateToSchemaVersion41"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getOurUuid }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var stale_reactions_std_exports = {}; __export(stale_reactions_std_exports, { default: () => updateToSchemaVersion42 }); module.exports = __toCommonJS(stale_reactions_std_exports); var import_util_std = require("../util.std.js"); function updateToSchemaVersion42(db, logger) { db.exec(` DROP TRIGGER messages_on_delete; CREATE TRIGGER messages_on_delete AFTER DELETE ON messages BEGIN DELETE FROM messages_fts WHERE rowid = old.rowid; DELETE FROM sendLogPayloads WHERE id IN ( SELECT payloadId FROM sendLogMessageIds WHERE messageId = old.id ); DELETE FROM reactions WHERE rowid IN ( SELECT rowid FROM reactions WHERE messageId = old.id ); END; `); const messageIdList = db.prepare("SELECT id FROM messages ORDER BY id ASC;", { pluck: true }).all(); const allReactions = db.prepare("SELECT rowid, messageId FROM reactions;").all(); const messageIds = new Set(messageIdList); const reactionsToDelete = []; allReactions.forEach((reaction) => { if (!messageIds.has(reaction.messageId)) { reactionsToDelete.push(reaction.rowid); } }); function deleteReactions(rowids, persistent) { db.prepare( ` DELETE FROM reactions WHERE rowid IN ( ${rowids.map(() => "?").join(", ")} ); `, { persistent } ).run(rowids); } __name(deleteReactions, "deleteReactions"); if (reactionsToDelete.length > 0) { logger.info(`Deleting ${reactionsToDelete.length} orphaned reactions`); (0, import_util_std.batchMultiVarQuery)(db, reactionsToDelete, deleteReactions); } } __name(updateToSchemaVersion42, "updateToSchemaVersion42"); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var gv2_uuid_std_exports = {}; __export(gv2_uuid_std_exports, { default: () => updateToSchemaVersion43 }); module.exports = __toCommonJS(gv2_uuid_std_exports); var import_lodash = __toESM(require("lodash")); var import_normalizeAci_std = require("../../util/normalizeAci.std.js"); var import_isNotNil_std = require("../../util/isNotNil.std.js"); var import_assert_std = require("../../util/assert.std.js"); var import_util_std = require("../util.std.js"); const { omit } = import_lodash.default; function updateToSchemaVersion43(db, logger) { const getConversationUuid = db.prepare( ` SELECT uuid FROM conversations WHERE id = $conversationId `, { pluck: true } ); const updateConversationStmt = db.prepare( ` UPDATE conversations SET json = $json, members = $members WHERE id = $id; ` ); const updateMessageStmt = db.prepare( ` UPDATE messages SET json = $json, sourceUuid = $sourceUuid WHERE id = $id; ` ); const upgradeConversation = /* @__PURE__ */ __name((convo) => { const legacy = convo; let result = convo; const logId = `(${legacy.id}) groupv2(${legacy.groupId})`; const memberKeys = [ "membersV2", "pendingMembersV2", "pendingAdminApprovalV2" ]; for (const key of memberKeys) { const oldValue = legacy[key]; if (!Array.isArray(oldValue)) { continue; } let addedByCount = 0; const newValue = oldValue.map((member) => { const uuid = getConversationUuid.get({ conversationId: member.conversationId }); if (!uuid) { logger.warn( `${logId}.${key} UUID not found for ${member.conversationId}` ); return void 0; } const updated = { ...omit(member, "conversationId"), uuid }; if (!("addedByUserId" in member) || !member.addedByUserId) { return updated; } const addedByUserId = getConversationUuid.get({ conversationId: member.addedByUserId }); if (!addedByUserId) { return updated; } addedByCount += 1; return { ...updated, addedByUserId }; }).filter(import_isNotNil_std.isNotNil); result = { ...result, [key]: newValue }; if (oldValue.length !== 0) { logger.info( `migrated ${oldValue.length} ${key} entries to ${newValue.length} for ${logId}` ); } if (addedByCount > 0) { logger.info( `migrated ${addedByCount} addedByUserId in ${key} for ${logId}` ); } } if (result === convo) { return; } let dbMembers; if (result.membersV2) { dbMembers = result.membersV2.map((item) => item.uuid).join(" "); } else if (result.members) { dbMembers = result.members.join(" "); } else { dbMembers = null; } updateConversationStmt.run({ id: result.id, json: (0, import_util_std.objectToJSON)(result), members: dbMembers }); }, "upgradeConversation"); const upgradeMessage = /* @__PURE__ */ __name((message) => { const { id, groupV2Change, sourceUuid, invitedGV2Members } = message; let result = message; if (groupV2Change) { (0, import_assert_std.assertDev)(result.groupV2Change, "Pacify typescript"); const from = getConversationUuid.get({ conversationId: groupV2Change.from }); if (from) { result = { ...result, groupV2Change: { ...result.groupV2Change, from } }; } else { result = { ...result, groupV2Change: omit(result.groupV2Change, ["from"]) }; } let changedDetails = false; const details = groupV2Change.details.map((legacyDetail, i) => { const oldDetail = result.groupV2Change?.details[i]; (0, import_assert_std.assertDev)(oldDetail, "Pacify typescript"); let newDetail = oldDetail; for (const key of ["conversationId", "inviter"]) { const oldValue = legacyDetail[key]; const newKey = key === "conversationId" ? "uuid" : key; if (oldValue === void 0) { continue; } changedDetails = true; const newValue = getConversationUuid.get({ conversationId: oldValue }); if (key === "inviter" && !newValue) { continue; } if (!newValue) { logger.warn( `${id}.groupV2Change.details.${key} UUID not found for ${oldValue}` ); return void 0; } (0, import_assert_std.assertDev)( newDetail.type === legacyDetail.type, "Pacify typescript" ); newDetail = { ...omit(newDetail, key), [newKey]: newValue }; } return newDetail; }).filter(import_isNotNil_std.isNotNil); if (changedDetails) { result = { ...result, groupV2Change: { ...result.groupV2Change, details } }; } } if (sourceUuid) { const newValue = getConversationUuid.get({ conversationId: sourceUuid }); if (newValue) { result = { ...result, sourceUuid: newValue }; } } if (invitedGV2Members) { const newMembers = invitedGV2Members.map(({ addedByUserId, conversationId }, i) => { const uuid = getConversationUuid.get({ conversationId }); const oldMember = result.invitedGV2Members && result.invitedGV2Members[i]; (0, import_assert_std.assertDev)(oldMember !== void 0, "Pacify typescript"); if (!uuid) { logger.warn( `${id}.invitedGV2Members UUID not found for ${conversationId}` ); return void 0; } const newMember = { ...omit(oldMember, ["conversationId"]), uuid }; if (!addedByUserId) { return newMember; } const newAddedBy = getConversationUuid.get({ conversationId: addedByUserId }); if (!newAddedBy) { return newMember; } return { ...newMember, addedByUserId: (0, import_normalizeAci_std.normalizeAci)(newAddedBy, "migration-43") }; }).filter(import_isNotNil_std.isNotNil); result = { ...result, invitedGV2Members: newMembers }; } if (result === message) { return false; } updateMessageStmt.run({ id: result.id, json: JSON.stringify(result), sourceUuid: result.sourceUuid ?? null }); return true; }, "upgradeMessage"); const allConversations = db.prepare( ` SELECT json FROM conversations ORDER BY id ASC; `, { pluck: true } ).all().map((json) => (0, import_util_std.jsonToObject)(json)); logger.info( `About to iterate through ${allConversations.length} conversations` ); for (const convo of allConversations) { upgradeConversation(convo); } const messageCount = (0, import_util_std.getCountFromTable)(db, "messages"); logger.info(`About to iterate through ${messageCount} messages`); let updatedCount = 0; for (const message of new import_util_std.TableIterator(db, "messages")) { if (upgradeMessage(message)) { updatedCount += 1; } } logger.info(`Updated ${updatedCount} messages`); } __name(updateToSchemaVersion43, "updateToSchemaVersion43"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var badges_std_exports = {}; __export(badges_std_exports, { default: () => updateToSchemaVersion44 }); module.exports = __toCommonJS(badges_std_exports); function updateToSchemaVersion44(db) { db.exec( ` CREATE TABLE badges( id TEXT PRIMARY KEY, category TEXT NOT NULL, name TEXT NOT NULL, descriptionTemplate TEXT NOT NULL ); CREATE TABLE badgeImageFiles( badgeId TEXT REFERENCES badges(id) ON DELETE CASCADE ON UPDATE CASCADE, 'order' INTEGER NOT NULL, url TEXT NOT NULL, localPath TEXT, theme TEXT NOT NULL ); ` ); } __name(updateToSchemaVersion44, "updateToSchemaVersion44"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var stories_std_exports = {}; __export(stories_std_exports, { default: () => updateToSchemaVersion45 }); module.exports = __toCommonJS(stories_std_exports); function updateToSchemaVersion45(db) { db.exec( ` --- Add column to messages table ALTER TABLE messages ADD COLUMN storyId STRING; --- Update important message indices DROP INDEX messages_conversation; CREATE INDEX messages_conversation ON messages (conversationId, type, storyId, received_at); DROP INDEX messages_unread; CREATE INDEX messages_unread ON messages (conversationId, readStatus, type, storyId) WHERE readStatus IS NOT NULL; --- Update attachment indices for All Media views DROP INDEX messages_hasAttachments; CREATE INDEX messages_hasAttachments ON messages (conversationId, hasAttachments, received_at) WHERE type IS NOT 'story' AND storyId IS NULL; DROP INDEX messages_hasFileAttachments; CREATE INDEX messages_hasFileAttachments ON messages (conversationId, hasFileAttachments, received_at) WHERE type IS NOT 'story' AND storyId IS NULL; DROP INDEX messages_hasVisualMediaAttachments; CREATE INDEX messages_hasVisualMediaAttachments ON messages (conversationId, hasVisualMediaAttachments, received_at) WHERE type IS NOT 'story' AND storyId IS NULL; --- Message insert/update triggers to exclude stories and story replies DROP TRIGGER messages_on_insert; -- Note: any changes to this trigger must be reflected in -- Server.ts: enableMessageInsertTriggersAndBackfill CREATE TRIGGER messages_on_insert AFTER INSERT ON messages WHEN new.isViewOnce IS NOT 1 AND new.storyId IS NULL BEGIN INSERT INTO messages_fts (rowid, body) VALUES (new.rowid, new.body); END; DROP TRIGGER messages_on_update; CREATE TRIGGER messages_on_update AFTER UPDATE ON messages WHEN (new.body IS NULL OR old.body IS NOT new.body) AND new.isViewOnce IS NOT 1 AND new.storyId IS NULL BEGIN DELETE FROM messages_fts WHERE rowid = old.rowid; INSERT INTO messages_fts (rowid, body) VALUES (new.rowid, new.body); END; --- Update delete trigger to remove storyReads --- Note: for future updates to this trigger, be sure to update Server.ts/removeAll() --- (it deletes and re-adds this trigger for performance) DROP TRIGGER messages_on_delete; CREATE TRIGGER messages_on_delete AFTER DELETE ON messages BEGIN DELETE FROM messages_fts WHERE rowid = old.rowid; DELETE FROM sendLogPayloads WHERE id IN ( SELECT payloadId FROM sendLogMessageIds WHERE messageId = old.id ); DELETE FROM reactions WHERE rowid IN ( SELECT rowid FROM reactions WHERE messageId = old.id ); DELETE FROM storyReads WHERE storyId = old.storyId; END; --- Story Read History CREATE TABLE storyReads ( authorId STRING NOT NULL, conversationId STRING NOT NULL, storyId STRING NOT NULL, storyReadDate NUMBER NOT NULL, PRIMARY KEY (authorId, storyId) ); CREATE INDEX storyReads_data ON storyReads ( storyReadDate, authorId, conversationId ); --- Story Distribution Lists CREATE TABLE storyDistributions( id STRING PRIMARY KEY NOT NULL, name TEXT, avatarUrlPath TEXT, avatarKey BLOB, senderKeyInfoJson STRING ); CREATE TABLE storyDistributionMembers( listId STRING NOT NULL REFERENCES storyDistributions(id) ON DELETE CASCADE ON UPDATE CASCADE, uuid STRING NOT NULL, PRIMARY KEY (listId, uuid) ) ` ); } __name(updateToSchemaVersion45, "updateToSchemaVersion45"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var optimize_stories_std_exports = {}; __export(optimize_stories_std_exports, { default: () => updateToSchemaVersion46 }); module.exports = __toCommonJS(optimize_stories_std_exports); function updateToSchemaVersion46(db) { db.exec( ` --- Add column to messages table ALTER TABLE messages ADD COLUMN isStory INTEGER GENERATED ALWAYS AS (type = 'story'); --- Update important message indices DROP INDEX messages_conversation; CREATE INDEX messages_conversation ON messages (conversationId, isStory, storyId, received_at, sent_at); ` ); } __name(updateToSchemaVersion46, "updateToSchemaVersion46"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var further_optimize_std_exports = {}; __export(further_optimize_std_exports, { default: () => updateToSchemaVersion47 }); module.exports = __toCommonJS(further_optimize_std_exports); var import_uuid_keys_std = require("./41-uuid-keys.std.js"); function updateToSchemaVersion47(db, logger) { db.exec( ` DROP INDEX messages_conversation; ALTER TABLE messages DROP COLUMN isStory; ALTER TABLE messages ADD COLUMN isStory INTEGER GENERATED ALWAYS AS (type IS 'story'); ALTER TABLE messages ADD COLUMN isChangeCreatedByUs INTEGER NOT NULL DEFAULT 0; ALTER TABLE messages ADD COLUMN shouldAffectActivity INTEGER GENERATED ALWAYS AS ( type IS NULL OR type NOT IN ( 'change-number-notification', 'group-v1-migration', 'message-history-unsynced', 'profile-change', 'story', 'universal-timer-notification', 'verified-change', 'keychange' ) ); ALTER TABLE messages ADD COLUMN shouldAffectPreview INTEGER GENERATED ALWAYS AS ( type IS NULL OR type NOT IN ( 'change-number-notification', 'group-v1-migration', 'message-history-unsynced', 'profile-change', 'story', 'universal-timer-notification', 'verified-change' ) ); ALTER TABLE messages ADD COLUMN isUserInitiatedMessage INTEGER GENERATED ALWAYS AS ( type IS NULL OR type NOT IN ( 'change-number-notification', 'group-v1-migration', 'message-history-unsynced', 'profile-change', 'story', 'universal-timer-notification', 'verified-change', 'group-v2-change', 'keychange' ) ); ALTER TABLE messages ADD COLUMN isTimerChangeFromSync INTEGER GENERATED ALWAYS AS ( json_extract(json, '$.expirationTimerUpdate.fromSync') IS 1 ); ALTER TABLE messages ADD COLUMN isGroupLeaveEvent INTEGER GENERATED ALWAYS AS ( type IS 'group-v2-change' AND json_array_length(json_extract(json, '$.groupV2Change.details')) IS 1 AND json_extract(json, '$.groupV2Change.details[0].type') IS 'member-remove' AND json_extract(json, '$.groupV2Change.from') IS NOT NULL AND json_extract(json, '$.groupV2Change.from') IS json_extract(json, '$.groupV2Change.details[0].uuid') ); ALTER TABLE messages ADD COLUMN isGroupLeaveEventFromOther INTEGER GENERATED ALWAYS AS ( isGroupLeaveEvent IS 1 AND isChangeCreatedByUs IS 0 ); CREATE INDEX messages_conversation ON messages (conversationId, isStory, storyId, received_at, sent_at); CREATE INDEX messages_preview ON messages (conversationId, shouldAffectPreview, isGroupLeaveEventFromOther, expiresAt, received_at, sent_at); CREATE INDEX messages_activity ON messages (conversationId, shouldAffectActivity, isTimerChangeFromSync, isGroupLeaveEventFromOther, received_at, sent_at); CREATE INDEX message_user_initiated ON messages (isUserInitiatedMessage); ` ); const ourUuid = (0, import_uuid_keys_std.getOurUuid)(db); if (!ourUuid) { logger.info("our UUID not found"); } else { db.prepare( ` UPDATE messages SET isChangeCreatedByUs = json_extract(json, '$.groupV2Change.from') IS $ourUuid; ` ).run({ ourUuid }); } } __name(updateToSchemaVersion47, "updateToSchemaVersion47"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var fix_user_initiated_index_std_exports = {}; __export(fix_user_initiated_index_std_exports, { default: () => updateToSchemaVersion48 }); module.exports = __toCommonJS(fix_user_initiated_index_std_exports); function updateToSchemaVersion48(db) { db.exec( ` DROP INDEX message_user_initiated; CREATE INDEX message_user_initiated ON messages (conversationId, isUserInitiatedMessage); ` ); } __name(updateToSchemaVersion48, "updateToSchemaVersion48"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var fix_preview_index_std_exports = {}; __export(fix_preview_index_std_exports, { default: () => updateToSchemaVersion49 }); module.exports = __toCommonJS(fix_preview_index_std_exports); function updateToSchemaVersion49(db) { db.exec( ` DROP INDEX messages_preview; -- Note the omitted 'expiresAt' column in the index. If it is present -- sqlite can't ORDER BY received_at, sent_at using this index. CREATE INDEX messages_preview ON messages (conversationId, shouldAffectPreview, isGroupLeaveEventFromOther, received_at, sent_at); ` ); } __name(updateToSchemaVersion49, "updateToSchemaVersion49"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var fix_messages_unread_index_std_exports = {}; __export(fix_messages_unread_index_std_exports, { default: () => updateToSchemaVersion50 }); module.exports = __toCommonJS(fix_messages_unread_index_std_exports); function updateToSchemaVersion50(db) { db.exec( ` DROP INDEX messages_unread; -- Note: here we move to the modern isStory/storyId fields and add received_at/sent_at. CREATE INDEX messages_unread ON messages (conversationId, readStatus, isStory, storyId, received_at, sent_at) WHERE readStatus IS NOT NULL; ` ); } __name(updateToSchemaVersion50, "updateToSchemaVersion50"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var centralize_conversation_jobs_node_exports = {}; __export(centralize_conversation_jobs_node_exports, { default: () => updateToSchemaVersion51 }); module.exports = __toCommonJS(centralize_conversation_jobs_node_exports); var import_isRecord_std = require("../../util/isRecord.std.js"); var import_Server_node = require("../Server.node.js"); function updateToSchemaVersion51(db, logger) { const deleteJobsInQueue = db.prepare( "DELETE FROM jobs WHERE queueType = $queueType" ); const reactionsJobs = (0, import_Server_node.getJobsInQueue)(db, "reactions"); deleteJobsInQueue.run({ queueType: "reactions" }); const getMessageById = db.prepare( "SELECT conversationId FROM messages WHERE id IS ?" ); reactionsJobs.forEach((job) => { const { data, id } = job; if (!(0, import_isRecord_std.isRecord)(data)) { logger.warn(`reactions queue job ${id} was missing valid data`); return; } const { messageId } = data; if (typeof messageId !== "string") { logger.warn(`reactions queue job ${id} had a non-string messageId`); return; } const message = getMessageById.get([messageId]); if (!message) { logger.warn(`Unable to find message for reaction job ${id}`); return; } const { conversationId } = message; if (typeof conversationId !== "string") { logger.warn(`reactions queue job ${id} had a non-string conversationId`); return; } const newJob = { ...job, queueType: "conversation", data: { ...data, type: "Reaction", conversationId } }; (0, import_Server_node.insertJob)(db, newJob); }); const normalSendJobs = (0, import_Server_node.getJobsInQueue)(db, "normal send"); deleteJobsInQueue.run({ queueType: "normal send" }); normalSendJobs.forEach((job) => { const { data, id } = job; if (!(0, import_isRecord_std.isRecord)(data)) { logger.warn(`normal send queue job ${id} was missing valid data`); return; } const newJob = { ...job, queueType: "conversation", data: { ...data, type: "NormalMessage" } }; (0, import_Server_node.insertJob)(db, newJob); }); } __name(updateToSchemaVersion51, "updateToSchemaVersion51"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var optimize_stories_std_exports = {}; __export(optimize_stories_std_exports, { default: () => updateToSchemaVersion52 }); module.exports = __toCommonJS(optimize_stories_std_exports); function updateToSchemaVersion52(db) { db.exec( ` -- Create indices that don't have storyId in them so that -- '_storyIdPredicate' could be optimized. -- See migration 47 CREATE INDEX messages_conversation_no_story_id ON messages (conversationId, isStory, received_at, sent_at); -- See migration 50 CREATE INDEX messages_unread_no_story_id ON messages (conversationId, readStatus, isStory, received_at, sent_at) WHERE readStatus IS NOT NULL; ` ); } __name(updateToSchemaVersion52, "updateToSchemaVersion52"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var gv2_banned_members_std_exports = {}; __export(gv2_banned_members_std_exports, { default: () => updateToSchemaVersion53 }); module.exports = __toCommonJS(gv2_banned_members_std_exports); var import_util_std = require("../util.std.js"); function updateToSchemaVersion53(db, logger) { const updateConversationStmt = db.prepare( ` UPDATE conversations SET json = json_patch(json, $jsonPatch) WHERE id = $id; ` ); const upgradeConversation = /* @__PURE__ */ __name((convo) => { const legacy = convo; const logId = `(${legacy.id}) groupv2(${legacy.groupId})`; if (!legacy.bannedMembersV2?.length) { return false; } const jsonPatch = { bannedMembersV2: legacy.bannedMembersV2.map((uuid) => ({ uuid, timestamp: 0 })) }; logger.info( `Updating ${logId} with ${legacy.bannedMembersV2.length} banned members` ); updateConversationStmt.run({ id: legacy.id, jsonPatch: JSON.stringify(jsonPatch) }); return true; }, "upgradeConversation"); const allConversations = db.prepare( ` SELECT json FROM conversations WHERE type = 'group' ORDER BY id ASC; `, { pluck: true } ).all().map((json) => (0, import_util_std.jsonToObject)(json)); logger.info( `About to iterate through ${allConversations.length} conversations` ); let updated = 0; for (const convo of allConversations) { updated += upgradeConversation(convo) ? 1 : 0; } logger.info(`Updated ${updated} conversations`); } __name(updateToSchemaVersion53, "updateToSchemaVersion53"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var unprocessed_received_at_counter_std_exports = {}; __export(unprocessed_received_at_counter_std_exports, { default: () => updateToSchemaVersion54 }); module.exports = __toCommonJS(unprocessed_received_at_counter_std_exports); function updateToSchemaVersion54(db) { db.exec( ` ALTER TABLE unprocessed ADD COLUMN receivedAtCounter INTEGER; ` ); } __name(updateToSchemaVersion54, "updateToSchemaVersion54"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var report_message_aci_node_exports = {}; __export(report_message_aci_node_exports, { default: () => updateToSchemaVersion55 }); module.exports = __toCommonJS(report_message_aci_node_exports); var import_Server_node = require("../Server.node.js"); var import_isRecord_std = require("../../util/isRecord.std.js"); var import_iterables_std = require("../../util/iterables.std.js"); function updateToSchemaVersion55(db, logger) { const deleteJobsInQueue = db.prepare( "DELETE FROM jobs WHERE queueType = $queueType" ); const reportSpamJobs = (0, import_Server_node.getJobsInQueue)(db, "report spam"); deleteJobsInQueue.run({ queueType: "report spam" }); reportSpamJobs.forEach((job) => { const { data, id } = job; if (!(0, import_isRecord_std.isRecord)(data)) { logger.warn(`report spam queue job ${id} was missing valid data`); return; } const { e164, serverGuids } = data; if (typeof e164 !== "string") { logger.warn(`report spam queue job ${id} had a non-string e164`); return; } if (!(0, import_iterables_std.isIterable)(serverGuids)) { logger.warn(`report spam queue job ${id} had a non-iterable serverGuids`); return; } const newJob = { ...job, queueType: "report spam", data: { uuid: e164, // this looks odd, but they are both strings and interchangeable in the server API serverGuids } }; (0, import_Server_node.insertJob)(db, newJob); }); } __name(updateToSchemaVersion55, "updateToSchemaVersion55"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var add_unseen_to_message_std_exports = {}; __export(add_unseen_to_message_std_exports, { default: () => updateToSchemaVersion56 }); module.exports = __toCommonJS(add_unseen_to_message_std_exports); var import_MessageReadStatus_std = require("../../messages/MessageReadStatus.std.js"); var import_MessageSeenStatus_std = require("../../MessageSeenStatus.std.js"); function updateToSchemaVersion56(db) { db.exec( ` --- Add column to messages table ALTER TABLE messages ADD COLUMN seenStatus NUMBER default 0; --- Add index to make searching on this field easy CREATE INDEX messages_unseen_no_story ON messages (conversationId, seenStatus, isStory, received_at, sent_at) WHERE seenStatus IS NOT NULL; CREATE INDEX messages_unseen_with_story ON messages (conversationId, seenStatus, isStory, storyId, received_at, sent_at) WHERE seenStatus IS NOT NULL; --- Update seenStatus to UnseenStatus.Unseen for certain messages --- (NULL included because 'timer-notification' in 1:1 convos had type = NULL) UPDATE messages SET seenStatus = ${import_MessageSeenStatus_std.SeenStatus.Unseen} WHERE readStatus = ${import_MessageReadStatus_std.ReadStatus.Unread} AND ( type IS NULL OR type IN ( 'call-history', 'change-number-notification', 'chat-session-refreshed', 'delivery-issue', 'group', 'incoming', 'keychange', 'timer-notification', 'verified-change' ) ); --- Set readStatus to ReadStatus.Read for all other message types UPDATE messages SET readStatus = ${import_MessageReadStatus_std.ReadStatus.Read} WHERE readStatus = ${import_MessageReadStatus_std.ReadStatus.Unread} AND type IS NOT NULL AND type NOT IN ( 'call-history', 'change-number-notification', 'chat-session-refreshed', 'delivery-issue', 'group', 'incoming', 'keychange', 'timer-notification', 'verified-change' ); ` ); } __name(updateToSchemaVersion56, "updateToSchemaVersion56"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var rm_message_history_unsynced_std_exports = {}; __export(rm_message_history_unsynced_std_exports, { default: () => updateToSchemaVersion57 }); module.exports = __toCommonJS(rm_message_history_unsynced_std_exports); function updateToSchemaVersion57(db) { db.exec( ` DELETE FROM messages WHERE type IS 'message-history-unsynced'; ` ); } __name(updateToSchemaVersion57, "updateToSchemaVersion57"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var update_unread_std_exports = {}; __export(update_unread_std_exports, { default: () => updateToSchemaVersion58 }); module.exports = __toCommonJS(update_unread_std_exports); var import_MessageReadStatus_std = require("../../messages/MessageReadStatus.std.js"); var import_MessageSeenStatus_std = require("../../MessageSeenStatus.std.js"); function updateToSchemaVersion58(db) { db.exec( ` --- Promote unread status in JSON to SQL column -- NOTE: This was disabled because the 'unread' json field was deprecated -- in b0750e5f4e1f79f0f177b17cbe06d688431f948d, but the old value was kept -- in the messages created before the release of that commit. -- -- UPDATE messages -- SET -- readStatus = ${import_MessageReadStatus_std.ReadStatus.Unread}, -- seenStatus = ${import_MessageSeenStatus_std.SeenStatus.Unseen} -- WHERE -- json_extract(json, '$.unread') IS true OR -- json_extract(json, '$.unread') IS 1; --- Clean up all old messages that still have a null read status --- Note: we don't need to update seenStatus, because that was defaulted to zero UPDATE messages SET readStatus = ${import_MessageReadStatus_std.ReadStatus.Read} WHERE readStatus IS NULL; --- Re-run unseen/unread queries from migration 56 UPDATE messages SET seenStatus = ${import_MessageSeenStatus_std.SeenStatus.Unseen} WHERE readStatus = ${import_MessageReadStatus_std.ReadStatus.Unread} AND ( type IS NULL OR type IN ( 'call-history', 'change-number-notification', 'chat-session-refreshed', 'delivery-issue', 'group', 'incoming', 'keychange', 'timer-notification', 'verified-change' ) ); UPDATE messages SET readStatus = ${import_MessageReadStatus_std.ReadStatus.Read} WHERE readStatus = ${import_MessageReadStatus_std.ReadStatus.Unread} AND type IS NOT NULL AND type NOT IN ( 'call-history', 'change-number-notification', 'chat-session-refreshed', 'delivery-issue', 'group', 'incoming', 'keychange', 'timer-notification', 'verified-change' ); --- (new) Ensure these message types are not unread, just unseen UPDATE messages SET readStatus = ${import_MessageReadStatus_std.ReadStatus.Read} WHERE readStatus = ${import_MessageReadStatus_std.ReadStatus.Unread} AND ( type IN ( 'change-number-notification', 'keychange' ) ); --- (new) Ensure that these message types are neither unseen nor unread UPDATE messages SET readStatus = ${import_MessageReadStatus_std.ReadStatus.Read}, seenStatus = ${import_MessageSeenStatus_std.SeenStatus.Seen} WHERE type IN ( 'group-v1-migration', 'message-history-unsynced', 'outgoing', 'profile-change', 'universal-timer-notification' ); --- Make sure JSON reflects SQL columns UPDATE messages SET json = json_patch( json, json_object( 'readStatus', readStatus, 'seenStatus', seenStatus ) ) WHERE readStatus IS NOT NULL OR seenStatus IS NOT 0; ` ); } __name(updateToSchemaVersion58, "updateToSchemaVersion58"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var unprocessed_received_at_counter_index_std_exports = {}; __export(unprocessed_received_at_counter_index_std_exports, { default: () => updateToSchemaVersion59 }); module.exports = __toCommonJS(unprocessed_received_at_counter_index_std_exports); function updateToSchemaVersion59(db) { db.exec( ` CREATE INDEX unprocessed_byReceivedAtCounter ON unprocessed (receivedAtCounter) ` ); } __name(updateToSchemaVersion59, "updateToSchemaVersion59"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var update_expiring_index_std_exports = {}; __export(update_expiring_index_std_exports, { default: () => updateToSchemaVersion60 }); module.exports = __toCommonJS(update_expiring_index_std_exports); function updateToSchemaVersion60(db) { db.exec( ` DROP INDEX expiring_message_by_conversation_and_received_at; CREATE INDEX expiring_message_by_conversation_and_received_at ON messages ( conversationId, storyId, expirationStartTimestamp, expireTimer, received_at ) WHERE isStory IS 0 AND type IS 'incoming'; ` ); } __name(updateToSchemaVersion60, "updateToSchemaVersion60"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var distribution_list_storage_std_exports = {}; __export(distribution_list_storage_std_exports, { default: () => updateToSchemaVersion61 }); module.exports = __toCommonJS(distribution_list_storage_std_exports); function updateToSchemaVersion61(db) { db.exec( ` ALTER TABLE storyDistributions DROP COLUMN avatarKey; ALTER TABLE storyDistributions DROP COLUMN avatarUrlPath; ALTER TABLE storyDistributions ADD COLUMN deletedAtTimestamp INTEGER; ALTER TABLE storyDistributions ADD COLUMN allowsReplies INTEGER; ALTER TABLE storyDistributions ADD COLUMN isBlockList INTEGER; ALTER TABLE storyDistributions ADD COLUMN storageID STRING; ALTER TABLE storyDistributions ADD COLUMN storageVersion INTEGER; ALTER TABLE storyDistributions ADD COLUMN storageUnknownFields BLOB; ALTER TABLE storyDistributions ADD COLUMN storageNeedsSync INTEGER; ALTER TABLE messages ADD COLUMN storyDistributionListId STRING; CREATE INDEX messages_by_distribution_list ON messages(storyDistributionListId, received_at) WHERE storyDistributionListId IS NOT NULL; ` ); } __name(updateToSchemaVersion61, "updateToSchemaVersion61"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var add_urgent_to_send_log_std_exports = {}; __export(add_urgent_to_send_log_std_exports, { default: () => updateToSchemaVersion62 }); module.exports = __toCommonJS(add_urgent_to_send_log_std_exports); function updateToSchemaVersion62(db) { db.exec( ` ALTER TABLE sendLogPayloads ADD COLUMN urgent INTEGER; ` ); } __name(updateToSchemaVersion62, "updateToSchemaVersion62"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var add_urgent_to_unprocessed_std_exports = {}; __export(add_urgent_to_unprocessed_std_exports, { default: () => updateToSchemaVersion63 }); module.exports = __toCommonJS(add_urgent_to_unprocessed_std_exports); function updateToSchemaVersion63(db) { db.exec( ` ALTER TABLE unprocessed ADD COLUMN urgent INTEGER; ` ); } __name(updateToSchemaVersion63, "updateToSchemaVersion63"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var uuid_column_for_pre_keys_std_exports = {}; __export(uuid_column_for_pre_keys_std_exports, { default: () => updateToSchemaVersion64 }); module.exports = __toCommonJS(uuid_column_for_pre_keys_std_exports); function updateToSchemaVersion64(db) { db.exec( ` ALTER TABLE preKeys ADD COLUMN ourUuid STRING GENERATED ALWAYS AS (json_extract(json, '$.ourUuid')); CREATE INDEX preKeys_ourUuid ON preKeys (ourUuid); ALTER TABLE signedPreKeys ADD COLUMN ourUuid STRING GENERATED ALWAYS AS (json_extract(json, '$.ourUuid')); CREATE INDEX signedPreKeys_ourUuid ON signedPreKeys (ourUuid); ` ); } __name(updateToSchemaVersion64, "updateToSchemaVersion64"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var add_storage_id_to_stickers_std_exports = {}; __export(add_storage_id_to_stickers_std_exports, { default: () => updateToSchemaVersion65 }); module.exports = __toCommonJS(add_storage_id_to_stickers_std_exports); function updateToSchemaVersion65(db) { db.exec( ` ALTER TABLE sticker_packs ADD COLUMN position INTEGER DEFAULT 0 NOT NULL; ALTER TABLE sticker_packs ADD COLUMN storageID STRING; ALTER TABLE sticker_packs ADD COLUMN storageVersion INTEGER; ALTER TABLE sticker_packs ADD COLUMN storageUnknownFields BLOB; ALTER TABLE sticker_packs ADD COLUMN storageNeedsSync INTEGER DEFAULT 0 NOT NULL; CREATE TABLE uninstalled_sticker_packs ( id STRING NOT NULL PRIMARY KEY, uninstalledAt NUMBER NOT NULL, storageID STRING, storageVersion NUMBER, storageUnknownFields BLOB, storageNeedsSync INTEGER NOT NULL ); -- Set initial position UPDATE sticker_packs SET position = (row_number - 1), storageNeedsSync = 1 FROM ( SELECT id, row_number() OVER (ORDER BY lastUsed DESC) as row_number FROM sticker_packs ) as ordered_pairs WHERE sticker_packs.id IS ordered_pairs.id; -- See: getAllStickerPacks CREATE INDEX sticker_packs_by_position_and_id ON sticker_packs ( position ASC, id ASC ); ` ); } __name(updateToSchemaVersion65, "updateToSchemaVersion65"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var add_pni_signature_to_sent_protos_std_exports = {}; __export(add_pni_signature_to_sent_protos_std_exports, { default: () => updateToSchemaVersion66 }); module.exports = __toCommonJS(add_pni_signature_to_sent_protos_std_exports); function updateToSchemaVersion66(db) { db.exec( ` ALTER TABLE sendLogPayloads ADD COLUMN hasPniSignatureMessage INTEGER DEFAULT 0 NOT NULL; ` ); } __name(updateToSchemaVersion66, "updateToSchemaVersion66"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var add_story_to_unprocessed_std_exports = {}; __export(add_story_to_unprocessed_std_exports, { default: () => updateToSchemaVersion67 }); module.exports = __toCommonJS(add_story_to_unprocessed_std_exports); function updateToSchemaVersion67(db) { db.exec( ` ALTER TABLE unprocessed ADD COLUMN story INTEGER; ` ); } __name(updateToSchemaVersion67, "updateToSchemaVersion67"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var drop_deprecated_columns_std_exports = {}; __export(drop_deprecated_columns_std_exports, { default: () => updateToSchemaVersion68 }); module.exports = __toCommonJS(drop_deprecated_columns_std_exports); function updateToSchemaVersion68(db) { db.exec( ` ALTER TABLE messages DROP COLUMN deprecatedSourceDevice; ALTER TABLE unprocessed DROP COLUMN deprecatedSourceDevice; ` ); } __name(updateToSchemaVersion68, "updateToSchemaVersion68"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var group_call_ring_cancellations_std_exports = {}; __export(group_call_ring_cancellations_std_exports, { default: () => updateToSchemaVersion69 }); module.exports = __toCommonJS(group_call_ring_cancellations_std_exports); function updateToSchemaVersion69(db) { db.exec( ` DROP TABLE IF EXISTS groupCallRings; CREATE TABLE groupCallRingCancellations( ringId INTEGER PRIMARY KEY, createdAt INTEGER NOT NULL ); ` ); } __name(updateToSchemaVersion69, "updateToSchemaVersion69"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var story_reply_index_std_exports = {}; __export(story_reply_index_std_exports, { default: () => updateToSchemaVersion70 }); module.exports = __toCommonJS(story_reply_index_std_exports); function updateToSchemaVersion70(db) { db.exec( ` CREATE INDEX messages_by_storyId ON messages (storyId); ` ); } __name(updateToSchemaVersion70, "updateToSchemaVersion70"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var merge_notifications_std_exports = {}; __export(merge_notifications_std_exports, { default: () => updateToSchemaVersion71 }); module.exports = __toCommonJS(merge_notifications_std_exports); function updateToSchemaVersion71(db) { db.exec( ` --- These will be re-added below DROP INDEX messages_preview; DROP INDEX messages_activity; DROP INDEX message_user_initiated; --- These will also be re-added below ALTER TABLE messages DROP COLUMN shouldAffectActivity; ALTER TABLE messages DROP COLUMN shouldAffectPreview; ALTER TABLE messages DROP COLUMN isUserInitiatedMessage; --- Note: These generated columns were originally introduced in migration 47, and --- are mostly the same --- Based on the current list (model-types.ts), the types which DO affect activity: --- NULL (old, malformed data) --- call-history --- chat-session-refreshed (deprecated) --- delivery-issue --- group (deprecated) --- group-v2-change --- incoming --- outgoing --- timer-notification --- (change: added conversation-merge, keychange, and phone-number-discovery) ALTER TABLE messages ADD COLUMN shouldAffectActivity INTEGER GENERATED ALWAYS AS ( type IS NULL OR type NOT IN ( 'change-number-notification', 'conversation-merge', 'group-v1-migration', 'keychange', 'message-history-unsynced', 'phone-number-discovery', 'profile-change', 'story', 'universal-timer-notification', 'verified-change' ) ); --- (change: added conversation-merge and phone-number-discovery --- (now matches the above list) ALTER TABLE messages ADD COLUMN shouldAffectPreview INTEGER GENERATED ALWAYS AS ( type IS NULL OR type NOT IN ( 'change-number-notification', 'conversation-merge', 'group-v1-migration', 'keychange', 'message-history-unsynced', 'phone-number-discovery', 'profile-change', 'story', 'universal-timer-notification', 'verified-change' ) ); --- Note: This list only differs from the above on these types: --- group-v2-change --- (change: added conversation-merge and phone-number-discovery ALTER TABLE messages ADD COLUMN isUserInitiatedMessage INTEGER GENERATED ALWAYS AS ( type IS NULL OR type NOT IN ( 'change-number-notification', 'conversation-merge', 'group-v1-migration', 'group-v2-change', 'keychange', 'message-history-unsynced', 'phone-number-discovery', 'profile-change', 'story', 'universal-timer-notification', 'verified-change' ) ); CREATE INDEX messages_preview ON messages (conversationId, shouldAffectPreview, isGroupLeaveEventFromOther, expiresAt, received_at, sent_at); CREATE INDEX messages_activity ON messages (conversationId, shouldAffectActivity, isTimerChangeFromSync, isGroupLeaveEventFromOther, received_at, sent_at); CREATE INDEX message_user_initiated ON messages (isUserInitiatedMessage); ` ); } __name(updateToSchemaVersion71, "updateToSchemaVersion71"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var optimize_call_id_message_lookup_std_exports = {}; __export(optimize_call_id_message_lookup_std_exports, { default: () => updateToSchemaVersion72 }); module.exports = __toCommonJS(optimize_call_id_message_lookup_std_exports); function updateToSchemaVersion72(db) { db.exec( ` ALTER TABLE messages ADD COLUMN callId TEXT GENERATED ALWAYS AS ( json_extract(json, '$.callHistoryDetails.callId') ); ALTER TABLE messages ADD COLUMN callMode TEXT GENERATED ALWAYS AS ( json_extract(json, '$.callHistoryDetails.callMode') ); CREATE INDEX messages_call ON messages (conversationId, type, callMode, callId); ` ); } __name(updateToSchemaVersion72, "updateToSchemaVersion72"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var remove_phone_number_discovery_std_exports = {}; __export(remove_phone_number_discovery_std_exports, { default: () => updateToSchemaVersion73 }); module.exports = __toCommonJS(remove_phone_number_discovery_std_exports); function updateToSchemaVersion73(db) { db.exec( ` --- Delete deprecated notifications DELETE FROM messages WHERE type IS 'phone-number-discovery'; --- These will be re-added below DROP INDEX messages_preview; DROP INDEX messages_activity; DROP INDEX message_user_initiated; --- These will also be re-added below ALTER TABLE messages DROP COLUMN shouldAffectActivity; ALTER TABLE messages DROP COLUMN shouldAffectPreview; ALTER TABLE messages DROP COLUMN isUserInitiatedMessage; --- Note: These generated columns were originally introduced in migration 71, and --- are mostly the same --- (change: removed phone-number-discovery) ALTER TABLE messages ADD COLUMN shouldAffectActivity INTEGER GENERATED ALWAYS AS ( type IS NULL OR type NOT IN ( 'change-number-notification', 'conversation-merge', 'group-v1-migration', 'keychange', 'message-history-unsynced', 'profile-change', 'story', 'universal-timer-notification', 'verified-change' ) ); --- (change: removed phone-number-discovery --- (now matches the above list) ALTER TABLE messages ADD COLUMN shouldAffectPreview INTEGER GENERATED ALWAYS AS ( type IS NULL OR type NOT IN ( 'change-number-notification', 'conversation-merge', 'group-v1-migration', 'keychange', 'message-history-unsynced', 'profile-change', 'story', 'universal-timer-notification', 'verified-change' ) ); --- Note: This list only differs from the above on these types: --- group-v2-change --- (change: removed phone-number-discovery ALTER TABLE messages ADD COLUMN isUserInitiatedMessage INTEGER GENERATED ALWAYS AS ( type IS NULL OR type NOT IN ( 'change-number-notification', 'conversation-merge', 'group-v1-migration', 'group-v2-change', 'keychange', 'message-history-unsynced', 'profile-change', 'story', 'universal-timer-notification', 'verified-change' ) ); CREATE INDEX messages_preview ON messages (conversationId, shouldAffectPreview, isGroupLeaveEventFromOther, expiresAt, received_at, sent_at); CREATE INDEX messages_activity ON messages (conversationId, shouldAffectActivity, isTimerChangeFromSync, isGroupLeaveEventFromOther, received_at, sent_at); CREATE INDEX message_user_initiated ON messages (isUserInitiatedMessage); ` ); } __name(updateToSchemaVersion73, "updateToSchemaVersion73"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var optimize_convo_open_std_exports = {}; __export(optimize_convo_open_std_exports, { default: () => updateToSchemaVersion74 }); module.exports = __toCommonJS(optimize_convo_open_std_exports); function updateToSchemaVersion74(db) { db.exec( ` -- Previously: (isUserInitiatedMessage) DROP INDEX message_user_initiated; CREATE INDEX message_user_initiated ON messages (conversationId, isUserInitiatedMessage); -- Previously: (unread, conversationId) DROP INDEX reactions_unread; CREATE INDEX reactions_unread ON reactions ( conversationId, unread ); ` ); } __name(updateToSchemaVersion74, "updateToSchemaVersion74"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var noop_std_exports = {}; __export(noop_std_exports, { default: () => updateToSchemaVersion75 }); module.exports = __toCommonJS(noop_std_exports); function updateToSchemaVersion75() { } __name(updateToSchemaVersion75, "updateToSchemaVersion75"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var optimize_convo_open_2_std_exports = {}; __export(optimize_convo_open_2_std_exports, { default: () => updateToSchemaVersion76 }); module.exports = __toCommonJS(optimize_convo_open_2_std_exports); function updateToSchemaVersion76(db) { db.exec( ` -- Re-created below DROP INDEX IF EXISTS message_expires_at; DROP INDEX IF EXISTS messages_preview; -- Create non-null expiresAt column ALTER TABLE messages DROP COLUMN expiresAt; ALTER TABLE messages ADD COLUMN expiresAt INT GENERATED ALWAYS AS (ifnull( expirationStartTimestamp + (expireTimer * 1000), ${Number.MAX_SAFE_INTEGER} )); -- Re-create indexes -- Note the "s" at the end of "messages" CREATE INDEX messages_expires_at ON messages ( expiresAt ); -- Note that expiresAt is intentionally dropped from the index since -- expiresAt > $now is likely to be true so we just try selecting it -- *after* ordering by received_at/sent_at. CREATE INDEX messages_preview ON messages (conversationId, shouldAffectPreview, isGroupLeaveEventFromOther, received_at, sent_at); CREATE INDEX messages_preview_without_story ON messages (conversationId, shouldAffectPreview, isGroupLeaveEventFromOther, received_at, sent_at) WHERE storyId IS NULL; ` ); } __name(updateToSchemaVersion76, "updateToSchemaVersion76"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var signal_tokenizer_std_exports = {}; __export(signal_tokenizer_std_exports, { default: () => updateToSchemaVersion77 }); module.exports = __toCommonJS(signal_tokenizer_std_exports); function updateToSchemaVersion77(db) { db.exec( ` -- Create FTS table with custom tokenizer from -- @signalapp/sqlcipher. DROP TABLE messages_fts; CREATE VIRTUAL TABLE messages_fts USING fts5( body, tokenize = 'signal_tokenizer' ); -- Reindex messages -- Based on messages_on_insert trigger from migrations/45-stories.ts INSERT INTO messages_fts (rowid, body) SELECT rowid, body FROM messages WHERE isViewOnce IS NOT 1 AND storyId IS NULL; ` ); } __name(updateToSchemaVersion77, "updateToSchemaVersion77"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var merge_receipt_jobs_node_exports = {}; __export(merge_receipt_jobs_node_exports, { default: () => updateToSchemaVersion78 }); module.exports = __toCommonJS(merge_receipt_jobs_node_exports); var import_isRecord_std = require("../../util/isRecord.std.js"); var import_Server_node = require("../Server.node.js"); function updateToSchemaVersion78(db, logger) { const deleteJobsInQueue = db.prepare( "DELETE FROM jobs WHERE queueType = $queueType" ); const queues = [ { queueType: "delivery receipts", jobDataKey: "deliveryReceipts", jobDataIsArray: true, newReceiptsType: "deliveryReceipt" }, { queueType: "read receipts", jobDataKey: "readReceipts", jobDataIsArray: true, newReceiptsType: "readReceipt" }, { queueType: "viewed receipts", jobDataKey: "viewedReceipt", jobDataIsArray: false, newReceiptsType: "viewedReceipt" } ]; const getMessageById = db.prepare( "SELECT conversationId FROM messages WHERE id IS ?" ); for (const queue of queues) { const prevJobs = (0, import_Server_node.getJobsInQueue)(db, queue.queueType); deleteJobsInQueue.run({ queueType: queue.queueType }); prevJobs.forEach((job) => { const { data, id } = job; if (!(0, import_isRecord_std.isRecord)(data)) { logger.warn( `${queue.queueType} queue job ${id} was missing valid data` ); return; } const { messageId } = data; if (typeof messageId !== "string") { logger.warn( `${queue.queueType} queue job ${id} had a non-string messageId` ); return; } const message = getMessageById.get([messageId]); if (!message) { logger.warn(`Unable to find message for ${queue.queueType} job ${id}`); return; } const { conversationId } = message; if (typeof conversationId !== "string") { logger.warn( `${queue.queueType} queue job ${id} had a non-string conversationId` ); return; } const oldReceipts = queue.jobDataIsArray ? data[queue.jobDataKey] : [data[queue.jobDataKey]]; if (!Array.isArray(oldReceipts)) { logger.warn( `${queue.queueType} queue job ${id} had a non-array ${queue.jobDataKey}` ); return; } const newReceipts = []; for (const receipt of oldReceipts) { if (!(0, import_isRecord_std.isRecord)(receipt)) { logger.warn( `${queue.queueType} queue job ${id} had a non-record receipt` ); continue; } newReceipts.push({ ...receipt, conversationId }); } const newJob = { ...job, queueType: "conversation", data: { type: "Receipts", conversationId, receiptsType: queue.newReceiptsType, receipts: newReceipts } }; (0, import_Server_node.insertJob)(db, newJob); }); } } __name(updateToSchemaVersion78, "updateToSchemaVersion78"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var paging_lightbox_std_exports = {}; __export(paging_lightbox_std_exports, { default: () => updateToSchemaVersion79 }); module.exports = __toCommonJS(paging_lightbox_std_exports); function updateToSchemaVersion79(db) { db.exec(` DROP INDEX messages_hasVisualMediaAttachments; CREATE INDEX messages_hasVisualMediaAttachments ON messages ( conversationId, isStory, storyId, hasVisualMediaAttachments, received_at, sent_at ) WHERE hasVisualMediaAttachments IS 1; `); } __name(updateToSchemaVersion79, "updateToSchemaVersion79"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var edited_messages_std_exports = {}; __export(edited_messages_std_exports, { default: () => updateToSchemaVersion80 }); module.exports = __toCommonJS(edited_messages_std_exports); function updateToSchemaVersion80(db) { db.exec(` CREATE TABLE edited_messages( fromId STRING, messageId STRING REFERENCES messages(id) ON DELETE CASCADE, sentAt INTEGER, readStatus INTEGER ); CREATE INDEX edited_messages_sent_at ON edited_messages (sentAt); `); } __name(updateToSchemaVersion80, "updateToSchemaVersion80"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var contact_removed_notification_std_exports = {}; __export(contact_removed_notification_std_exports, { default: () => updateToSchemaVersion81 }); module.exports = __toCommonJS(contact_removed_notification_std_exports); function updateToSchemaVersion81(db) { db.exec( ` --- These will be re-added below DROP INDEX messages_preview; DROP INDEX messages_preview_without_story; DROP INDEX messages_activity; DROP INDEX message_user_initiated; --- These will also be re-added below ALTER TABLE messages DROP COLUMN shouldAffectActivity; ALTER TABLE messages DROP COLUMN shouldAffectPreview; ALTER TABLE messages DROP COLUMN isUserInitiatedMessage; --- Note: These generated columns were previously modified in --- migration 73, and are mostly the same --- (change: added contact-removed-notification) ALTER TABLE messages ADD COLUMN shouldAffectActivity INTEGER GENERATED ALWAYS AS ( type IS NULL OR type NOT IN ( 'change-number-notification', 'contact-removed-notification', 'conversation-merge', 'group-v1-migration', 'keychange', 'message-history-unsynced', 'profile-change', 'story', 'universal-timer-notification', 'verified-change' ) ); --- (change: added contact-removed-notification) ALTER TABLE messages ADD COLUMN shouldAffectPreview INTEGER GENERATED ALWAYS AS ( type IS NULL OR type NOT IN ( 'change-number-notification', 'contact-removed-notification', 'conversation-merge', 'group-v1-migration', 'keychange', 'message-history-unsynced', 'profile-change', 'story', 'universal-timer-notification', 'verified-change' ) ); --- (change: added contact-removed-notification) ALTER TABLE messages ADD COLUMN isUserInitiatedMessage INTEGER GENERATED ALWAYS AS ( type IS NULL OR type NOT IN ( 'change-number-notification', 'contact-removed-notification', 'conversation-merge', 'group-v1-migration', 'group-v2-change', 'keychange', 'message-history-unsynced', 'profile-change', 'story', 'universal-timer-notification', 'verified-change' ) ); --- From migration 76 CREATE INDEX messages_preview ON messages (conversationId, shouldAffectPreview, isGroupLeaveEventFromOther, received_at, sent_at); --- From migration 76 CREATE INDEX messages_preview_without_story ON messages (conversationId, shouldAffectPreview, isGroupLeaveEventFromOther, received_at, sent_at) WHERE storyId IS NULL; --- From migration 73 CREATE INDEX messages_activity ON messages (conversationId, shouldAffectActivity, isTimerChangeFromSync, isGroupLeaveEventFromOther, received_at, sent_at); --- From migration 74 CREATE INDEX message_user_initiated ON messages (conversationId, isUserInitiatedMessage); ` ); } __name(updateToSchemaVersion81, "updateToSchemaVersion81"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var edited_messages_read_index_std_exports = {}; __export(edited_messages_read_index_std_exports, { default: () => updateToSchemaVersion82 }); module.exports = __toCommonJS(edited_messages_read_index_std_exports); function updateToSchemaVersion82(db) { db.exec(` ALTER TABLE edited_messages DROP COLUMN fromId; ALTER TABLE edited_messages ADD COLUMN conversationId STRING; CREATE INDEX edited_messages_unread ON edited_messages (readStatus, conversationId); `); } __name(updateToSchemaVersion82, "updateToSchemaVersion82"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var mentions_std_exports = {}; __export(mentions_std_exports, { default: () => updateToSchemaVersion83 }); module.exports = __toCommonJS(mentions_std_exports); function updateToSchemaVersion83(db) { db.exec( ` ALTER TABLE messages ADD COLUMN mentionsMe INTEGER NOT NULL DEFAULT 0; -- one which includes story data... CREATE INDEX messages_unread_mentions ON messages (conversationId, readStatus, mentionsMe, isStory, storyId, received_at, sent_at) WHERE readStatus IS NOT NULL; -- ...and one which doesn't, so storyPredicate works as expected CREATE INDEX messages_unread_mentions_no_story_id ON messages (conversationId, readStatus, mentionsMe, isStory, received_at, sent_at) WHERE isStory IS 0 AND readStatus IS NOT NULL; ` ); } __name(updateToSchemaVersion83, "updateToSchemaVersion83"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var all_mentions_std_exports = {}; __export(all_mentions_std_exports, { default: () => updateToSchemaVersion84 }); module.exports = __toCommonJS(all_mentions_std_exports); function updateToSchemaVersion84(db) { const selectMentionsFromMessages = ` SELECT messages.id, bodyRanges.value ->> 'mentionUuid' as mentionUuid, bodyRanges.value ->> 'start' as start, bodyRanges.value ->> 'length' as length FROM messages, json_each(messages.json ->> 'bodyRanges') as bodyRanges WHERE bodyRanges.value ->> 'mentionUuid' IS NOT NULL `; db.exec(` DROP TABLE IF EXISTS mentions; CREATE TABLE mentions ( messageId REFERENCES messages(id) ON DELETE CASCADE, mentionUuid STRING, start INTEGER, length INTEGER ); CREATE INDEX mentions_uuid ON mentions (mentionUuid); INSERT INTO mentions (messageId, mentionUuid, start, length) ${selectMentionsFromMessages}; -- Note: any changes to this trigger must be reflected in -- Server.ts: enableMessageInsertTriggersAndBackfill CREATE TRIGGER messages_on_insert_insert_mentions AFTER INSERT ON messages BEGIN INSERT INTO mentions (messageId, mentionUuid, start, length) ${selectMentionsFromMessages} AND messages.id = new.id; END; CREATE TRIGGER messages_on_update_update_mentions AFTER UPDATE ON messages BEGIN DELETE FROM mentions WHERE messageId = new.id; INSERT INTO mentions (messageId, mentionUuid, start, length) ${selectMentionsFromMessages} AND messages.id = new.id; END; `); } __name(updateToSchemaVersion84, "updateToSchemaVersion84"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var add_kyber_keys_std_exports = {}; __export(add_kyber_keys_std_exports, { default: () => updateToSchemaVersion85 }); module.exports = __toCommonJS(add_kyber_keys_std_exports); function updateToSchemaVersion85(db) { db.exec( `CREATE TABLE kyberPreKeys( id STRING PRIMARY KEY NOT NULL, json TEXT NOT NULL, ourUuid STRING GENERATED ALWAYS AS (json_extract(json, '$.ourUuid')) );` ); db.exec("CREATE INDEX kyberPreKeys_ourUuid ON kyberPreKeys (ourUuid);"); const now = Date.now(); db.exec( `UPDATE preKeys SET json = json_set(json, '$.createdAt', ${now}); ` ); } __name(updateToSchemaVersion85, "updateToSchemaVersion85"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var story_replies_index_std_exports = {}; __export(story_replies_index_std_exports, { default: () => updateToSchemaVersion86 }); module.exports = __toCommonJS(story_replies_index_std_exports); function updateToSchemaVersion86(db) { db.exec( `CREATE INDEX messages_story_replies ON messages (storyId, received_at, sent_at) WHERE isStory IS 0; ` ); } __name(updateToSchemaVersion86, "updateToSchemaVersion86"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var cleanup_std_exports = {}; __export(cleanup_std_exports, { default: () => updateToSchemaVersion87 }); module.exports = __toCommonJS(cleanup_std_exports); var import_clean_more_keys_std = require("./920-clean-more-keys.std.js"); var import_util_std = require("../util.std.js"); function updateToSchemaVersion87(db, logger, startingVersion) { if (startingVersion >= 88) { return; } (0, import_clean_more_keys_std.cleanKeys)( db, logger, "(cleanup)/kyberPreKeys", import_util_std.sqlFragment`kyberPreKeys`, import_util_std.sqlFragment`createdAt`, import_util_std.sqlFragment`ourUuid` ); (0, import_clean_more_keys_std.cleanKeys)( db, logger, "(cleanup)/preKeys", import_util_std.sqlFragment`preKeys`, import_util_std.sqlFragment`createdAt`, import_util_std.sqlFragment`ourUuid` ); (0, import_clean_more_keys_std.cleanKeys)( db, logger, "(cleanup)/signedPreKeys", import_util_std.sqlFragment`signedPreKeys`, import_util_std.sqlFragment`created_at`, import_util_std.sqlFragment`ourUuid` ); } __name(updateToSchemaVersion87, "updateToSchemaVersion87"); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var service_ids_std_exports = {}; __export(service_ids_std_exports, { default: () => updateToSchemaVersion88 }); module.exports = __toCommonJS(service_ids_std_exports); var import_lodash = __toESM(require("lodash")); var import_ServiceId_std = require("../../types/ServiceId.std.js"); var import_normalizeAci_std = require("../../util/normalizeAci.std.js"); var import_isNotNil_std = require("../../util/isNotNil.std.js"); const { omit } = import_lodash.default; function updateToSchemaVersion88(db, logger) { const selectMentionsFromMessages = ` SELECT messages.id, bodyRanges.value ->> 'mentionAci' as mentionAci, bodyRanges.value ->> 'start' as start, bodyRanges.value ->> 'length' as length FROM messages, json_each(messages.json ->> 'bodyRanges') as bodyRanges WHERE bodyRanges.value ->> 'mentionAci' IS NOT NULL `; db.exec(` -- -- conversations -- DROP INDEX conversations_uuid; ALTER TABLE conversations RENAME COLUMN uuid TO serviceId; -- See: updateToSchemaVersion20 CREATE INDEX conversations_serviceId ON conversations(serviceId); -- -- sessions -- ALTER TABLE sessions RENAME COLUMN ourUuid TO ourServiceId; ALTER TABLE sessions RENAME COLUMN uuid TO serviceId; -- -- messages -- DROP INDEX messages_sourceUuid; DROP INDEX messages_preview; DROP INDEX messages_preview_without_story; DROP INDEX messages_activity; ALTER TABLE messages DROP COLUMN isGroupLeaveEventFromOther; ALTER TABLE messages DROP COLUMN isGroupLeaveEvent; ALTER TABLE messages RENAME COLUMN sourceUuid TO sourceServiceId; -- See: updateToSchemaVersion47 ALTER TABLE messages ADD COLUMN isGroupLeaveEvent INTEGER GENERATED ALWAYS AS ( type IS 'group-v2-change' AND json_array_length(json_extract(json, '$.groupV2Change.details')) IS 1 AND json_extract(json, '$.groupV2Change.details[0].type') IS 'member-remove' AND json_extract(json, '$.groupV2Change.from') IS NOT NULL AND json_extract(json, '$.groupV2Change.from') IS json_extract(json, '$.groupV2Change.details[0].aci') ); ALTER TABLE messages ADD COLUMN isGroupLeaveEventFromOther INTEGER GENERATED ALWAYS AS ( isGroupLeaveEvent IS 1 AND isChangeCreatedByUs IS 0 ); -- See: updateToSchemaVersion25 CREATE INDEX messages_sourceServiceId on messages(sourceServiceId); -- See: updateToSchemaVersion81 CREATE INDEX messages_preview ON messages (conversationId, shouldAffectPreview, isGroupLeaveEventFromOther, received_at, sent_at); CREATE INDEX messages_preview_without_story ON messages (conversationId, shouldAffectPreview, isGroupLeaveEventFromOther, received_at, sent_at) WHERE storyId IS NULL; CREATE INDEX messages_activity ON messages (conversationId, shouldAffectActivity, isTimerChangeFromSync, isGroupLeaveEventFromOther, received_at, sent_at); -- -- reactions -- DROP INDEX reaction_identifier; ALTER TABLE reactions RENAME COLUMN targetAuthorUuid TO targetAuthorAci; -- See: updateToSchemaVersion29 CREATE INDEX reaction_identifier ON reactions ( emoji, targetAuthorAci, targetTimestamp ); -- -- unprocessed -- ALTER TABLE unprocessed RENAME COLUMN sourceUuid TO sourceServiceId; -- -- sendLogRecipients -- DROP INDEX sendLogRecipientsByRecipient; ALTER TABLE sendLogRecipients RENAME COLUMN recipientUuid TO recipientServiceId; -- See: updateToSchemaVersion37 CREATE INDEX sendLogRecipientsByRecipient ON sendLogRecipients (recipientServiceId, deviceId); -- -- storyDistributionMembers -- ALTER TABLE storyDistributionMembers RENAME COLUMN uuid TO serviceId; -- -- mentions -- DROP TRIGGER messages_on_update; DROP TRIGGER messages_on_insert_insert_mentions; DROP TRIGGER messages_on_update_update_mentions; DROP INDEX mentions_uuid; ALTER TABLE mentions RENAME COLUMN mentionUuid TO mentionAci; -- See: updateToSchemaVersion84 CREATE INDEX mentions_aci ON mentions (mentionAci); -- -- preKeys -- DROP INDEX preKeys_ourUuid; DROP INDEX signedPreKeys_ourUuid; DROP INDEX kyberPreKeys_ourUuid; ALTER TABLE preKeys RENAME COLUMN ourUuid TO ourServiceId; ALTER TABLE signedPreKeys RENAME COLUMN ourUuid TO ourServiceId; ALTER TABLE kyberPreKeys RENAME COLUMN ourUuid TO ourServiceId; -- See: updateToSchemaVersion64 CREATE INDEX preKeys_ourServiceId ON preKeys (ourServiceId); CREATE INDEX signedPreKeys_ourServiceId ON signedPreKeys (ourServiceId); CREATE INDEX kyberPreKeys_ourServiceId ON kyberPreKeys (ourServiceId); `); const { identifierToServiceId } = migrateConversations(db, logger); const ourServiceIds = migrateItems(db, logger); migrateSessions(db, ourServiceIds, logger); migrateMessages(db, logger); migratePreKeys(db, "preKeys", ourServiceIds, logger); migratePreKeys(db, "signedPreKeys", ourServiceIds, logger); migratePreKeys(db, "kyberPreKeys", ourServiceIds, logger); migrateJobs(db, identifierToServiceId, logger); db.exec(` -- See: updateToSchemaVersion45 CREATE TRIGGER messages_on_update AFTER UPDATE ON messages WHEN (new.body IS NULL OR old.body IS NOT new.body) AND new.isViewOnce IS NOT 1 AND new.storyId IS NULL BEGIN DELETE FROM messages_fts WHERE rowid = old.rowid; INSERT INTO messages_fts (rowid, body) VALUES (new.rowid, new.body); END; -- See: updateToSchemaVersion84 CREATE TRIGGER messages_on_insert_insert_mentions AFTER INSERT ON messages BEGIN INSERT INTO mentions (messageId, mentionAci, start, length) ${selectMentionsFromMessages} AND messages.id = new.id; END; CREATE TRIGGER messages_on_update_update_mentions AFTER UPDATE ON messages BEGIN DELETE FROM mentions WHERE messageId = new.id; INSERT INTO mentions (messageId, mentionAci, start, length) ${selectMentionsFromMessages} AND messages.id = new.id; END; `); } __name(updateToSchemaVersion88, "updateToSchemaVersion88"); function migrateConversations(db, logger) { const convos = db.prepare("SELECT id, e164, serviceId, json FROM conversations").all(); const updateStmt = db.prepare( "UPDATE conversations SET json = $json WHERE id IS $id" ); logger.info(`updating ${convos.length} conversations`); const identifierToServiceId = /* @__PURE__ */ new Map(); for (const { id, e164, serviceId: rawServiceId } of convos) { if (!rawServiceId) { continue; } const serviceId = (0, import_ServiceId_std.normalizeServiceId)( rawServiceId, "legacyConvo.serviceId", logger ); identifierToServiceId.set(id, serviceId); if (e164) { identifierToServiceId.set(e164, serviceId); } identifierToServiceId.set(serviceId, serviceId); } for (const { id, json } of convos) { try { const legacy = JSON.parse(json); const { uuid: serviceId, pni, bannedMembersV2, membersV2, pendingAdminApprovalV2, pendingMembersV2, lastMessageBodyRanges, senderKeyInfo, ...restOfConvo } = legacy; const modern = { ...restOfConvo, serviceId: (0, import_ServiceId_std.normalizeServiceId)( serviceId, "legacyConvo.serviceId", logger ), pni: prefixPni(pni, "legacyConvo.pni", logger), bannedMembersV2: bannedMembersV2?.map( ({ uuid: memberServiceId, ...rest }) => { return { ...rest, serviceId: (0, import_ServiceId_std.normalizeServiceId)( memberServiceId, "legacyConvo.bannedMembersV2", logger ) }; } ), membersV2: membersV2?.map(({ uuid: aci, ...rest }) => { return { ...rest, aci: (0, import_normalizeAci_std.normalizeAci)(aci, "legacyConvo.membersV2", logger) }; }), pendingAdminApprovalV2: pendingAdminApprovalV2?.map( ({ uuid: aci, ...rest }) => { return { ...rest, aci: (0, import_normalizeAci_std.normalizeAci)( aci, "legacyConvo.pendingAdminApprovalV2", logger ) }; } ), pendingMembersV2: pendingMembersV2?.map( ({ uuid: memberServiceId, ...rest }) => { return { ...rest, serviceId: (0, import_ServiceId_std.normalizeServiceId)( memberServiceId, "legacyConvo.pendingMembersV2", logger ) }; } ), lastMessageBodyRanges: migrateBodyRanges( lastMessageBodyRanges, "lastMessageBodyRanges", logger ), senderKeyInfo: senderKeyInfo ? { ...senderKeyInfo, memberDevices: senderKeyInfo.memberDevices.map(({ identifier, ...rest }) => { const deviceServiceId = identifierToServiceId.get(identifier); if (!deviceServiceId) { logger.warn(`failed to resolve identifier ${identifier}`); return void 0; } return { ...rest, serviceId: deviceServiceId }; }).filter(import_isNotNil_std.isNotNil) } : void 0 }; updateStmt.run({ id, json: JSON.stringify(modern) }); } catch (error) { logger.warn(`failed to parse convo ${id} json`, error); continue; } } return { identifierToServiceId }; } __name(migrateConversations, "migrateConversations"); function migrateItems(db, logger) { const uuidIdJson = db.prepare( ` SELECT json FROM items WHERE id IS 'uuid_id' `, { pluck: true } ).get(); const pniJson = db.prepare( ` SELECT json FROM items WHERE id IS 'pni' `, { pluck: true } ).get(); let legacyAci; try { [legacyAci] = JSON.parse(uuidIdJson ?? "").value.split(".", 2); } catch (error) { if (uuidIdJson) { logger.warn("failed to parse uuid_id item", error); } else { logger.info("Our UUID not found"); } } let legacyPni; try { legacyPni = JSON.parse(pniJson ?? "").value; } catch (error) { if (pniJson) { logger.warn("failed to parse pni item", error); } else { logger.info("Our PNI not found"); } } const aci = (0, import_normalizeAci_std.normalizeAci)(legacyAci, "uuid_id", logger); const pni = prefixPni(legacyPni, "pni", logger); const maps = db.prepare( ` SELECT id, json FROM items WHERE id IN ('identityKeyMap', 'registrationIdMap'); ` ).all(); const updateStmt = db.prepare( "UPDATE items SET json = $json WHERE id IS $id" ); if (pni) { updateStmt.run({ id: "pni", json: JSON.stringify({ id: "pni", value: pni }) }); } for (const { id, json } of maps) { try { const data = JSON.parse(json); const aciValue = legacyAci && data.value[legacyAci]; if (legacyAci && aci && aciValue) { delete data.value[legacyAci]; data.value[aci] = aciValue; } const pniValue = legacyPni && data.value[legacyPni]; if (legacyPni && pni && pniValue) { delete data.value[legacyPni]; data.value[pni] = pniValue; } updateStmt.run({ id, json: JSON.stringify(data) }); } catch (error) { logger.warn(`failed to parse ${id} item`, error); } } return { aci, pni, legacyAci, legacyPni }; } __name(migrateItems, "migrateItems"); function migrateSessions(db, ourServiceIds, logger) { const sessions = db.prepare("SELECT id, serviceId, ourServiceId, json FROM sessions").all(); const updateStmt = db.prepare( ` UPDATE sessions SET id = $newId, serviceId = $newServiceId, ourServiceId = $newOurServiceId, json = $newJson WHERE id IS $id ` ); logger.info(`updating ${sessions.length} sessions`); for (const { id, serviceId, ourServiceId, json } of sessions) { const match = id.match(/^(.*):(.*)\.(.*)$/); if (!match) { logger.warn(`invalid session id ${id}`); continue; } let legacyData; try { legacyData = JSON.parse(json); } catch (error) { logger.warn(`failed to parse session ${id}`, error); continue; } const [, from, to, device] = match; const newId = `${migrateServiceId(from, ourServiceIds, logger)}:${migrateServiceId(to, ourServiceIds, logger)}.${device}`; const newServiceId = migrateServiceId(serviceId, ourServiceIds, logger); const newOurServiceId = migrateServiceId( ourServiceId, ourServiceIds, logger ); if (!newServiceId || !newOurServiceId) { logger.warn( "failed to normalize session service ids", serviceId, ourServiceId ); continue; } const newData = { ...omit(legacyData, "uuid", "ourUuid"), id: newId, serviceId: newServiceId, ourServiceId: newOurServiceId }; updateStmt.run({ id, newId, newServiceId, newOurServiceId, newJson: JSON.stringify(newData) }); } } __name(migrateSessions, "migrateSessions"); function migrateMessages(db, logger) { const PAGE_SIZE = 1e4; const getPage = db.prepare(` SELECT rowid, id, json FROM messages LIMIT $limit OFFSET $offset `); const updateStmt = db.prepare(` UPDATE messages SET json = $json WHERE rowid = $rowid `); logger.info("updating messages"); let totalMessages = 0; for (let offset = 0; true; offset += PAGE_SIZE) { const messages = getPage.all({ limit: PAGE_SIZE, offset }); if (messages.length === 0) { break; } totalMessages += messages.length; for (const { rowid, id, json } of messages) { try { const legacy = JSON.parse(json); const { sourceUuid, expirationTimerUpdate, reactions, storyReaction, storyReplyContext, editHistory, groupV2Change, ...restOfMessage } = legacy; const updatedMessage = { ...restOfMessage, ...omit( migrateBodyRangesAndQuote(legacy, "message", logger), "sourceUuid" ), sourceServiceId: (0, import_ServiceId_std.normalizeServiceId)(sourceUuid, "sourceUuid"), expirationTimerUpdate: expirationTimerUpdate ? { ...omit(expirationTimerUpdate, "sourceUuid"), sourceServiceId: (0, import_ServiceId_std.normalizeServiceId)( expirationTimerUpdate.sourceUuid, "expirationTimerUpdate.sourceUuid" ) } : void 0, reactions: reactions?.map((r) => migrateReaction(r)), storyReaction: storyReaction ? migrateReaction(storyReaction) : void 0, storyReplyContext: storyReplyContext ? { ...omit(storyReplyContext, "authorUuid"), authorAci: (0, import_normalizeAci_std.normalizeAci)( storyReplyContext.authorUuid, "storyReplyContext.authorUuid", logger ) } : void 0, editHistory: editHistory?.map( (h) => migrateBodyRangesAndQuote(h, "editHistory", logger) ), groupV2Change: groupV2Change ? { ...groupV2Change, details: groupV2Change.details?.map( (d) => migrateGroupChange(d, logger) ) } : void 0 }; updateStmt.run({ rowid, json: JSON.stringify(updatedMessage) }); } catch (error) { logger.warn(`failed to parse message ${id} json`, error); } } } logger.info(`updated ${totalMessages} messages`); } __name(migrateMessages, "migrateMessages"); function migratePreKeys(db, table, ourServiceIds, logger) { const preKeys = db.prepare(`SELECT id, json FROM ${table}`).all(); const updateStmt = db.prepare(` UPDATE ${table} SET id = $newId, json = $newJson WHERE id = $id `); logger.info(`updating ${preKeys.length} ${table}`); for (const { id, json } of preKeys) { const match = id.match(/^(.*):(.*)$/); if (!match) { logger.warn(`invalid ${table} id ${id}`); continue; } let legacyData; try { legacyData = JSON.parse(json); } catch (error) { logger.warn(`failed to parse ${table} ${id}`, error); continue; } const [, ourUuid, keyId] = match; const ourServiceId = migrateServiceId(ourUuid, ourServiceIds, logger); const newId = `${ourServiceId}:${keyId}`; const newData = { ...omit(legacyData, "ourUuid"), id: newId, ourServiceId }; updateStmt.run({ id, newId, newJson: JSON.stringify(newData) }); } } __name(migratePreKeys, "migratePreKeys"); function migrateJobs(db, identifierToServiceId, logger) { const jobs = db.prepare("SELECT id, queueType, data FROM jobs").all(); const updateStmt = db.prepare("UPDATE jobs SET data = $data WHERE id IS $id"); let updatedCount = 0; for (const { id, queueType, data } of jobs) { try { const parsedData = JSON.parse(data); let updatedData; if (queueType === "conversation") { const convoJob = parsedData; let updatedJob; if (convoJob.type === "DeleteStoryForEveryone") { updatedJob = { ...convoJob, updatedStoryRecipients: convoJob.updatedStoryRecipients.map( ({ destinationUuid, legacyDestinationUuid, destinationAci, destinationPni, ...rest }) => { return { ...rest, destinationServiceId: (0, import_ServiceId_std.normalizeServiceId)( destinationUuid || destinationAci || destinationPni || legacyDestinationUuid, "DeleteStoryForEveryone", logger ) }; } ) }; } else if (convoJob.type === "ResendRequest") { updatedJob = { ...omit(convoJob, "senderUuid"), senderAci: (0, import_normalizeAci_std.normalizeAci)( convoJob.senderUuid, "ResendRequest", logger ) }; } else if (convoJob.type === "Receipts") { updatedJob = { ...convoJob, receipts: convoJob.receipts.map(({ senderUuid, ...rest }) => { return { ...rest, senderAci: (0, import_normalizeAci_std.normalizeAci)(senderUuid, "Receipts", logger) }; }) }; } updatedData = updatedJob; } else if (queueType === "read sync") { const syncJob = parsedData; const updatedJob = { ...syncJob, readSyncs: syncJob.readSyncs.map(({ senderUuid, ...rest }) => { return { ...rest, senderAci: (0, import_normalizeAci_std.normalizeAci)(senderUuid, "read sync") }; }) }; updatedData = updatedJob; } else if (queueType === "view sync") { const syncJob = parsedData; const updatedJob = { ...syncJob, viewSyncs: syncJob.viewSyncs.map(({ senderUuid, ...rest }) => { return { ...rest, senderAci: (0, import_normalizeAci_std.normalizeAci)(senderUuid, "read sync") }; }) }; updatedData = updatedJob; } else if (queueType === "view once open sync") { const syncJob = parsedData; const updatedJob = { ...syncJob, viewOnceOpens: syncJob.viewOnceOpens.map( ({ senderUuid, ...rest }) => { return { ...rest, senderAci: (0, import_normalizeAci_std.normalizeAci)(senderUuid, "read sync") }; } ) }; updatedData = updatedJob; } else if (queueType === "single proto") { const { identifier, ...syncJob } = parsedData; const serviceId = identifierToServiceId.get(identifier); if (!serviceId) { logger.warn( `failed to resolve identifier ${identifier} for job ${id}/${queueType}` ); continue; } const updatedJob = { ...syncJob, serviceId }; updatedData = updatedJob; } if (updatedData !== void 0) { updatedCount += 1; updateStmt.run({ id, data: JSON.stringify(updatedData) }); } } catch (error) { logger.warn(`failed to migrate job ${id}/${queueType} json`, error); } } logger.info(`updated ${updatedCount} jobs`); } __name(migrateJobs, "migrateJobs"); function migrateBodyRangesAndQuote({ bodyRanges, quote, ...rest }, context, logger) { return { ...rest, bodyRanges: bodyRanges ? migrateBodyRanges(bodyRanges, `${context}.bodyRanges`, logger) : void 0, quote: quote ? { ...quote, authorAci: (0, import_normalizeAci_std.normalizeAci)( quote.authorUuid, `${context}.quote.authorUuid`, logger ), bodyRanges: quote.bodyRanges ? migrateBodyRanges( quote.bodyRanges, `${context}.quote.bodyRanges`, logger ) : void 0 } : void 0 }; } __name(migrateBodyRangesAndQuote, "migrateBodyRangesAndQuote"); function migrateServiceId(legacyId, { legacyAci, legacyPni, aci, pni }, logger) { if (legacyId == null) { return void 0; } if (legacyId === legacyAci) { return aci; } if (legacyId === legacyPni) { return pni; } return (0, import_ServiceId_std.normalizeServiceId)(legacyId, `migrateServiceId(${legacyId})`, logger); } __name(migrateServiceId, "migrateServiceId"); function prefixPni(legacyPni, context, logger) { if (legacyPni == null) { return void 0; } if (legacyPni.toLowerCase().startsWith("pni:")) { return (0, import_ServiceId_std.normalizePni)(legacyPni, context, logger); } return (0, import_ServiceId_std.normalizePni)(`PNI:${legacyPni}`, context, logger); } __name(prefixPni, "prefixPni"); function migrateBodyRanges(legacy, context, logger) { if (legacy == null) { return void 0; } return legacy?.map(({ mentionUuid: mentionAci, ...rest }) => { return { ...rest, mentionAci: (0, import_normalizeAci_std.normalizeAci)(mentionAci, context, logger) }; }); } __name(migrateBodyRanges, "migrateBodyRanges"); function migrateReaction(legacy) { return omit(legacy, "targetAuthorUuid"); } __name(migrateReaction, "migrateReaction"); const GROUP_CHANGES_WITH_SERVICE_ID = /* @__PURE__ */ new Set([ "pending-add-one", "pending-remove-one" ]); function migrateGroupChange({ type, uuid, ...rest }, logger) { let aci; let serviceId; if (GROUP_CHANGES_WITH_SERVICE_ID.has(type)) { serviceId = (0, import_ServiceId_std.normalizeServiceId)(uuid, `migrateGroupChange(${type})`, logger); } else { aci = (0, import_normalizeAci_std.normalizeAci)(uuid, `migrateGroupChange(${type})`, logger); } return { ...rest, type, aci, serviceId }; } __name(migrateGroupChange, "migrateGroupChange"); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var call_history_node_exports = {}; __export(call_history_node_exports, { default: () => updateToSchemaVersion89 }); module.exports = __toCommonJS(call_history_node_exports); var import_ringrtc = require("@signalapp/ringrtc"); var import_long = __toESM(require("long")); var import_uuid = require("uuid"); var import_lodash = __toESM(require("lodash")); var import_util_std = require("../util.std.js"); var import_uuid_keys_std = require("./41-uuid-keys.std.js"); var import_CallDisposition_std = require("../../types/CallDisposition.std.js"); var import_assert_std = require("../../util/assert.std.js"); var import_missingCaseError_std = require("../../util/missingCaseError.std.js"); var import_isAciString_std = require("../../util/isAciString.std.js"); var import_schemas_std = require("../../util/schemas.std.js"); const { isObject } = import_lodash.default; function upcastCallHistoryDetailsFromDiskType(callDetails) { if (callDetails.callMode === import_CallDisposition_std.CallMode.Direct) { return callDetails; } if (callDetails.callMode === import_CallDisposition_std.CallMode.Group) { return callDetails; } if (Object.hasOwn(callDetails, "wasIncoming") && Object.hasOwn(callDetails, "wasVideoCall")) { return { callMode: import_CallDisposition_std.CallMode.Direct, ...callDetails }; } if (Object.hasOwn(callDetails, "eraId") && Object.hasOwn(callDetails, "startedTime")) { return { callMode: import_CallDisposition_std.CallMode.Group, ...callDetails }; } throw new Error("Could not determine call mode"); } __name(upcastCallHistoryDetailsFromDiskType, "upcastCallHistoryDetailsFromDiskType"); function getPeerIdFromConversation(conversation, logger) { if (conversation.type === "private") { if (conversation.serviceId == null) { logger.warn( `Private conversation (${conversation.id}) was missing serviceId (discoveredUnregisteredAt: ${conversation.discoveredUnregisteredAt})` ); return conversation.id; } (0, import_assert_std.strictAssert)( (0, import_isAciString_std.isAciString)(conversation.serviceId), "ACI must exist for direct chat" ); return conversation.serviceId; } (0, import_assert_std.strictAssert)( conversation.groupId != null, "groupId must exist for group chat" ); return conversation.groupId; } __name(getPeerIdFromConversation, "getPeerIdFromConversation"); function convertLegacyCallDetails(ourUuid, peerId, message, partialDetails, logger) { const details = upcastCallHistoryDetailsFromDiskType(partialDetails); const { callMode: mode } = details; let callId; let type; let direction; let status; let timestamp; let ringerId = null; (0, import_assert_std.strictAssert)(mode != null, "mode must exist"); const fallbackTimestamp = message.timestamp ?? message.sent_at ?? message.received_at_ms ?? 0; if (mode === import_CallDisposition_std.CallMode.Direct) { callId = details.callId ?? (0, import_uuid.v4)(); type = details.wasVideoCall ? import_CallDisposition_std.CallType.Video : import_CallDisposition_std.CallType.Audio; direction = details.wasIncoming ? import_CallDisposition_std.CallDirection.Incoming : import_CallDisposition_std.CallDirection.Outgoing; if (details.acceptedTime != null) { status = import_CallDisposition_std.DirectCallStatus.Accepted; } else { status = details.wasDeclined ? import_CallDisposition_std.DirectCallStatus.Declined : import_CallDisposition_std.DirectCallStatus.Missed; } timestamp = details.acceptedTime ?? details.endedTime ?? fallbackTimestamp; } else if (mode === import_CallDisposition_std.CallMode.Group) { callId = import_long.default.fromValue((0, import_ringrtc.callIdFromEra)(details.eraId)).toString(); type = import_CallDisposition_std.CallType.Group; direction = details.creatorUuid === ourUuid ? import_CallDisposition_std.CallDirection.Outgoing : import_CallDisposition_std.CallDirection.Incoming; status = import_CallDisposition_std.GroupCallStatus.GenericGroupCall; timestamp = details.startedTime ?? fallbackTimestamp; ringerId = details.creatorUuid; } else { throw (0, import_missingCaseError_std.missingCaseError)(mode); } const callHistory = { callId, peerId, ringerId, mode, type, direction, status, timestamp, // Not present at the time of this migration startedById: null, endedTimestamp: null }; const result = (0, import_schemas_std.safeParseStrict)(import_CallDisposition_std.callHistoryDetailsSchema, callHistory); if (result.success) { return result.data; } logger.error( `convertLegacyCallDetails: Could not convert ${mode} call`, result.error.toString() ); throw new Error(`Failed to convert legacy ${mode} call details`); } __name(convertLegacyCallDetails, "convertLegacyCallDetails"); function updateToSchemaVersion89(db, logger) { const ourUuid = (0, import_uuid_keys_std.getOurUuid)(db); const [createTable] = import_util_std.sql` -- This table may have already existed from migration 87 CREATE TABLE IF NOT EXISTS callsHistory ( callId TEXT PRIMARY KEY, peerId TEXT NOT NULL, -- conversation id (legacy) | uuid | groupId | roomId ringerId TEXT DEFAULT NULL, -- ringer uuid mode TEXT NOT NULL, -- enum "Direct" | "Group" type TEXT NOT NULL, -- enum "Audio" | "Video" | "Group" direction TEXT NOT NULL, -- enum "Incoming" | "Outgoing -- Direct: enum "Pending" | "Missed" | "Accepted" | "Deleted" -- Group: enum "GenericGroupCall" | "OutgoingRing" | "Ringing" | "Joined" | "Missed" | "Declined" | "Accepted" | "Deleted" status TEXT NOT NULL, timestamp INTEGER NOT NULL, UNIQUE (callId, peerId) ON CONFLICT FAIL ); -- Update peerId to be uuid or groupId UPDATE callsHistory SET peerId = ( SELECT CASE WHEN conversations.type = 'private' THEN conversations.serviceId WHEN conversations.type = 'group' THEN conversations.groupId END FROM conversations WHERE callsHistory.peerId IS conversations.id AND callsHistory.peerId IS NOT conversations.serviceId ) WHERE EXISTS ( SELECT 1 FROM conversations WHERE callsHistory.peerId IS conversations.id AND callsHistory.peerId IS NOT conversations.serviceId ); CREATE INDEX IF NOT EXISTS callsHistory_order on callsHistory (timestamp DESC); CREATE INDEX IF NOT EXISTS callsHistory_byConversation ON callsHistory (peerId); -- For 'getCallHistoryGroupData': -- This index should target the subqueries for 'possible_parent' and 'possible_children' CREATE INDEX IF NOT EXISTS callsHistory_callAndGroupInfo_optimize on callsHistory ( direction, peerId, timestamp DESC, status ); `; db.exec(createTable); const [selectQuery] = import_util_std.sql` SELECT messages.json AS messageJson, conversations.id AS conversationId, conversations.json AS conversationJson FROM messages LEFT JOIN conversations ON conversations.id = messages.conversationId WHERE messages.type = 'call-history' -- Some of these messages were already migrated AND messages.json->'callHistoryDetails' IS NOT NULL -- Sort from oldest to newest, so that newer messages can overwrite older ORDER BY messages.received_at ASC, messages.sent_at ASC; `; const rows = db.prepare(selectQuery).all(); for (const row of rows) { const { messageJson, conversationId, conversationJson } = row; const message = (0, import_util_std.jsonToObject)(messageJson); const conversation = (0, import_util_std.jsonToObject)(conversationJson); if (!isObject(conversation)) { logger.warn( `Private conversation (${conversationId}) has non-object json column` ); continue; } const details = message.callHistoryDetails; const peerId = getPeerIdFromConversation(conversation, logger); const callHistory = convertLegacyCallDetails( ourUuid, peerId, message, details, logger ); const [insertQuery, insertParams] = import_util_std.sql` -- Using 'OR REPLACE' because in some earlier versions of call history -- we had a bug where we would insert duplicate call history entries -- for the same callId and peerId. -- We're assuming here that the latest call history entry is the most -- accurate. INSERT OR REPLACE INTO callsHistory ( callId, peerId, ringerId, mode, type, direction, status, timestamp ) VALUES ( ${callHistory.callId}, ${callHistory.peerId}, ${callHistory.ringerId}, ${callHistory.mode}, ${callHistory.type}, ${callHistory.direction}, ${callHistory.status}, ${callHistory.timestamp} ) `; db.prepare(insertQuery).run(insertParams); const messageId = message.id; (0, import_assert_std.strictAssert)(messageId != null, "message.id must exist"); const [updateQuery, updateParams] = import_util_std.sql` UPDATE messages SET json = JSON_PATCH(json, ${JSON.stringify({ callHistoryDetails: null, // delete callId: callHistory.callId })}) WHERE id = ${messageId} `; db.prepare(updateQuery).run(updateParams); } const [dropIndex] = import_util_std.sql` DROP INDEX IF EXISTS messages_call; `; db.exec(dropIndex); try { const [dropColumnQuery] = import_util_std.sql` ALTER TABLE messages DROP COLUMN callMode; `; db.exec(dropColumnQuery); } catch (error) { if (!error.message.includes('no such column: "callMode"')) { throw error; } } try { const [dropColumnQuery] = import_util_std.sql` ALTER TABLE messages DROP COLUMN callId; `; db.exec(dropColumnQuery); } catch (error) { if (!error.message.includes('no such column: "callId"')) { throw error; } } const [optimizeMessages] = import_util_std.sql` ALTER TABLE messages ADD COLUMN callId TEXT GENERATED ALWAYS AS ( json_extract(json, '$.callId') ); -- Optimize getCallHistoryMessageByCallId CREATE INDEX messages_call ON messages (conversationId, type, callId); CREATE INDEX messages_callHistory_readStatus ON messages (type, readStatus) WHERE type IS 'call-history'; `; db.exec(optimizeMessages); } __name(updateToSchemaVersion89, "updateToSchemaVersion89"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var delete_story_reply_screenshot_std_exports = {}; __export(delete_story_reply_screenshot_std_exports, { default: () => updateToSchemaVersion90 }); module.exports = __toCommonJS(delete_story_reply_screenshot_std_exports); var import_util_std = require("../util.std.js"); function updateToSchemaVersion90(db, logger) { let numChanges = 0; const [updateQuery, updateParams] = import_util_std.sql` UPDATE messages SET json = json_remove(json, '$.storyReplyContext.attachment.screenshotData') WHERE isStory = 0 /* we want to find all messages with a non-null storyId, but using string comparison (instead of a non-null check) here causes Sqlite to use the storyId index */ AND storyId > '0' AND json->'$.storyReplyContext.attachment.screenshotData' IS NOT NULL; `; const info = db.prepare(updateQuery).run(updateParams); numChanges = info.changes; logger.info( `removed screenshotData from ${numChanges} message${numChanges > 1 ? "s" : ""}` ); } __name(updateToSchemaVersion90, "updateToSchemaVersion90"); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var clean_keys_std_exports = {}; __export(clean_keys_std_exports, { default: () => updateToSchemaVersion91 }); module.exports = __toCommonJS(clean_keys_std_exports); var import_util_std = require("../util.std.js"); var import_ServiceId_std = require("../../types/ServiceId.std.js"); var Errors = __toESM(require("../../types/errors.std.js")); function updateToSchemaVersion91(db, logger) { db.exec(` --- First, prekeys DROP INDEX preKeys_ourServiceId; ALTER TABLE preKeys DROP COLUMN ourServiceId; ALTER TABLE preKeys ADD COLUMN ourServiceId NUMBER GENERATED ALWAYS AS (json_extract(json, '$.ourServiceId')); CREATE INDEX preKeys_ourServiceId ON preKeys (ourServiceId); -- Second, kyber prekeys DROP INDEX kyberPreKeys_ourServiceId; ALTER TABLE kyberPreKeys DROP COLUMN ourServiceId; ALTER TABLE kyberPreKeys ADD COLUMN ourServiceId NUMBER GENERATED ALWAYS AS (json_extract(json, '$.ourServiceId')); CREATE INDEX kyberPreKeys_ourServiceId ON kyberPreKeys (ourServiceId); -- Finally, signed prekeys DROP INDEX signedPreKeys_ourServiceId; ALTER TABLE signedPreKeys DROP COLUMN ourServiceId; ALTER TABLE signedPreKeys ADD COLUMN ourServiceId NUMBER GENERATED ALWAYS AS (json_extract(json, '$.ourServiceId')); CREATE INDEX signedPreKeys_ourServiceId ON signedPreKeys (ourServiceId); `); const totalKeys = db.prepare("SELECT count(*) FROM preKeys;", { pluck: true }).get() ?? 0; logger.info(`Found ${totalKeys} keys`); if (totalKeys < 1e3) { return; } let pni; const pniJson = db.prepare("SELECT json FROM items WHERE id IS 'pni'", { pluck: true }).get(); try { const pniData = JSON.parse(pniJson ?? ""); pni = (0, import_ServiceId_std.normalizePni)(pniData.value, "updateToSchemaVersion91"); } catch (error) { if (pniJson) { logger.warn("PNI found but did not parse", Errors.toLogFormat(error)); } else { logger.info("Our PNI not found"); } return; } const [beforeQuery, beforeParams] = import_util_std.sql`SELECT count(*) from preKeys WHERE ourServiceId = ${pni}`; const beforeKeys = db.prepare(beforeQuery, { pluck: true }).get(beforeParams); logger.info(`Found ${beforeKeys} preKeys for PNI`); db.exec(` ALTER TABLE preKeys ADD COLUMN createdAt NUMBER GENERATED ALWAYS AS (json_extract(json, '$.createdAt')); CREATE INDEX preKeys_date ON preKeys (ourServiceId, createdAt); `); logger.info("Temporary index created"); const [oldQuery, oldParams] = import_util_std.sql` SELECT createdAt FROM preKeys WHERE createdAt IS NOT NULL AND ourServiceId = ${pni} ORDER BY createdAt ASC LIMIT 1 OFFSET 499 `; const oldBoundary = db.prepare(oldQuery, { pluck: true }).get(oldParams); logger.info(`Found 500th-oldest timestamp: ${oldBoundary}`); const [newQuery, newParams] = import_util_std.sql` SELECT createdAt FROM preKeys WHERE createdAt IS NOT NULL AND ourServiceId = ${pni} ORDER BY createdAt DESC LIMIT 1 OFFSET 499 `; const newBoundary = db.prepare(newQuery, { pluck: true }).get(newParams); logger.info(`Found 500th-newest timestamp: ${newBoundary}`); let result; const [deleteQuery, deleteParams] = import_util_std.sql` DELETE FROM preKeys WHERE rowid IN ( SELECT rowid FROM preKeys WHERE createdAt IS NOT NULL AND createdAt > ${oldBoundary ?? null} AND createdAt < ${newBoundary ?? null} AND ourServiceId = ${pni} LIMIT 10000 ); `; const preparedQuery = db.prepare(deleteQuery); do { result = preparedQuery.run(deleteParams); logger.info(`Deleted ${result.changes} items`); } while (result.changes > 0); logger.info("Delete is complete!"); const [afterQuery, afterParams] = import_util_std.sql` SELECT count(*) FROM preKeys WHERE ourServiceId = ${pni}; `; const afterCount = db.prepare(afterQuery, { pluck: true }).get(afterParams); logger.info(`Found ${afterCount} preKeys for PNI after delete`); db.exec(` DROP INDEX preKeys_date; ALTER TABLE preKeys DROP COLUMN createdAt; `); } __name(updateToSchemaVersion91, "updateToSchemaVersion91"); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var clean_more_keys_std_exports = {}; __export(clean_more_keys_std_exports, { cleanKeys: () => cleanKeys, default: () => updateToSchemaVersion920 }); module.exports = __toCommonJS(clean_more_keys_std_exports); var import_util_std = require("../util.std.js"); var import_ServiceId_std = require("../../types/ServiceId.std.js"); var Errors = __toESM(require("../../types/errors.std.js")); function updateToSchemaVersion920(db, logger) { cleanKeys( db, logger, "kyberPreKeys", import_util_std.sqlFragment`kyberPreKeys`, import_util_std.sqlFragment`createdAt`, import_util_std.sqlFragment`ourServiceId` ); cleanKeys( db, logger, "signedPreKeys", import_util_std.sqlFragment`signedPreKeys`, import_util_std.sqlFragment`created_at`, import_util_std.sqlFragment`ourServiceId` ); logger.info("Done with deletions, starting vacuum..."); return "vacuum"; } __name(updateToSchemaVersion920, "updateToSchemaVersion920"); function cleanKeys(db, logger, logId, tableName, columnName, idField) { let pni; const pniJson = db.prepare("SELECT json FROM items WHERE id IS 'pni'", { pluck: true }).get(); try { const pniData = JSON.parse(pniJson ?? ""); pni = (0, import_ServiceId_std.normalizePni)(pniData.value, logId); } catch (error) { if (pniJson) { logger.warn( `${logId}: PNI found but did not parse`, Errors.toLogFormat(error) ); } else { logger.info(`${logId}: Our PNI not found`); } return; } const totalKeys = db.prepare(import_util_std.sql`SELECT count(*) FROM ${tableName};`[0], { pluck: true }).get() ?? 0; logger.info(`${logId}: Found ${totalKeys} total keys`); if (totalKeys < 1e3) { return; } const [beforeQuery, beforeParams] = import_util_std.sql`SELECT count(*) from ${tableName} WHERE ${idField} = ${pni}`; const beforeKeys = db.prepare(beforeQuery, { pluck: true }).get(beforeParams); logger.info(`${logId}: Found ${beforeKeys} keys for PNI`); db.exec( import_util_std.sql` ALTER TABLE ${tableName} ADD COLUMN createdAt NUMBER GENERATED ALWAYS AS (json_extract(json, '$.${columnName}')); CREATE INDEX ${tableName}_date ON ${tableName} (${idField}, createdAt); `[0] ); logger.info(`${logId}: Temporary index created`); const [oldQuery, oldParams] = import_util_std.sql` SELECT createdAt FROM ${tableName} WHERE createdAt IS NOT NULL AND ${idField} = ${pni} ORDER BY createdAt ASC LIMIT 1 OFFSET 499 `; const oldBoundary = db.prepare(oldQuery, { pluck: true }).get(oldParams); logger.info(`${logId}: Found 500th-oldest timestamp: ${oldBoundary}`); const [newQuery, newParams] = import_util_std.sql` SELECT createdAt FROM ${tableName} WHERE createdAt IS NOT NULL AND ${idField} = ${pni} ORDER BY createdAt DESC LIMIT 1 OFFSET 499 `; const newBoundary = db.prepare(newQuery, { pluck: true }).get(newParams); logger.info(`${logId}: Found 500th-newest timestamp: ${newBoundary}`); let result; const [deleteQuery, deleteParams] = import_util_std.sql` DELETE FROM ${tableName} WHERE createdAt IS NOT NULL AND createdAt > ${oldBoundary ?? null} AND createdAt < ${newBoundary ?? null} AND ${idField} = ${pni} LIMIT 10000; `; const preparedQuery = db.prepare(deleteQuery); do { result = preparedQuery.run(deleteParams); logger.info(`${logId}: Deleted ${result.changes} keys`); } while (result.changes > 0); logger.info(`${logId}: Delete is complete!`); const [afterQuery, afterParams] = import_util_std.sql` SELECT count(*) FROM ${tableName} WHERE ${idField} = ${pni}; `; const afterCount = db.prepare(afterQuery, { pluck: true }).get(afterParams); logger.info(`${logId}: Found ${afterCount} keys for PNI after delete`); db.exec( import_util_std.sql` DROP INDEX ${tableName}_date; ALTER TABLE ${tableName} DROP COLUMN createdAt; `[0] ); } __name(cleanKeys, "cleanKeys"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { cleanKeys }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var fts5_secure_delete_std_exports = {}; __export(fts5_secure_delete_std_exports, { default: () => updateToSchemaVersion930 }); module.exports = __toCommonJS(fts5_secure_delete_std_exports); function updateToSchemaVersion930() { } __name(updateToSchemaVersion930, "updateToSchemaVersion930"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var fts5_revert_std_exports = {}; __export(fts5_revert_std_exports, { default: () => updateToSchemaVersion940 }); module.exports = __toCommonJS(fts5_revert_std_exports); function updateToSchemaVersion940() { } __name(updateToSchemaVersion940, "updateToSchemaVersion940"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var fts5_secure_delete_std_exports = {}; __export(fts5_secure_delete_std_exports, { default: () => updateToSchemaVersion950 }); module.exports = __toCommonJS(fts5_secure_delete_std_exports); function updateToSchemaVersion950() { } __name(updateToSchemaVersion950, "updateToSchemaVersion950"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var untag_pni_std_exports = {}; __export(untag_pni_std_exports, { default: () => updateToSchemaVersion960 }); module.exports = __toCommonJS(untag_pni_std_exports); var import_ServiceId_std = require("../../types/ServiceId.std.js"); var import_normalizeAci_std = require("../../util/normalizeAci.std.js"); function updateToSchemaVersion960(db, logger) { const ourServiceIds = migratePni(db, logger); if (!ourServiceIds) { logger.info("not running, pni is normalized"); return; } db.prepare( ` UPDATE conversations SET json = json_set(json, '$.pni', $pni) WHERE serviceId IS $aci ` ).run({ aci: ourServiceIds.aci, pni: ourServiceIds.pni }); migratePreKeys(db, "preKeys", ourServiceIds, logger); migratePreKeys(db, "signedPreKeys", ourServiceIds, logger); migratePreKeys(db, "kyberPreKeys", ourServiceIds, logger); } __name(updateToSchemaVersion960, "updateToSchemaVersion960"); function migratePni(db, logger) { const uuidIdJson = db.prepare( ` SELECT json FROM items WHERE id IS 'uuid_id' `, { pluck: true } ).get(); const pniJson = db.prepare( ` SELECT json FROM items WHERE id IS 'pni' `, { pluck: true } ).get(); let aci; try { [aci] = JSON.parse(uuidIdJson ?? "").value.split(".", 2); } catch (error) { if (uuidIdJson) { logger.warn("failed to parse uuid_id item", error); } else { logger.info("Our ACI not found"); } } if (!aci) { return void 0; } let legacyPni; try { legacyPni = JSON.parse(pniJson ?? "").value; } catch (error) { if (pniJson) { logger.warn("failed to parse pni item", error); } else { logger.info("Our PNI not found"); } } if (!legacyPni) { return void 0; } const pni = prefixPni(legacyPni, "pni", logger); if (!pni || pni === legacyPni) { return void 0; } const maps = db.prepare( ` SELECT id, json FROM items WHERE id IN ('identityKeyMap', 'registrationIdMap'); ` ).all(); const updateStmt = db.prepare( "UPDATE items SET json = $json WHERE id IS $id" ); updateStmt.run({ id: "pni", json: JSON.stringify({ id: "pni", value: pni }) }); for (const { id, json } of maps) { try { const data = JSON.parse(json); const pniValue = data.value[legacyPni]; if (pniValue) { delete data.value[legacyPni]; data.value[pni] = pniValue; } updateStmt.run({ id, json: JSON.stringify(data) }); } catch (error) { logger.warn(`failed to parse ${id} item`, error); } } return { aci: (0, import_normalizeAci_std.normalizeAci)(aci, "uuid_id", logger), pni, legacyPni }; } __name(migratePni, "migratePni"); function migratePreKeys(db, table, { legacyPni, pni }, logger) { const preKeys = db.prepare(`SELECT id, json FROM ${table} WHERE ourServiceId IS $legacyPni`).all({ legacyPni }); const updateStmt = db.prepare(` UPDATE ${table} SET id = $newId, json = $newJson WHERE id = $id `); logger.info(`updating ${preKeys.length} ${table}`); for (const { id, json } of preKeys) { const match = id.match(/^(.*):(.*)$/); if (!match) { logger.warn(`invalid ${table} id ${id}`); continue; } let legacyData; try { legacyData = JSON.parse(json); } catch (error) { logger.warn(`failed to parse ${table} ${id}`, error); continue; } const [, ourServiceId, keyId] = match; if (ourServiceId !== legacyPni) { logger.warn("unexpected ourServiceId", ourServiceId, legacyPni); continue; } const newId = `${pni}:${keyId}`; const newData = { ...legacyData, id: newId, ourServiceId: pni }; updateStmt.run({ id, newId, newJson: JSON.stringify(newData) }); } } __name(migratePreKeys, "migratePreKeys"); function prefixPni(legacyPni, context, logger) { if (legacyPni == null) { return void 0; } if (legacyPni.toLowerCase().startsWith("pni:")) { return (0, import_ServiceId_std.normalizePni)(legacyPni, context, logger); } return (0, import_ServiceId_std.normalizePni)(`PNI:${legacyPni}`, context, logger); } __name(prefixPni, "prefixPni"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var fts5_optimize_std_exports = {}; __export(fts5_optimize_std_exports, { default: () => updateToSchemaVersion970 }); module.exports = __toCommonJS(fts5_optimize_std_exports); function updateToSchemaVersion970(db) { db.exec(` INSERT INTO messages_fts(messages_fts) VALUES ('optimize'); `); } __name(updateToSchemaVersion970, "updateToSchemaVersion970"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var reaction_timestamp_std_exports = {}; __export(reaction_timestamp_std_exports, { default: () => updateToSchemaVersion980 }); module.exports = __toCommonJS(reaction_timestamp_std_exports); function updateToSchemaVersion980(db) { db.exec(` ALTER TABLE reactions ADD COLUMN timestamp NUMBER; CREATE INDEX reactions_byTimestamp ON reactions (fromId, timestamp); `); } __name(updateToSchemaVersion980, "updateToSchemaVersion980"); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var phone_number_sharing_std_exports = {}; __export(phone_number_sharing_std_exports, { default: () => updateToSchemaVersion990 }); module.exports = __toCommonJS(phone_number_sharing_std_exports); function updateToSchemaVersion990(db) { db.exec(` UPDATE conversations SET json = json_remove( json_insert( json, '$.sharingPhoneNumber', iif( json ->> '$.notSharingPhoneNumber', -- We flip the value from false to true, and vice versa json('false'), json('true') ) ), '$.notSharingPhoneNumber' ) -- Default value of '$.notSharingPhoneNumber' is true and -- the default value of '$.sharingPhoneNumber' is false so we don't have -- to do anything if the field wasn't present. WHERE json ->> '$.notSharingPhoneNumber' IS NOT NULL; `); } __name(updateToSchemaVersion990, "updateToSchemaVersion990"); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var index_node_exports = {}; __export(index_node_exports, { DBVersionFromFutureError: () => DBVersionFromFutureError, SCHEMA_VERSIONS: () => SCHEMA_VERSIONS, enableFTS5SecureDelete: () => enableFTS5SecureDelete, updateSchema: () => updateSchema }); module.exports = __toCommonJS(index_node_exports); var import_lodash = __toESM(require("lodash")); var import_uuid = require("uuid"); var import_util_std = require("../util.std.js"); var import_uuid_keys_std = __toESM(require("./41-uuid-keys.std.js")); var import_stale_reactions_std = __toESM(require("./42-stale-reactions.std.js")); var import_gv2_uuid_std = __toESM(require("./43-gv2-uuid.std.js")); var import_badges_std = __toESM(require("./44-badges.std.js")); var import_stories_std = __toESM(require("./45-stories.std.js")); var import_optimize_stories_std = __toESM(require("./46-optimize-stories.std.js")); var import_further_optimize_std = __toESM(require("./47-further-optimize.std.js")); var import_fix_user_initiated_index_std = __toESM(require("./48-fix-user-initiated-index.std.js")); var import_fix_preview_index_std = __toESM(require("./49-fix-preview-index.std.js")); var import_fix_messages_unread_index_std = __toESM(require("./50-fix-messages-unread-index.std.js")); var import_centralize_conversation_jobs_node = __toESM(require("./51-centralize-conversation-jobs.node.js")); var import_optimize_stories_std2 = __toESM(require("./52-optimize-stories.std.js")); var import_gv2_banned_members_std = __toESM(require("./53-gv2-banned-members.std.js")); var import_unprocessed_received_at_counter_std = __toESM(require("./54-unprocessed-received-at-counter.std.js")); var import_report_message_aci_node = __toESM(require("./55-report-message-aci.node.js")); var import_add_unseen_to_message_std = __toESM(require("./56-add-unseen-to-message.std.js")); var import_rm_message_history_unsynced_std = __toESM(require("./57-rm-message-history-unsynced.std.js")); var import_update_unread_std = __toESM(require("./58-update-unread.std.js")); var import_unprocessed_received_at_counter_index_std = __toESM(require("./59-unprocessed-received-at-counter-index.std.js")); var import_update_expiring_index_std = __toESM(require("./60-update-expiring-index.std.js")); var import_distribution_list_storage_std = __toESM(require("./61-distribution-list-storage.std.js")); var import_add_urgent_to_send_log_std = __toESM(require("./62-add-urgent-to-send-log.std.js")); var import_add_urgent_to_unprocessed_std = __toESM(require("./63-add-urgent-to-unprocessed.std.js")); var import_uuid_column_for_pre_keys_std = __toESM(require("./64-uuid-column-for-pre-keys.std.js")); var import_add_storage_id_to_stickers_std = __toESM(require("./65-add-storage-id-to-stickers.std.js")); var import_add_pni_signature_to_sent_protos_std = __toESM(require("./66-add-pni-signature-to-sent-protos.std.js")); var import_add_story_to_unprocessed_std = __toESM(require("./67-add-story-to-unprocessed.std.js")); var import_drop_deprecated_columns_std = __toESM(require("./68-drop-deprecated-columns.std.js")); var import_group_call_ring_cancellations_std = __toESM(require("./69-group-call-ring-cancellations.std.js")); var import_story_reply_index_std = __toESM(require("./70-story-reply-index.std.js")); var import_merge_notifications_std = __toESM(require("./71-merge-notifications.std.js")); var import_optimize_call_id_message_lookup_std = __toESM(require("./72-optimize-call-id-message-lookup.std.js")); var import_remove_phone_number_discovery_std = __toESM(require("./73-remove-phone-number-discovery.std.js")); var import_optimize_convo_open_std = __toESM(require("./74-optimize-convo-open.std.js")); var import_noop_std = __toESM(require("./75-noop.std.js")); var import_optimize_convo_open_2_std = __toESM(require("./76-optimize-convo-open-2.std.js")); var import_signal_tokenizer_std = __toESM(require("./77-signal-tokenizer.std.js")); var import_merge_receipt_jobs_node = __toESM(require("./78-merge-receipt-jobs.node.js")); var import_paging_lightbox_std = __toESM(require("./79-paging-lightbox.std.js")); var import_edited_messages_std = __toESM(require("./80-edited-messages.std.js")); var import_contact_removed_notification_std = __toESM(require("./81-contact-removed-notification.std.js")); var import_edited_messages_read_index_std = __toESM(require("./82-edited-messages-read-index.std.js")); var import_mentions_std = __toESM(require("./83-mentions.std.js")); var import_all_mentions_std = __toESM(require("./84-all-mentions.std.js")); var import_add_kyber_keys_std = __toESM(require("./85-add-kyber-keys.std.js")); var import_story_replies_index_std = __toESM(require("./86-story-replies-index.std.js")); var import_cleanup_std = __toESM(require("./87-cleanup.std.js")); var import_service_ids_std = __toESM(require("./88-service-ids.std.js")); var import_call_history_node = __toESM(require("./89-call-history.node.js")); var import_delete_story_reply_screenshot_std = __toESM(require("./90-delete-story-reply-screenshot.std.js")); var import_clean_keys_std = __toESM(require("./91-clean-keys.std.js")); var import_clean_more_keys_std = __toESM(require("./920-clean-more-keys.std.js")); var import_fts5_secure_delete_std = __toESM(require("./930-fts5-secure-delete.std.js")); var import_fts5_revert_std = __toESM(require("./940-fts5-revert.std.js")); var import_fts5_secure_delete_std2 = __toESM(require("./950-fts5-secure-delete.std.js")); var import_untag_pni_std = __toESM(require("./960-untag-pni.std.js")); var import_fts5_optimize_std = __toESM(require("./970-fts5-optimize.std.js")); var import_reaction_timestamp_std = __toESM(require("./980-reaction-timestamp.std.js")); var import_phone_number_sharing_std = __toESM(require("./990-phone-number-sharing.std.js")); var import_mark_unread_call_history_messages_as_unseen_std = __toESM(require("./1000-mark-unread-call-history-messages-as-unseen.std.js")); var import_call_links_table_std = __toESM(require("./1010-call-links-table.std.js")); var import_self_merges_std = __toESM(require("./1020-self-merges.std.js")); var import_unblock_event_std = __toESM(require("./1030-unblock-event.std.js")); var import_undownloaded_backed_up_media_std = __toESM(require("./1040-undownloaded-backed-up-media.std.js")); var import_group_send_endorsements_std = __toESM(require("./1050-group-send-endorsements.std.js")); var import_addressable_messages_and_sync_tasks_std = __toESM(require("./1060-addressable-messages-and-sync-tasks.std.js")); var import_attachment_backup_std = __toESM(require("./1070-attachment-backup.std.js")); var import_nondisappearing_addressable_std = __toESM(require("./1080-nondisappearing-addressable.std.js")); var import_message_delete_indexes_std = __toESM(require("./1090-message-delete-indexes.std.js")); var import_optimize_mark_call_history_read_in_conversation_std = __toESM(require("./1100-optimize-mark-call-history-read-in-conversation.std.js")); var import_sticker_local_key_std = __toESM(require("./1110-sticker-local-key.std.js")); var import_messages_foreign_keys_indexes_std = __toESM(require("./1120-messages-foreign-keys-indexes.std.js")); var import_isStory_index_std = __toESM(require("./1130-isStory-index.std.js")); var import_call_links_deleted_column_std = __toESM(require("./1140-call-links-deleted-column.std.js")); var import_expire_timer_version_std = __toESM(require("./1150-expire-timer-version.std.js")); var import_optimize_calls_unread_count_std = __toESM(require("./1160-optimize-calls-unread-count.std.js")); var import_update_call_history_unread_index_std = __toESM(require("./1170-update-call-history-unread-index.std.js")); var import_add_attachment_download_source_std = __toESM(require("./1180-add-attachment-download-source.std.js")); var import_call_links_storage_std = __toESM(require("./1190-call-links-storage.std.js")); var import_attachment_download_source_index_std = __toESM(require("./1200-attachment-download-source-index.std.js")); var import_call_history_started_id_std = __toESM(require("./1210-call-history-started-id.std.js")); var import_blob_sessions_node = __toESM(require("./1220-blob-sessions.node.js")); var import_call_links_admin_key_index_std = __toESM(require("./1230-call-links-admin-key-index.std.js")); var import_defunct_call_links_table_std = __toESM(require("./1240-defunct-call-links-table.std.js")); var import_defunct_call_links_storage_std = __toESM(require("./1250-defunct-call-links-storage.std.js")); var import_sync_tasks_rowid_std = __toESM(require("./1260-sync-tasks-rowid.std.js")); var import_normalize_messages_std = __toESM(require("./1270-normalize-messages.std.js")); var import_blob_unprocessed_std = __toESM(require("./1280-blob-unprocessed.std.js")); var import_int_unprocessed_source_device_std = __toESM(require("./1290-int-unprocessed-source-device.std.js")); var import_sticker_pack_refs_std = __toESM(require("./1300-sticker-pack-refs.std.js")); var import_muted_fixup_std = __toESM(require("./1310-muted-fixup.std.js")); var import_unprocessed_received_at_date_std = __toESM(require("./1320-unprocessed-received-at-date.std.js")); var import_sync_tasks_type_index_std = __toESM(require("./1330-sync-tasks-type-index.std.js")); var import_recent_gifs_std = __toESM(require("./1340-recent-gifs.std.js")); var import_notification_profiles_std = __toESM(require("./1350-notification-profiles.std.js")); var import_attachments_std = __toESM(require("./1360-attachments.std.js")); var import_message_attachment_indexes_std = __toESM(require("./1370-message-attachment-indexes.std.js")); var import_donation_receipts_std = __toESM(require("./1380-donation-receipts.std.js")); var import_attachment_download_keys_std = __toESM(require("./1390-attachment-download-keys.std.js")); var import_simplify_receipts_std = __toESM(require("./1400-simplify-receipts.std.js")); var import_remove_wallpaper_std = __toESM(require("./1410-remove-wallpaper.std.js")); var import_backup_downloads_std = __toESM(require("./1420-backup-downloads.std.js")); var import_call_links_epoch_id_std = __toESM(require("./1430-call-links-epoch-id.std.js")); var import_chat_folders_std = __toESM(require("./1440-chat-folders.std.js")); var import_all_media_std = __toESM(require("./1450-all-media.std.js")); var import_attachment_duration_std = __toESM(require("./1460-attachment-duration.std.js")); var import_kyber_triple_std = __toESM(require("./1470-kyber-triple.std.js")); var import_chat_folders_remove_duplicates_std = __toESM(require("./1480-chat-folders-remove-duplicates.std.js")); var import_lowercase_notification_profiles_std = __toESM(require("./1490-lowercase-notification-profiles.std.js")); var import_search_polls_std = __toESM(require("./1500-search-polls.std.js")); var import_chat_folders_normalize_all_chats_std = __toESM(require("./1510-chat-folders-normalize-all-chats.std.js")); var import_poll_votes_unread_std = __toESM(require("./1520-poll-votes-unread.std.js")); var import_update_expiring_index_std2 = __toESM(require("./1530-update-expiring-index.std.js")); var import_partial_expiring_index_std = __toESM(require("./1540-partial-expiring-index.std.js")); var import_has_link_preview_std = __toESM(require("./1550-has-link-preview.std.js")); var import_pinned_messages_std = __toESM(require("./1560-pinned-messages.std.js")); var import_cleanup_polls_std = __toESM(require("./1561-cleanup-polls.std.js")); var import_pinned_messages_updates_std = __toESM(require("./1570-pinned-messages-updates.std.js")); var import_expired_group_replies_std = __toESM(require("./1580-expired-group-replies.std.js")); var import_megaphones_std = __toESM(require("./1590-megaphones.std.js")); var import_deduplicate_usernames_std = __toESM(require("./1600-deduplicate-usernames.std.js")); var import_has_contacts_std = __toESM(require("./1610-has-contacts.std.js")); var import_sort_bigger_media_std = __toESM(require("./1620-sort-bigger-media.std.js")); var import_message_pin_message_data_std = __toESM(require("./1630-message-pin-message-data.std.js")); var import_key_transparency_std = __toESM(require("./1640-key-transparency.std.js")); var import_protected_attachments_std = __toESM(require("./1650-protected-attachments.std.js")); var import_protected_attachments_non_unique_std = __toESM(require("./1660-protected-attachments-non-unique.std.js")); var import_Server_node = require("../Server.node.js"); const { keyBy } = import_lodash.default; function updateToSchemaVersion1(db) { db.exec(` CREATE TABLE messages( id STRING PRIMARY KEY ASC, json TEXT, unread INTEGER, expires_at INTEGER, sent_at INTEGER, schemaVersion INTEGER, conversationId STRING, received_at INTEGER, source STRING, sourceDevice STRING, hasAttachments INTEGER, hasFileAttachments INTEGER, hasVisualMediaAttachments INTEGER ); CREATE INDEX messages_unread ON messages ( unread ); CREATE INDEX messages_expires_at ON messages ( expires_at ); CREATE INDEX messages_receipt ON messages ( sent_at ); CREATE INDEX messages_schemaVersion ON messages ( schemaVersion ); CREATE INDEX messages_conversation ON messages ( conversationId, received_at ); CREATE INDEX messages_duplicate_check ON messages ( source, sourceDevice, sent_at ); CREATE INDEX messages_hasAttachments ON messages ( conversationId, hasAttachments, received_at ); CREATE INDEX messages_hasFileAttachments ON messages ( conversationId, hasFileAttachments, received_at ); CREATE INDEX messages_hasVisualMediaAttachments ON messages ( conversationId, hasVisualMediaAttachments, received_at ); CREATE TABLE unprocessed( id STRING, timestamp INTEGER, json TEXT ); CREATE INDEX unprocessed_id ON unprocessed ( id ); CREATE INDEX unprocessed_timestamp ON unprocessed ( timestamp ); `); } __name(updateToSchemaVersion1, "updateToSchemaVersion1"); function updateToSchemaVersion2(db) { db.exec(` ALTER TABLE messages ADD COLUMN expireTimer INTEGER; ALTER TABLE messages ADD COLUMN expirationStartTimestamp INTEGER; ALTER TABLE messages ADD COLUMN type STRING; CREATE INDEX messages_expiring ON messages ( expireTimer, expirationStartTimestamp, expires_at ); UPDATE messages SET expirationStartTimestamp = json_extract(json, '$.expirationStartTimestamp'), expireTimer = json_extract(json, '$.expireTimer'), type = json_extract(json, '$.type'); `); } __name(updateToSchemaVersion2, "updateToSchemaVersion2"); function updateToSchemaVersion3(db) { db.exec(` DROP INDEX messages_expiring; DROP INDEX messages_unread; CREATE INDEX messages_without_timer ON messages ( expireTimer, expires_at, type ) WHERE expires_at IS NULL AND expireTimer IS NOT NULL; CREATE INDEX messages_unread ON messages ( conversationId, unread ) WHERE unread IS NOT NULL; ANALYZE; `); } __name(updateToSchemaVersion3, "updateToSchemaVersion3"); function updateToSchemaVersion4(db) { db.exec(` CREATE TABLE conversations( id STRING PRIMARY KEY ASC, json TEXT, active_at INTEGER, type STRING, members TEXT, name TEXT, profileName TEXT ); CREATE INDEX conversations_active ON conversations ( active_at ) WHERE active_at IS NOT NULL; CREATE INDEX conversations_type ON conversations ( type ) WHERE type IS NOT NULL; `); } __name(updateToSchemaVersion4, "updateToSchemaVersion4"); function updateToSchemaVersion6(db) { db.exec(` -- key-value, ids are strings, one extra column CREATE TABLE sessions( id STRING PRIMARY KEY ASC, number STRING, json TEXT ); CREATE INDEX sessions_number ON sessions ( number ) WHERE number IS NOT NULL; -- key-value, ids are strings CREATE TABLE groups( id STRING PRIMARY KEY ASC, json TEXT ); CREATE TABLE identityKeys( id STRING PRIMARY KEY ASC, json TEXT ); CREATE TABLE items( id STRING PRIMARY KEY ASC, json TEXT ); -- key-value, ids are integers CREATE TABLE preKeys( id INTEGER PRIMARY KEY ASC, json TEXT ); CREATE TABLE signedPreKeys( id INTEGER PRIMARY KEY ASC, json TEXT ); `); } __name(updateToSchemaVersion6, "updateToSchemaVersion6"); function updateToSchemaVersion7(db) { db.exec(` -- SQLite has been coercing our STRINGs into numbers, so we force it with TEXT -- We create a new table then copy the data into it, since we can't modify columns DROP INDEX sessions_number; ALTER TABLE sessions RENAME TO sessions_old; CREATE TABLE sessions( id TEXT PRIMARY KEY, number TEXT, json TEXT ); CREATE INDEX sessions_number ON sessions ( number ) WHERE number IS NOT NULL; INSERT INTO sessions(id, number, json) SELECT '+' || id, number, json FROM sessions_old; DROP TABLE sessions_old; `); } __name(updateToSchemaVersion7, "updateToSchemaVersion7"); function updateToSchemaVersion8(db) { db.exec(` -- First, we pull a new body field out of the message table's json blob ALTER TABLE messages ADD COLUMN body TEXT; UPDATE messages SET body = json_extract(json, '$.body'); -- Then we create our full-text search table and populate it CREATE VIRTUAL TABLE messages_fts USING fts5(id UNINDEXED, body); INSERT INTO messages_fts(id, body) SELECT id, body FROM messages; -- Then we set up triggers to keep the full-text search table up to date CREATE TRIGGER messages_on_insert AFTER INSERT ON messages BEGIN INSERT INTO messages_fts ( id, body ) VALUES ( new.id, new.body ); END; CREATE TRIGGER messages_on_delete AFTER DELETE ON messages BEGIN DELETE FROM messages_fts WHERE id = old.id; END; CREATE TRIGGER messages_on_update AFTER UPDATE ON messages BEGIN DELETE FROM messages_fts WHERE id = old.id; INSERT INTO messages_fts( id, body ) VALUES ( new.id, new.body ); END; `); } __name(updateToSchemaVersion8, "updateToSchemaVersion8"); function updateToSchemaVersion9(db) { db.exec(` CREATE TABLE attachment_downloads( id STRING primary key, timestamp INTEGER, pending INTEGER, json TEXT ); CREATE INDEX attachment_downloads_timestamp ON attachment_downloads ( timestamp ) WHERE pending = 0; CREATE INDEX attachment_downloads_pending ON attachment_downloads ( pending ) WHERE pending != 0; `); } __name(updateToSchemaVersion9, "updateToSchemaVersion9"); function updateToSchemaVersion10(db) { db.exec(` DROP INDEX unprocessed_id; DROP INDEX unprocessed_timestamp; ALTER TABLE unprocessed RENAME TO unprocessed_old; CREATE TABLE unprocessed( id STRING, timestamp INTEGER, version INTEGER, attempts INTEGER, envelope TEXT, decrypted TEXT, source TEXT, sourceDevice TEXT, serverTimestamp INTEGER ); CREATE INDEX unprocessed_id ON unprocessed ( id ); CREATE INDEX unprocessed_timestamp ON unprocessed ( timestamp ); INSERT INTO unprocessed ( id, timestamp, version, attempts, envelope, decrypted, source, sourceDevice, serverTimestamp ) SELECT id, timestamp, json_extract(json, '$.version'), json_extract(json, '$.attempts'), json_extract(json, '$.envelope'), json_extract(json, '$.decrypted'), json_extract(json, '$.source'), json_extract(json, '$.sourceDevice'), json_extract(json, '$.serverTimestamp') FROM unprocessed_old; DROP TABLE unprocessed_old; `); } __name(updateToSchemaVersion10, "updateToSchemaVersion10"); function updateToSchemaVersion11(db) { db.exec(` DROP TABLE groups; `); } __name(updateToSchemaVersion11, "updateToSchemaVersion11"); function updateToSchemaVersion12(db) { db.exec(` CREATE TABLE sticker_packs( id TEXT PRIMARY KEY, key TEXT NOT NULL, author STRING, coverStickerId INTEGER, createdAt INTEGER, downloadAttempts INTEGER, installedAt INTEGER, lastUsed INTEGER, status STRING, stickerCount INTEGER, title STRING ); CREATE TABLE stickers( id INTEGER NOT NULL, packId TEXT NOT NULL, emoji STRING, height INTEGER, isCoverOnly INTEGER, lastUsed INTEGER, path STRING, width INTEGER, PRIMARY KEY (id, packId), CONSTRAINT stickers_fk FOREIGN KEY (packId) REFERENCES sticker_packs(id) ON DELETE CASCADE ); CREATE INDEX stickers_recents ON stickers ( lastUsed ) WHERE lastUsed IS NOT NULL; CREATE TABLE sticker_references( messageId STRING, packId TEXT, CONSTRAINT sticker_references_fk FOREIGN KEY(packId) REFERENCES sticker_packs(id) ON DELETE CASCADE ); `); } __name(updateToSchemaVersion12, "updateToSchemaVersion12"); function updateToSchemaVersion13(db) { db.exec(` ALTER TABLE sticker_packs ADD COLUMN attemptedStatus STRING; `); } __name(updateToSchemaVersion13, "updateToSchemaVersion13"); function updateToSchemaVersion14(db) { db.exec(` CREATE TABLE emojis( shortName STRING PRIMARY KEY, lastUsage INTEGER ); CREATE INDEX emojis_lastUsage ON emojis ( lastUsage ); `); } __name(updateToSchemaVersion14, "updateToSchemaVersion14"); function updateToSchemaVersion15(db) { db.exec(` -- SQLite has again coerced our STRINGs into numbers, so we force it with TEXT -- We create a new table then copy the data into it, since we can't modify columns DROP INDEX emojis_lastUsage; ALTER TABLE emojis RENAME TO emojis_old; CREATE TABLE emojis( shortName TEXT PRIMARY KEY, lastUsage INTEGER ); CREATE INDEX emojis_lastUsage ON emojis ( lastUsage ); DELETE FROM emojis WHERE shortName = 1; INSERT INTO emojis(shortName, lastUsage) SELECT shortName, lastUsage FROM emojis_old; DROP TABLE emojis_old; `); } __name(updateToSchemaVersion15, "updateToSchemaVersion15"); function updateToSchemaVersion16(db) { db.exec(` ALTER TABLE messages ADD COLUMN messageTimer INTEGER; ALTER TABLE messages ADD COLUMN messageTimerStart INTEGER; ALTER TABLE messages ADD COLUMN messageTimerExpiresAt INTEGER; ALTER TABLE messages ADD COLUMN isErased INTEGER; CREATE INDEX messages_message_timer ON messages ( messageTimer, messageTimerStart, messageTimerExpiresAt, isErased ) WHERE messageTimer IS NOT NULL; -- Updating full-text triggers to avoid anything with a messageTimer set DROP TRIGGER messages_on_insert; DROP TRIGGER messages_on_delete; DROP TRIGGER messages_on_update; CREATE TRIGGER messages_on_insert AFTER INSERT ON messages WHEN new.messageTimer IS NULL BEGIN INSERT INTO messages_fts ( id, body ) VALUES ( new.id, new.body ); END; CREATE TRIGGER messages_on_delete AFTER DELETE ON messages BEGIN DELETE FROM messages_fts WHERE id = old.id; END; CREATE TRIGGER messages_on_update AFTER UPDATE ON messages WHEN new.messageTimer IS NULL BEGIN DELETE FROM messages_fts WHERE id = old.id; INSERT INTO messages_fts( id, body ) VALUES ( new.id, new.body ); END; `); } __name(updateToSchemaVersion16, "updateToSchemaVersion16"); function updateToSchemaVersion17(db, logger) { try { db.exec(` ALTER TABLE messages ADD COLUMN isViewOnce INTEGER; DROP INDEX messages_message_timer; `); } catch (error) { logger.info("Message table already had isViewOnce column"); } db.exec("DROP INDEX IF EXISTS messages_view_once;"); db.exec(` CREATE INDEX messages_view_once ON messages ( isErased ) WHERE isViewOnce = 1; -- Updating full-text triggers to avoid anything with isViewOnce = 1 DROP TRIGGER messages_on_insert; DROP TRIGGER messages_on_update; CREATE TRIGGER messages_on_insert AFTER INSERT ON messages WHEN new.isViewOnce != 1 BEGIN INSERT INTO messages_fts ( id, body ) VALUES ( new.id, new.body ); END; CREATE TRIGGER messages_on_update AFTER UPDATE ON messages WHEN new.isViewOnce != 1 BEGIN DELETE FROM messages_fts WHERE id = old.id; INSERT INTO messages_fts( id, body ) VALUES ( new.id, new.body ); END; `); } __name(updateToSchemaVersion17, "updateToSchemaVersion17"); function updateToSchemaVersion18(db) { db.exec(` -- Delete and rebuild full-text search index to capture everything DELETE FROM messages_fts; INSERT INTO messages_fts(messages_fts) VALUES('rebuild'); INSERT INTO messages_fts(id, body) SELECT id, body FROM messages WHERE isViewOnce IS NULL OR isViewOnce != 1; -- Fixing full-text triggers DROP TRIGGER messages_on_insert; DROP TRIGGER messages_on_update; CREATE TRIGGER messages_on_insert AFTER INSERT ON messages WHEN new.isViewOnce IS NULL OR new.isViewOnce != 1 BEGIN INSERT INTO messages_fts ( id, body ) VALUES ( new.id, new.body ); END; CREATE TRIGGER messages_on_update AFTER UPDATE ON messages WHEN new.isViewOnce IS NULL OR new.isViewOnce != 1 BEGIN DELETE FROM messages_fts WHERE id = old.id; INSERT INTO messages_fts( id, body ) VALUES ( new.id, new.body ); END; `); } __name(updateToSchemaVersion18, "updateToSchemaVersion18"); function updateToSchemaVersion19(db) { db.exec(` ALTER TABLE conversations ADD COLUMN profileFamilyName TEXT; ALTER TABLE conversations ADD COLUMN profileFullName TEXT; -- Preload new field with the profileName we already have UPDATE conversations SET profileFullName = profileName; `); } __name(updateToSchemaVersion19, "updateToSchemaVersion19"); function updateToSchemaVersion20(db) { const triggers = db.prepare( "SELECT * FROM sqlite_master WHERE type = 'trigger' AND tbl_name = 'messages'" ).all(); for (const trigger of triggers) { db.exec(`DROP TRIGGER ${trigger.name}`); } db.exec(` ALTER TABLE conversations ADD COLUMN e164 TEXT; ALTER TABLE conversations ADD COLUMN uuid TEXT; ALTER TABLE conversations ADD COLUMN groupId TEXT; ALTER TABLE messages ADD COLUMN sourceUuid TEXT; ALTER TABLE sessions RENAME COLUMN number TO conversationId; CREATE INDEX conversations_e164 ON conversations(e164); CREATE INDEX conversations_uuid ON conversations(uuid); CREATE INDEX conversations_groupId ON conversations(groupId); CREATE INDEX messages_sourceUuid on messages(sourceUuid); -- Migrate existing IDs UPDATE conversations SET e164 = '+' || id WHERE type = 'private'; UPDATE conversations SET groupId = id WHERE type = 'group'; `); const maybeInvalidGroups = db.prepare( "SELECT * FROM conversations WHERE type = 'group' AND members IS NULL;" ).all(); for (const group of maybeInvalidGroups) { const json = JSON.parse( group.json ); if (!json.members || !json.members.length) { db.prepare("DELETE FROM conversations WHERE id = $id;").run({ id: json.id }); db.prepare("DELETE FROM messages WHERE conversationId = $id;").run({ id: json.id }); } } const allConversations = db.prepare("SELECT * FROM conversations;").all(); const allConversationsByOldId = keyBy(allConversations, "id"); for (const row of allConversations) { const oldId = row.id; const newId = (0, import_uuid.v4)(); allConversationsByOldId[oldId].id = newId; const patchObj = { id: newId }; if (row.type === "private") { patchObj.e164 = `+${oldId}`; } else if (row.type === "group") { patchObj.groupId = oldId; } const patch = JSON.stringify(patchObj); db.prepare( ` UPDATE conversations SET id = $newId, json = JSON_PATCH(json, $patch) WHERE id = $oldId ` ).run({ newId, oldId, patch }); const messagePatch = JSON.stringify({ conversationId: newId }); db.prepare( ` UPDATE messages SET conversationId = $newId, json = JSON_PATCH(json, $patch) WHERE conversationId = $oldId ` ).run({ newId, oldId, patch: messagePatch }); } const groupConversations = db.prepare( ` SELECT id, members, json FROM conversations WHERE type = 'group'; ` ).all(); groupConversations.forEach((groupRow) => { const members = groupRow.members.split(/\s?\+/).filter(Boolean); const newMembers = []; for (const m of members) { const memberRow = allConversationsByOldId[m]; if (memberRow) { newMembers.push(memberRow.id); } else { const id = (0, import_uuid.v4)(); const updatedConversation = { id, e164: m, type: "private", version: 2, unreadCount: 0, verified: 0, // Not directly used by saveConversation, but are necessary // for conversation model inbox_position: 0, isPinned: false, lastMessageDeletedForEveryone: false, markedUnread: false, messageCount: 0, sentMessageCount: 0, profileSharing: false }; db.prepare( ` UPDATE conversations SET json = $json, e164 = $e164, type = $type WHERE id = $id; ` ).run({ id: updatedConversation.id, json: (0, import_util_std.objectToJSON)(updatedConversation), e164: updatedConversation.e164, type: updatedConversation.type }); newMembers.push(id); } } const json = { ...(0, import_util_std.jsonToObject)(groupRow.json), members: newMembers }; const newMembersValue = newMembers.join(" "); db.prepare( ` UPDATE conversations SET members = $newMembersValue, json = $newJsonValue WHERE id = $id ` ).run({ id: groupRow.id, newMembersValue, newJsonValue: (0, import_util_std.objectToJSON)(json) }); }); const allSessions = db.prepare("SELECT * FROM sessions;").all(); for (const session of allSessions) { const newJson = JSON.parse(session.json); const conversation = allConversationsByOldId[newJson.number.substr(1)]; if (conversation) { newJson.conversationId = conversation.id; newJson.id = `${newJson.conversationId}.${newJson.deviceId}`; } delete newJson.number; db.prepare( ` UPDATE sessions SET id = $newId, json = $newJson, conversationId = $newConversationId WHERE id = $oldId ` ).run({ newId: newJson.id, newJson: (0, import_util_std.objectToJSON)(newJson), oldId: session.id, newConversationId: newJson.conversationId }); } const allIdentityKeys = db.prepare("SELECT * FROM identityKeys;").all(); for (const identityKey of allIdentityKeys) { const newJson = JSON.parse(identityKey.json); newJson.id = allConversationsByOldId[newJson.id]; db.prepare( ` UPDATE identityKeys SET id = $newId, json = $newJson WHERE id = $oldId ` ).run({ newId: newJson.id, newJson: (0, import_util_std.objectToJSON)(newJson), oldId: identityKey.id }); } for (const trigger of triggers) { db.exec(trigger.sql); } } __name(updateToSchemaVersion20, "updateToSchemaVersion20"); function updateToSchemaVersion21(db) { db.exec(` UPDATE conversations SET json = json_set( json, '$.messageCount', (SELECT count(*) FROM messages WHERE messages.conversationId = conversations.id) ); UPDATE conversations SET json = json_set( json, '$.sentMessageCount', (SELECT count(*) FROM messages WHERE messages.conversationId = conversations.id AND messages.type = 'outgoing') ); `); } __name(updateToSchemaVersion21, "updateToSchemaVersion21"); function updateToSchemaVersion22(db) { db.exec(` ALTER TABLE unprocessed ADD COLUMN sourceUuid STRING; `); } __name(updateToSchemaVersion22, "updateToSchemaVersion22"); function updateToSchemaVersion23(db) { db.exec(` -- Remove triggers which keep full-text search up to date DROP TRIGGER messages_on_insert; DROP TRIGGER messages_on_update; DROP TRIGGER messages_on_delete; `); } __name(updateToSchemaVersion23, "updateToSchemaVersion23"); function updateToSchemaVersion24(db) { db.exec(` ALTER TABLE conversations ADD COLUMN profileLastFetchedAt INTEGER; `); } __name(updateToSchemaVersion24, "updateToSchemaVersion24"); function updateToSchemaVersion25(db) { db.exec(` ALTER TABLE messages RENAME TO old_messages `); const indicesToDrop = [ "messages_expires_at", "messages_receipt", "messages_schemaVersion", "messages_conversation", "messages_duplicate_check", "messages_hasAttachments", "messages_hasFileAttachments", "messages_hasVisualMediaAttachments", "messages_without_timer", "messages_unread", "messages_view_once", "messages_sourceUuid" ]; for (const index of indicesToDrop) { db.exec(`DROP INDEX IF EXISTS ${index};`); } db.exec(` -- -- Create a new table with a different primary key -- CREATE TABLE messages( rowid INTEGER PRIMARY KEY ASC, id STRING UNIQUE, json TEXT, unread INTEGER, expires_at INTEGER, sent_at INTEGER, schemaVersion INTEGER, conversationId STRING, received_at INTEGER, source STRING, sourceDevice STRING, hasAttachments INTEGER, hasFileAttachments INTEGER, hasVisualMediaAttachments INTEGER, expireTimer INTEGER, expirationStartTimestamp INTEGER, type STRING, body TEXT, messageTimer INTEGER, messageTimerStart INTEGER, messageTimerExpiresAt INTEGER, isErased INTEGER, isViewOnce INTEGER, sourceUuid TEXT); -- Create index in lieu of old PRIMARY KEY CREATE INDEX messages_id ON messages (id ASC); -- -- Recreate indices -- CREATE INDEX messages_expires_at ON messages (expires_at); CREATE INDEX messages_receipt ON messages (sent_at); CREATE INDEX messages_schemaVersion ON messages (schemaVersion); CREATE INDEX messages_conversation ON messages (conversationId, received_at); CREATE INDEX messages_duplicate_check ON messages (source, sourceDevice, sent_at); CREATE INDEX messages_hasAttachments ON messages (conversationId, hasAttachments, received_at); CREATE INDEX messages_hasFileAttachments ON messages (conversationId, hasFileAttachments, received_at); CREATE INDEX messages_hasVisualMediaAttachments ON messages (conversationId, hasVisualMediaAttachments, received_at); CREATE INDEX messages_without_timer ON messages (expireTimer, expires_at, type) WHERE expires_at IS NULL AND expireTimer IS NOT NULL; CREATE INDEX messages_unread ON messages (conversationId, unread) WHERE unread IS NOT NULL; CREATE INDEX messages_view_once ON messages (isErased) WHERE isViewOnce = 1; CREATE INDEX messages_sourceUuid on messages(sourceUuid); -- New index for searchMessages CREATE INDEX messages_searchOrder on messages(received_at, sent_at); -- -- Re-create messages_fts and add triggers -- DROP TABLE messages_fts; CREATE VIRTUAL TABLE messages_fts USING fts5(body); CREATE TRIGGER messages_on_insert AFTER INSERT ON messages WHEN new.isViewOnce IS NULL OR new.isViewOnce != 1 BEGIN INSERT INTO messages_fts (rowid, body) VALUES (new.rowid, new.body); END; CREATE TRIGGER messages_on_delete AFTER DELETE ON messages BEGIN DELETE FROM messages_fts WHERE rowid = old.rowid; END; CREATE TRIGGER messages_on_update AFTER UPDATE ON messages WHEN new.isViewOnce IS NULL OR new.isViewOnce != 1 BEGIN DELETE FROM messages_fts WHERE rowid = old.rowid; INSERT INTO messages_fts (rowid, body) VALUES (new.rowid, new.body); END; -- -- Copy data over -- INSERT INTO messages ( id, json, unread, expires_at, sent_at, schemaVersion, conversationId, received_at, source, sourceDevice, hasAttachments, hasFileAttachments, hasVisualMediaAttachments, expireTimer, expirationStartTimestamp, type, body, messageTimer, messageTimerStart, messageTimerExpiresAt, isErased, isViewOnce, sourceUuid ) SELECT id, json, unread, expires_at, sent_at, schemaVersion, conversationId, received_at, source, sourceDevice, hasAttachments, hasFileAttachments, hasVisualMediaAttachments, expireTimer, expirationStartTimestamp, type, body, messageTimer, messageTimerStart, messageTimerExpiresAt, isErased, isViewOnce, sourceUuid FROM old_messages; -- Drop old database DROP TABLE old_messages; `); } __name(updateToSchemaVersion25, "updateToSchemaVersion25"); function updateToSchemaVersion26(db) { db.exec(` DROP TRIGGER messages_on_insert; DROP TRIGGER messages_on_update; CREATE TRIGGER messages_on_insert AFTER INSERT ON messages WHEN new.isViewOnce IS NULL OR new.isViewOnce != 1 BEGIN INSERT INTO messages_fts (rowid, body) VALUES (new.rowid, new.body); END; CREATE TRIGGER messages_on_update AFTER UPDATE ON messages WHEN new.body != old.body AND (new.isViewOnce IS NULL OR new.isViewOnce != 1) BEGIN DELETE FROM messages_fts WHERE rowid = old.rowid; INSERT INTO messages_fts (rowid, body) VALUES (new.rowid, new.body); END; `); } __name(updateToSchemaVersion26, "updateToSchemaVersion26"); function updateToSchemaVersion27(db) { db.exec(` DELETE FROM messages_fts WHERE rowid IN (SELECT rowid FROM messages WHERE body IS NULL); DROP TRIGGER messages_on_update; CREATE TRIGGER messages_on_update AFTER UPDATE ON messages WHEN new.body IS NULL OR ((old.body IS NULL OR new.body != old.body) AND (new.isViewOnce IS NULL OR new.isViewOnce != 1)) BEGIN DELETE FROM messages_fts WHERE rowid = old.rowid; INSERT INTO messages_fts (rowid, body) VALUES (new.rowid, new.body); END; CREATE TRIGGER messages_on_view_once_update AFTER UPDATE ON messages WHEN new.body IS NOT NULL AND new.isViewOnce = 1 BEGIN DELETE FROM messages_fts WHERE rowid = old.rowid; END; `); } __name(updateToSchemaVersion27, "updateToSchemaVersion27"); function updateToSchemaVersion28(db) { db.exec(` CREATE TABLE jobs( id TEXT PRIMARY KEY, queueType TEXT STRING NOT NULL, timestamp INTEGER NOT NULL, data STRING TEXT ); CREATE INDEX jobs_timestamp ON jobs (timestamp); `); } __name(updateToSchemaVersion28, "updateToSchemaVersion28"); function updateToSchemaVersion29(db) { db.exec(` CREATE TABLE reactions( conversationId STRING, emoji STRING, fromId STRING, messageReceivedAt INTEGER, targetAuthorUuid STRING, targetTimestamp INTEGER, unread INTEGER ); CREATE INDEX reactions_unread ON reactions ( unread, conversationId ); CREATE INDEX reaction_identifier ON reactions ( emoji, targetAuthorUuid, targetTimestamp ); `); } __name(updateToSchemaVersion29, "updateToSchemaVersion29"); function updateToSchemaVersion30(db) { db.exec(` CREATE TABLE senderKeys( id TEXT PRIMARY KEY NOT NULL, senderId TEXT NOT NULL, distributionId TEXT NOT NULL, data BLOB NOT NULL, lastUpdatedDate NUMBER NOT NULL ); `); } __name(updateToSchemaVersion30, "updateToSchemaVersion30"); function updateToSchemaVersion31(db) { db.exec(` DROP INDEX unprocessed_id; DROP INDEX unprocessed_timestamp; ALTER TABLE unprocessed RENAME TO unprocessed_old; CREATE TABLE unprocessed( id STRING PRIMARY KEY ASC, timestamp INTEGER, version INTEGER, attempts INTEGER, envelope TEXT, decrypted TEXT, source TEXT, sourceDevice TEXT, serverTimestamp INTEGER, sourceUuid STRING ); CREATE INDEX unprocessed_timestamp ON unprocessed ( timestamp ); INSERT OR REPLACE INTO unprocessed (id, timestamp, version, attempts, envelope, decrypted, source, sourceDevice, serverTimestamp, sourceUuid) SELECT id, timestamp, version, attempts, envelope, decrypted, source, sourceDevice, serverTimestamp, sourceUuid FROM unprocessed_old; DROP TABLE unprocessed_old; `); } __name(updateToSchemaVersion31, "updateToSchemaVersion31"); function updateToSchemaVersion32(db) { db.exec(` ALTER TABLE messages ADD COLUMN serverGuid STRING NULL; ALTER TABLE unprocessed ADD COLUMN serverGuid STRING NULL; `); } __name(updateToSchemaVersion32, "updateToSchemaVersion32"); function updateToSchemaVersion33(db) { db.exec(` -- These indexes should exist, but we add "IF EXISTS" for safety. DROP INDEX IF EXISTS messages_expires_at; DROP INDEX IF EXISTS messages_without_timer; ALTER TABLE messages ADD COLUMN expiresAt INT GENERATED ALWAYS AS (expirationStartTimestamp + (expireTimer * 1000)); CREATE INDEX message_expires_at ON messages ( expiresAt ); CREATE INDEX outgoing_messages_without_expiration_start_timestamp ON messages ( expireTimer, expirationStartTimestamp, type ) WHERE expireTimer IS NOT NULL AND expirationStartTimestamp IS NULL; `); } __name(updateToSchemaVersion33, "updateToSchemaVersion33"); function updateToSchemaVersion34(db) { db.exec(` -- This index should exist, but we add "IF EXISTS" for safety. DROP INDEX IF EXISTS outgoing_messages_without_expiration_start_timestamp; CREATE INDEX messages_unexpectedly_missing_expiration_start_timestamp ON messages ( expireTimer, expirationStartTimestamp, type ) WHERE expireTimer IS NOT NULL AND expirationStartTimestamp IS NULL; `); } __name(updateToSchemaVersion34, "updateToSchemaVersion34"); function updateToSchemaVersion35(db) { db.exec(` CREATE INDEX expiring_message_by_conversation_and_received_at ON messages ( expirationStartTimestamp, expireTimer, conversationId, received_at ); `); } __name(updateToSchemaVersion35, "updateToSchemaVersion35"); function updateToSchemaVersion36() { } __name(updateToSchemaVersion36, "updateToSchemaVersion36"); function updateToSchemaVersion37(db) { db.exec(` -- Create send log primary table CREATE TABLE sendLogPayloads( id INTEGER PRIMARY KEY ASC, timestamp INTEGER NOT NULL, contentHint INTEGER NOT NULL, proto BLOB NOT NULL ); CREATE INDEX sendLogPayloadsByTimestamp ON sendLogPayloads (timestamp); -- Create send log recipients table with foreign key relationship to payloads CREATE TABLE sendLogRecipients( payloadId INTEGER NOT NULL, recipientUuid STRING NOT NULL, deviceId INTEGER NOT NULL, PRIMARY KEY (payloadId, recipientUuid, deviceId), CONSTRAINT sendLogRecipientsForeignKey FOREIGN KEY (payloadId) REFERENCES sendLogPayloads(id) ON DELETE CASCADE ); CREATE INDEX sendLogRecipientsByRecipient ON sendLogRecipients (recipientUuid, deviceId); -- Create send log messages table with foreign key relationship to payloads CREATE TABLE sendLogMessageIds( payloadId INTEGER NOT NULL, messageId STRING NOT NULL, PRIMARY KEY (payloadId, messageId), CONSTRAINT sendLogMessageIdsForeignKey FOREIGN KEY (payloadId) REFERENCES sendLogPayloads(id) ON DELETE CASCADE ); CREATE INDEX sendLogMessageIdsByMessage ON sendLogMessageIds (messageId); -- Recreate messages table delete trigger with send log support DROP TRIGGER messages_on_delete; CREATE TRIGGER messages_on_delete AFTER DELETE ON messages BEGIN DELETE FROM messages_fts WHERE rowid = old.rowid; DELETE FROM sendLogPayloads WHERE id IN ( SELECT payloadId FROM sendLogMessageIds WHERE messageId = old.id ); END; --- Add messageId column to reactions table to properly track proto associations ALTER TABLE reactions ADD column messageId STRING; `); } __name(updateToSchemaVersion37, "updateToSchemaVersion37"); function updateToSchemaVersion38(db) { db.exec(` DROP INDEX IF EXISTS messages_duplicate_check; ALTER TABLE messages RENAME COLUMN sourceDevice TO deprecatedSourceDevice; ALTER TABLE messages ADD COLUMN sourceDevice INTEGER; UPDATE messages SET sourceDevice = CAST(deprecatedSourceDevice AS INTEGER), deprecatedSourceDevice = NULL; ALTER TABLE unprocessed RENAME COLUMN sourceDevice TO deprecatedSourceDevice; ALTER TABLE unprocessed ADD COLUMN sourceDevice INTEGER; UPDATE unprocessed SET sourceDevice = CAST(deprecatedSourceDevice AS INTEGER), deprecatedSourceDevice = NULL; `); } __name(updateToSchemaVersion38, "updateToSchemaVersion38"); function updateToSchemaVersion39(db) { db.exec("ALTER TABLE messages RENAME COLUMN unread TO readStatus;"); } __name(updateToSchemaVersion39, "updateToSchemaVersion39"); function updateToSchemaVersion40(db) { db.exec( ` CREATE TABLE groupCallRings( ringId INTEGER PRIMARY KEY, isActive INTEGER NOT NULL, createdAt INTEGER NOT NULL ); ` ); } __name(updateToSchemaVersion40, "updateToSchemaVersion40"); const SCHEMA_VERSIONS = [ { version: 1, update: updateToSchemaVersion1 }, { version: 2, update: updateToSchemaVersion2 }, { version: 3, update: updateToSchemaVersion3 }, { version: 4, update: updateToSchemaVersion4 }, // version 5 was dropped { version: 6, update: updateToSchemaVersion6 }, { version: 7, update: updateToSchemaVersion7 }, { version: 8, update: updateToSchemaVersion8 }, { version: 9, update: updateToSchemaVersion9 }, { version: 10, update: updateToSchemaVersion10 }, { version: 11, update: updateToSchemaVersion11 }, { version: 12, update: updateToSchemaVersion12 }, { version: 13, update: updateToSchemaVersion13 }, { version: 14, update: updateToSchemaVersion14 }, { version: 15, update: updateToSchemaVersion15 }, { version: 16, update: updateToSchemaVersion16 }, { version: 17, update: updateToSchemaVersion17 }, { version: 18, update: updateToSchemaVersion18 }, { version: 19, update: updateToSchemaVersion19 }, { version: 20, update: updateToSchemaVersion20 }, { version: 21, update: updateToSchemaVersion21 }, { version: 22, update: updateToSchemaVersion22 }, { version: 23, update: updateToSchemaVersion23 }, { version: 24, update: updateToSchemaVersion24 }, { version: 25, update: updateToSchemaVersion25 }, { version: 26, update: updateToSchemaVersion26 }, { version: 27, update: updateToSchemaVersion27 }, { version: 28, update: updateToSchemaVersion28 }, { version: 29, update: updateToSchemaVersion29 }, { version: 30, update: updateToSchemaVersion30 }, { version: 31, update: updateToSchemaVersion31 }, { version: 32, update: updateToSchemaVersion32 }, { version: 33, update: updateToSchemaVersion33 }, { version: 34, update: updateToSchemaVersion34 }, { version: 35, update: updateToSchemaVersion35 }, { version: 36, update: updateToSchemaVersion36 }, { version: 37, update: updateToSchemaVersion37 }, { version: 38, update: updateToSchemaVersion38 }, { version: 39, update: updateToSchemaVersion39 }, { version: 40, update: updateToSchemaVersion40 }, { version: 41, update: import_uuid_keys_std.default }, { version: 42, update: import_stale_reactions_std.default }, { version: 43, update: import_gv2_uuid_std.default }, { version: 44, update: import_badges_std.default }, { version: 45, update: import_stories_std.default }, { version: 46, update: import_optimize_stories_std.default }, { version: 47, update: import_further_optimize_std.default }, { version: 48, update: import_fix_user_initiated_index_std.default }, { version: 49, update: import_fix_preview_index_std.default }, { version: 50, update: import_fix_messages_unread_index_std.default }, { version: 51, update: import_centralize_conversation_jobs_node.default }, { version: 52, update: import_optimize_stories_std2.default }, { version: 53, update: import_gv2_banned_members_std.default }, { version: 54, update: import_unprocessed_received_at_counter_std.default }, { version: 55, update: import_report_message_aci_node.default }, { version: 56, update: import_add_unseen_to_message_std.default }, { version: 57, update: import_rm_message_history_unsynced_std.default }, { version: 58, update: import_update_unread_std.default }, { version: 59, update: import_unprocessed_received_at_counter_index_std.default }, { version: 60, update: import_update_expiring_index_std.default }, { version: 61, update: import_distribution_list_storage_std.default }, { version: 62, update: import_add_urgent_to_send_log_std.default }, { version: 63, update: import_add_urgent_to_unprocessed_std.default }, { version: 64, update: import_uuid_column_for_pre_keys_std.default }, { version: 65, update: import_add_storage_id_to_stickers_std.default }, { version: 66, update: import_add_pni_signature_to_sent_protos_std.default }, { version: 67, update: import_add_story_to_unprocessed_std.default }, { version: 68, update: import_drop_deprecated_columns_std.default }, { version: 69, update: import_group_call_ring_cancellations_std.default }, { version: 70, update: import_story_reply_index_std.default }, { version: 71, update: import_merge_notifications_std.default }, { version: 72, update: import_optimize_call_id_message_lookup_std.default }, { version: 73, update: import_remove_phone_number_discovery_std.default }, { version: 74, update: import_optimize_convo_open_std.default }, { version: 75, update: import_noop_std.default }, { version: 76, update: import_optimize_convo_open_2_std.default }, { version: 77, update: import_signal_tokenizer_std.default }, { version: 78, update: import_merge_receipt_jobs_node.default }, { version: 79, update: import_paging_lightbox_std.default }, { version: 80, update: import_edited_messages_std.default }, { version: 81, update: import_contact_removed_notification_std.default }, { version: 82, update: import_edited_messages_read_index_std.default }, { version: 83, update: import_mentions_std.default }, { version: 84, update: import_all_mentions_std.default }, { version: 85, update: import_add_kyber_keys_std.default }, { version: 86, update: import_story_replies_index_std.default }, { version: 87, update: import_cleanup_std.default }, { version: 88, update: import_service_ids_std.default }, { version: 89, update: import_call_history_node.default }, { version: 90, update: import_delete_story_reply_screenshot_std.default }, { version: 91, update: import_clean_keys_std.default }, // From here forward, all migrations should be multiples of 10 { version: 920, update: import_clean_more_keys_std.default }, { version: 930, update: import_fts5_secure_delete_std.default }, { version: 940, update: import_fts5_revert_std.default }, { version: 950, update: import_fts5_secure_delete_std2.default }, { version: 960, update: import_untag_pni_std.default }, { version: 970, update: import_fts5_optimize_std.default }, { version: 980, update: import_reaction_timestamp_std.default }, { version: 990, update: import_phone_number_sharing_std.default }, { version: 1e3, update: import_mark_unread_call_history_messages_as_unseen_std.default }, { version: 1010, update: import_call_links_table_std.default }, { version: 1020, update: import_self_merges_std.default }, { version: 1030, update: import_unblock_event_std.default }, { version: 1040, update: import_undownloaded_backed_up_media_std.default }, { version: 1050, update: import_group_send_endorsements_std.default }, { version: 1060, update: import_addressable_messages_and_sync_tasks_std.default }, { version: 1070, update: import_attachment_backup_std.default }, { version: 1080, update: import_nondisappearing_addressable_std.default }, { version: 1090, update: import_message_delete_indexes_std.default }, { version: 1100, update: import_optimize_mark_call_history_read_in_conversation_std.default }, { version: 1110, update: import_sticker_local_key_std.default }, { version: 1120, update: import_messages_foreign_keys_indexes_std.default }, { version: 1130, update: import_isStory_index_std.default }, { version: 1140, update: import_call_links_deleted_column_std.default }, { version: 1150, update: import_expire_timer_version_std.default }, { version: 1160, update: import_optimize_calls_unread_count_std.default }, { version: 1170, update: import_update_call_history_unread_index_std.default }, { version: 1180, update: import_add_attachment_download_source_std.default }, { version: 1190, update: import_call_links_storage_std.default }, { version: 1200, update: import_attachment_download_source_index_std.default }, { version: 1210, update: import_call_history_started_id_std.default }, { version: 1220, update: import_blob_sessions_node.default }, { version: 1230, update: import_call_links_admin_key_index_std.default }, { version: 1240, update: import_defunct_call_links_table_std.default }, { version: 1250, update: import_defunct_call_links_storage_std.default }, { version: 1260, update: import_sync_tasks_rowid_std.default }, { version: 1270, update: import_normalize_messages_std.default }, { version: 1280, update: import_blob_unprocessed_std.default }, { version: 1290, update: import_int_unprocessed_source_device_std.default }, { version: 1300, update: import_sticker_pack_refs_std.default }, { version: 1310, update: import_muted_fixup_std.default }, { version: 1320, update: import_unprocessed_received_at_date_std.default }, { version: 1330, update: import_sync_tasks_type_index_std.default }, { version: 1340, update: import_recent_gifs_std.default }, { version: 1350, update: import_notification_profiles_std.default }, { version: 1360, update: import_attachments_std.default }, { version: 1370, update: import_message_attachment_indexes_std.default }, { version: 1380, update: import_donation_receipts_std.default }, { version: 1390, update: import_attachment_download_keys_std.default }, { version: 1400, update: import_simplify_receipts_std.default }, { version: 1410, update: import_remove_wallpaper_std.default }, { version: 1420, update: import_backup_downloads_std.default }, { version: 1430, update: import_call_links_epoch_id_std.default }, { version: 1440, update: import_chat_folders_std.default }, { version: 1450, update: import_all_media_std.default }, { version: 1460, update: import_attachment_duration_std.default }, { version: 1470, update: import_kyber_triple_std.default }, { version: 1480, update: import_chat_folders_remove_duplicates_std.default }, { version: 1490, update: import_lowercase_notification_profiles_std.default }, { version: 1500, update: import_search_polls_std.default }, { version: 1510, update: import_chat_folders_normalize_all_chats_std.default }, { version: 1520, update: import_poll_votes_unread_std.default }, { version: 1530, update: import_update_expiring_index_std2.default }, { version: 1540, update: import_partial_expiring_index_std.default }, { version: 1550, update: import_has_link_preview_std.default }, { version: 1560, update: import_pinned_messages_std.default }, // 1561, 1551, and 1541 all refer to the same migration { version: 1561, update: import_cleanup_polls_std.default }, { version: 1570, update: import_pinned_messages_updates_std.default }, { version: 1580, update: import_expired_group_replies_std.default }, { version: 1590, update: import_megaphones_std.default }, { version: 1600, update: import_deduplicate_usernames_std.default }, { version: 1610, update: import_has_contacts_std.default }, { version: 1620, update: import_sort_bigger_media_std.default }, { version: 1630, update: import_message_pin_message_data_std.default }, { version: 1640, update: import_key_transparency_std.default }, { version: 1650, update: import_protected_attachments_std.default }, { version: 1660, update: import_protected_attachments_non_unique_std.default } ]; class DBVersionFromFutureError extends Error { static { __name(this, "DBVersionFromFutureError"); } name = "DBVersionFromFutureError"; } function enableFTS5SecureDelete(db, logger) { const isEnabled = db.prepare( ` SELECT v FROM messages_fts_config WHERE k is 'secure-delete'; `, { pluck: true } ).get() === 1; if (!isEnabled) { logger.info("enableFTS5SecureDelete: enabling"); db.exec(` -- Enable secure-delete INSERT INTO messages_fts (messages_fts, rank) VALUES ('secure-delete', 1); `); } } __name(enableFTS5SecureDelete, "enableFTS5SecureDelete"); function updateSchema(db, logger) { const sqliteVersion = (0, import_util_std.getSQLiteVersion)(db); const sqlcipherVersion = (0, import_util_std.getSQLCipherVersion)(db); const startingVersion = (0, import_util_std.getUserVersion)(db); const schemaVersion = (0, import_util_std.getSchemaVersion)(db); const MAX_VERSION = SCHEMA_VERSIONS[SCHEMA_VERSIONS.length - 1].version; for (let i2 = 1; i2 < SCHEMA_VERSIONS.length; i2 += 1) { const prev = SCHEMA_VERSIONS[i2 - 1].version; const next = SCHEMA_VERSIONS[i2].version; if (prev >= next) { throw new Error( `Migration versions are not monotonic: ${prev} >= ${next}` ); } } logger.info( "updateSchema:\n", ` Current user_version: ${startingVersion}; `, ` Most recent db schema: ${MAX_VERSION}; `, ` SQLite version: ${sqliteVersion}; `, ` SQLCipher version: ${sqlcipherVersion}; `, ` (deprecated) schema_version: ${schemaVersion}; ` ); if (startingVersion > MAX_VERSION) { throw new DBVersionFromFutureError( `SQL: User version is ${startingVersion} but the expected maximum version is ${MAX_VERSION}.` ); } let i = 0; while (i < SCHEMA_VERSIONS.length) { const needsVacuum = db.transaction(() => { for (; i < SCHEMA_VERSIONS.length; i += 1) { const { version, update } = SCHEMA_VERSIONS[i]; if (version <= startingVersion) { continue; } const schemaLogger = logger.child(`updateSchema(${version})`); const result = update(db, schemaLogger, startingVersion); if (result === "vacuum") { schemaLogger.info("success, needs vacuum"); db.pragma(`user_version = ${version}`); i += 1; return true; } schemaLogger.info("success"); } db.pragma(`user_version = ${MAX_VERSION}`); return false; })(); if (needsVacuum) { logger.info("running vacuum"); db.exec("VACUUM"); logger.info("done running vacuum"); } } import_Server_node.DataWriter.ensureMessageInsertTriggersAreEnabled(db); enableFTS5SecureDelete(db, logger); if (startingVersion !== MAX_VERSION) { const start = Date.now(); db.pragma("optimize"); const duration = Date.now() - start; logger.info(`updateSchema: optimize took ${duration}ms`); } } __name(updateSchema, "updateSchema"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { DBVersionFromFutureError, SCHEMA_VERSIONS, enableFTS5SecureDelete, updateSchema }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var callLinks_node_exports = {}; __export(callLinks_node_exports, { _removeAllCallLinks: () => _removeAllCallLinks, beginDeleteAllCallLinks: () => beginDeleteAllCallLinks, beginDeleteCallLink: () => beginDeleteCallLink, callLinkExists: () => callLinkExists, defunctCallLinkExists: () => defunctCallLinkExists, deleteCallHistoryByRoomId: () => deleteCallHistoryByRoomId, deleteCallLinkAndHistory: () => deleteCallLinkAndHistory, deleteCallLinkFromSync: () => deleteCallLinkFromSync, finalizeDeleteCallLink: () => finalizeDeleteCallLink, getAllAdminCallLinks: () => getAllAdminCallLinks, getAllCallLinkRecordsWithAdminKey: () => getAllCallLinkRecordsWithAdminKey, getAllCallLinks: () => getAllCallLinks, getAllDefunctCallLinksWithAdminKey: () => getAllDefunctCallLinksWithAdminKey, getAllMarkedDeletedCallLinkRoomIds: () => getAllMarkedDeletedCallLinkRoomIds, getCallLinkByRoomId: () => getCallLinkByRoomId, getCallLinkRecordByRoomId: () => getCallLinkRecordByRoomId, insertCallLink: () => insertCallLink, insertDefunctCallLink: () => insertDefunctCallLink, insertOrUpdateCallLinkFromSync: () => insertOrUpdateCallLinkFromSync, updateCallLink: () => updateCallLink, updateCallLinkEpochAndAdminKeyByRoomId: () => updateCallLinkEpochAndAdminKeyByRoomId, updateCallLinkState: () => updateCallLinkState, updateCallLinkStateAndEpoch: () => updateCallLinkStateAndEpoch, updateDefunctCallLink: () => updateDefunctCallLink }); module.exports = __toCommonJS(callLinks_node_exports); var import_ringrtc = require("@signalapp/ringrtc"); var Bytes = __toESM(require("../../Bytes.std.js")); var import_CallLink_std = require("../../types/CallLink.std.js"); var import_callLinks_std = require("../../util/callLinks.std.js"); var import_callLinksRingrtc_node = require("../../util/callLinksRingrtc.node.js"); var import_util_std = require("../util.std.js"); var import_assert_std = require("../../util/assert.std.js"); var import_CallDisposition_std = require("../../types/CallDisposition.std.js"); var import_schemas_std = require("../../util/schemas.std.js"); function callLinkExists(db, roomId) { const [query, params] = import_util_std.sql` SELECT 1 FROM callLinks WHERE roomId = ${roomId}; `; return db.prepare(query, { pluck: true }).get(params) === 1; } __name(callLinkExists, "callLinkExists"); function getCallLinkByRoomId(db, roomId) { const callLinkRecord = getCallLinkRecordByRoomId(db, roomId); if (!callLinkRecord) { return void 0; } return (0, import_callLinksRingrtc_node.callLinkFromRecord)(callLinkRecord); } __name(getCallLinkByRoomId, "getCallLinkByRoomId"); function getCallLinkRecordByRoomId(db, roomId) { const row = db.prepare("SELECT * FROM callLinks WHERE roomId = $roomId").get({ roomId }); if (!row) { return void 0; } return (0, import_schemas_std.parseUnknown)(import_CallLink_std.callLinkRecordSchema, row); } __name(getCallLinkRecordByRoomId, "getCallLinkRecordByRoomId"); function getAllCallLinks(db) { const [query] = import_util_std.sql` SELECT * FROM callLinks; `; return db.prepare(query).all().map( (item) => (0, import_callLinksRingrtc_node.callLinkFromRecord)((0, import_schemas_std.parseUnknown)(import_CallLink_std.callLinkRecordSchema, item)) ); } __name(getAllCallLinks, "getAllCallLinks"); function _insertCallLink(db, callLink) { const { roomId, rootKey } = callLink; assertRoomIdMatchesRootKey(roomId, rootKey); const data = (0, import_callLinksRingrtc_node.callLinkToRecord)(callLink); db.prepare( ` INSERT INTO callLinks ( roomId, rootKey, epoch, adminKey, name, restrictions, revoked, expiration, storageID, storageVersion, storageUnknownFields, storageNeedsSync ) VALUES ( $roomId, $rootKey, $epoch, $adminKey, $name, $restrictions, $revoked, $expiration, $storageID, $storageVersion, $storageUnknownFields, $storageNeedsSync ) ` ).run(data); } __name(_insertCallLink, "_insertCallLink"); function insertCallLink(db, callLink) { _insertCallLink(db, callLink); } __name(insertCallLink, "insertCallLink"); function insertOrUpdateCallLinkFromSync(db, callLink) { const { roomId, epoch, adminKey } = callLink; return db.transaction(() => { const existingCallLink = getCallLinkByRoomId(db, roomId); if (existingCallLink) { if (adminKey && adminKey !== existingCallLink.adminKey || epoch !== existingCallLink.epoch) { updateCallLinkEpochAndAdminKeyByRoomId(db, roomId, epoch, adminKey); return { callLink: { ...existingCallLink, adminKey, epoch }, inserted: false, updated: true }; } return { callLink: existingCallLink, inserted: false, updated: false }; } insertCallLink(db, callLink); return { callLink, inserted: true, updated: false }; })(); } __name(insertOrUpdateCallLinkFromSync, "insertOrUpdateCallLinkFromSync"); function updateCallLink(db, callLink) { const { roomId, rootKey } = callLink; assertRoomIdMatchesRootKey(roomId, rootKey); const data = (0, import_callLinksRingrtc_node.callLinkToRecord)(callLink); db.prepare( ` UPDATE callLinks SET epoch = $epoch, adminKey = $adminKey, name = $name, restrictions = $restrictions, revoked = $revoked, expiration = $expiration, storageID = $storageID, storageVersion = $storageVersion, storageUnknownFields = $storageUnknownFields, storageNeedsSync = $storageNeedsSync WHERE roomId = $roomId ` ).run(data); } __name(updateCallLink, "updateCallLink"); function updateCallLinkState(db, roomId, callLinkState) { const { name, restrictions, expiration, revoked } = callLinkState; const restrictionsValue = (0, import_schemas_std.parseStrict)( import_CallLink_std.callLinkRestrictionsSchema, restrictions ); const [query, params] = import_util_std.sql` UPDATE callLinks SET name = ${name}, restrictions = ${restrictionsValue}, expiration = ${expiration}, revoked = ${revoked ? 1 : 0} WHERE roomId = ${roomId} RETURNING *; `; const row = db.prepare(query).get(params); (0, import_assert_std.strictAssert)(row, "Expected row to be returned"); return (0, import_callLinksRingrtc_node.callLinkFromRecord)((0, import_schemas_std.parseUnknown)(import_CallLink_std.callLinkRecordSchema, row)); } __name(updateCallLinkState, "updateCallLinkState"); function updateCallLinkStateAndEpoch(db, roomId, callLinkState, epoch) { const { name, restrictions, expiration, revoked } = callLinkState; const restrictionsValue = (0, import_schemas_std.parseStrict)( import_CallLink_std.callLinkRestrictionsSchema, restrictions ); const epochBytes = epoch ? (0, import_callLinksRingrtc_node.toEpochBytes)(epoch) : null; const [query, params] = import_util_std.sql` UPDATE callLinks SET name = ${name}, epoch = ${epochBytes}, restrictions = ${restrictionsValue}, expiration = ${expiration}, revoked = ${revoked ? 1 : 0} WHERE roomId = ${roomId} RETURNING *; `; const row = db.prepare(query).get(params); (0, import_assert_std.strictAssert)(row, "Expected row to be returned"); return (0, import_callLinksRingrtc_node.callLinkFromRecord)((0, import_schemas_std.parseUnknown)(import_CallLink_std.callLinkRecordSchema, row)); } __name(updateCallLinkStateAndEpoch, "updateCallLinkStateAndEpoch"); function updateCallLinkEpochAndAdminKeyByRoomId(db, roomId, epoch, adminKey) { const epochBytes = epoch ? (0, import_callLinksRingrtc_node.toEpochBytes)(epoch) : null; if (adminKey) { const adminKeyBytes = (0, import_callLinks_std.toAdminKeyBytes)(adminKey); db.prepare( ` UPDATE callLinks SET adminKey = $adminKeyBytes, epoch = $epochBytes WHERE roomId = $roomId; ` ).run({ roomId, epochBytes, adminKeyBytes }); } else { db.prepare( ` UPDATE callLinks SET epoch = $epochBytes WHERE roomId = $roomId; ` ).run({ roomId, epochBytes }); } } __name(updateCallLinkEpochAndAdminKeyByRoomId, "updateCallLinkEpochAndAdminKeyByRoomId"); function assertRoomIdMatchesRootKey(roomId, rootKey) { const derivedRoomId = Bytes.toHex( import_ringrtc.CallLinkRootKey.parse(rootKey).deriveRoomId() ); (0, import_assert_std.strictAssert)( roomId === derivedRoomId, "passed roomId must match roomId derived from root key" ); } __name(assertRoomIdMatchesRootKey, "assertRoomIdMatchesRootKey"); function deleteCallHistoryByRoomId(db, roomId) { const [ markCallHistoryDeleteByPeerIdQuery, markCallHistoryDeleteByPeerIdParams ] = import_util_std.sql` UPDATE callsHistory SET status = ${import_CallDisposition_std.CallStatusValue.Deleted}, timestamp = ${Date.now()} WHERE peerId = ${roomId} `; db.prepare(markCallHistoryDeleteByPeerIdQuery).run( markCallHistoryDeleteByPeerIdParams ); } __name(deleteCallHistoryByRoomId, "deleteCallHistoryByRoomId"); function deleteCallLinkFromSync(db, roomId) { db.transaction(() => { const [query, params] = import_util_std.sql` DELETE FROM callLinks WHERE roomId = ${roomId}; `; db.prepare(query).run(params); deleteCallHistoryByRoomId(db, roomId); })(); } __name(deleteCallLinkFromSync, "deleteCallLinkFromSync"); function beginDeleteCallLink(db, roomId) { return db.transaction(() => { const [deleteNonAdminCallLinksQuery, deleteNonAdminCallLinksParams] = import_util_std.sql` DELETE FROM callLinks WHERE adminKey IS NULL AND roomId = ${roomId}; `; const result = db.prepare(deleteNonAdminCallLinksQuery).run(deleteNonAdminCallLinksParams); if (result.changes !== 0) { return false; } const deletedAt = (/* @__PURE__ */ new Date()).getTime(); const [markAdminCallLinksDeletedQuery, markAdminCallLinksDeletedParams] = import_util_std.sql` UPDATE callLinks SET deleted = 1, deletedAt = ${deletedAt}, storageNeedsSync = 1 WHERE adminKey IS NOT NULL AND deleted IS NOT 1 AND roomId = ${roomId}; `; const deleteAdminLinkResult = db.prepare(markAdminCallLinksDeletedQuery).run(markAdminCallLinksDeletedParams); return deleteAdminLinkResult.changes > 0; })(); } __name(beginDeleteCallLink, "beginDeleteCallLink"); function deleteCallLinkAndHistory(db, roomId) { db.transaction(() => { const [deleteCallLinkQuery, deleteCallLinkParams] = import_util_std.sql` DELETE FROM callLinks WHERE roomId = ${roomId}; `; db.prepare(deleteCallLinkQuery).run(deleteCallLinkParams); const [deleteCallHistoryQuery, clearCallHistoryParams] = import_util_std.sql` UPDATE callsHistory SET status = ${import_CallDisposition_std.DirectCallStatus.Deleted}, timestamp = ${Date.now()} WHERE peerId = ${roomId}; `; db.prepare(deleteCallHistoryQuery).run(clearCallHistoryParams); })(); } __name(deleteCallLinkAndHistory, "deleteCallLinkAndHistory"); function beginDeleteAllCallLinks(db) { const deletedAt = (/* @__PURE__ */ new Date()).getTime(); return db.transaction(() => { const [markAdminCallLinksDeletedQuery, markAdminCallLinksDeletedParams] = import_util_std.sql` UPDATE callLinks SET deleted = 1, deletedAt = ${deletedAt}, storageNeedsSync = 1 WHERE adminKey IS NOT NULL AND deleted IS NOT 1; `; const markAdminCallLinksDeletedResult = db.prepare(markAdminCallLinksDeletedQuery).run(markAdminCallLinksDeletedParams); const [deleteNonAdminCallLinksQuery] = import_util_std.sql` DELETE FROM callLinks WHERE adminKey IS NULL; `; db.prepare(deleteNonAdminCallLinksQuery).run(); return markAdminCallLinksDeletedResult.changes > 0; })(); } __name(beginDeleteAllCallLinks, "beginDeleteAllCallLinks"); function getAllCallLinkRecordsWithAdminKey(db) { const [query] = import_util_std.sql` SELECT * FROM callLinks WHERE adminKey IS NOT NULL AND rootKey IS NOT NULL; `; return db.prepare(query).all().map((item) => (0, import_schemas_std.parseUnknown)(import_CallLink_std.callLinkRecordSchema, item)); } __name(getAllCallLinkRecordsWithAdminKey, "getAllCallLinkRecordsWithAdminKey"); function getAllAdminCallLinks(db) { return getAllCallLinkRecordsWithAdminKey(db).map( (record) => (0, import_callLinksRingrtc_node.callLinkFromRecord)(record) ); } __name(getAllAdminCallLinks, "getAllAdminCallLinks"); function getAllMarkedDeletedCallLinkRoomIds(db) { const [query] = import_util_std.sql` SELECT roomId FROM callLinks WHERE deleted = 1; `; return db.prepare(query, { pluck: true }).all(); } __name(getAllMarkedDeletedCallLinkRoomIds, "getAllMarkedDeletedCallLinkRoomIds"); function finalizeDeleteCallLink(db, roomId) { const [query, params] = import_util_std.sql` DELETE FROM callLinks WHERE roomId = ${roomId} AND deleted = 1 AND storageNeedsSync = 0; `; db.prepare(query).run(params); } __name(finalizeDeleteCallLink, "finalizeDeleteCallLink"); function _removeAllCallLinks(db) { const [query, params] = import_util_std.sql` DELETE FROM callLinks; `; db.prepare(query).run(params); } __name(_removeAllCallLinks, "_removeAllCallLinks"); function defunctCallLinkExists(db, roomId) { const [query, params] = import_util_std.sql` SELECT 1 FROM defunctCallLinks WHERE roomId = ${roomId}; `; return db.prepare(query, { pluck: true }).get(params) === 1; } __name(defunctCallLinkExists, "defunctCallLinkExists"); function getAllDefunctCallLinksWithAdminKey(db) { const [query] = import_util_std.sql` SELECT * FROM defunctCallLinks WHERE adminKey IS NOT NULL; `; return db.prepare(query).all().map( (item) => (0, import_callLinksRingrtc_node.defunctCallLinkFromRecord)((0, import_schemas_std.parseUnknown)(import_CallLink_std.defunctCallLinkRecordSchema, item)) ); } __name(getAllDefunctCallLinksWithAdminKey, "getAllDefunctCallLinksWithAdminKey"); function insertDefunctCallLink(db, defunctCallLink) { const { roomId, rootKey } = defunctCallLink; assertRoomIdMatchesRootKey(roomId, rootKey); const data = (0, import_callLinksRingrtc_node.defunctCallLinkToRecord)(defunctCallLink); db.prepare( ` INSERT INTO defunctCallLinks ( roomId, rootKey, epoch, adminKey, storageID, storageVersion, storageUnknownFields, storageNeedsSync ) VALUES ( $roomId, $rootKey, $epoch, $adminKey, $storageID, $storageVersion, $storageUnknownFields, $storageNeedsSync ) ON CONFLICT (roomId) DO NOTHING; ` ).run(data); } __name(insertDefunctCallLink, "insertDefunctCallLink"); function updateDefunctCallLink(db, defunctCallLink) { const { roomId, rootKey } = defunctCallLink; assertRoomIdMatchesRootKey(roomId, rootKey); const data = (0, import_callLinksRingrtc_node.defunctCallLinkToRecord)(defunctCallLink); db.prepare( ` UPDATE callLinks SET storageID = $storageID, storageVersion = $storageVersion, storageUnknownFields = $storageUnknownFields, storageNeedsSync = $storageNeedsSync WHERE roomId = $roomId ` ).run(data); } __name(updateDefunctCallLink, "updateDefunctCallLink"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { _removeAllCallLinks, beginDeleteAllCallLinks, beginDeleteCallLink, callLinkExists, defunctCallLinkExists, deleteCallHistoryByRoomId, deleteCallLinkAndHistory, deleteCallLinkFromSync, finalizeDeleteCallLink, getAllAdminCallLinks, getAllCallLinkRecordsWithAdminKey, getAllCallLinks, getAllDefunctCallLinksWithAdminKey, getAllMarkedDeletedCallLinkRoomIds, getCallLinkByRoomId, getCallLinkRecordByRoomId, insertCallLink, insertDefunctCallLink, insertOrUpdateCallLinkFromSync, updateCallLink, updateCallLinkEpochAndAdminKeyByRoomId, updateCallLinkState, updateCallLinkStateAndEpoch, updateDefunctCallLink }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var chatFolders_std_exports = {}; __export(chatFolders_std_exports, { createAllChatsChatFolder: () => createAllChatsChatFolder, createChatFolder: () => createChatFolder, deleteExpiredChatFolders: () => deleteExpiredChatFolders, getAllChatFolders: () => getAllChatFolders, getChatFolder: () => getChatFolder, getCurrentChatFolders: () => getCurrentChatFolders, getOldestDeletedChatFolder: () => getOldestDeletedChatFolder, hasAllChatsChatFolder: () => hasAllChatsChatFolder, markChatFolderDeleted: () => markChatFolderDeleted, updateChatFolder: () => updateChatFolder, updateChatFolderDeletedAtTimestampMsFromSync: () => updateChatFolderDeletedAtTimestampMsFromSync, updateChatFolderPositions: () => updateChatFolderPositions, updateChatFolderToggleChat: () => updateChatFolderToggleChat, upsertAllChatsChatFolderFromSync: () => upsertAllChatsChatFolderFromSync }); module.exports = __toCommonJS(chatFolders_std_exports); var import_uuid = require("uuid"); var import_ChatFolder_std = require("../../types/ChatFolder.std.js"); var import_util_std = require("../util.std.js"); var import_assert_std = require("../../util/assert.std.js"); var import_CurrentChatFolders_std = require("../../types/CurrentChatFolders.std.js"); function chatFolderToRow(chatFolder) { return { ...chatFolder, showOnlyUnread: chatFolder.showOnlyUnread ? 1 : 0, showMutedChats: chatFolder.showMutedChats ? 1 : 0, includeAllIndividualChats: chatFolder.includeAllIndividualChats ? 1 : 0, includeAllGroupChats: chatFolder.includeAllGroupChats ? 1 : 0, includedConversationIds: JSON.stringify(chatFolder.includedConversationIds), excludedConversationIds: JSON.stringify(chatFolder.excludedConversationIds), storageNeedsSync: chatFolder.storageNeedsSync ? 1 : 0 }; } __name(chatFolderToRow, "chatFolderToRow"); function rowToChatFolder(chatFolderRow) { return { ...chatFolderRow, showOnlyUnread: chatFolderRow.showOnlyUnread === 1, showMutedChats: chatFolderRow.showMutedChats === 1, includeAllIndividualChats: chatFolderRow.includeAllIndividualChats === 1, includeAllGroupChats: chatFolderRow.includeAllGroupChats === 1, includedConversationIds: JSON.parse(chatFolderRow.includedConversationIds), excludedConversationIds: JSON.parse(chatFolderRow.excludedConversationIds), storageNeedsSync: chatFolderRow.storageNeedsSync === 1 }; } __name(rowToChatFolder, "rowToChatFolder"); function getAllChatFolders(db) { const [query, params] = import_util_std.sql` SELECT * FROM chatFolders `; return db.prepare(query).all(params).map((row) => rowToChatFolder(row)); } __name(getAllChatFolders, "getAllChatFolders"); function getCurrentChatFolders(db) { const [query, params] = import_util_std.sql` SELECT * FROM chatFolders WHERE folderType IS NOT ${import_ChatFolder_std.ChatFolderType.UNKNOWN} AND deletedAtTimestampMs IS 0 ORDER BY position ASC `; return db.prepare(query).all(params).map((row) => { const chatFolder = rowToChatFolder(row); (0, import_assert_std.strictAssert)( (0, import_CurrentChatFolders_std.isCurrentChatFolder)(chatFolder), `Query returned row that is not a current chat folder (${chatFolder.id})` ); return chatFolder; }); } __name(getCurrentChatFolders, "getCurrentChatFolders"); function getChatFolder(db, chatFolderId) { const [query, params] = import_util_std.sql` SELECT * FROM chatFolders WHERE id = ${chatFolderId}; `; const row = db.prepare(query).get(params); if (row == null) { return null; } return rowToChatFolder(row); } __name(getChatFolder, "getChatFolder"); function _insertChatFolder(db, chatFolder) { const chatFolderRow = chatFolderToRow(chatFolder); const [chatFolderQuery, chatFolderParams] = import_util_std.sql` INSERT INTO chatFolders ( id, folderType, name, position, showOnlyUnread, showMutedChats, includeAllIndividualChats, includeAllGroupChats, includedConversationIds, excludedConversationIds, deletedAtTimestampMs, storageID, storageVersion, storageUnknownFields, storageNeedsSync ) VALUES ( ${chatFolderRow.id}, ${chatFolderRow.folderType}, ${chatFolderRow.name}, ${chatFolderRow.position}, ${chatFolderRow.showOnlyUnread}, ${chatFolderRow.showMutedChats}, ${chatFolderRow.includeAllIndividualChats}, ${chatFolderRow.includeAllGroupChats}, ${chatFolderRow.includedConversationIds}, ${chatFolderRow.excludedConversationIds}, ${chatFolderRow.deletedAtTimestampMs}, ${chatFolderRow.storageID}, ${chatFolderRow.storageVersion}, ${chatFolderRow.storageUnknownFields}, ${chatFolderRow.storageNeedsSync} ) `; db.prepare(chatFolderQuery).run(chatFolderParams); } __name(_insertChatFolder, "_insertChatFolder"); function createChatFolder(db, chatFolder) { return db.transaction(() => { _insertChatFolder(db, chatFolder); })(); } __name(createChatFolder, "createChatFolder"); function hasAllChatsChatFolder(db) { const [query, params] = import_util_std.sql` SELECT EXISTS ( SELECT 1 FROM chatFolders WHERE folderType IS ${import_ChatFolder_std.ChatFolderType.ALL} AND deletedAtTimestampMs IS 0 LIMIT 1 ) `; const result = db.prepare(query, { pluck: true }).get(params); return result === 1; } __name(hasAllChatsChatFolder, "hasAllChatsChatFolder"); function createAllChatsChatFolder(db) { return db.transaction(() => { const allChatsChatFolder = { id: (0, import_uuid.v4)(), ...import_ChatFolder_std.ALL_CHATS_FOLDER_REQUIRED_PARAMS, position: 0, deletedAtTimestampMs: 0, storageID: null, storageVersion: null, storageUnknownFields: null, storageNeedsSync: true }; _resetAllChatFolderPositions(db, 1); _insertChatFolder(db, allChatsChatFolder); return allChatsChatFolder; })(); } __name(createAllChatsChatFolder, "createAllChatsChatFolder"); function upsertAllChatsChatFolderFromSync(db, chatFolder) { return db.transaction(() => { (0, import_assert_std.strictAssert)( chatFolder.folderType === import_ChatFolder_std.ChatFolderType.ALL, "Chat folder must have folderType=ALL" ); if (hasAllChatsChatFolder(db)) { const chatFolderRow = chatFolderToRow(chatFolder); const [query, params] = import_util_std.sql` UPDATE chatFolders SET id = ${chatFolderRow.id}, position = ${chatFolderRow.position}, storageID = ${chatFolderRow.storageID}, storageVersion = ${chatFolderRow.storageVersion}, storageUnknownFields = ${chatFolderRow.storageUnknownFields}, storageNeedsSync = ${chatFolderRow.storageNeedsSync} WHERE folderType = ${import_ChatFolder_std.ChatFolderType.ALL} `; db.prepare(query).run(params); } else { _insertChatFolder(db, chatFolder); } })(); } __name(upsertAllChatsChatFolderFromSync, "upsertAllChatsChatFolderFromSync"); function updateChatFolder(db, chatFolder) { const chatFolderRow = chatFolderToRow(chatFolder); const [chatFolderQuery, chatFolderParams] = import_util_std.sql` UPDATE chatFolders SET id = ${chatFolderRow.id}, folderType = ${chatFolderRow.folderType}, name = ${chatFolderRow.name}, position = ${chatFolderRow.position}, showOnlyUnread = ${chatFolderRow.showOnlyUnread}, showMutedChats = ${chatFolderRow.showMutedChats}, includeAllIndividualChats = ${chatFolderRow.includeAllIndividualChats}, includeAllGroupChats = ${chatFolderRow.includeAllGroupChats}, includedConversationIds = ${chatFolderRow.includedConversationIds}, excludedConversationIds = ${chatFolderRow.excludedConversationIds}, deletedAtTimestampMs = ${chatFolderRow.deletedAtTimestampMs}, storageID = ${chatFolderRow.storageID}, storageVersion = ${chatFolderRow.storageVersion}, storageUnknownFields = ${chatFolderRow.storageUnknownFields}, storageNeedsSync = ${chatFolderRow.storageNeedsSync} WHERE id = ${chatFolderRow.id} `; db.prepare(chatFolderQuery).run(chatFolderParams); } __name(updateChatFolder, "updateChatFolder"); function updateChatFolderToggleChat(db, chatFolderId, conversationId, toggle) { return db.transaction(() => { const chatFolder = getChatFolder(db, chatFolderId); (0, import_assert_std.strictAssert)( chatFolder != null, `Missing chat folder for id: ${chatFolderId}` ); const included = new Set(chatFolder.includedConversationIds); const excluded = new Set(chatFolder.excludedConversationIds); if (toggle) { included.add(conversationId); excluded.delete(conversationId); } else { included.delete(conversationId); excluded.add(conversationId); } updateChatFolder(db, { ...chatFolder, includedConversationIds: Array.from(included), excludedConversationIds: Array.from(excluded), storageNeedsSync: true }); })(); } __name(updateChatFolderToggleChat, "updateChatFolderToggleChat"); const EMPTY_ARRAY = JSON.stringify([]); function markChatFolderDeleted(db, id, deletedAtTimestampMs, storageNeedsSync) { return db.transaction(() => { const [query, params] = import_util_std.sql` UPDATE chatFolders SET position = ${import_ChatFolder_std.CHAT_FOLDER_DELETED_POSITION}, deletedAtTimestampMs = ${deletedAtTimestampMs}, storageNeedsSync = ${storageNeedsSync ? 1 : 0}, includedConversationIds = ${EMPTY_ARRAY}, excludedConversationIds = ${EMPTY_ARRAY} WHERE id = ${id} `; db.prepare(query).run(params); _resetAllChatFolderPositions(db, 0); })(); } __name(markChatFolderDeleted, "markChatFolderDeleted"); function _resetAllChatFolderPositions(db, offset) { const [query, params] = import_util_std.sql` SELECT id FROM chatFolders WHERE deletedAtTimestampMs IS 0 ORDER BY position ASC `; db.prepare(query, { pluck: true }).all(params).forEach((id, index) => { const [update, updateParams] = import_util_std.sql` UPDATE chatFolders SET position = ${offset + index}, storageNeedsSync = 1 WHERE id = ${id} `; db.prepare(update).run(updateParams); }); } __name(_resetAllChatFolderPositions, "_resetAllChatFolderPositions"); function updateChatFolderPositions(db, chatFolders) { return db.transaction(() => { for (const chatFolder of chatFolders) { const [query, params] = import_util_std.sql` UPDATE chatFolders SET position = ${chatFolder.position}, storageNeedsSync = 1 WHERE id = ${chatFolder.id} `; db.prepare(query).run(params); } })(); } __name(updateChatFolderPositions, "updateChatFolderPositions"); function updateChatFolderDeletedAtTimestampMsFromSync(db, chatFolderId, deletedAtTimestampMs) { return db.transaction(() => { const [update, updateParams] = import_util_std.sql` UPDATE chatFolders SET deletedAtTimestampMs = ${deletedAtTimestampMs} WHERE id = ${chatFolderId} `; db.prepare(update).run(updateParams); })(); } __name(updateChatFolderDeletedAtTimestampMsFromSync, "updateChatFolderDeletedAtTimestampMsFromSync"); function getOldestDeletedChatFolder(db) { const [query, params] = import_util_std.sql` SELECT * FROM chatFolders WHERE deletedAtTimestampMs > 0 ORDER BY deletedAtTimestampMs ASC LIMIT 1 `; const row = db.prepare(query).get(params); if (row == null) { return null; } return rowToChatFolder(row); } __name(getOldestDeletedChatFolder, "getOldestDeletedChatFolder"); function deleteExpiredChatFolders(db, messageQueueTime) { const before = Date.now() - messageQueueTime; const [query, params] = import_util_std.sql` DELETE FROM chatFolders WHERE deletedAtTimestampMs > 0 AND deletedAtTimestampMs < ${before} RETURNING id `; return db.prepare(query, { pluck: true }).all(params); } __name(deleteExpiredChatFolders, "deleteExpiredChatFolders"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { createAllChatsChatFolder, createChatFolder, deleteExpiredChatFolders, getAllChatFolders, getChatFolder, getCurrentChatFolders, getOldestDeletedChatFolder, hasAllChatsChatFolder, markChatFolderDeleted, updateChatFolder, updateChatFolderDeletedAtTimestampMsFromSync, updateChatFolderPositions, updateChatFolderToggleChat, upsertAllChatsChatFolderFromSync }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var donationReceipts_std_exports = {}; __export(donationReceipts_std_exports, { _deleteAllDonationReceipts: () => _deleteAllDonationReceipts, createDonationReceipt: () => createDonationReceipt, deleteDonationReceiptById: () => deleteDonationReceiptById, getAllDonationReceipts: () => getAllDonationReceipts, getDonationReceiptById: () => getDonationReceiptById }); module.exports = __toCommonJS(donationReceipts_std_exports); var import_util_std = require("../util.std.js"); function getAllDonationReceipts(db) { const donationReceipts = db.prepare("SELECT * FROM donationReceipts ORDER BY timestamp DESC;").all(); return donationReceipts; } __name(getAllDonationReceipts, "getAllDonationReceipts"); function getDonationReceiptById(db, id) { const [query, parameters] = import_util_std.sql`SELECT * FROM donationReceipts WHERE id = ${id}`; return db.prepare(query).get(parameters); } __name(getDonationReceiptById, "getDonationReceiptById"); function _deleteAllDonationReceipts(db) { db.prepare("DELETE FROM donationReceipts;").run(); } __name(_deleteAllDonationReceipts, "_deleteAllDonationReceipts"); function deleteDonationReceiptById(db, id) { const [query, parameters] = import_util_std.sql`DELETE FROM donationReceipts WHERE id = ${id};`; db.prepare(query).run(parameters); } __name(deleteDonationReceiptById, "deleteDonationReceiptById"); function createDonationReceipt(db, receipt) { db.prepare( ` INSERT INTO donationReceipts( id, currencyType, paymentAmount, timestamp ) VALUES ( $id, $currencyType, $paymentAmount, $timestamp ); ` ).run(receipt); } __name(createDonationReceipt, "createDonationReceipt"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { _deleteAllDonationReceipts, createDonationReceipt, deleteDonationReceiptById, getAllDonationReceipts, getDonationReceiptById }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var groupSendEndorsements_std_exports = {}; __export(groupSendEndorsements_std_exports, { deleteAllEndorsementsForGroup: () => deleteAllEndorsementsForGroup, getGroupSendCombinedEndorsementExpiration: () => getGroupSendCombinedEndorsementExpiration, getGroupSendEndorsementsData: () => getGroupSendEndorsementsData, getGroupSendMemberEndorsement: () => getGroupSendMemberEndorsement, replaceAllEndorsementsForGroup: () => replaceAllEndorsementsForGroup }); module.exports = __toCommonJS(groupSendEndorsements_std_exports); var import_GroupSendEndorsements_std = require("../../types/GroupSendEndorsements.std.js"); var import_util_std = require("../util.std.js"); var import_assert_std = require("../../util/assert.std.js"); var import_schemas_std = require("../../util/schemas.std.js"); function replaceAllEndorsementsForGroup(db, data) { db.transaction(() => { const { combinedEndorsement, memberEndorsements } = data; const { groupId } = combinedEndorsement; _deleteAllEndorsementsForGroup(db, groupId); _replaceCombinedEndorsement(db, combinedEndorsement); _replaceMemberEndorsements(db, memberEndorsements); })(); } __name(replaceAllEndorsementsForGroup, "replaceAllEndorsementsForGroup"); function _deleteAllEndorsementsForGroup(db, groupId) { const [deleteCombined, deleteCombinedParams] = import_util_std.sql` DELETE FROM groupSendCombinedEndorsement WHERE groupId = ${groupId}; `; const [deleteMembers, deleteMembersParams] = import_util_std.sql` DELETE FROM groupSendMemberEndorsement WHERE groupId IS ${groupId}; `; db.prepare(deleteCombined).run(deleteCombinedParams); db.prepare(deleteMembers).run(deleteMembersParams); } __name(_deleteAllEndorsementsForGroup, "_deleteAllEndorsementsForGroup"); function _replaceCombinedEndorsement(db, combinedEndorsement) { const { groupId, expiration, endorsement } = combinedEndorsement; const [insertCombined, insertCombinedParams] = import_util_std.sql` INSERT OR REPLACE INTO groupSendCombinedEndorsement (groupId, expiration, endorsement) VALUES (${groupId}, ${expiration}, ${endorsement}); `; const result = db.prepare(insertCombined).run(insertCombinedParams); (0, import_assert_std.strictAssert)( result.changes === 1, "Must update groupSendCombinedEndorsement" ); } __name(_replaceCombinedEndorsement, "_replaceCombinedEndorsement"); function _replaceMemberEndorsements(db, memberEndorsements) { for (const memberEndorsement of memberEndorsements) { const { groupId, memberAci, expiration, endorsement } = memberEndorsement; const [replaceMember, replaceMemberParams] = import_util_std.sql` INSERT OR REPLACE INTO groupSendMemberEndorsement (groupId, memberAci, expiration, endorsement) VALUES (${groupId}, ${memberAci}, ${expiration}, ${endorsement}); `; const result = db.prepare(replaceMember).run(replaceMemberParams); (0, import_assert_std.strictAssert)( result.changes === 1, "Must update groupSendMemberEndorsement" ); } } __name(_replaceMemberEndorsements, "_replaceMemberEndorsements"); function deleteAllEndorsementsForGroup(db, groupId) { db.transaction(() => { _deleteAllEndorsementsForGroup(db, groupId); })(); } __name(deleteAllEndorsementsForGroup, "deleteAllEndorsementsForGroup"); function getGroupSendCombinedEndorsementExpiration(db, groupId) { const [selectGroup, selectGroupParams] = import_util_std.sql` SELECT expiration FROM groupSendCombinedEndorsement WHERE groupId IS ${groupId}; `; const value = db.prepare(selectGroup, { pluck: true }).get(selectGroupParams); if (value == null) { return null; } return (0, import_schemas_std.parseUnknown)(import_GroupSendEndorsements_std.groupSendEndorsementExpirationSchema, value); } __name(getGroupSendCombinedEndorsementExpiration, "getGroupSendCombinedEndorsementExpiration"); function getGroupSendEndorsementsData(db, groupId) { return db.transaction(() => { const [selectCombinedEndorsement, selectCombinedEndorsementParams] = import_util_std.sql` SELECT * FROM groupSendCombinedEndorsement WHERE groupId IS ${groupId} `; const [selectMemberEndorsements, selectMemberEndorsementsParams] = import_util_std.sql` SELECT * FROM groupSendMemberEndorsement WHERE groupId IS ${groupId} `; const combinedEndorsement = db.prepare(selectCombinedEndorsement).get(selectCombinedEndorsementParams); if (combinedEndorsement == null) { return null; } const memberEndorsements = db.prepare(selectMemberEndorsements).all(selectMemberEndorsementsParams); return (0, import_schemas_std.parseLoose)(import_GroupSendEndorsements_std.groupSendEndorsementsDataSchema, { combinedEndorsement, memberEndorsements }); })(); } __name(getGroupSendEndorsementsData, "getGroupSendEndorsementsData"); function getGroupSendMemberEndorsement(db, groupId, memberAci) { const [selectMemberEndorsements, selectMemberEndorsementsParams] = import_util_std.sql` SELECT * FROM groupSendMemberEndorsement WHERE groupId IS ${groupId} AND memberAci IS ${memberAci} `; const row = db.prepare(selectMemberEndorsements).get(selectMemberEndorsementsParams); if (row == null) { return null; } return (0, import_schemas_std.parseUnknown)(import_GroupSendEndorsements_std.groupSendMemberEndorsementSchema, row); } __name(getGroupSendMemberEndorsement, "getGroupSendMemberEndorsement"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { deleteAllEndorsementsForGroup, getGroupSendCombinedEndorsementExpiration, getGroupSendEndorsementsData, getGroupSendMemberEndorsement, replaceAllEndorsementsForGroup }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var keyTransparency_std_exports = {}; __export(keyTransparency_std_exports, { getAllKTAcis: () => getAllKTAcis, getKTAccountData: () => getKTAccountData, removeAllKTAccountData: () => removeAllKTAccountData, setKTAccountData: () => setKTAccountData }); module.exports = __toCommonJS(keyTransparency_std_exports); var import_util_std = require("../util.std.js"); function getAllKTAcis(db) { const [query, params] = import_util_std.sql` SELECT aci FROM key_transparency_account_data `; return db.prepare(query, { pluck: true }).all(params); } __name(getAllKTAcis, "getAllKTAcis"); function getKTAccountData(db, aci) { const [query, params] = import_util_std.sql` SELECT data FROM key_transparency_account_data WHERE aci IS ${aci} `; return db.prepare(query, { pluck: true }).get(params); } __name(getKTAccountData, "getKTAccountData"); function setKTAccountData(db, aci, data) { const [query, params] = import_util_std.sql` INSERT OR REPLACE INTO key_transparency_account_data (aci, data) VALUES (${aci}, ${data}); `; db.prepare(query).run(params); } __name(setKTAccountData, "setKTAccountData"); function removeAllKTAccountData(db) { db.exec(` DELETE FROM key_transparency_account_data; `); } __name(removeAllKTAccountData, "removeAllKTAccountData"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getAllKTAcis, getKTAccountData, removeAllKTAccountData, setKTAccountData }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var megaphones_std_exports = {}; __export(megaphones_std_exports, { createMegaphone: () => createMegaphone, deleteMegaphone: () => deleteMegaphone, finishMegaphone: () => finishMegaphone, getAllMegaphoneIds: () => getAllMegaphoneIds, getAllMegaphoneImageLocalPaths: () => getAllMegaphoneImageLocalPaths, getAllMegaphones: () => getAllMegaphones, hasMegaphone: () => hasMegaphone, internalDeleteAllMegaphones: () => internalDeleteAllMegaphones, snoozeMegaphone: () => snoozeMegaphone, updateMegaphone: () => updateMegaphone }); module.exports = __toCommonJS(megaphones_std_exports); var import_util_std = require("../util.std.js"); var import_assert_std = require("../../util/assert.std.js"); function megaphoneToRow(megaphone) { return { ...megaphone, isFinished: megaphone.isFinished ? 1 : 0, primaryCtaDataJson: megaphone.primaryCtaData != null ? JSON.stringify(megaphone.primaryCtaData) : null, secondaryCtaDataJson: megaphone.secondaryCtaData != null ? JSON.stringify(megaphone.secondaryCtaData) : null }; } __name(megaphoneToRow, "megaphoneToRow"); function rowToMegaphone(megaphoneRow) { return { ...megaphoneRow, isFinished: megaphoneRow.isFinished === 1, primaryCtaData: megaphoneRow.primaryCtaDataJson != null ? JSON.parse(megaphoneRow.primaryCtaDataJson) : null, secondaryCtaData: megaphoneRow.secondaryCtaDataJson != null ? JSON.parse(megaphoneRow.secondaryCtaDataJson) : null }; } __name(rowToMegaphone, "rowToMegaphone"); function hasMegaphone(db, megaphoneId) { const [query, params] = import_util_std.sql` SELECT EXISTS ( SELECT 1 FROM megaphones WHERE id = ${megaphoneId} ) `; const result = db.prepare(query, { pluck: true }).get(params); return result === 1; } __name(hasMegaphone, "hasMegaphone"); function getAllMegaphones(db) { const [query, params] = import_util_std.sql` SELECT * FROM megaphones `; return db.prepare(query).all(params).map((row) => rowToMegaphone(row)); } __name(getAllMegaphones, "getAllMegaphones"); function getAllMegaphoneIds(db) { const [query, params] = import_util_std.sql` SELECT id FROM megaphones `; return db.prepare(query, { pluck: true }).all(params); } __name(getAllMegaphoneIds, "getAllMegaphoneIds"); function _insertMegaphone(db, megaphone) { const row = megaphoneToRow(megaphone); const [query, params] = import_util_std.sql` INSERT INTO megaphones ( id, desktopMinVersion, priority, dontShowBeforeEpochMs, dontShowAfterEpochMs, showForNumberOfDays, primaryCtaId, secondaryCtaId, primaryCtaDataJson, secondaryCtaDataJson, conditionalId, title, body, primaryCtaText, secondaryCtaText, imagePath, localeFetched, shownAt, snoozedAt, snoozeCount, isFinished ) VALUES ( ${row.id}, ${row.desktopMinVersion}, ${row.priority}, ${row.dontShowBeforeEpochMs}, ${row.dontShowAfterEpochMs}, ${row.showForNumberOfDays}, ${row.primaryCtaId}, ${row.secondaryCtaId}, ${row.primaryCtaDataJson}, ${row.secondaryCtaDataJson}, ${row.conditionalId}, ${row.title}, ${row.body}, ${row.primaryCtaText}, ${row.secondaryCtaText}, ${row.imagePath}, ${row.localeFetched}, ${row.shownAt}, ${row.snoozedAt}, ${row.snoozeCount}, ${row.isFinished} ) `; db.prepare(query).run(params); } __name(_insertMegaphone, "_insertMegaphone"); function createMegaphone(db, megaphone) { return db.transaction(() => { _insertMegaphone(db, megaphone); })(); } __name(createMegaphone, "createMegaphone"); function updateMegaphone(db, megaphone) { const row = megaphoneToRow(megaphone); const [query, params] = import_util_std.sql` UPDATE megaphones SET desktopMinVersion = ${row.desktopMinVersion}, priority = ${row.priority}, dontShowBeforeEpochMs = ${row.dontShowBeforeEpochMs}, dontShowAfterEpochMs = ${row.dontShowAfterEpochMs}, showForNumberOfDays = ${row.showForNumberOfDays}, primaryCtaId = ${row.primaryCtaId}, secondaryCtaId = ${row.secondaryCtaId}, primaryCtaDataJson = ${row.primaryCtaDataJson}, secondaryCtaDataJson = ${row.secondaryCtaDataJson}, conditionalId = ${row.conditionalId}, title = ${row.title}, body = ${row.body}, primaryCtaText = ${row.primaryCtaText}, secondaryCtaText = ${row.secondaryCtaText}, imagePath = ${row.imagePath}, localeFetched = ${row.localeFetched}, shownAt = ${row.shownAt}, snoozedAt = ${row.snoozedAt}, snoozeCount = ${row.snoozeCount}, isFinished = ${row.isFinished} WHERE id = ${row.id} `; db.prepare(query).run(params); } __name(updateMegaphone, "updateMegaphone"); function finishMegaphone(db, megaphoneId) { const [query, params] = import_util_std.sql` UPDATE megaphones SET isFinished = 1 WHERE id = ${megaphoneId} `; const result = db.prepare(query).run(params); (0, import_assert_std.strictAssert)( result.changes === 1, `finishMegaphone: Expected changes: 1, Actual: ${result.changes}` ); } __name(finishMegaphone, "finishMegaphone"); function snoozeMegaphone(db, megaphoneId) { const [query, params] = import_util_std.sql` UPDATE megaphones SET snoozedAt = ${Date.now()}, snoozeCount = snoozeCount + 1 WHERE id = ${megaphoneId} `; const result = db.prepare(query).run(params); (0, import_assert_std.strictAssert)( result.changes === 1, `snoozeMegaphone: Expected changes: 1, Actual: ${result.changes}` ); } __name(snoozeMegaphone, "snoozeMegaphone"); function deleteMegaphone(db, megaphoneId) { const [query, params] = import_util_std.sql` DELETE FROM megaphones WHERE id = ${megaphoneId} `; const result = db.prepare(query).run(params); (0, import_assert_std.strictAssert)( result.changes === 1, `deleteMegaphone: Expected changes: 1, Actual: ${result.changes}` ); } __name(deleteMegaphone, "deleteMegaphone"); function internalDeleteAllMegaphones(db) { const [query, params] = import_util_std.sql` DELETE FROM megaphones `; const result = db.prepare(query).run(params); return result.changes; } __name(internalDeleteAllMegaphones, "internalDeleteAllMegaphones"); function getAllMegaphoneImageLocalPaths(db) { const localPaths = db.prepare("SELECT imagePath FROM megaphones WHERE imagePath IS NOT NULL", { pluck: true }).all(); return new Set(localPaths); } __name(getAllMegaphoneImageLocalPaths, "getAllMegaphoneImageLocalPaths"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { createMegaphone, deleteMegaphone, finishMegaphone, getAllMegaphoneIds, getAllMegaphoneImageLocalPaths, getAllMegaphones, hasMegaphone, internalDeleteAllMegaphones, snoozeMegaphone, updateMegaphone }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var messageAttachments_std_exports = {}; __export(messageAttachments_std_exports, { permissiveMessageAttachmentSchema: () => permissiveMessageAttachmentSchema }); module.exports = __toCommonJS(messageAttachments_std_exports); var import_zod = require("zod"); var import_dropNull_std = require("../../util/dropNull.std.js"); var import_AttachmentDownload_std = require("../../types/AttachmentDownload.std.js"); var import_MIME_std = require("../../types/MIME.std.js"); const permissiveStringOrNull = import_zod.z.string().optional().transform(import_dropNull_std.convertUndefinedToNull).catch(null); const permissiveNumberOrNull = import_zod.z.number().optional().transform(import_dropNull_std.convertUndefinedToNull).catch(null); const permissiveAttachmentVersion = import_zod.z.union([import_zod.z.literal(1), import_zod.z.literal(2)]).optional().transform(import_dropNull_std.convertUndefinedToNull).catch(null); const permissiveOptionalBool = import_zod.z.union([import_zod.z.literal(0), import_zod.z.literal(1)]).optional().transform(import_dropNull_std.convertUndefinedToNull).catch(null); const permissiveMessageAttachmentSchema = import_zod.z.object({ // Fields required to be NOT NULL messageId: import_zod.z.string(), messageType: import_zod.z.string(), editHistoryIndex: import_zod.z.number(), attachmentType: import_AttachmentDownload_std.messageAttachmentTypeSchema, orderInMessage: import_zod.z.number(), conversationId: import_zod.z.string(), sentAt: import_zod.z.number().catch(0), receivedAt: import_zod.z.number().catch(0), size: import_zod.z.number().catch(0), contentType: import_zod.z.string().catch(import_MIME_std.APPLICATION_OCTET_STREAM), // Fields allowing NULL receivedAtMs: permissiveNumberOrNull, duration: permissiveNumberOrNull, path: permissiveStringOrNull, clientUuid: permissiveStringOrNull, localKey: permissiveStringOrNull, plaintextHash: permissiveStringOrNull, caption: permissiveStringOrNull, blurHash: permissiveStringOrNull, height: permissiveNumberOrNull, width: permissiveNumberOrNull, digest: permissiveStringOrNull, key: permissiveStringOrNull, fileName: permissiveStringOrNull, downloadPath: permissiveStringOrNull, transitCdnKey: permissiveStringOrNull, transitCdnNumber: permissiveNumberOrNull, transitCdnUploadTimestamp: permissiveNumberOrNull, backupCdnNumber: permissiveNumberOrNull, incrementalMac: permissiveStringOrNull, incrementalMacChunkSize: permissiveNumberOrNull, thumbnailPath: permissiveStringOrNull, thumbnailSize: permissiveNumberOrNull, thumbnailContentType: permissiveStringOrNull, thumbnailLocalKey: permissiveStringOrNull, thumbnailVersion: permissiveAttachmentVersion, screenshotPath: permissiveStringOrNull, screenshotSize: permissiveNumberOrNull, screenshotContentType: permissiveStringOrNull, screenshotLocalKey: permissiveStringOrNull, screenshotVersion: permissiveAttachmentVersion, backupThumbnailPath: permissiveStringOrNull, backupThumbnailSize: permissiveNumberOrNull, backupThumbnailContentType: permissiveStringOrNull, backupThumbnailLocalKey: permissiveStringOrNull, backupThumbnailVersion: permissiveAttachmentVersion, storyTextAttachmentJson: permissiveStringOrNull, localBackupPath: permissiveStringOrNull, flags: permissiveNumberOrNull, error: permissiveOptionalBool, wasTooBig: permissiveOptionalBool, backfillError: permissiveOptionalBool, isCorrupted: permissiveOptionalBool, isViewOnce: permissiveOptionalBool, copiedFromQuotedAttachment: permissiveOptionalBool, version: permissiveAttachmentVersion, pending: permissiveOptionalBool }); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { permissiveMessageAttachmentSchema }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var pinnedMessages_std_exports = {}; __export(pinnedMessages_std_exports, { appendPinnedMessage: () => appendPinnedMessage, deleteAllExpiredPinnedMessagesBefore: () => deleteAllExpiredPinnedMessagesBefore, deletePinnedMessageByMessageId: () => deletePinnedMessageByMessageId, getAllPinnedMessages: () => getAllPinnedMessages, getNextExpiringPinnedMessageAcrossConversations: () => getNextExpiringPinnedMessageAcrossConversations, getPinnedMessagesPreloadDataForConversation: () => getPinnedMessagesPreloadDataForConversation }); module.exports = __toCommonJS(pinnedMessages_std_exports); var import_assert_std = require("../../util/assert.std.js"); var import_hydration_std = require("../hydration.std.js"); var import_util_std = require("../util.std.js"); function _getMessageById(db, messageId) { const [query, params] = import_util_std.sql` SELECT * FROM messages WHERE id = ${messageId} `; const row = db.prepare(query).get(params); if (row == null) { return null; } return (0, import_hydration_std.hydrateMessage)(db, row); } __name(_getMessageById, "_getMessageById"); function _getPinnedMessagePreloadData(db, pinnedMessage) { const message = _getMessageById(db, pinnedMessage.messageId); (0, import_assert_std.strictAssert)( message != null, `Missing message ${pinnedMessage.messageId} for pinned message ${pinnedMessage.id}` ); return { pinnedMessage, message }; } __name(_getPinnedMessagePreloadData, "_getPinnedMessagePreloadData"); function getAllPinnedMessages(db) { const [query, params] = import_util_std.sql` SELECT * FROM pinnedMessages; `; return db.prepare(query).all(params); } __name(getAllPinnedMessages, "getAllPinnedMessages"); function getPinnedMessagesPreloadDataForConversation(db, conversationId) { return db.transaction(() => { const [query, params] = import_util_std.sql` SELECT * FROM pinnedMessages WHERE conversationId = ${conversationId} ORDER BY pinnedAt ASC `; return db.prepare(query).all(params).map((pinnedMessage) => { return _getPinnedMessagePreloadData(db, pinnedMessage); }); })(); } __name(getPinnedMessagesPreloadDataForConversation, "getPinnedMessagesPreloadDataForConversation"); function _getPinnedMessageByMessageId(db, messageId) { const [query, params] = import_util_std.sql` SELECT * FROM pinnedMessages WHERE messageId IS ${messageId} `; return db.prepare(query).get(params) ?? null; } __name(_getPinnedMessageByMessageId, "_getPinnedMessageByMessageId"); function _insertPinnedMessage(db, pinnedMessageParams) { const [query, params] = import_util_std.sql` INSERT INTO pinnedMessages ( conversationId, messageId, pinnedAt, expiresAt ) VALUES ( ${pinnedMessageParams.conversationId}, ${pinnedMessageParams.messageId}, ${pinnedMessageParams.pinnedAt}, ${pinnedMessageParams.expiresAt} ) RETURNING *; `; const row = db.prepare(query).get(params); (0, import_assert_std.strictAssert)(row != null, "createPinnedMessage: Failed to insert"); return row; } __name(_insertPinnedMessage, "_insertPinnedMessage"); function _deletePinnedMessageById(db, id) { const [query, params] = import_util_std.sql` DELETE FROM pinnedMessages WHERE id = ${id} `; const result = db.prepare(query).run(params); (0, import_assert_std.strictAssert)( result.changes === 1, `deletePinnedMessage: Expected changes: 1, Actual: ${result.changes}` ); } __name(_deletePinnedMessageById, "_deletePinnedMessageById"); function _truncatePinnedMessagesByConversationId(db, conversationId, pinnedMessagesLimit) { const [query, params] = import_util_std.sql` DELETE FROM pinnedMessages WHERE conversationId = ${conversationId} AND id NOT IN ( SELECT id FROM pinnedMessages WHERE conversationId = ${conversationId} ORDER BY pinnedAt DESC LIMIT ${pinnedMessagesLimit} ) RETURNING id `; return db.prepare(query, { pluck: true }).all(params); } __name(_truncatePinnedMessagesByConversationId, "_truncatePinnedMessagesByConversationId"); function appendPinnedMessage(db, pinnedMessagesLimit, pinnedMessageParams) { return db.transaction(() => { const existing = _getPinnedMessageByMessageId( db, pinnedMessageParams.messageId ); let shouldInsertOrReplace; if (existing == null) { shouldInsertOrReplace = true; } else if (pinnedMessageParams.pinnedAt > existing.pinnedAt) { shouldInsertOrReplace = true; } else { shouldInsertOrReplace = false; } let change = null; if (shouldInsertOrReplace) { let replaced = null; if (existing != null) { _deletePinnedMessageById(db, existing.id); replaced = existing.id; } const inserted = _insertPinnedMessage(db, pinnedMessageParams); change = { inserted, replaced }; } const truncated = _truncatePinnedMessagesByConversationId( db, pinnedMessageParams.conversationId, pinnedMessagesLimit ); return { change, truncated }; })(); } __name(appendPinnedMessage, "appendPinnedMessage"); function deletePinnedMessageByMessageId(db, messageId) { const [query, params] = import_util_std.sql` DELETE FROM pinnedMessages WHERE messageId = ${messageId} RETURNING id `; const result = db.prepare(query, { pluck: true }).get(params); return result ?? null; } __name(deletePinnedMessageByMessageId, "deletePinnedMessageByMessageId"); function getNextExpiringPinnedMessageAcrossConversations(db) { const [query, params] = import_util_std.sql` SELECT * FROM pinnedMessages WHERE expiresAt IS NOT null ORDER BY expiresAt ASC LIMIT 1 `; return db.prepare(query).get(params) ?? null; } __name(getNextExpiringPinnedMessageAcrossConversations, "getNextExpiringPinnedMessageAcrossConversations"); function deleteAllExpiredPinnedMessagesBefore(db, beforeTimestamp) { const [query, params] = import_util_std.sql` DELETE FROM pinnedMessages WHERE expiresAt <= ${beforeTimestamp} RETURNING * `; return db.prepare(query).all(params); } __name(deleteAllExpiredPinnedMessagesBefore, "deleteAllExpiredPinnedMessagesBefore"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { appendPinnedMessage, deleteAllExpiredPinnedMessagesBefore, deletePinnedMessageByMessageId, getAllPinnedMessages, getNextExpiringPinnedMessageAcrossConversations, getPinnedMessagesPreloadDataForConversation }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var sqlLogger_node_exports = {}; __export(sqlLogger_node_exports, { sqlLogger: () => sqlLogger }); module.exports = __toCommonJS(sqlLogger_node_exports); var import_node_worker_threads = require("node:worker_threads"); var import_node_util = require("node:util"); var import_consoleLogger_std = require("../util/consoleLogger.std.js"); var import_assert_std = require("../util/assert.std.js"); class SQLLogger { static { __name(this, "SQLLogger"); } #msgPrefix; constructor(msgPrefix) { this.#msgPrefix = msgPrefix; } fatal(...args) { this.#log("fatal", args); } error(...args) { this.#log("error", args); } warn(...args) { this.#log("warn", args); } info(...args) { this.#log("info", args); } debug(...args) { this.#log("debug", args); } trace(...args) { this.#log("trace", args); } child(subsystem) { return new SQLLogger(`${this.#msgPrefix}[${subsystem}] `); } #log(level, args) { if (import_node_worker_threads.parentPort) { const [fmt, ...rest] = args; const wrappedResponse = { type: "log", level, args: [this.#msgPrefix + fmt].concat(rest) }; import_node_worker_threads.parentPort.postMessage(wrappedResponse); } else { (0, import_assert_std.strictAssert)(process.env.NODE_ENV === "test", "must be test environment"); import_consoleLogger_std.consoleLogger[level](this.#msgPrefix + (0, import_node_util.format)(...args)); } } } const sqlLogger = new SQLLogger(""); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { sqlLogger }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var util_std_exports = {}; __export(util_std_exports, { QueryFragment: () => QueryFragment, TableIterator: () => TableIterator, batchMultiVarQuery: () => batchMultiVarQuery, bulkAdd: () => bulkAdd, convertOptionalBooleanToInteger: () => convertOptionalBooleanToInteger, convertOptionalIntegerToBoolean: () => convertOptionalIntegerToBoolean, createOrUpdate: () => createOrUpdate, explainQueryPlan: () => explainQueryPlan, getAllFromTable: () => getAllFromTable, getById: () => getById, getCountFromTable: () => getCountFromTable, getSQLCipherVersion: () => getSQLCipherVersion, getSQLiteVersion: () => getSQLiteVersion, getSchemaVersion: () => getSchemaVersion, getUserVersion: () => getUserVersion, jsonToObject: () => jsonToObject, objectToJSON: () => objectToJSON, removeAllFromTable: () => removeAllFromTable, removeById: () => removeById, setUserVersion: () => setUserVersion, sql: () => sql, sqlConstant: () => sqlConstant, sqlFragment: () => sqlFragment, sqlId: () => sqlId, sqlJoin: () => sqlJoin }); module.exports = __toCommonJS(util_std_exports); var import_lodash = __toESM(require("lodash")); var import_assert_std = require("../util/assert.std.js"); const { isNumber, last } = import_lodash.default; const MAX_VARIABLE_COUNT = 100; function objectToJSON(data) { return JSON.stringify(data); } __name(objectToJSON, "objectToJSON"); function jsonToObject(json) { return JSON.parse(json); } __name(jsonToObject, "jsonToObject"); class QueryFragment { constructor(fragment, fragmentParams) { this.fragment = fragment; this.fragmentParams = fragmentParams; } static { __name(this, "QueryFragment"); } } function sqlFragment(strings, ...values) { let query = ""; const params = []; strings.forEach((string, index) => { const value = values[index]; query += string; if (index < values.length) { if (value instanceof QueryFragment) { const { fragment, fragmentParams } = value; query += fragment; params.push(...fragmentParams); } else { query += "?"; params.push(value); } } }); return new QueryFragment(query, params); } __name(sqlFragment, "sqlFragment"); function sqlConstant(value) { let fragment; if (value == null) { fragment = "NULL"; } else if (typeof value === "number") { fragment = `${value}`; } else if (typeof value === "boolean") { fragment = `${value}`; } else { fragment = `'${value}'`; } return new QueryFragment(fragment, []); } __name(sqlConstant, "sqlConstant"); const PLAIN_SQL_IDENTIFIER = /^[a-zA-Z_][a-zA-Z0-9_]*$/; function sqlId(name) { (0, import_assert_std.strictAssert)(PLAIN_SQL_IDENTIFIER.test(name), `Invalid identifier ${name}`); return new QueryFragment(`\`${name}\``, []); } __name(sqlId, "sqlId"); const SQL_JOIN_SEPARATOR = ","; function sqlJoin(items) { let query = ""; const params = []; items.forEach((item, index) => { const { fragment, fragmentParams } = sqlFragment`${item}`; query += fragment; params.push(...fragmentParams); if (index < items.length - 1) { query += SQL_JOIN_SEPARATOR; } }); return new QueryFragment(query, params); } __name(sqlJoin, "sqlJoin"); function sql(strings, ...values) { const { fragment, fragmentParams } = sqlFragment(strings, ...values); return [fragment, fragmentParams]; } __name(sql, "sql"); function explainQueryPlan(db, logger, template) { const [query, params] = template; const plan = db.prepare(`EXPLAIN QUERY PLAN ${query}`).all(params); logger.info("EXPLAIN QUERY PLAN"); for (const line of query.split("\n")) { logger.info(line); } for (const row of plan) { logger.info(`id=${row.id}, parent=${row.parent}, detail=${row.detail}`); } return [query, params]; } __name(explainQueryPlan, "explainQueryPlan"); function getSQLiteVersion(db) { return db.prepare("select sqlite_version() AS sqlite_version", { pluck: true }).get() ?? ""; } __name(getSQLiteVersion, "getSQLiteVersion"); function getSchemaVersion(db) { return db.pragma("schema_version", { simple: true }); } __name(getSchemaVersion, "getSchemaVersion"); function setUserVersion(db, version) { if (!isNumber(version)) { throw new Error(`setUserVersion: version ${version} is not a number`); } db.pragma(`user_version = ${version}`); } __name(setUserVersion, "setUserVersion"); function getUserVersion(db) { return db.pragma("user_version", { simple: true }); } __name(getUserVersion, "getUserVersion"); function getSQLCipherVersion(db) { return db.pragma("cipher_version", { simple: true }); } __name(getSQLCipherVersion, "getSQLCipherVersion"); function batchMultiVarQuery(db, values, query) { if (values.length > MAX_VARIABLE_COUNT) { const result2 = []; db.transaction(() => { for (let i = 0; i < values.length; i += MAX_VARIABLE_COUNT) { const batch = values.slice(i, i + MAX_VARIABLE_COUNT); const batchResult = query(batch, batch.length === MAX_VARIABLE_COUNT); if (Array.isArray(batchResult)) { result2.push(...batchResult); } } })(); return result2; } const result = query(values, values.length === MAX_VARIABLE_COUNT); return Array.isArray(result) ? result : []; } __name(batchMultiVarQuery, "batchMultiVarQuery"); function createOrUpdate(db, table, data) { const { id } = data; if (!id) { throw new Error("createOrUpdate: Provided data did not have a truthy id"); } db.prepare( ` INSERT OR REPLACE INTO ${table} ( id, json ) values ( $id, $json ) ` ).run({ id, json: objectToJSON(data) }); } __name(createOrUpdate, "createOrUpdate"); function bulkAdd(db, table, array) { db.transaction(() => { for (const data of array) { createOrUpdate(db, table, data); } })(); } __name(bulkAdd, "bulkAdd"); function getById(db, table, id) { const row = db.prepare( ` SELECT json FROM ${table} WHERE id = $id; ` ).get({ id }); if (!row) { return void 0; } return jsonToObject(row.json); } __name(getById, "getById"); function removeById(db, tableName, id) { const table = sqlConstant(tableName); if (!Array.isArray(id)) { const [query, params] = sql` DELETE FROM ${table} WHERE id = ${id}; `; return db.prepare(query).run(params).changes; } if (!id.length) { throw new Error("removeById: No ids to delete!"); } let totalChanges = 0; const removeByIdsSync = /* @__PURE__ */ __name((ids, persistent) => { const [query, params] = sql` DELETE FROM ${table} WHERE id IN (${sqlJoin(ids)}); `; totalChanges += db.prepare(query, { persistent }).run(params).changes; }, "removeByIdsSync"); batchMultiVarQuery(db, id, removeByIdsSync); return totalChanges; } __name(removeById, "removeById"); function removeAllFromTable(db, table) { return db.prepare(`DELETE FROM ${table};`).run().changes; } __name(removeAllFromTable, "removeAllFromTable"); function getAllFromTable(db, table) { const rows = db.prepare(`SELECT json FROM ${table};`).all(); return rows.map((row) => jsonToObject(row.json)); } __name(getAllFromTable, "getAllFromTable"); function getCountFromTable(db, table) { const result = db.prepare(`SELECT count(*) from ${table};`, { pluck: true }).get(); if (isNumber(result)) { return result; } throw new Error(`getCountFromTable: Unable to get count from table ${table}`); } __name(getCountFromTable, "getCountFromTable"); class TableIterator { constructor(db, table, pageSize = 500) { this.db = db; this.table = table; this.pageSize = pageSize; } static { __name(this, "TableIterator"); } *[Symbol.iterator]() { const fetchObject = this.db.prepare( ` SELECT json FROM ${this.table} WHERE id > $id ORDER BY id ASC LIMIT $pageSize; ` ); let complete = false; let id = ""; while (!complete) { const rows = fetchObject.all({ id, pageSize: this.pageSize }); const messages = rows.map( (row) => jsonToObject(row.json) ); yield* messages; const lastMessage = last(messages); if (lastMessage) { ({ id } = lastMessage); } complete = messages.length < this.pageSize; } } } function convertOptionalIntegerToBoolean(optionalInteger) { if (optionalInteger === 1) { return true; } if (optionalInteger === 0) { return false; } return void 0; } __name(convertOptionalIntegerToBoolean, "convertOptionalIntegerToBoolean"); function convertOptionalBooleanToInteger(optionalBoolean) { if (optionalBoolean === true) { return 1; } if (optionalBoolean === false) { return 0; } return void 0; } __name(convertOptionalBooleanToInteger, "convertOptionalBooleanToInteger"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { QueryFragment, TableIterator, batchMultiVarQuery, bulkAdd, convertOptionalBooleanToInteger, convertOptionalIntegerToBoolean, createOrUpdate, explainQueryPlan, getAllFromTable, getById, getCountFromTable, getSQLCipherVersion, getSQLiteVersion, getSchemaVersion, getUserVersion, jsonToObject, objectToJSON, removeAllFromTable, removeById, setUserVersion, sql, sqlConstant, sqlFragment, sqlId, sqlJoin }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var callingHelpers_std_exports = {}; __export(callingHelpers_std_exports, { MAX_CALL_PARTICIPANTS_FOR_DEFAULT_MUTE: () => MAX_CALL_PARTICIPANTS_FOR_DEFAULT_MUTE, getRingingCall: () => getRingingCall, isAnybodyElseInGroupCall: () => isAnybodyElseInGroupCall, isAnybodyInGroupCall: () => isAnybodyInGroupCall, isGroupCallActiveOnServer: () => isGroupCallActiveOnServer, isLonelyGroup: () => isLonelyGroup }); module.exports = __toCommonJS(callingHelpers_std_exports); var import_Calling_std = require("../../types/Calling.std.js"); var import_CallDisposition_std = require("../../types/CallDisposition.std.js"); const MAX_CALL_PARTICIPANTS_FOR_DEFAULT_MUTE = 8; const getRingingCall = /* @__PURE__ */ __name((callsByConversation, activeCallState, ourAci) => { const callList = Object.values(callsByConversation); const ringingDirect = callList.find((call) => { if (call.callMode !== import_CallDisposition_std.CallMode.Direct) { return false; } if (activeCallState?.state === "Active" && activeCallState.conversationId !== call.conversationId) { return false; } if (activeCallState?.state === "Active" && activeCallState?.outgoingRing && call.callState === import_Calling_std.CallState.Prering) { return true; } return call.callState === import_Calling_std.CallState.Ringing && call.callEndedReason == null; }); if (ringingDirect) { return ringingDirect; } return callList.find((call) => { if (call.callMode !== import_CallDisposition_std.CallMode.Group) { return false; } if (activeCallState?.state === "Active" && activeCallState.conversationId !== call.conversationId) { return false; } if (activeCallState?.state === "Active" && activeCallState.conversationId === call.conversationId && activeCallState.outgoingRing && isConnected(call.connectionState) && isJoined(call.joinState) && !hasRemoteParticipants(call.remoteParticipants)) { return true; } return call.ringerAci && call.ringerAci !== ourAci && !isConnected(call.connectionState) && !isJoined(call.joinState) && isAnybodyElseInGroupCall(call.peekInfo, ourAci); }); }, "getRingingCall"); const isAnybodyElseInGroupCall = /* @__PURE__ */ __name((peekInfo, ourAci) => Boolean(peekInfo?.acis.some((id) => id !== ourAci)), "isAnybodyElseInGroupCall"); const isAnybodyInGroupCall = /* @__PURE__ */ __name((peekInfo) => { if (!peekInfo?.acis) { return false; } return peekInfo.acis.length > 0; }, "isAnybodyInGroupCall"); const isGroupCallActiveOnServer = /* @__PURE__ */ __name((peekInfo) => { return Boolean(peekInfo?.eraId); }, "isGroupCallActiveOnServer"); function isLonelyGroup(conversation) { return (conversation.sortedGroupMembers?.length ?? 0) < 2; } __name(isLonelyGroup, "isLonelyGroup"); function isConnected(connectionState) { return connectionState === import_Calling_std.GroupCallConnectionState.Connecting || connectionState === import_Calling_std.GroupCallConnectionState.Connected; } __name(isConnected, "isConnected"); function isJoined(joinState) { return joinState !== import_Calling_std.GroupCallJoinState.NotJoined; } __name(isJoined, "isJoined"); function hasRemoteParticipants(remoteParticipants) { return remoteParticipants.length > 0; } __name(hasRemoteParticipants, "hasRemoteParticipants"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { MAX_CALL_PARTICIPANTS_FOR_DEFAULT_MUTE, getRingingCall, isAnybodyElseInGroupCall, isAnybodyInGroupCall, isGroupCallActiveOnServer, isLonelyGroup }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var conversationsEnums_std_exports = {}; __export(conversationsEnums_std_exports, { ComposerStep: () => ComposerStep, ConversationVerificationState: () => ConversationVerificationState, OneTimeModalState: () => OneTimeModalState, TargetedMessageSource: () => TargetedMessageSource }); module.exports = __toCommonJS(conversationsEnums_std_exports); var ComposerStep = /* @__PURE__ */ ((ComposerStep2) => { ComposerStep2["StartDirectConversation"] = "StartDirectConversation"; ComposerStep2["FindByUsername"] = "FindByUsername"; ComposerStep2["FindByPhoneNumber"] = "FindByPhoneNumber"; ComposerStep2["ChooseGroupMembers"] = "ChooseGroupMembers"; ComposerStep2["SetGroupMetadata"] = "SetGroupMetadata"; return ComposerStep2; })(ComposerStep || {}); var OneTimeModalState = /* @__PURE__ */ ((OneTimeModalState2) => { OneTimeModalState2[OneTimeModalState2["NeverShown"] = 0] = "NeverShown"; OneTimeModalState2[OneTimeModalState2["Showing"] = 1] = "Showing"; OneTimeModalState2[OneTimeModalState2["Shown"] = 2] = "Shown"; return OneTimeModalState2; })(OneTimeModalState || {}); var ConversationVerificationState = /* @__PURE__ */ ((ConversationVerificationState2) => { ConversationVerificationState2["PendingVerification"] = "PendingVerification"; ConversationVerificationState2["VerificationCanceled"] = "VerificationCanceled"; return ConversationVerificationState2; })(ConversationVerificationState || {}); var TargetedMessageSource = /* @__PURE__ */ ((TargetedMessageSource2) => { TargetedMessageSource2["Reset"] = "Reset"; TargetedMessageSource2["NavigateToMessage"] = "NavigateToMessage"; TargetedMessageSource2["Focus"] = "Focus"; return TargetedMessageSource2; })(TargetedMessageSource || {}); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { ComposerStep, ConversationVerificationState, OneTimeModalState, TargetedMessageSource }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var expiration_std_exports = {}; __export(expiration_std_exports, { actions: () => actions, getEmptyState: () => getEmptyState, reducer: () => reducer }); module.exports = __toCommonJS(expiration_std_exports); const HYDRATE_EXPIRATION_STATUS = "expiration/HYDRATE_EXPIRATION_STATUS"; function hydrateExpirationStatus(buildExpiration) { return { type: HYDRATE_EXPIRATION_STATUS, payload: { buildExpiration } }; } __name(hydrateExpirationStatus, "hydrateExpirationStatus"); const actions = { hydrateExpirationStatus }; function getEmptyState() { return { buildExpiration: 0 }; } __name(getEmptyState, "getEmptyState"); function reducer(state = getEmptyState(), action) { if (action.type === HYDRATE_EXPIRATION_STATUS) { return { buildExpiration: action.payload.buildExpiration }; } return state; } __name(reducer, "reducer"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { actions, getEmptyState, reducer }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var inbox_std_exports = {}; __export(inbox_std_exports, { actions: () => actions, getEmptyState: () => getEmptyState, reducer: () => reducer }); module.exports = __toCommonJS(inbox_std_exports); const SET_ENVELOPE_TIMESTAMP = "INBOX/SET_INBOX_ENVELOPE_TIMESTAMP"; const actions = { setInboxEnvelopeTimestamp }; function setInboxEnvelopeTimestamp(envelopeTimestamp) { return { type: SET_ENVELOPE_TIMESTAMP, payload: { envelopeTimestamp } }; } __name(setInboxEnvelopeTimestamp, "setInboxEnvelopeTimestamp"); function getEmptyState() { return { firstEnvelopeTimestamp: void 0, envelopeTimestamp: void 0 }; } __name(getEmptyState, "getEmptyState"); function reducer(state = getEmptyState(), action) { if (!state) { return getEmptyState(); } if (action.type === SET_ENVELOPE_TIMESTAMP) { const { payload } = action; const { envelopeTimestamp: providedTimestamp } = payload; let { envelopeTimestamp } = state; if (providedTimestamp !== void 0) { envelopeTimestamp = Math.max( providedTimestamp, envelopeTimestamp ?? providedTimestamp ); } const firstEnvelopeTimestamp = state.firstEnvelopeTimestamp ?? envelopeTimestamp; return { ...state, envelopeTimestamp, firstEnvelopeTimestamp }; } return state; } __name(reducer, "reducer"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { actions, getEmptyState, reducer }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var nav_std_exports = {}; __export(nav_std_exports, { CHANGE_LOCATION: () => CHANGE_LOCATION, actions: () => actions, changeLocation: () => changeLocation, getEmptyState: () => getEmptyState, popPanelForConversation: () => popPanelForConversation, reducer: () => reducer, useNavActions: () => useNavActions }); module.exports = __toCommonJS(nav_std_exports); var import_lodash = require("lodash"); var import_log_std = require("../../logging/log.std.js"); var import_useBoundActions_std = require("../../hooks/useBoundActions.std.js"); var import_BeforeNavigate_std = require("../../services/BeforeNavigate.std.js"); var import_Nav_std = require("../../types/Nav.std.js"); var import_nav_std = require("../selectors/nav.std.js"); const log = (0, import_log_std.createLogger)("nav"); function printLocation(location) { if (location.tab === import_Nav_std.NavTab.Settings) { if (location.details.page === import_Nav_std.SettingsPage.Profile) { return `${location.tab}/${location.details.page}/${location.details.state}`; } return `${location.tab}/${location.details.page}`; } return `${location.tab}`; } __name(printLocation, "printLocation"); function getDefaultPanels() { return { isAnimating: false, wasAnimated: false, direction: void 0, stack: [], watermark: -1 }; } __name(getDefaultPanels, "getDefaultPanels"); const CHANGE_LOCATION = "nav/CHANGE_LOCATION"; const PANEL_ANIMATION_DONE = "nav/PANEL_ANIMATION_DONE"; const PANEL_ANIMATION_STARTED = "nav/PANEL_ANIMATION_STARTED"; function changeLocation(newLocation) { return async (dispatch, getState) => { const existingLocation = getState().nav.selectedLocation; const logId = `changeLocation/${printLocation(newLocation)}`; const needToCancel = await import_BeforeNavigate_std.beforeNavigateService.shouldCancelNavigation({ context: logId, existingLocation, newLocation }); if (needToCancel) { log.info(`${logId}: Canceling navigation`); return; } dispatch({ type: CHANGE_LOCATION, payload: { selectedLocation: newLocation } }); }; } __name(changeLocation, "changeLocation"); function panelAnimationStarted() { return { type: PANEL_ANIMATION_STARTED, payload: null }; } __name(panelAnimationStarted, "panelAnimationStarted"); function panelAnimationDone() { return { type: PANEL_ANIMATION_DONE, payload: null }; } __name(panelAnimationDone, "panelAnimationDone"); function pushPanelForConversation(panel) { return async (dispatch, getState) => { const state = getState(); const existingLocation = (0, import_nav_std.getSelectedLocation)(state); const logId = `pushPanelForConversation/${panel.type}`; if (existingLocation.tab !== import_Nav_std.NavTab.Chats) { log.warn(`${logId}: Not on Chats tab; on ${existingLocation.tab} tab!`); return; } const activePanel = (0, import_nav_std.getActivePanel)(getState()); if (panel.type === activePanel?.type && (0, import_lodash.isEqual)(panel, activePanel)) { log.warn(`${logId}: Already on ${panel.type} panel!`); return; } const panels = (0, import_nav_std.getPanels)(state) || getDefaultPanels(); const currentStack = panels.stack; const watermark = Math.min(panels.watermark + 1, currentStack.length); const stack = [...currentStack.slice(0, watermark), panel]; const newPanels = { isAnimating: false, wasAnimated: false, direction: "push", stack, watermark }; const newLocation = { ...existingLocation, details: { ...existingLocation.details, panels: newPanels } }; const needToCancel = await import_BeforeNavigate_std.beforeNavigateService.shouldCancelNavigation({ context: logId, existingLocation, newLocation }); if (needToCancel) { log.info(`${logId}: Canceling navigation`); return; } dispatch({ type: CHANGE_LOCATION, payload: { selectedLocation: newLocation } }); }; } __name(pushPanelForConversation, "pushPanelForConversation"); function popPanelForConversation() { return async (dispatch, getState) => { const state = getState(); const panels = (0, import_nav_std.getPanels)(state); const existingLocation = (0, import_nav_std.getSelectedLocation)(state); const logId = `popPanelForConversation/length=${panels?.stack.length}`; if (existingLocation.tab !== import_Nav_std.NavTab.Chats) { log.warn(`${logId}: Not on Chats tab; on ${existingLocation.tab} tab!`); return; } if (!panels || panels.stack.length === 0) { log.warn(`${logId}: No panel to pop!`); return; } if (panels.watermark === -1) { log.warn(`${logId}: Watermark is already -1`); return; } const poppedPanel = panels.stack[panels.watermark]; if (!poppedPanel) { log.warn(`${logId}: No panel found at watermark=${panels.watermark}`); return; } const watermark = Math.max(panels.watermark - 1, -1); const newPanels = { isAnimating: false, wasAnimated: false, direction: "pop", stack: panels.stack, watermark }; const newLocation = { ...existingLocation, details: { ...existingLocation.details, panels: newPanels } }; const needToCancel = await import_BeforeNavigate_std.beforeNavigateService.shouldCancelNavigation({ context: logId, existingLocation, newLocation }); if (needToCancel) { log.info(`${logId}: Canceling navigation`); return; } dispatch({ type: CHANGE_LOCATION, payload: { selectedLocation: newLocation } }); }; } __name(popPanelForConversation, "popPanelForConversation"); const actions = { changeLocation, panelAnimationDone, panelAnimationStarted, popPanelForConversation, pushPanelForConversation }; const useNavActions = /* @__PURE__ */ __name(() => (0, import_useBoundActions_std.useBoundActions)(actions), "useNavActions"); function getEmptyState() { return { selectedLocation: { tab: import_Nav_std.NavTab.Chats, details: { conversationId: void 0 } } }; } __name(getEmptyState, "getEmptyState"); function reducer(state = getEmptyState(), action) { if (action.type === CHANGE_LOCATION) { let { selectedLocation } = action.payload; let { lastChatTabLocation } = state; if (selectedLocation.tab !== import_Nav_std.NavTab.Chats && state.selectedLocation.tab === import_Nav_std.NavTab.Chats) { lastChatTabLocation = state.selectedLocation; } if (selectedLocation.tab === import_Nav_std.NavTab.Chats && !selectedLocation.details.conversationId && state.selectedLocation.tab !== import_Nav_std.NavTab.Chats && state.lastChatTabLocation) { selectedLocation = state.lastChatTabLocation; } return { ...state, selectedLocation, lastChatTabLocation }; } if (action.type === PANEL_ANIMATION_STARTED) { if (state.selectedLocation.tab !== import_Nav_std.NavTab.Chats) { return state; } if (!state.selectedLocation.details.panels) { return state; } return { ...state, selectedLocation: { ...state.selectedLocation, details: { ...state.selectedLocation.details, panels: { ...state.selectedLocation.details.panels, isAnimating: true } } } }; } if (action.type === PANEL_ANIMATION_DONE) { if (state.selectedLocation.tab !== import_Nav_std.NavTab.Chats) { return state; } if (!state.selectedLocation.details.panels) { return state; } return { ...state, selectedLocation: { ...state.selectedLocation, details: { ...state.selectedLocation.details, panels: { ...state.selectedLocation.details.panels, isAnimating: false, wasAnimated: true, leafPanelOnly: false } } } }; } return state; } __name(reducer, "reducer"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { CHANGE_LOCATION, actions, changeLocation, getEmptyState, popPanelForConversation, reducer, useNavActions }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var noop_std_exports = {}; __export(noop_std_exports, { noopAction: () => noopAction }); module.exports = __toCommonJS(noop_std_exports); function noopAction() { return { type: "NOOP", payload: null }; } __name(noopAction, "noopAction"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { noopAction }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var usernameEnums_std_exports = {}; __export(usernameEnums_std_exports, { UsernameEditState: () => UsernameEditState, UsernameLinkState: () => UsernameLinkState, UsernameReservationError: () => UsernameReservationError, UsernameReservationState: () => UsernameReservationState }); module.exports = __toCommonJS(usernameEnums_std_exports); var UsernameEditState = /* @__PURE__ */ ((UsernameEditState2) => { UsernameEditState2["Editing"] = "Editing"; UsernameEditState2["ConfirmingDelete"] = "ConfirmingDelete"; UsernameEditState2["Deleting"] = "Deleting"; return UsernameEditState2; })(UsernameEditState || {}); var UsernameLinkState = /* @__PURE__ */ ((UsernameLinkState2) => { UsernameLinkState2["Ready"] = "Ready"; UsernameLinkState2["Updating"] = "Updating"; UsernameLinkState2["Error"] = "Error"; return UsernameLinkState2; })(UsernameLinkState || {}); var UsernameReservationState = /* @__PURE__ */ ((UsernameReservationState2) => { UsernameReservationState2["Open"] = "Open"; UsernameReservationState2["Reserving"] = "Reserving"; UsernameReservationState2["Confirming"] = "Confirming"; UsernameReservationState2["Closed"] = "Closed"; return UsernameReservationState2; })(UsernameReservationState || {}); var UsernameReservationError = /* @__PURE__ */ ((UsernameReservationError2) => { UsernameReservationError2["NotEnoughCharacters"] = "NotEnoughCharacters"; UsernameReservationError2["TooManyCharacters"] = "TooManyCharacters"; UsernameReservationError2["CheckStartingCharacter"] = "CheckStartingCharacter"; UsernameReservationError2["CheckCharacters"] = "CheckCharacters"; UsernameReservationError2["UsernameNotAvailable"] = "UsernameNotAvailable"; UsernameReservationError2["General"] = "General"; UsernameReservationError2["ConflictOrGone"] = "ConflictOrGone"; UsernameReservationError2["NotEnoughDiscriminator"] = "NotEnoughDiscriminator"; UsernameReservationError2["AllZeroDiscriminator"] = "AllZeroDiscriminator"; UsernameReservationError2["LeadingZeroDiscriminator"] = "LeadingZeroDiscriminator"; UsernameReservationError2["TooManyAttempts"] = "TooManyAttempts"; return UsernameReservationError2; })(UsernameReservationError || {}); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { UsernameEditState, UsernameLinkState, UsernameReservationError, UsernameReservationState }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var accounts_std_exports = {}; __export(accounts_std_exports, { getAccountSelector: () => getAccountSelector, getAccounts: () => getAccounts }); module.exports = __toCommonJS(accounts_std_exports); var import_reselect = require("reselect"); const getAccounts = /* @__PURE__ */ __name((state) => state.accounts, "getAccounts"); const getAccountSelector = (0, import_reselect.createSelector)( getAccounts, (accounts) => { return (identifier) => { if (!identifier) { return void 0; } return accounts.accounts[identifier] || void 0; }; } ); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getAccountSelector, getAccounts }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var app_std_exports = {}; __export(app_std_exports, { getApp: () => getApp, getAppView: () => getAppView, getHasInitialLoadCompleted: () => getHasInitialLoadCompleted }); module.exports = __toCommonJS(app_std_exports); var import_reselect = require("reselect"); const getApp = /* @__PURE__ */ __name((state) => state.app, "getApp"); const getHasInitialLoadCompleted = (0, import_reselect.createSelector)( getApp, ({ hasInitialLoadCompleted }) => hasInitialLoadCompleted ); const getAppView = (0, import_reselect.createSelector)(getApp, ({ appView }) => appView); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getApp, getAppView, getHasInitialLoadCompleted }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var audioRecorder_std_exports = {}; __export(audioRecorder_std_exports, { getAudioRecorder: () => getAudioRecorder, getErrorDialogAudioRecorderType: () => getErrorDialogAudioRecorderType, getRecordingState: () => getRecordingState }); module.exports = __toCommonJS(audioRecorder_std_exports); var import_reselect = require("reselect"); function getAudioRecorder(state) { return state.audioRecorder; } __name(getAudioRecorder, "getAudioRecorder"); const getErrorDialogAudioRecorderType = (0, import_reselect.createSelector)( getAudioRecorder, (audioRecorder) => { return audioRecorder.errorDialogAudioRecorderType; } ); const getRecordingState = (0, import_reselect.createSelector)( getAudioRecorder, (audioRecorder) => { return audioRecorder.recordingState; } ); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getAudioRecorder, getErrorDialogAudioRecorderType, getRecordingState }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var backups_std_exports = {}; __export(backups_std_exports, { getBackups: () => getBackups, getLocalBackupWorkflow: () => getLocalBackupWorkflow, getPlaintextWorkflow: () => getPlaintextWorkflow, shouldShowLocalBackupWorkflow: () => shouldShowLocalBackupWorkflow, shouldShowPlaintextWorkflow: () => shouldShowPlaintextWorkflow }); module.exports = __toCommonJS(backups_std_exports); var import_reselect = require("reselect"); const getBackups = /* @__PURE__ */ __name((state) => state.backups, "getBackups"); const shouldShowPlaintextWorkflow = (0, import_reselect.createSelector)( getBackups, (backups) => { const workflow = backups.workflow?.workflow; const isPlaintextExport = backups.workflow?.type === "plaintext-export"; if (!isPlaintextExport || !workflow) { return false; } return true; } ); const getPlaintextWorkflow = (0, import_reselect.createSelector)( getBackups, (backups) => { if (backups.workflow?.type !== "plaintext-export") { return void 0; } return backups.workflow.workflow; } ); const shouldShowLocalBackupWorkflow = (0, import_reselect.createSelector)( getBackups, (backups) => { return backups.workflow?.type === "local-backup"; } ); const getLocalBackupWorkflow = (0, import_reselect.createSelector)( getBackups, (backups) => { if (backups.workflow?.type !== "local-backup") { return void 0; } return backups.workflow.workflow; } ); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getBackups, getLocalBackupWorkflow, getPlaintextWorkflow, shouldShowLocalBackupWorkflow, shouldShowPlaintextWorkflow }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var callHistory_std_exports = {}; __export(callHistory_std_exports, { getCallHistoryEdition: () => getCallHistoryEdition, getCallHistoryLatestCall: () => getCallHistoryLatestCall, getCallHistorySelector: () => getCallHistorySelector, getCallHistoryUnreadCount: () => getCallHistoryUnreadCount }); module.exports = __toCommonJS(callHistory_std_exports); var import_reselect = require("reselect"); var import_CallDisposition_std = require("../../types/CallDisposition.std.js"); var import_getOwn_std = require("../../util/getOwn.std.js"); const getCallHistory = /* @__PURE__ */ __name((state) => state.callHistory, "getCallHistory"); const getCallHistoryEdition = (0, import_reselect.createSelector)( getCallHistory, (callHistory) => { return callHistory.edition; } ); const getCallHistorySelector = (0, import_reselect.createSelector)( getCallHistory, (callHistory) => { return (callId) => { return (0, import_getOwn_std.getOwn)(callHistory.callHistoryByCallId, callId); }; } ); const getCallHistoryUnreadCount = (0, import_reselect.createSelector)( getCallHistory, (callHistory) => { return callHistory.unreadCount; } ); const getCallHistoryLatestCall = (0, import_reselect.createSelector)( getCallHistory, (callHistory) => { let latestCall = null; for (const callId of Object.keys(callHistory.callHistoryByCallId)) { const call = callHistory.callHistoryByCallId[callId]; if (call.type === import_CallDisposition_std.CallType.Adhoc && call.status === import_CallDisposition_std.AdhocCallStatus.Pending) { continue; } if (latestCall == null || call.timestamp > latestCall.timestamp) { latestCall = call; } } return latestCall; } ); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getCallHistoryEdition, getCallHistoryLatestCall, getCallHistorySelector, getCallHistoryUnreadCount }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var calling_std_exports = {}; __export(calling_std_exports, { areAnyCallsActiveOrRinging: () => areAnyCallsActiveOrRinging, getActiveCall: () => getActiveCall, getActiveCallState: () => getActiveCallState, getAdhocCallSelector: () => getAdhocCallSelector, getAdhocCalls: () => getAdhocCalls, getAllCallLinks: () => getAllCallLinks, getAvailableCameras: () => getAvailableCameras, getAvailableMicrophones: () => getAvailableMicrophones, getAvailableSpeakers: () => getAvailableSpeakers, getCallLinkSelector: () => getCallLinkSelector, getCallLinksByRoomId: () => getCallLinksByRoomId, getCallSelector: () => getCallSelector, getCallsByConversation: () => getCallsByConversation, getHasAnyAdminCallLinks: () => getHasAnyAdminCallLinks, getPresentingSource: () => getPresentingSource, getRingingCall: () => getRingingCall, getSelectedCamera: () => getSelectedCamera, getSelectedMicrophone: () => getSelectedMicrophone, getSelectedSpeaker: () => getSelectedSpeaker, isInCall: () => isInCall, isInFullScreenCall: () => isInFullScreenCall }); module.exports = __toCommonJS(calling_std_exports); var import_reselect = require("reselect"); var import_callingHelpers_std = require("../ducks/callingHelpers.std.js"); var import_CallDisposition_std = require("../../types/CallDisposition.std.js"); var import_CallLink_std = require("../../types/CallLink.std.js"); var import_user_std = require("./user.std.js"); var import_getOwn_std = require("../../util/getOwn.std.js"); const getCalling = /* @__PURE__ */ __name((state) => state.calling, "getCalling"); const getAvailableMicrophones = (0, import_reselect.createSelector)( getCalling, ({ availableMicrophones }) => availableMicrophones ); const getSelectedMicrophone = (0, import_reselect.createSelector)( getCalling, ({ selectedMicrophone }) => selectedMicrophone ); const getAvailableSpeakers = (0, import_reselect.createSelector)( getCalling, ({ availableSpeakers }) => availableSpeakers ); const getSelectedSpeaker = (0, import_reselect.createSelector)( getCalling, ({ selectedSpeaker }) => selectedSpeaker ); const getAvailableCameras = (0, import_reselect.createSelector)( getCalling, ({ availableCameras }) => availableCameras ); const getSelectedCamera = (0, import_reselect.createSelector)( getCalling, ({ selectedCamera }) => selectedCamera ); const getActiveCallState = (0, import_reselect.createSelector)( getCalling, (state) => { if (state.activeCallState?.state !== "Active") { return void 0; } return state.activeCallState; } ); const getCallsByConversation = (0, import_reselect.createSelector)( getCalling, (state) => state.callsByConversation ); const getAdhocCalls = (0, import_reselect.createSelector)( getCalling, (state) => state.adhocCalls ); const getCallLinksByRoomId = (0, import_reselect.createSelector)( getCalling, (state) => state.callLinks ); const getCallLinkSelector = (0, import_reselect.createSelector)( getCallLinksByRoomId, (callLinksByRoomId) => (roomId) => (0, import_getOwn_std.getOwn)(callLinksByRoomId, roomId) ); const getAllCallLinks = (0, import_reselect.createSelector)( getCallLinksByRoomId, (lookup) => Object.values(lookup) ); const getHasAnyAdminCallLinks = (0, import_reselect.createSelector)( getAllCallLinks, (callLinks) => callLinks.some((callLink) => (0, import_CallLink_std.isCallLinkAdmin)(callLink)) ); const getCallSelector = (0, import_reselect.createSelector)( getCallsByConversation, (callsByConversation) => (conversationId) => (0, import_getOwn_std.getOwn)(callsByConversation, conversationId) ); const getAdhocCallSelector = (0, import_reselect.createSelector)( getAdhocCalls, (adhocCalls) => (roomId) => (0, import_getOwn_std.getOwn)(adhocCalls, roomId) ); const getActiveCall = (0, import_reselect.createSelector)( getActiveCallState, getCallSelector, getAdhocCallSelector, (activeCallState, callSelector, adhocCallSelector) => { const { callMode, conversationId } = activeCallState || {}; if (!conversationId) { return void 0; } return callMode === import_CallDisposition_std.CallMode.Adhoc ? adhocCallSelector(conversationId) : callSelector(conversationId); } ); const isInCall = (0, import_reselect.createSelector)( getActiveCall, (call) => Boolean(call) ); const isInFullScreenCall = (0, import_reselect.createSelector)( getActiveCallState, (activeCallState) => Boolean(activeCallState && !activeCallState.pip) ); const getRingingCall = (0, import_reselect.createSelector)( getCallsByConversation, getActiveCallState, import_user_std.getUserACI, (callsByConversation, activeCallState, ourAci) => { if (!ourAci) { return void 0; } return (0, import_callingHelpers_std.getRingingCall)(callsByConversation, activeCallState, ourAci); } ); const areAnyCallsActiveOrRinging = (0, import_reselect.createSelector)( getActiveCall, getRingingCall, (activeCall, ringingCall) => Boolean(activeCall || ringingCall) ); const getPresentingSource = (0, import_reselect.createSelector)( getActiveCallState, (activeCallState) => activeCallState?.presentingSource ); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { areAnyCallsActiveOrRinging, getActiveCall, getActiveCallState, getAdhocCallSelector, getAdhocCalls, getAllCallLinks, getAvailableCameras, getAvailableMicrophones, getAvailableSpeakers, getCallLinkSelector, getCallLinksByRoomId, getCallSelector, getCallsByConversation, getHasAnyAdminCallLinks, getPresentingSource, getRingingCall, getSelectedCamera, getSelectedMicrophone, getSelectedSpeaker, isInCall, isInFullScreenCall }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var chatFolders_std_exports = {}; __export(chatFolders_std_exports, { getChatFoldersState: () => getChatFoldersState, getCurrentChatFolders: () => getCurrentChatFolders, getCurrentChatFoldersCount: () => getCurrentChatFoldersCount, getHasAnyCurrentCustomChatFolders: () => getHasAnyCurrentCustomChatFolders, getSelectedChatFolder: () => getSelectedChatFolder, getStableSelectedConversationIdInChatFolder: () => getStableSelectedConversationIdInChatFolder }); module.exports = __toCommonJS(chatFolders_std_exports); var import_reselect = require("reselect"); var import_CurrentChatFolders_std = require("../../types/CurrentChatFolders.std.js"); function getChatFoldersState(state) { return state.chatFolders; } __name(getChatFoldersState, "getChatFoldersState"); const getCurrentChatFolders = (0, import_reselect.createSelector)(getChatFoldersState, (state) => { return state.currentChatFolders; }); const getCurrentChatFoldersCount = (0, import_reselect.createSelector)( getCurrentChatFolders, (currentChatFolders) => { return import_CurrentChatFolders_std.CurrentChatFolders.size(currentChatFolders); } ); const getHasAnyCurrentCustomChatFolders = (0, import_reselect.createSelector)(getCurrentChatFolders, (currentChatFolders) => { return currentChatFolders.hasAnyCurrentCustomChatFolders; }); const getSelectedChatFolder = (0, import_reselect.createSelector)( getChatFoldersState, getCurrentChatFolders, (state, currentChatFolders) => { const { selectedChatFolderId } = state; if (selectedChatFolderId == null) { return null; } return import_CurrentChatFolders_std.CurrentChatFolders.expect( currentChatFolders, selectedChatFolderId, "getSelectedChatFolder" ); } ); const getStableSelectedConversationIdInChatFolder = (0, import_reselect.createSelector)(getChatFoldersState, (state) => { return state.stableSelectedConversationIdInChatFolder; }); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getChatFoldersState, getCurrentChatFolders, getCurrentChatFoldersCount, getHasAnyCurrentCustomChatFolders, getSelectedChatFolder, getStableSelectedConversationIdInChatFolder }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var crashReports_std_exports = {}; __export(crashReports_std_exports, { getCrashReportCount: () => getCrashReportCount, getCrashReportsIsPending: () => getCrashReportsIsPending }); module.exports = __toCommonJS(crashReports_std_exports); var import_reselect = require("reselect"); const getCrashReports = /* @__PURE__ */ __name((state) => state.crashReports, "getCrashReports"); const getCrashReportsIsPending = (0, import_reselect.createSelector)( getCrashReports, ({ isPending }) => isPending ); const getCrashReportCount = (0, import_reselect.createSelector)( getCrashReports, ({ count }) => count ); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getCrashReportCount, getCrashReportsIsPending }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var donations_std_exports = {}; __export(donations_std_exports, { getDonationConfigCache: () => getDonationConfigCache, getDonationsState: () => getDonationsState }); module.exports = __toCommonJS(donations_std_exports); var import_reselect = require("reselect"); const getDonationsState = /* @__PURE__ */ __name((state) => state.donations, "getDonationsState"); const getDonationConfigCache = (0, import_reselect.createSelector)( getDonationsState, ({ configCache }) => configCache ); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getDonationConfigCache, getDonationsState }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var emojis_std_exports = {}; __export(emojis_std_exports, { selectRecentEmojis: () => selectRecentEmojis, useRecentEmojis: () => useRecentEmojis }); module.exports = __toCommonJS(emojis_std_exports); var import_reselect = require("reselect"); var import_react_redux = require("react-redux"); var import_emojis_std = require("../../components/fun/data/emojis.std.js"); const selectRecentEmojis = (0, import_reselect.createSelector)( ({ emojis }) => emojis.recents, (recents) => recents.filter(import_emojis_std.isEmojiEnglishShortName) ); const useRecentEmojis = /* @__PURE__ */ __name(() => (0, import_react_redux.useSelector)(selectRecentEmojis), "useRecentEmojis"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { selectRecentEmojis, useRecentEmojis }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var gifs_std_exports = {}; __export(gifs_std_exports, { getRecentGifs: () => getRecentGifs, selectGifs: () => selectGifs }); module.exports = __toCommonJS(gifs_std_exports); var import_reselect = require("reselect"); const selectGifs = /* @__PURE__ */ __name((state) => state.gifs, "selectGifs"); const getRecentGifs = (0, import_reselect.createSelector)(selectGifs, (gifs) => { return gifs.recentGifs; }); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getRecentGifs, selectGifs }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var globalModals_std_exports = {}; __export(globalModals_std_exports, { getAboutContactModalState: () => getAboutContactModalState, getCallLinkAddNameModalRoomId: () => getCallLinkAddNameModalRoomId, getCallLinkEditModalRoomId: () => getCallLinkEditModalRoomId, getCallLinkPendingParticipantContactId: () => getCallLinkPendingParticipantContactId, getCallQualitySurveyProps: () => getCallQualitySurveyProps, getConfirmLeaveCallModalState: () => getConfirmLeaveCallModalState, getContactModalState: () => getContactModalState, getDeleteMessagesProps: () => getDeleteMessagesProps, getDraftGifMessageSendModalProps: () => getDraftGifMessageSendModalProps, getEditHistoryMessages: () => getEditHistoryMessages, getEditNicknameAndNoteModalProps: () => getEditNicknameAndNoteModalProps, getForwardMessagesProps: () => getForwardMessagesProps, getGlobalModalsState: () => getGlobalModalsState, getGroupMemberLabelInfoModalState: () => getGroupMemberLabelInfoModalState, getIsStoriesSettingsVisible: () => getIsStoriesSettingsVisible, getNotePreviewModalProps: () => getNotePreviewModalProps, getPinMessageDialogData: () => getPinMessageDialogData, getSafetyNumberChangedBlockingData: () => getSafetyNumberChangedBlockingData, isShowingAnyModal: () => isShowingAnyModal }); module.exports = __toCommonJS(globalModals_std_exports); var import_reselect = require("reselect"); var import_globalModals_std = require("../../types/globalModals.std.js"); const getGlobalModalsState = /* @__PURE__ */ __name((state) => state.globalModals, "getGlobalModalsState"); const isShowingAnyModal = (0, import_reselect.createSelector)( getGlobalModalsState, (globalModalsState) => Object.entries(globalModalsState).some(([key, value]) => { if (key === "usernameOnboardingState") { return value === import_globalModals_std.UsernameOnboardingState.Open; } return Boolean(value); }) ); const getCallLinkEditModalRoomId = (0, import_reselect.createSelector)( getGlobalModalsState, ({ callLinkEditModalRoomId }) => callLinkEditModalRoomId ); const getCallQualitySurveyProps = (0, import_reselect.createSelector)( getGlobalModalsState, ({ callQualitySurveyProps }) => callQualitySurveyProps ); const getCallLinkAddNameModalRoomId = (0, import_reselect.createSelector)( getGlobalModalsState, ({ callLinkAddNameModalRoomId }) => callLinkAddNameModalRoomId ); const getCallLinkPendingParticipantContactId = (0, import_reselect.createSelector)( getGlobalModalsState, ({ callLinkPendingParticipantContactId }) => callLinkPendingParticipantContactId ); const getConfirmLeaveCallModalState = (0, import_reselect.createSelector)( getGlobalModalsState, ({ confirmLeaveCallModalState }) => confirmLeaveCallModalState ); const getAboutContactModalState = (0, import_reselect.createSelector)( getGlobalModalsState, ({ aboutContactModalState }) => aboutContactModalState ); const getGroupMemberLabelInfoModalState = (0, import_reselect.createSelector)( getGlobalModalsState, ({ groupMemberLabelInfoModalState }) => groupMemberLabelInfoModalState ); const getContactModalState = (0, import_reselect.createSelector)( getGlobalModalsState, ({ contactModalState }) => contactModalState ); const getIsStoriesSettingsVisible = (0, import_reselect.createSelector)( getGlobalModalsState, ({ isStoriesSettingsVisible }) => isStoriesSettingsVisible ); const getSafetyNumberChangedBlockingData = (0, import_reselect.createSelector)( getGlobalModalsState, ({ safetyNumberChangedBlockingData }) => safetyNumberChangedBlockingData ); const getDeleteMessagesProps = (0, import_reselect.createSelector)( getGlobalModalsState, ({ deleteMessagesProps }) => deleteMessagesProps ); const getDraftGifMessageSendModalProps = (0, import_reselect.createSelector)( getGlobalModalsState, ({ draftGifMessageSendModalProps }) => draftGifMessageSendModalProps ); const getEditHistoryMessages = (0, import_reselect.createSelector)( getGlobalModalsState, ({ editHistoryMessages }) => editHistoryMessages ); const getForwardMessagesProps = (0, import_reselect.createSelector)( getGlobalModalsState, ({ forwardMessagesProps }) => forwardMessagesProps ); const getEditNicknameAndNoteModalProps = (0, import_reselect.createSelector)( getGlobalModalsState, ({ editNicknameAndNoteModalProps }) => editNicknameAndNoteModalProps ); const getNotePreviewModalProps = (0, import_reselect.createSelector)( getGlobalModalsState, ({ notePreviewModalProps }) => notePreviewModalProps ); const getPinMessageDialogData = (0, import_reselect.createSelector)( getGlobalModalsState, ({ pinMessageDialogData }) => pinMessageDialogData ); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getAboutContactModalState, getCallLinkAddNameModalRoomId, getCallLinkEditModalRoomId, getCallLinkPendingParticipantContactId, getCallQualitySurveyProps, getConfirmLeaveCallModalState, getContactModalState, getDeleteMessagesProps, getDraftGifMessageSendModalProps, getEditHistoryMessages, getEditNicknameAndNoteModalProps, getForwardMessagesProps, getGlobalModalsState, getGroupMemberLabelInfoModalState, getIsStoriesSettingsVisible, getNotePreviewModalProps, getPinMessageDialogData, getSafetyNumberChangedBlockingData, isShowingAnyModal }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var inbox_std_exports = {}; __export(inbox_std_exports, { getInboxEnvelopeTimestamp: () => getInboxEnvelopeTimestamp, getInboxFirstEnvelopeTimestamp: () => getInboxFirstEnvelopeTimestamp }); module.exports = __toCommonJS(inbox_std_exports); var import_reselect = require("reselect"); const getInboxState = /* @__PURE__ */ __name((state) => state.inbox, "getInboxState"); const getInboxEnvelopeTimestamp = (0, import_reselect.createSelector)( getInboxState, ({ envelopeTimestamp }) => envelopeTimestamp ); const getInboxFirstEnvelopeTimestamp = (0, import_reselect.createSelector)( getInboxState, ({ firstEnvelopeTimestamp }) => firstEnvelopeTimestamp ); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getInboxEnvelopeTimestamp, getInboxFirstEnvelopeTimestamp }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var installer_std_exports = {}; __export(installer_std_exports, { getInstallerState: () => getInstallerState }); module.exports = __toCommonJS(installer_std_exports); const getInstallerState = /* @__PURE__ */ __name((state) => state.installer, "getInstallerState"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getInstallerState }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var lightbox_std_exports = {}; __export(lightbox_std_exports, { getHasNextMessage: () => getHasNextMessage, getHasPrevMessage: () => getHasPrevMessage, getIsViewOnce: () => getIsViewOnce, getLightboxState: () => getLightboxState, getMedia: () => getMedia, getPlaybackDisabled: () => getPlaybackDisabled, getSelectedIndex: () => getSelectedIndex, shouldShowLightbox: () => shouldShowLightbox }); module.exports = __toCommonJS(lightbox_std_exports); var import_reselect = require("reselect"); const getLightboxState = /* @__PURE__ */ __name((state) => state.lightbox, "getLightboxState"); const shouldShowLightbox = (0, import_reselect.createSelector)( getLightboxState, ({ isShowingLightbox }) => isShowingLightbox ); const getIsViewOnce = (0, import_reselect.createSelector)( getLightboxState, (state) => state.isShowingLightbox ? state.isViewOnce : false ); const getSelectedIndex = (0, import_reselect.createSelector)( getLightboxState, (state) => { if (!state.isShowingLightbox) { return 0; } return state.selectedIndex ?? 0; } ); const getMedia = (0, import_reselect.createSelector)( getLightboxState, (state) => state.isShowingLightbox ? state.media : [] ); const getHasPrevMessage = (0, import_reselect.createSelector)( getLightboxState, (state) => state.isShowingLightbox && state.hasPrevMessage ); const getHasNextMessage = (0, import_reselect.createSelector)( getLightboxState, (state) => state.isShowingLightbox && state.hasNextMessage ); const getPlaybackDisabled = (0, import_reselect.createSelector)( getLightboxState, (state) => state.isShowingLightbox && state.playbackDisabled ); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getHasNextMessage, getHasPrevMessage, getIsViewOnce, getLightboxState, getMedia, getPlaybackDisabled, getSelectedIndex, shouldShowLightbox }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var linkPreviews_std_exports = {}; __export(linkPreviews_std_exports, { getLinkPreview: () => getLinkPreview }); module.exports = __toCommonJS(linkPreviews_std_exports); var import_reselect = require("reselect"); const getLinkPreview = (0, import_reselect.createSelector)( ({ linkPreviews }) => linkPreviews, ({ linkPreview, source }) => { return (fromSource) => { if (!linkPreview) { return; } if (source !== fromSource) { return; } return linkPreview; }; } ); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getLinkPreview }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var mediaGallery_std_exports = {}; __export(mediaGallery_std_exports, { getMediaGalleryState: () => getMediaGalleryState }); module.exports = __toCommonJS(mediaGallery_std_exports); const getMediaGalleryState = /* @__PURE__ */ __name((state) => state.mediaGallery, "getMediaGalleryState"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getMediaGalleryState }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var nav_std_exports = {}; __export(nav_std_exports, { getActivePanel: () => getActivePanel, getHasPanelOpen: () => getHasPanelOpen, getIsPanelAnimating: () => getIsPanelAnimating, getPanelInformation: () => getPanelInformation, getPanels: () => getPanels, getSelectedConversationId: () => getSelectedConversationId, getSelectedLocation: () => getSelectedLocation, getSelectedNavTab: () => getSelectedNavTab, getWasPanelAnimated: () => getWasPanelAnimated }); module.exports = __toCommonJS(nav_std_exports); var import_reselect = require("reselect"); var import_Nav_std = require("../../types/Nav.std.js"); function getNav(state) { return state.nav; } __name(getNav, "getNav"); const getSelectedNavTab = (0, import_reselect.createSelector)(getNav, (nav) => { return nav.selectedLocation.tab; }); const getSelectedLocation = (0, import_reselect.createSelector)(getNav, (nav) => { return nav.selectedLocation; }); const getSelectedConversationId = (0, import_reselect.createSelector)( getSelectedLocation, (selectedLocation) => { if (selectedLocation.tab !== import_Nav_std.NavTab.Chats) { return; } return selectedLocation.details.conversationId; } ); const getPanels = (0, import_reselect.createSelector)( getSelectedLocation, (selectedLocation) => { if (selectedLocation.tab !== import_Nav_std.NavTab.Chats) { return; } return selectedLocation.details.panels; } ); const getHasPanelOpen = (0, import_reselect.createSelector)(getPanels, (panels) => { return Boolean(panels && panels.watermark > 0); }); const getActivePanel = (0, import_reselect.createSelector)( getPanels, (panels) => { if (!panels) { return void 0; } return panels.stack[panels.watermark]; } ); const getPanelInformation = (0, import_reselect.createSelector)( getPanels, getActivePanel, (panels, currPanel) => { if (!panels) { return; } const { direction, watermark, leafPanelOnly } = panels; if (!direction) { return; } const watermarkDirection = direction === "push" ? watermark - 1 : watermark + 1; const prevPanel = panels.stack[watermarkDirection]; return { currPanel, direction, prevPanel, leafPanelOnly }; } ); const getIsPanelAnimating = (0, import_reselect.createSelector)( getPanels, (panels) => { return Boolean(panels?.isAnimating); } ); const getWasPanelAnimated = (0, import_reselect.createSelector)( getPanels, (panels) => { return Boolean(panels?.wasAnimated); } ); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getActivePanel, getHasPanelOpen, getIsPanelAnimating, getPanelInformation, getPanels, getSelectedConversationId, getSelectedLocation, getSelectedNavTab, getWasPanelAnimated }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var preferredReactions_std_exports = {}; __export(preferredReactions_std_exports, { getCustomizeModalState: () => getCustomizeModalState, getIsCustomizingPreferredReactions: () => getIsCustomizingPreferredReactions }); module.exports = __toCommonJS(preferredReactions_std_exports); var import_reselect = require("reselect"); const getPreferredReactionsState = /* @__PURE__ */ __name((state) => state.preferredReactions, "getPreferredReactionsState"); const getCustomizeModalState = (0, import_reselect.createSelector)( getPreferredReactionsState, (state) => state.customizePreferredReactionsModal ); const getIsCustomizingPreferredReactions = (0, import_reselect.createSelector)( getCustomizeModalState, (customizeModal) => Boolean(customizeModal) ); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getCustomizeModalState, getIsCustomizingPreferredReactions }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var safetyNumber_std_exports = {}; __export(safetyNumber_std_exports, { getContactSafetyNumber: () => getContactSafetyNumber, getContactSafetyNumberSelector: () => getContactSafetyNumberSelector }); module.exports = __toCommonJS(safetyNumber_std_exports); var import_reselect = require("reselect"); const getSafetyNumber = /* @__PURE__ */ __name((state) => state.safetyNumber, "getSafetyNumber"); const getContactID = /* @__PURE__ */ __name((_, props) => props.contactID, "getContactID"); const getContactSafetyNumber = (0, import_reselect.createSelector)( [getSafetyNumber, getContactID], ({ contacts }, contactID) => contacts[contactID] ); const getContactSafetyNumberSelector = (0, import_reselect.createSelector)( [getSafetyNumber], ({ contacts }) => { return (contactId) => { return contacts[contactId]; }; } ); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getContactSafetyNumber, getContactSafetyNumberSelector }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var stickers_std_exports = {}; __export(stickers_std_exports, { getBlessedPacks: () => getBlessedPacks, getBlessedStickerPacks: () => getBlessedStickerPacks, getInstalledStickerPacks: () => getInstalledStickerPacks, getKnownStickerPacks: () => getKnownStickerPacks, getPacks: () => getPacks, getReceivedStickerPacks: () => getReceivedStickerPacks, getRecentStickers: () => getRecentStickers, getRecentlyInstalledStickerPack: () => getRecentlyInstalledStickerPack, translatePackFromDB: () => translatePackFromDB }); module.exports = __toCommonJS(stickers_std_exports); var import_lodash = __toESM(require("lodash")); var import_reselect = require("reselect"); var import_getLocalAttachmentUrl_std = require("../../util/getLocalAttachmentUrl.std.js"); const { compact, filter, map, orderBy, reject, sortBy, values } = import_lodash.default; const getSticker = /* @__PURE__ */ __name((packs, packId, stickerId) => { const pack = packs[packId]; if (!pack) { return void 0; } const sticker = pack.stickers[stickerId]; if (!sticker) { return void 0; } const isEphemeral = pack.status === "ephemeral"; return translateStickerFromDB(sticker, isEphemeral); }, "getSticker"); const translateStickerFromDB = /* @__PURE__ */ __name((sticker, isEphemeral) => { const { id, packId, emoji } = sticker; return { id, packId, emoji, url: (0, import_getLocalAttachmentUrl_std.getLocalAttachmentUrl)(sticker, { disposition: isEphemeral ? import_getLocalAttachmentUrl_std.AttachmentDisposition.Temporary : import_getLocalAttachmentUrl_std.AttachmentDisposition.Sticker }) }; }, "translateStickerFromDB"); const translatePackFromDB = /* @__PURE__ */ __name((pack, packs, blessedPacks) => { const { id, stickers, status, coverStickerId } = pack; const isEphemeral = status === "ephemeral"; const filteredStickers = reject( values(stickers), (sticker) => sticker.isCoverOnly ); const translatedStickers = map( filteredStickers, (sticker) => translateStickerFromDB(sticker, isEphemeral) ); return { ...pack, isBlessed: Boolean(blessedPacks[id]), cover: getSticker(packs, id, coverStickerId), stickers: sortBy(translatedStickers, (sticker) => sticker.id) }; }, "translatePackFromDB"); const filterAndTransformPacks = /* @__PURE__ */ __name((packs, packFilter, packSort, blessedPacks) => { const list = filter(packs, packFilter); const sorted = orderBy(list, packSort, ["desc"]); return sorted.map((pack) => translatePackFromDB(pack, packs, blessedPacks)); }, "filterAndTransformPacks"); const getStickers = /* @__PURE__ */ __name((state) => state.stickers, "getStickers"); const getPacks = (0, import_reselect.createSelector)( getStickers, (stickers) => stickers.packs ); const getRecents = (0, import_reselect.createSelector)( getStickers, (stickers) => stickers.recentStickers ); const getBlessedPacks = (0, import_reselect.createSelector)( getStickers, (stickers) => stickers.blessedPacks ); const getRecentStickers = (0, import_reselect.createSelector)( getRecents, getPacks, (recents, packs) => { return compact( recents.map(({ packId, stickerId }) => { return getSticker(packs, packId, stickerId); }) ); } ); const getInstalledStickerPacks = (0, import_reselect.createSelector)( getPacks, getBlessedPacks, (packs, blessedPacks) => { return filterAndTransformPacks( packs, (pack) => pack.status === "installed", (pack) => pack.installedAt, blessedPacks ); } ); const getRecentlyInstalledStickerPack = (0, import_reselect.createSelector)( getInstalledStickerPacks, getStickers, (packs, { installedPack: packId }) => { if (!packId) { return null; } return packs.find(({ id }) => id === packId) || null; } ); const getReceivedStickerPacks = (0, import_reselect.createSelector)( getPacks, getBlessedPacks, (packs, blessedPacks) => { return filterAndTransformPacks( packs, (pack) => (pack.status === "downloaded" || pack.status === "pending") && !blessedPacks[pack.id], (pack) => pack.createdAt, blessedPacks ); } ); const getBlessedStickerPacks = (0, import_reselect.createSelector)( getPacks, getBlessedPacks, (packs, blessedPacks) => { return filterAndTransformPacks( packs, (pack) => blessedPacks[pack.id] && pack.status !== "installed", (pack) => pack.createdAt, blessedPacks ); } ); const getKnownStickerPacks = (0, import_reselect.createSelector)( getPacks, getBlessedPacks, (packs, blessedPacks) => { return filterAndTransformPacks( packs, (pack) => !blessedPacks[pack.id] && pack.status === "known", (pack) => pack.createdAt, blessedPacks ); } ); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getBlessedPacks, getBlessedStickerPacks, getInstalledStickerPacks, getKnownStickerPacks, getPacks, getReceivedStickerPacks, getRecentStickers, getRecentlyInstalledStickerPack, translatePackFromDB }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var toast_std_exports = {}; __export(toast_std_exports, { getToast: () => getToast, getToastState: () => getToastState }); module.exports = __toCommonJS(toast_std_exports); var import_reselect = require("reselect"); function getToastState(state) { return state.toast; } __name(getToastState, "getToastState"); const getToast = (0, import_reselect.createSelector)(getToastState, ({ toast }) => toast); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getToast, getToastState }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var updates_std_exports = {}; __export(updates_std_exports, { getHasPendingUpdate: () => getHasPendingUpdate, getUpdateDialogType: () => getUpdateDialogType, getUpdateDownloadSize: () => getUpdateDownloadSize, getUpdateDownloadedSize: () => getUpdateDownloadedSize, getUpdateVersion: () => getUpdateVersion, getUpdatesState: () => getUpdatesState, isOSUnsupported: () => isOSUnsupported, isUpdateDialogVisible: () => isUpdateDialogVisible, isUpdateDownloaded: () => isUpdateDownloaded }); module.exports = __toCommonJS(updates_std_exports); var import_reselect = require("reselect"); var import_Dialogs_std = require("../../types/Dialogs.std.js"); const getUpdatesState = /* @__PURE__ */ __name((state) => state.updates, "getUpdatesState"); const getUpdateDialogType = (0, import_reselect.createSelector)( getUpdatesState, ({ dialogType }) => dialogType ); const getUpdateVersion = (0, import_reselect.createSelector)( getUpdatesState, ({ version }) => version ); const getUpdateDownloadSize = (0, import_reselect.createSelector)( getUpdatesState, ({ downloadSize }) => downloadSize ); const getUpdateDownloadedSize = (0, import_reselect.createSelector)( getUpdatesState, ({ downloadedSize }) => downloadedSize ); const isUpdateDialogVisible = (0, import_reselect.createSelector)( getUpdatesState, ({ dialogType, didSnooze }) => { if (dialogType === import_Dialogs_std.DialogType.None) { return false; } if (dialogType === import_Dialogs_std.DialogType.UnsupportedOS) { return false; } if (didSnooze) { return false; } return true; } ); const isUpdateDownloaded = (0, import_reselect.createSelector)( getUpdatesState, ({ dialogType }) => dialogType === import_Dialogs_std.DialogType.AutoUpdate || dialogType === import_Dialogs_std.DialogType.DownloadedUpdate ); const isOSUnsupported = (0, import_reselect.createSelector)( getUpdatesState, ({ dialogType }) => dialogType === import_Dialogs_std.DialogType.UnsupportedOS ); const getHasPendingUpdate = (0, import_reselect.createSelector)( getUpdatesState, ({ didSnooze }) => didSnooze === true ); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getHasPendingUpdate, getUpdateDialogType, getUpdateDownloadSize, getUpdateDownloadedSize, getUpdateVersion, getUpdatesState, isOSUnsupported, isUpdateDialogVisible, isUpdateDownloaded }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var user_std_exports = {}; __export(user_std_exports, { getAttachmentsPath: () => getAttachmentsPath, getInteractionMode: () => getInteractionMode, getIntl: () => getIntl, getIsBeta: () => getIsBeta, getIsMacOS: () => getIsMacOS, getIsMainWindowFullScreen: () => getIsMainWindowFullScreen, getIsMainWindowMaximized: () => getIsMainWindowMaximized, getIsNightly: () => getIsNightly, getLocaleMessages: () => getLocaleMessages, getMenuOptions: () => getMenuOptions, getPlatform: () => getPlatform, getPreferredTheme: () => getPreferredTheme, getRegionCode: () => getRegionCode, getStickersPath: () => getStickersPath, getTempPath: () => getTempPath, getTheme: () => getTheme, getUser: () => getUser, getUserACI: () => getUserACI, getUserConversationId: () => getUserConversationId, getUserDeviceId: () => getUserDeviceId, getUserNumber: () => getUserNumber, getUserPNI: () => getUserPNI, getVersion: () => getVersion }); module.exports = __toCommonJS(user_std_exports); var import_reselect = require("reselect"); var import_Util_std = require("../../types/Util.std.js"); var import_version_std = require("../../util/version.std.js"); const getUser = /* @__PURE__ */ __name((state) => state.user, "getUser"); const getUserNumber = (0, import_reselect.createSelector)( getUser, (state) => state.ourNumber ); const getUserDeviceId = (0, import_reselect.createSelector)( getUser, (state) => state.ourDeviceId ); const getRegionCode = (0, import_reselect.createSelector)( getUser, (state) => state.regionCode ); const getUserConversationId = (0, import_reselect.createSelector)( getUser, (state) => state.ourConversationId ); const getUserACI = (0, import_reselect.createSelector)( getUser, (state) => state.ourAci ); const getUserPNI = (0, import_reselect.createSelector)( getUser, (state) => state.ourPni ); const getIntl = (0, import_reselect.createSelector)( getUser, (state) => state.i18n ); const getLocaleMessages = (0, import_reselect.createSelector)( getUser, (state) => state.localeMessages ); const getInteractionMode = (0, import_reselect.createSelector)( getUser, (state) => state.interactionMode ); const getAttachmentsPath = (0, import_reselect.createSelector)( getUser, (state) => state.attachmentsPath ); const getStickersPath = (0, import_reselect.createSelector)( getUser, (state) => state.stickersPath ); const getPlatform = (0, import_reselect.createSelector)( getUser, (state) => state.platform ); const getTempPath = (0, import_reselect.createSelector)( getUser, (state) => state.tempPath ); const getPreferredTheme = (0, import_reselect.createSelector)( getUser, (state) => state.theme ); const getIsInFullScreenCall = (0, import_reselect.createSelector)( (state) => state.calling, (state) => Boolean( state.activeCallState?.state === "Active" && !state.activeCallState.pip ) ); const getTheme = (0, import_reselect.createSelector)( getPreferredTheme, getIsInFullScreenCall, (theme, isInCall) => { return isInCall ? import_Util_std.ThemeType.dark : theme; } ); const getVersion = (0, import_reselect.createSelector)( getUser, (state) => state.version ); const getIsNightly = (0, import_reselect.createSelector)(getVersion, import_version_std.isNightly); const getIsBeta = (0, import_reselect.createSelector)(getVersion, import_version_std.isBeta); const getIsMainWindowMaximized = (0, import_reselect.createSelector)( getUser, (state) => state.isMainWindowMaximized ); const getIsMainWindowFullScreen = (0, import_reselect.createSelector)( getUser, (state) => state.isMainWindowFullScreen ); const getMenuOptions = (0, import_reselect.createSelector)( getUser, (state) => state.menuOptions ); const getIsMacOS = (0, import_reselect.createSelector)( getPlatform, (platform) => platform === "darwin" ); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getAttachmentsPath, getInteractionMode, getIntl, getIsBeta, getIsMacOS, getIsMainWindowFullScreen, getIsMainWindowMaximized, getIsNightly, getLocaleMessages, getMenuOptions, getPlatform, getPreferredTheme, getRegionCode, getStickersPath, getTempPath, getTheme, getUser, getUserACI, getUserConversationId, getUserDeviceId, getUserNumber, getUserPNI, getVersion }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var username_std_exports = {}; __export(username_std_exports, { getRecoveredUsername: () => getRecoveredUsername, getUsernameEditState: () => getUsernameEditState, getUsernameLinkState: () => getUsernameLinkState, getUsernameReservation: () => getUsernameReservation, getUsernameReservationError: () => getUsernameReservationError, getUsernameReservationObject: () => getUsernameReservationObject, getUsernameReservationState: () => getUsernameReservationState, getUsernameState: () => getUsernameState }); module.exports = __toCommonJS(username_std_exports); var import_reselect = require("reselect"); const getUsernameState = /* @__PURE__ */ __name((state) => state.username, "getUsernameState"); const getUsernameEditState = (0, import_reselect.createSelector)( getUsernameState, (state) => state.editState ); const getUsernameLinkState = (0, import_reselect.createSelector)( getUsernameState, (state) => state.linkState ); const getUsernameReservation = (0, import_reselect.createSelector)( getUsernameState, (state) => state.usernameReservation ); const getUsernameReservationState = (0, import_reselect.createSelector)( getUsernameReservation, (reservation) => reservation.state ); const getUsernameReservationObject = (0, import_reselect.createSelector)( getUsernameReservation, (reservation) => reservation.reservation ); const getUsernameReservationError = (0, import_reselect.createSelector)( getUsernameReservation, (reservation) => reservation.error ); const getRecoveredUsername = (0, import_reselect.createSelector)( getUsernameReservation, (reservation) => reservation.recoveredUsername ); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getRecoveredUsername, getUsernameEditState, getUsernameLinkState, getUsernameReservation, getUsernameReservationError, getUsernameReservationObject, getUsernameReservationState, getUsernameState }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var types_std_exports = {}; module.exports = __toCommonJS(types_std_exports); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var util_std_exports = {}; module.exports = __toCommonJS(util_std_exports); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var Errors_std_exports = {}; __export(Errors_std_exports, { ConnectTimeoutError: () => ConnectTimeoutError, IncorrectSenderKeyAuthError: () => IncorrectSenderKeyAuthError, MessageError: () => MessageError, NoSenderKeyError: () => NoSenderKeyError, OutgoingIdentityKeyError: () => OutgoingIdentityKeyError, OutgoingMessageError: () => OutgoingMessageError, ReplayableError: () => ReplayableError, SendMessageChallengeError: () => SendMessageChallengeError, SendMessageNetworkError: () => SendMessageNetworkError, SendMessageProtoError: () => SendMessageProtoError, UnknownRecipientError: () => UnknownRecipientError, UnregisteredUserError: () => UnregisteredUserError, WarnOnlyError: () => WarnOnlyError }); module.exports = __toCommonJS(Errors_std_exports); var import_parseRetryAfter_std = require("../util/parseRetryAfter.std.js"); function appendStack(newError, originalError) { newError.stack += ` Original stack: ${originalError.stack}`; } __name(appendStack, "appendStack"); class ReplayableError extends Error { static { __name(this, "ReplayableError"); } functionCode; constructor(options) { super(options.message, { cause: options.cause }); this.name = options.name || "ReplayableError"; this.message = options.message; if (Error.captureStackTrace) { Error.captureStackTrace(this); } this.functionCode = options.functionCode; } } class OutgoingIdentityKeyError extends ReplayableError { static { __name(this, "OutgoingIdentityKeyError"); } identifier; // Note: Data to resend message is no longer captured constructor(incomingIdentifier, cause) { const identifier = incomingIdentifier.split(".")[0]; super({ name: "OutgoingIdentityKeyError", message: `The identity of ${identifier} has changed.`, cause }); this.identifier = identifier; } } class OutgoingMessageError extends ReplayableError { static { __name(this, "OutgoingMessageError"); } identifier; httpError; // Note: Data to resend message is no longer captured constructor(incomingIdentifier, _m, _t, httpError) { const identifier = incomingIdentifier.split(".")[0]; super({ name: "OutgoingMessageError", message: httpError ? httpError.message : "no http error" }); this.identifier = identifier; if (httpError) { this.httpError = httpError; appendStack(this, httpError); } } get code() { return this.httpError?.code; } } class SendMessageNetworkError extends ReplayableError { static { __name(this, "SendMessageNetworkError"); } identifier; httpError; constructor(identifier, _m, httpError) { super({ name: "SendMessageNetworkError", message: httpError.message }); [this.identifier] = identifier.split("."); this.httpError = httpError; appendStack(this, httpError); } get code() { return this.httpError.code; } get responseHeaders() { return this.httpError.responseHeaders; } } class SendMessageChallengeError extends ReplayableError { static { __name(this, "SendMessageChallengeError"); } identifier; httpError; data; retryAt; constructor(identifier, httpError) { super({ name: "SendMessageChallengeError", message: httpError.message, cause: httpError }); [this.identifier] = identifier.split("."); this.httpError = httpError; this.data = httpError.response; const headers = httpError.responseHeaders || {}; const retryAfter = (0, import_parseRetryAfter_std.parseRetryAfter)(headers["retry-after"]); if (retryAfter) { this.retryAt = Date.now() + retryAfter; } appendStack(this, httpError); } get code() { return this.httpError.code; } } class SendMessageProtoError extends Error { static { __name(this, "SendMessageProtoError"); } successfulServiceIds; failoverServiceIds; errors; unidentifiedDeliveries; dataMessage; editMessage; // Fields necessary for send log save contentHint; contentProto; timestamp; recipients; sendIsNotFinal; constructor({ successfulServiceIds, failoverServiceIds, errors, unidentifiedDeliveries, dataMessage, editMessage, contentHint, contentProto, timestamp, recipients, sendIsNotFinal }) { super(`SendMessageProtoError: ${SendMessageProtoError.getMessage(errors)}`); this.successfulServiceIds = successfulServiceIds; this.failoverServiceIds = failoverServiceIds; this.errors = errors; this.unidentifiedDeliveries = unidentifiedDeliveries; this.dataMessage = dataMessage; this.editMessage = editMessage; this.contentHint = contentHint; this.contentProto = contentProto; this.timestamp = timestamp; this.recipients = recipients; this.sendIsNotFinal = sendIsNotFinal; } static getMessage(errors) { if (!errors) { return "No errors"; } return errors.map((error) => error.toString()).join(", "); } } class MessageError extends ReplayableError { static { __name(this, "MessageError"); } httpError; constructor(_m, httpError) { super({ name: "MessageError", message: httpError.message }); this.httpError = httpError; appendStack(this, httpError); } get code() { return this.httpError.code; } } class UnregisteredUserError extends Error { static { __name(this, "UnregisteredUserError"); } serviceId; httpError; constructor(serviceId, httpError) { const { message } = httpError; super(message); this.message = message; this.name = "UnregisteredUserError"; if (Error.captureStackTrace) { Error.captureStackTrace(this); } this.serviceId = serviceId; this.httpError = httpError; appendStack(this, httpError); } get code() { return this.httpError.code; } } class ConnectTimeoutError extends Error { static { __name(this, "ConnectTimeoutError"); } } class UnknownRecipientError extends Error { static { __name(this, "UnknownRecipientError"); } } class IncorrectSenderKeyAuthError extends Error { static { __name(this, "IncorrectSenderKeyAuthError"); } } class WarnOnlyError extends Error { static { __name(this, "WarnOnlyError"); } } class NoSenderKeyError extends Error { static { __name(this, "NoSenderKeyError"); } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { ConnectTimeoutError, IncorrectSenderKeyAuthError, MessageError, NoSenderKeyError, OutgoingIdentityKeyError, OutgoingMessageError, ReplayableError, SendMessageChallengeError, SendMessageNetworkError, SendMessageProtoError, UnknownRecipientError, UnregisteredUserError, WarnOnlyError }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var EventTarget_std_exports = {}; __export(EventTarget_std_exports, { default: () => EventTarget }); module.exports = __toCommonJS(EventTarget_std_exports); class EventTarget { static { __name(this, "EventTarget"); } listeners; dispatchEvent(ev) { if (!(ev instanceof Event)) { throw new Error("Expects an event"); } if (this.listeners == null || typeof this.listeners !== "object") { this.listeners = {}; } const listeners = this.listeners[ev.type]; const results = []; if (typeof listeners === "object") { const max = listeners.length; for (let i = 0; i < max; i += 1) { const listener = listeners[i]; if (typeof listener === "function") { results.push(listener.call(null, ev)); } } } return results; } addEventListener(eventName, callback) { if (typeof eventName !== "string") { throw new Error("First argument expects a string"); } if (typeof callback !== "function") { throw new Error("Second argument expects a function"); } if (this.listeners == null || typeof this.listeners !== "object") { this.listeners = {}; } let listeners = this.listeners[eventName]; if (typeof listeners !== "object") { listeners = []; } listeners.push(callback); this.listeners[eventName] = listeners; } removeEventListener(eventName, callback) { if (typeof eventName !== "string") { throw new Error("First argument expects a string"); } if (typeof callback !== "function") { throw new Error("Second argument expects a function"); } if (this.listeners == null || typeof this.listeners !== "object") { this.listeners = {}; } const listeners = this.listeners[eventName]; if (typeof listeners === "object") { for (let i = 0; i < listeners.length; i += 1) { if (listeners[i] === callback) { listeners.splice(i, 1); return; } } } this.listeners[eventName] = listeners; } extend(source) { const target = this; for (const prop in source) { target[prop] = source[prop]; } return target; } } "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var Helpers_std_exports = {}; __export(Helpers_std_exports, { default: () => Helpers_std_default }); module.exports = __toCommonJS(Helpers_std_exports); const arrayBuffer = new ArrayBuffer(0); const uint8Array = new Uint8Array(); const StaticArrayBufferProto = arrayBuffer.__proto__; const StaticUint8ArrayProto = uint8Array.__proto__; function getString(thing) { if (thing === Object(thing)) { if (thing.__proto__ === StaticUint8ArrayProto) { return String.fromCharCode.apply(null, thing); } if (thing.__proto__ === StaticArrayBufferProto) { return getString(new Uint8Array(thing)); } } return thing; } __name(getString, "getString"); function getStringable(thing) { return typeof thing === "string" || typeof thing === "number" || typeof thing === "boolean" || thing === Object(thing) && (thing.__proto__ === StaticArrayBufferProto || thing.__proto__ === StaticUint8ArrayProto); } __name(getStringable, "getStringable"); function ensureStringed(thing) { if (getStringable(thing)) { return getString(thing); } if (thing instanceof Array) { const res = []; for (let i = 0; i < thing.length; i += 1) { res[i] = ensureStringed(thing[i]); } return res; } if (thing === Object(thing)) { const res = {}; for (const key in thing) { res[key] = ensureStringed(thing[key]); } return res; } if (thing == null) { return null; } throw new Error(`unsure of how to jsonify object of type ${typeof thing}`); } __name(ensureStringed, "ensureStringed"); const utils = { getString, isNumberSane: /* @__PURE__ */ __name((number) => number[0] === "+" && /^[0-9]+$/.test(number.substring(1)), "isNumberSane"), // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types jsonThing: /* @__PURE__ */ __name((thing) => JSON.stringify(ensureStringed(thing)), "jsonThing"), unencodeNumber: /* @__PURE__ */ __name((number) => number.split("."), "unencodeNumber") }; var Helpers_std_default = utils; "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var ProvisioningCipher_node_exports = {}; __export(ProvisioningCipher_node_exports, { default: () => ProvisioningCipher }); module.exports = __toCommonJS(ProvisioningCipher_node_exports); var import_libsignal_client = require("@signalapp/libsignal-client"); var Bytes = __toESM(require("../Bytes.std.js")); var import_Crypto_node = require("../Crypto.node.js"); var import_Curve_node = require("../Curve.node.js"); var import_index_std = require("../protobuf/index.std.js"); var import_assert_std = require("../util/assert.std.js"); var import_dropNull_std = require("../util/dropNull.std.js"); var import_normalizeAci_std = require("../util/normalizeAci.std.js"); var import_ServiceId_std = require("../types/ServiceId.std.js"); class ProvisioningCipherInner { static { __name(this, "ProvisioningCipherInner"); } keyPair; decrypt(provisionEnvelope) { (0, import_assert_std.strictAssert)( provisionEnvelope.publicKey, "Missing publicKey in ProvisionEnvelope" ); (0, import_assert_std.strictAssert)(provisionEnvelope.body, "Missing body in ProvisionEnvelope"); const masterEphemeral = provisionEnvelope.publicKey; const message = provisionEnvelope.body; if (new Uint8Array(message)[0] !== 1) { throw new Error("Bad version number on ProvisioningMessage"); } const iv = message.subarray(1, 16 + 1); const mac = message.subarray(message.byteLength - 32, message.byteLength); const ivAndCiphertext = message.subarray(0, message.byteLength - 32); const ciphertext = message.subarray(16 + 1, message.byteLength - 32); if (!this.keyPair) { throw new Error("ProvisioningCipher.decrypt: No keypair!"); } const ecRes = (0, import_Curve_node.calculateAgreement)( import_libsignal_client.PublicKey.deserialize(masterEphemeral), this.keyPair.privateKey ); const keys = (0, import_Crypto_node.deriveSecrets)( ecRes, new Uint8Array(32), Bytes.fromString("TextSecure Provisioning Message") ); (0, import_Crypto_node.verifyHmacSha256)(ivAndCiphertext, keys[1], mac, 32); const plaintext = (0, import_Crypto_node.decryptAes256CbcPkcsPadding)(keys[0], ciphertext, iv); const provisionMessage = import_index_std.SignalService.ProvisionMessage.decode(plaintext); const aciPrivKey = provisionMessage.aciIdentityKeyPrivate; const pniPrivKey = provisionMessage.pniIdentityKeyPrivate; (0, import_assert_std.strictAssert)(aciPrivKey, "Missing aciKeyPrivate in ProvisionMessage"); const aciKeyPair = (0, import_Curve_node.createKeyPair)(aciPrivKey); const pniKeyPair = pniPrivKey?.length ? (0, import_Curve_node.createKeyPair)(pniPrivKey) : void 0; const { aci: rawAci, pni: rawUntaggedPni, aciBinary, pniBinary } = provisionMessage; let aci; let pni; if (Bytes.isNotEmpty(aciBinary) && Bytes.isNotEmpty(pniBinary)) { aci = (0, import_ServiceId_std.fromAciObject)(import_libsignal_client.Aci.fromUuidBytes(aciBinary)); pni = (0, import_ServiceId_std.fromPniObject)(import_libsignal_client.Pni.fromUuidBytes(pniBinary)); } else if (rawAci && rawUntaggedPni) { (0, import_assert_std.strictAssert)( (0, import_ServiceId_std.isUntaggedPniString)(rawUntaggedPni), "ProvisioningCipher: invalid untaggedPni" ); aci = (0, import_normalizeAci_std.normalizeAci)(rawAci, "provisionMessage.aci"); pni = (0, import_ServiceId_std.normalizePni)((0, import_ServiceId_std.toTaggedPni)(rawUntaggedPni), "provisionMessage.pni"); } else { throw new Error("Missing aci/pni in provisioning message"); } return { aciKeyPair, pniKeyPair, number: (0, import_dropNull_std.dropNull)(provisionMessage.number), aci, pni, provisioningCode: (0, import_dropNull_std.dropNull)(provisionMessage.provisioningCode), userAgent: (0, import_dropNull_std.dropNull)(provisionMessage.userAgent), readReceipts: provisionMessage.readReceipts ?? false, profileKey: Bytes.isNotEmpty(provisionMessage.profileKey) ? provisionMessage.profileKey : void 0, masterKey: Bytes.isNotEmpty(provisionMessage.masterKey) ? provisionMessage.masterKey : void 0, ephemeralBackupKey: Bytes.isNotEmpty(provisionMessage.ephemeralBackupKey) ? provisionMessage.ephemeralBackupKey : void 0, mediaRootBackupKey: Bytes.isNotEmpty(provisionMessage.mediaRootBackupKey) ? provisionMessage.mediaRootBackupKey : void 0, accountEntropyPool: provisionMessage.accountEntropyPool || void 0 }; } getPublicKey() { if (!this.keyPair) { this.keyPair = (0, import_Curve_node.generateKeyPair)(); } if (!this.keyPair) { throw new Error("ProvisioningCipher.decrypt: No keypair!"); } return this.keyPair.publicKey; } } class ProvisioningCipher { static { __name(this, "ProvisioningCipher"); } constructor() { const inner = new ProvisioningCipherInner(); this.decrypt = inner.decrypt.bind(inner); this.getPublicKey = inner.getPublicKey.bind(inner); } decrypt; getPublicKey; } "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var TaskWithTimeout_std_exports = {}; __export(TaskWithTimeout_std_exports, { default: () => createTaskWithTimeout, reportLongRunningTasks: () => reportLongRunningTasks, resumeTasksWithTimeout: () => resumeTasksWithTimeout, suspendTasksWithTimeout: () => suspendTasksWithTimeout }); module.exports = __toCommonJS(TaskWithTimeout_std_exports); var import_index_std = require("../util/durations/index.std.js"); var import_clearTimeoutIfNecessary_std = require("../util/clearTimeoutIfNecessary.std.js"); var import_explodePromise_std = require("../util/explodePromise.std.js"); var import_errors_std = require("../types/errors.std.js"); var import_log_std = require("../logging/log.std.js"); const log = (0, import_log_std.createLogger)("TaskWithTimeout"); const tasks = /* @__PURE__ */ new Set(); let shouldStartTimers = true; function suspendTasksWithTimeout() { log.info(`suspending ${tasks.size} tasks`); shouldStartTimers = false; for (const task of tasks) { task.suspend(); } } __name(suspendTasksWithTimeout, "suspendTasksWithTimeout"); function resumeTasksWithTimeout() { log.info(`resuming ${tasks.size} tasks`); shouldStartTimers = true; for (const task of tasks) { task.resume(); } } __name(resumeTasksWithTimeout, "resumeTasksWithTimeout"); function reportLongRunningTasks() { const now = Date.now(); for (const task of tasks) { if (task.startedAt === void 0) { continue; } const duration = Math.max(0, now - task.startedAt); if (duration > import_index_std.MINUTE) { log.warn(`${task.id} has been running for ${duration}ms`); } } } __name(reportLongRunningTasks, "reportLongRunningTasks"); function createTaskWithTimeout(task, id, options = {}) { const timeout = options.timeout || 30 * import_index_std.MINUTE; const timeoutError = new Error(`${id || ""} task did not complete in time.`); return async (...args) => { let complete = false; let timer; const { promise: timerPromise, reject } = (0, import_explodePromise_std.explodePromise)(); const startTimer = /* @__PURE__ */ __name(() => { stopTimer(); if (complete) { return; } entry.startedAt = Date.now(); timer = setTimeout(() => { if (complete) { log.warn(`${id} task timed out, but was already complete`); return; } complete = true; tasks.delete(entry); log.error((0, import_errors_std.toLogFormat)(timeoutError)); reject(timeoutError); }, timeout); }, "startTimer"); const stopTimer = /* @__PURE__ */ __name(() => { (0, import_clearTimeoutIfNecessary_std.clearTimeoutIfNecessary)(timer); timer = void 0; }, "stopTimer"); const entry = { id, startedAt: void 0, suspend: /* @__PURE__ */ __name(() => { log.warn(`${id} task suspended`); stopTimer(); }, "suspend"), resume: /* @__PURE__ */ __name(() => { log.warn(`${id} task resumed`); startTimer(); }, "resume") }; tasks.add(entry); if (shouldStartTimers) { startTimer(); } let result; const run = /* @__PURE__ */ __name(async () => { result = await task(...args); }, "run"); try { await Promise.race([run(), timerPromise]); return result; } finally { complete = true; tasks.delete(entry); stopTimer(); } }; } __name(createTaskWithTimeout, "createTaskWithTimeout"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { reportLongRunningTasks, resumeTasksWithTimeout, suspendTasksWithTimeout }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var CDSBase_node_exports = {}; __export(CDSBase_node_exports, { CDSBase: () => CDSBase }); module.exports = __toCommonJS(CDSBase_node_exports); var import_timestamp_std = require("../../util/timestamp.std.js"); var import_index_std = require("../../util/durations/index.std.js"); var import_createProxyAgent_node = require("../../util/createProxyAgent.node.js"); const CACHED_AUTH_TTL = 23 * import_index_std.HOUR; class CDSBase { constructor(options) { this.options = options; this.logger = options.logger; } static { __name(this, "CDSBase"); } logger; proxyAgent; cachedAuth; async getAuth() { if (!this.proxyAgent && this.options.proxyUrl) { this.proxyAgent = await (0, import_createProxyAgent_node.createProxyAgent)(this.options.proxyUrl); } if (this.cachedAuth) { if ((0, import_timestamp_std.isOlderThan)(this.cachedAuth.timestamp, CACHED_AUTH_TTL)) { this.cachedAuth = void 0; } else { return this.cachedAuth.auth; } } const auth = await this.options.getAuth(); this.cachedAuth = { auth, timestamp: Date.now() }; return auth; } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { CDSBase }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var CDSI_node_exports = {}; __export(CDSI_node_exports, { CDSI: () => CDSI }); module.exports = __toCommonJS(CDSI_node_exports); var import_libsignal_client = require("@signalapp/libsignal-client"); var import_p_timeout = __toESM(require("p-timeout")); var import_CDSBase_node = require("./CDSBase.node.js"); var import_sleep_std = require("../../util/sleep.std.js"); var durations = __toESM(require("../../util/durations/index.std.js")); const REQUEST_TIMEOUT = 10 * durations.SECOND; class CDSI extends import_CDSBase_node.CDSBase { constructor(libsignalNet, options) { super(options); this.libsignalNet = libsignalNet; } static { __name(this, "CDSI"); } #retryAfter; async request(options) { const log = this.logger; if (this.#retryAfter !== void 0) { const delay = Math.max(0, this.#retryAfter - Date.now()); log.info(`CDSSocketManager: waiting ${delay}ms before retrying`); await (0, import_sleep_std.sleep)(delay); } const { acisAndAccessKeys, e164s } = options; const auth = await this.getAuth(); log.info("CDSSocketManager: making request via libsignal"); try { log.info("CDSSocketManager: starting lookup request"); const { timeout = REQUEST_TIMEOUT } = options; const response = await (0, import_p_timeout.default)( this.libsignalNet.cdsiLookup(auth, { acisAndAccessKeys, e164s }), timeout ); log.info("CDSSocketManager: lookup request finished"); return response; } catch (error) { if (error instanceof import_libsignal_client.LibSignalErrorBase && error.code === import_libsignal_client.ErrorCode.RateLimitedError) { const retryError = error; this.#retryAfter = Math.max( this.#retryAfter ?? Date.now(), Date.now() + retryError.retryAfterSecs * durations.SECOND ); } throw error; } } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { CDSI }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var RateLimitedError_std_exports = {}; __export(RateLimitedError_std_exports, { RateLimitedError: () => RateLimitedError }); module.exports = __toCommonJS(RateLimitedError_std_exports); class RateLimitedError extends Error { static { __name(this, "RateLimitedError"); } retryAfterSecs; // eslint-disable-next-line camelcase constructor({ retry_after }) { super( `RateLimitedError: got 4008 close code from CDSI, retry_after=${retry_after}` ); this.retryAfterSecs = retry_after ?? 0; } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { RateLimitedError }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var messageReceiverEvents_std_exports = {}; __export(messageReceiverEvents_std_exports, { AttachmentBackfillResponseSyncEvent: () => AttachmentBackfillResponseSyncEvent, CallEventSyncEvent: () => CallEventSyncEvent, CallLinkUpdateSyncEvent: () => CallLinkUpdateSyncEvent, CallLogEventSyncEvent: () => CallLogEventSyncEvent, ConfigurationEvent: () => ConfigurationEvent, ConfirmableEvent: () => ConfirmableEvent, ContactSyncEvent: () => ContactSyncEvent, DecryptionErrorEvent: () => DecryptionErrorEvent, DeleteForMeSyncEvent: () => DeleteForMeSyncEvent, DeliveryEvent: () => DeliveryEvent, DeviceNameChangeSyncEvent: () => DeviceNameChangeSyncEvent, EmptyEvent: () => EmptyEvent, EnvelopeQueuedEvent: () => EnvelopeQueuedEvent, EnvelopeUnsealedEvent: () => EnvelopeUnsealedEvent, ErrorEvent: () => ErrorEvent, FetchLatestEvent: () => FetchLatestEvent, InvalidPlaintextEvent: () => InvalidPlaintextEvent, KeysEvent: () => KeysEvent, MessageEvent: () => MessageEvent, MessageRequestResponseEvent: () => MessageRequestResponseEvent, ProfileKeyUpdateEvent: () => ProfileKeyUpdateEvent, ReadEvent: () => ReadEvent, ReadSyncEvent: () => ReadSyncEvent, RetryRequestEvent: () => RetryRequestEvent, SentEvent: () => SentEvent, StickerPackEvent: () => StickerPackEvent, StoryRecipientUpdateEvent: () => StoryRecipientUpdateEvent, SuccessfulDecryptEvent: () => SuccessfulDecryptEvent, TypingEvent: () => TypingEvent, ViewEvent: () => ViewEvent, ViewOnceOpenSyncEvent: () => ViewOnceOpenSyncEvent, ViewSyncEvent: () => ViewSyncEvent, deleteAttachmentSchema: () => deleteAttachmentSchema, deleteConversationSchema: () => deleteConversationSchema, deleteForMeSyncTargetSchema: () => deleteForMeSyncTargetSchema, deleteLocalConversationSchema: () => deleteLocalConversationSchema, deleteMessageSchema: () => deleteMessageSchema }); module.exports = __toCommonJS(messageReceiverEvents_std_exports); var import_zod = require("zod"); var import_ServiceId_std = require("../types/ServiceId.std.js"); var import_isAciString_std = require("../util/isAciString.std.js"); class EmptyEvent extends Event { static { __name(this, "EmptyEvent"); } constructor() { super("empty"); } } class TypingEvent extends Event { static { __name(this, "TypingEvent"); } sender; senderAci; senderDevice; typing; constructor({ sender, senderAci, senderDevice, typing }) { super("typing"); this.sender = sender; this.senderAci = senderAci; this.senderDevice = senderDevice; this.typing = typing; } } class ErrorEvent extends Event { constructor(error) { super("error"); this.error = error; } static { __name(this, "ErrorEvent"); } } class ContactSyncEvent extends Event { constructor(contactAttachment, complete, receivedAtCounter, sentAt) { super("contactSync"); this.contactAttachment = contactAttachment; this.complete = complete; this.receivedAtCounter = receivedAtCounter; this.sentAt = sentAt; } static { __name(this, "ContactSyncEvent"); } } class EnvelopeUnsealedEvent extends Event { constructor(envelope) { super("envelopeUnsealed"); this.envelope = envelope; } static { __name(this, "EnvelopeUnsealedEvent"); } } class EnvelopeQueuedEvent extends Event { constructor(envelope) { super("envelopeQueued"); this.envelope = envelope; } static { __name(this, "EnvelopeQueuedEvent"); } } class ConfirmableEvent extends Event { constructor(type, confirm) { super(type); this.confirm = confirm; } static { __name(this, "ConfirmableEvent"); } } class DeliveryEvent extends ConfirmableEvent { constructor(deliveryReceipts, envelopeId, envelopeTimestamp, confirm) { super("delivery", confirm); this.deliveryReceipts = deliveryReceipts; this.envelopeId = envelopeId; this.envelopeTimestamp = envelopeTimestamp; } static { __name(this, "DeliveryEvent"); } } class SuccessfulDecryptEvent extends Event { constructor(data) { super("successful-decrypt"); this.data = data; } static { __name(this, "SuccessfulDecryptEvent"); } } class DecryptionErrorEvent extends ConfirmableEvent { constructor(decryptionError, confirm) { super("decryption-error", confirm); this.decryptionError = decryptionError; } static { __name(this, "DecryptionErrorEvent"); } } class InvalidPlaintextEvent extends Event { constructor(data) { super("invalid-plaintext"); this.data = data; } static { __name(this, "InvalidPlaintextEvent"); } } class RetryRequestEvent extends ConfirmableEvent { constructor(retryRequest, confirm) { super("retry-request", confirm); this.retryRequest = retryRequest; } static { __name(this, "RetryRequestEvent"); } } class SentEvent extends ConfirmableEvent { constructor(data, confirm) { super("sent", confirm); this.data = data; } static { __name(this, "SentEvent"); } } class ProfileKeyUpdateEvent extends ConfirmableEvent { constructor(data, reason, confirm) { super("profileKeyUpdate", confirm); this.data = data; this.reason = reason; } static { __name(this, "ProfileKeyUpdateEvent"); } } class MessageEvent extends ConfirmableEvent { constructor(data, confirm) { super("message", confirm); this.data = data; } static { __name(this, "MessageEvent"); } } class ReadEvent extends ConfirmableEvent { constructor(receipts, envelopeId, envelopeTimestamp, confirm) { super("read", confirm); this.receipts = receipts; this.envelopeId = envelopeId; this.envelopeTimestamp = envelopeTimestamp; } static { __name(this, "ReadEvent"); } } class ViewEvent extends ConfirmableEvent { constructor(receipts, envelopeId, envelopeTimestamp, confirm) { super("view", confirm); this.receipts = receipts; this.envelopeId = envelopeId; this.envelopeTimestamp = envelopeTimestamp; } static { __name(this, "ViewEvent"); } } class ConfigurationEvent extends ConfirmableEvent { constructor(configuration, confirm) { super("configuration", confirm); this.configuration = configuration; } static { __name(this, "ConfigurationEvent"); } } class ViewOnceOpenSyncEvent extends ConfirmableEvent { static { __name(this, "ViewOnceOpenSyncEvent"); } sourceAci; envelopeTimestamp; timestamp; constructor({ sourceAci, timestamp, envelopeTimestamp }, confirm) { super("viewOnceOpenSync", confirm); this.sourceAci = sourceAci; this.timestamp = timestamp; this.envelopeTimestamp = envelopeTimestamp; } } class MessageRequestResponseEvent extends ConfirmableEvent { static { __name(this, "MessageRequestResponseEvent"); } threadAci; messageRequestResponseType; groupId; groupV2Id; envelopeId; receivedAtMs; receivedAtCounter; sentAt; constructor({ envelopeId, threadAci, messageRequestResponseType, groupId, groupV2Id, receivedAtMs, receivedAtCounter, sentAt }, confirm) { super("messageRequestResponse", confirm); this.envelopeId = envelopeId; this.threadAci = threadAci; this.messageRequestResponseType = messageRequestResponseType; this.groupId = groupId; this.groupV2Id = groupV2Id; this.receivedAtMs = receivedAtMs; this.receivedAtCounter = receivedAtCounter; this.sentAt = sentAt; } } class FetchLatestEvent extends ConfirmableEvent { constructor(eventType, confirm) { super("fetchLatest", confirm); this.eventType = eventType; } static { __name(this, "FetchLatestEvent"); } } class KeysEvent extends ConfirmableEvent { static { __name(this, "KeysEvent"); } masterKey; accountEntropyPool; mediaRootBackupKey; constructor({ masterKey, accountEntropyPool, mediaRootBackupKey }, confirm) { super("keys", confirm); this.masterKey = masterKey; this.accountEntropyPool = accountEntropyPool; this.mediaRootBackupKey = mediaRootBackupKey; } } class StickerPackEvent extends ConfirmableEvent { constructor(stickerPacks, confirm) { super("sticker-pack", confirm); this.stickerPacks = stickerPacks; } static { __name(this, "StickerPackEvent"); } } class ReadSyncEvent extends ConfirmableEvent { constructor(reads, envelopeId, envelopeTimestamp, confirm) { super("readSync", confirm); this.reads = reads; this.envelopeId = envelopeId; this.envelopeTimestamp = envelopeTimestamp; } static { __name(this, "ReadSyncEvent"); } } class ViewSyncEvent extends ConfirmableEvent { constructor(views, envelopeId, envelopeTimestamp, confirm) { super("viewSync", confirm); this.views = views; this.envelopeId = envelopeId; this.envelopeTimestamp = envelopeTimestamp; } static { __name(this, "ViewSyncEvent"); } } class CallEventSyncEvent extends ConfirmableEvent { constructor(callEvent, confirm) { super("callEventSync", confirm); this.callEvent = callEvent; } static { __name(this, "CallEventSyncEvent"); } } class CallLinkUpdateSyncEvent extends ConfirmableEvent { constructor(callLinkUpdate, confirm) { super("callLinkUpdateSync", confirm); this.callLinkUpdate = callLinkUpdate; } static { __name(this, "CallLinkUpdateSyncEvent"); } } class DeviceNameChangeSyncEvent extends ConfirmableEvent { static { __name(this, "DeviceNameChangeSyncEvent"); } constructor(confirm) { super("deviceNameChangeSync", confirm); } } const addressableMessageSchema = import_zod.z.union([ import_zod.z.object({ type: import_zod.z.literal("aci").readonly(), authorAci: import_zod.z.string().refine(import_isAciString_std.isAciString), sentAt: import_zod.z.number() }), import_zod.z.object({ type: import_zod.z.literal("e164").readonly(), authorE164: import_zod.z.string(), sentAt: import_zod.z.number() }), import_zod.z.object({ type: import_zod.z.literal("pni").readonly(), authorPni: import_zod.z.string().refine(import_ServiceId_std.isPniString), sentAt: import_zod.z.number() }) ]); const conversationIdentifierSchema = import_zod.z.union([ import_zod.z.object({ type: import_zod.z.literal("aci").readonly(), aci: import_zod.z.string().refine(import_isAciString_std.isAciString) }), import_zod.z.object({ type: import_zod.z.literal("e164").readonly(), e164: import_zod.z.string() }), import_zod.z.object({ type: import_zod.z.literal("group").readonly(), groupId: import_zod.z.string() }), import_zod.z.object({ type: import_zod.z.literal("pni").readonly(), pni: import_zod.z.string().refine(import_ServiceId_std.isPniString) }) ]); const deleteMessageSchema = import_zod.z.object({ type: import_zod.z.literal("delete-message").readonly(), conversation: conversationIdentifierSchema, message: addressableMessageSchema, timestamp: import_zod.z.number() }); const deleteConversationSchema = import_zod.z.object({ type: import_zod.z.literal("delete-conversation").readonly(), conversation: conversationIdentifierSchema, mostRecentMessages: import_zod.z.array(addressableMessageSchema), mostRecentNonExpiringMessages: import_zod.z.array(addressableMessageSchema).optional(), isFullDelete: import_zod.z.boolean(), timestamp: import_zod.z.number() }); const deleteLocalConversationSchema = import_zod.z.object({ type: import_zod.z.literal("delete-local-conversation").readonly(), conversation: conversationIdentifierSchema, timestamp: import_zod.z.number() }); const deleteAttachmentSchema = import_zod.z.object({ type: import_zod.z.literal("delete-single-attachment").readonly(), conversation: conversationIdentifierSchema, message: addressableMessageSchema, clientUuid: import_zod.z.string().optional(), fallbackDigest: import_zod.z.string().optional(), fallbackPlaintextHash: import_zod.z.string().optional(), timestamp: import_zod.z.number() }); const deleteForMeSyncTargetSchema = import_zod.z.union([ deleteMessageSchema, deleteConversationSchema, deleteLocalConversationSchema, deleteAttachmentSchema ]); class DeleteForMeSyncEvent extends ConfirmableEvent { constructor(deleteForMeSync, timestamp, envelopeId, confirm) { super("deleteForMeSync", confirm); this.deleteForMeSync = deleteForMeSync; this.timestamp = timestamp; this.envelopeId = envelopeId; } static { __name(this, "DeleteForMeSyncEvent"); } } class AttachmentBackfillResponseSyncEvent extends ConfirmableEvent { constructor(response, timestamp, envelopeId, confirm) { super("attachmentBackfillResponseSync", confirm); this.response = response; this.timestamp = timestamp; this.envelopeId = envelopeId; } static { __name(this, "AttachmentBackfillResponseSyncEvent"); } } class CallLogEventSyncEvent extends ConfirmableEvent { constructor(data, confirm) { super("callLogEventSync", confirm); this.data = data; } static { __name(this, "CallLogEventSyncEvent"); } } class StoryRecipientUpdateEvent extends ConfirmableEvent { constructor(data, confirm) { super("storyRecipientUpdate", confirm); this.data = data; } static { __name(this, "StoryRecipientUpdateEvent"); } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { AttachmentBackfillResponseSyncEvent, CallEventSyncEvent, CallLinkUpdateSyncEvent, CallLogEventSyncEvent, ConfigurationEvent, ConfirmableEvent, ContactSyncEvent, DecryptionErrorEvent, DeleteForMeSyncEvent, DeliveryEvent, DeviceNameChangeSyncEvent, EmptyEvent, EnvelopeQueuedEvent, EnvelopeUnsealedEvent, ErrorEvent, FetchLatestEvent, InvalidPlaintextEvent, KeysEvent, MessageEvent, MessageRequestResponseEvent, ProfileKeyUpdateEvent, ReadEvent, ReadSyncEvent, RetryRequestEvent, SentEvent, StickerPackEvent, StoryRecipientUpdateEvent, SuccessfulDecryptEvent, TypingEvent, ViewEvent, ViewOnceOpenSyncEvent, ViewSyncEvent, deleteAttachmentSchema, deleteConversationSchema, deleteForMeSyncTargetSchema, deleteLocalConversationSchema, deleteMessageSchema }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var processSyncMessage_node_exports = {}; __export(processSyncMessage_node_exports, { processSyncMessage: () => processSyncMessage }); module.exports = __toCommonJS(processSyncMessage_node_exports); var import_ServiceId_node = require("../util/ServiceId.node.js"); function processProtoWithDestinationServiceId(input) { const { destinationServiceId: rawDestinationServiceId, destinationServiceIdBinary, ...remaining } = input; return { ...remaining, destinationServiceId: (0, import_ServiceId_node.fromServiceIdBinaryOrString)( destinationServiceIdBinary, rawDestinationServiceId, "processSyncMessage" ) }; } __name(processProtoWithDestinationServiceId, "processProtoWithDestinationServiceId"); function processSent(sent) { if (!sent) { return void 0; } const { destinationServiceId: rawDestinationServiceId, destinationServiceIdBinary, unidentifiedStatus, storyMessageRecipients, ...remaining } = sent; return { ...remaining, destinationServiceId: (0, import_ServiceId_node.fromServiceIdBinaryOrString)( destinationServiceIdBinary, rawDestinationServiceId, "processSent" ), unidentifiedStatus: unidentifiedStatus ? unidentifiedStatus.map(processProtoWithDestinationServiceId) : void 0, storyMessageRecipients: storyMessageRecipients ? storyMessageRecipients.map(processProtoWithDestinationServiceId) : void 0 }; } __name(processSent, "processSent"); function processSyncMessage(syncMessage) { return { ...syncMessage, sent: processSent(syncMessage.sent) }; } __name(processSyncMessage, "processSyncMessage"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { processSyncMessage }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var Blocked_std_exports = {}; __export(Blocked_std_exports, { BLOCKED_GROUPS_ID: () => BLOCKED_GROUPS_ID, BLOCKED_NUMBERS_ID: () => BLOCKED_NUMBERS_ID, BLOCKED_UUIDS_ID: () => BLOCKED_UUIDS_ID, Blocked: () => Blocked }); module.exports = __toCommonJS(Blocked_std_exports); var import_lodash = __toESM(require("lodash")); var import_log_std = require("../../logging/log.std.js"); var Bytes = __toESM(require("../../Bytes.std.js")); var import_isAciString_std = require("../../util/isAciString.std.js"); const { without } = import_lodash.default; const log = (0, import_log_std.createLogger)("Blocked"); const BLOCKED_NUMBERS_ID = "blocked"; const BLOCKED_UUIDS_ID = "blocked-uuids"; const BLOCKED_GROUPS_ID = "blocked-groups"; class Blocked { constructor(storage) { this.storage = storage; } static { __name(this, "Blocked"); } getBlockedNumbers() { return this.storage.get(BLOCKED_NUMBERS_ID, new Array()); } isBlocked(number) { return this.getBlockedNumbers().includes(number); } async addBlockedNumber(number) { const numbers = this.getBlockedNumbers(); if (numbers.includes(number)) { return; } log.info("adding", number, "to blocked list"); await this.storage.put(BLOCKED_NUMBERS_ID, numbers.concat(number)); } async removeBlockedNumber(number) { const numbers = this.getBlockedNumbers(); if (!numbers.includes(number)) { return; } log.info("removing", number, "from blocked list"); await this.storage.put(BLOCKED_NUMBERS_ID, without(numbers, number)); } getBlockedServiceIds() { return this.storage.get(BLOCKED_UUIDS_ID, new Array()); } isServiceIdBlocked(serviceId) { return this.getBlockedServiceIds().includes(serviceId); } async addBlockedServiceId(serviceId) { const serviceIds = this.getBlockedServiceIds(); if (serviceIds.includes(serviceId)) { return; } log.info("adding", serviceId, "to blocked list"); await this.storage.put(BLOCKED_UUIDS_ID, serviceIds.concat(serviceId)); } async removeBlockedServiceId(serviceId) { const numbers = this.getBlockedServiceIds(); if (!numbers.includes(serviceId)) { return; } log.info("removing", serviceId, "from blocked list"); await this.storage.put(BLOCKED_UUIDS_ID, without(numbers, serviceId)); } getBlockedGroups() { return this.storage.get(BLOCKED_GROUPS_ID, new Array()); } isGroupBlocked(groupId) { return this.getBlockedGroups().includes(groupId); } async addBlockedGroup(groupId) { const groupIds = this.getBlockedGroups(); if (groupIds.includes(groupId)) { return; } log.info(`adding group(${groupId}) to blocked list`); await this.storage.put(BLOCKED_GROUPS_ID, groupIds.concat(groupId)); } async removeBlockedGroup(groupId) { const groupIds = this.getBlockedGroups(); if (!groupIds.includes(groupId)) { return; } log.info(`removing group(${groupId} from blocked list`); await this.storage.put(BLOCKED_GROUPS_ID, without(groupIds, groupId)); } getBlockedData() { const e164s = this.getBlockedNumbers(); const acis = this.getBlockedServiceIds().filter((item) => (0, import_isAciString_std.isAciString)(item)); const groupIds = this.getBlockedGroups().map( (item) => Bytes.fromBase64(item) ); return { e164s, acis, groupIds }; } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { BLOCKED_GROUPS_ID, BLOCKED_NUMBERS_ID, BLOCKED_UUIDS_ID, Blocked }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var Address_std_exports = {}; __export(Address_std_exports, { Address: () => Address }); module.exports = __toCommonJS(Address_std_exports); class Address { constructor(serviceId, deviceId) { this.serviceId = serviceId; this.deviceId = deviceId; } static { __name(this, "Address"); } toString() { return `${this.serviceId}.${this.deviceId}`; } static create(serviceId, deviceId) { return new Address(serviceId, deviceId); } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { Address }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var Attachment_std_exports = {}; __export(Attachment_std_exports, { AttachmentPermanentlyUndownloadableError: () => AttachmentPermanentlyUndownloadableError, AttachmentSizeError: () => AttachmentSizeError, AttachmentVariant: () => AttachmentVariant, TextAttachmentStyleType: () => TextAttachmentStyleType }); module.exports = __toCommonJS(Attachment_std_exports); var TextAttachmentStyleType = /* @__PURE__ */ ((TextAttachmentStyleType2) => { TextAttachmentStyleType2[TextAttachmentStyleType2["DEFAULT"] = 0] = "DEFAULT"; TextAttachmentStyleType2[TextAttachmentStyleType2["REGULAR"] = 1] = "REGULAR"; TextAttachmentStyleType2[TextAttachmentStyleType2["BOLD"] = 2] = "BOLD"; TextAttachmentStyleType2[TextAttachmentStyleType2["SERIF"] = 3] = "SERIF"; TextAttachmentStyleType2[TextAttachmentStyleType2["SCRIPT"] = 4] = "SCRIPT"; TextAttachmentStyleType2[TextAttachmentStyleType2["CONDENSED"] = 5] = "CONDENSED"; return TextAttachmentStyleType2; })(TextAttachmentStyleType || {}); var AttachmentVariant = /* @__PURE__ */ ((AttachmentVariant2) => { AttachmentVariant2["Default"] = "Default"; AttachmentVariant2["ThumbnailFromBackup"] = "thumbnailFromBackup"; return AttachmentVariant2; })(AttachmentVariant || {}); class AttachmentSizeError extends Error { static { __name(this, "AttachmentSizeError"); } } class AttachmentPermanentlyUndownloadableError extends Error { static { __name(this, "AttachmentPermanentlyUndownloadableError"); } constructor(message) { super(`AttachmentPermanentlyUndownloadableError: ${message}`); } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { AttachmentPermanentlyUndownloadableError, AttachmentSizeError, AttachmentVariant, TextAttachmentStyleType }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var AttachmentBackup_std_exports = {}; __export(AttachmentBackup_std_exports, { attachmentBackupJobSchema: () => attachmentBackupJobSchema, thumbnailBackupJobRecordSchema: () => thumbnailBackupJobRecordSchema }); module.exports = __toCommonJS(AttachmentBackup_std_exports); var import_zod = require("zod"); var import_JobManager_std = require("../jobs/JobManager.std.js"); var import_MIME_std = require("./MIME.std.js"); const standardBackupJobDataSchema = import_zod.z.object({ type: import_zod.z.literal("standard"), mediaName: import_zod.z.string(), data: import_zod.z.object({ path: import_zod.z.string(), size: import_zod.z.number(), contentType: import_MIME_std.MIMETypeSchema, keys: import_zod.z.string(), transitCdnInfo: import_zod.z.object({ cdnKey: import_zod.z.string(), cdnNumber: import_zod.z.number(), uploadTimestamp: import_zod.z.number().optional() }).optional(), version: import_zod.z.union([import_zod.z.literal(1), import_zod.z.literal(2)]).optional(), localKey: import_zod.z.string().optional() }) }); const thumbnailMediaNameSchema = import_zod.z.string().refine((mediaName) => { return mediaName.endsWith("_thumbnail"); }); const thumbnailBackupJobDataSchema = import_zod.z.object({ type: import_zod.z.literal("thumbnail"), mediaName: thumbnailMediaNameSchema, data: import_zod.z.object({ fullsizePath: import_zod.z.string(), fullsizeSize: import_zod.z.number(), contentType: import_MIME_std.MIMETypeSchema, version: import_zod.z.union([import_zod.z.literal(1), import_zod.z.literal(2)]).optional(), localKey: import_zod.z.string().optional() }) }); const attachmentBackupJobSchema = import_zod.z.object({ receivedAt: import_zod.z.number() }).and( import_zod.z.discriminatedUnion("type", [ standardBackupJobDataSchema, thumbnailBackupJobDataSchema ]) ).and(import_JobManager_std.jobManagerJobSchema); const thumbnailBackupJobRecordSchema = import_zod.z.object({ mediaName: thumbnailMediaNameSchema, type: import_zod.z.literal("standard"), json: thumbnailBackupJobDataSchema.omit({ type: true }) }); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { attachmentBackupJobSchema, thumbnailBackupJobRecordSchema }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var AttachmentDownload_std_exports = {}; __export(AttachmentDownload_std_exports, { AttachmentDownloadUrgency: () => AttachmentDownloadUrgency, MediaTier: () => MediaTier, attachmentDownloadJobSchema: () => attachmentDownloadJobSchema, coreAttachmentDownloadJobSchema: () => coreAttachmentDownloadJobSchema, messageAttachmentTypeSchema: () => messageAttachmentTypeSchema }); module.exports = __toCommonJS(AttachmentDownload_std_exports); var import_zod = require("zod"); var import_MIME_std = require("./MIME.std.js"); var import_JobManager_std = require("../jobs/JobManager.std.js"); var import_Interface_std = require("../sql/Interface.std.js"); var MediaTier = /* @__PURE__ */ ((MediaTier2) => { MediaTier2["STANDARD"] = "standard"; MediaTier2["BACKUP"] = "backup"; return MediaTier2; })(MediaTier || {}); const messageAttachmentTypeSchema = import_zod.z.enum([ "long-message", "attachment", "preview", "contact", "quote", "sticker" ]); const coreAttachmentDownloadJobSchema = import_zod.z.object({ attachment: import_zod.z.object({ size: import_zod.z.number(), contentType: import_MIME_std.MIMETypeSchema }).passthrough(), attachmentType: messageAttachmentTypeSchema, ciphertextSize: import_zod.z.number(), contentType: import_MIME_std.MIMETypeSchema, attachmentSignature: import_zod.z.string(), isManualDownload: import_zod.z.boolean().optional(), messageId: import_zod.z.string(), messageIdForLogging: import_zod.z.string().optional(), originalSource: import_zod.z.nativeEnum(import_Interface_std.AttachmentDownloadSource), receivedAt: import_zod.z.number(), sentAt: import_zod.z.number(), size: import_zod.z.number(), source: import_zod.z.nativeEnum(import_Interface_std.AttachmentDownloadSource) }); const attachmentDownloadJobSchema = coreAttachmentDownloadJobSchema.and( import_JobManager_std.jobManagerJobSchema ); var AttachmentDownloadUrgency = /* @__PURE__ */ ((AttachmentDownloadUrgency2) => { AttachmentDownloadUrgency2["IMMEDIATE"] = "immediate"; AttachmentDownloadUrgency2["STANDARD"] = "standard"; return AttachmentDownloadUrgency2; })(AttachmentDownloadUrgency || {}); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { AttachmentDownloadUrgency, MediaTier, attachmentDownloadJobSchema, coreAttachmentDownloadJobSchema, messageAttachmentTypeSchema }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var AttachmentSize_std_exports = {}; __export(AttachmentSize_std_exports, { KIBIBYTE: () => KIBIBYTE, MEBIBYTE: () => MEBIBYTE, getMaximumIncomingAttachmentSizeInKb: () => getMaximumIncomingAttachmentSizeInKb, getMaximumIncomingTextAttachmentSizeInKb: () => getMaximumIncomingTextAttachmentSizeInKb, getMaximumOutgoingAttachmentSizeInKb: () => getMaximumOutgoingAttachmentSizeInKb, getRenderDetailsForLimit: () => getRenderDetailsForLimit }); module.exports = __toCommonJS(AttachmentSize_std_exports); var import_log_std = require("../logging/log.std.js"); var import_parseIntOrThrow_std = require("../util/parseIntOrThrow.std.js"); const log = (0, import_log_std.createLogger)("AttachmentSize"); const KIBIBYTE = 1024; const MEBIBYTE = 1024 * 1024; const DEFAULT_MAX = 100 * MEBIBYTE; const getMaximumOutgoingAttachmentSizeInKb = /* @__PURE__ */ __name((getValue) => { try { return (0, import_parseIntOrThrow_std.parseIntOrThrow)( getValue("global.attachments.maxBytes"), "getMaximumOutgoingAttachmentSizeInKb" ) / KIBIBYTE; } catch (error) { log.warn( "Failed to parse integer out of global.attachments.maxBytes feature flag" ); return DEFAULT_MAX / KIBIBYTE; } }, "getMaximumOutgoingAttachmentSizeInKb"); const getMaximumIncomingAttachmentSizeInKb = /* @__PURE__ */ __name((getValue) => { try { return (0, import_parseIntOrThrow_std.parseIntOrThrow)( getValue("global.attachments.maxReceiveBytes"), "getMaximumIncomingAttachmentSizeInKb" ) / KIBIBYTE; } catch (_error) { return getMaximumOutgoingAttachmentSizeInKb(getValue) * 1.25; } }, "getMaximumIncomingAttachmentSizeInKb"); const getMaximumIncomingTextAttachmentSizeInKb = /* @__PURE__ */ __name((getValue) => { try { return (0, import_parseIntOrThrow_std.parseIntOrThrow)( getValue("global.textAttachmentLimitBytes"), "getMaximumIncomingTextAttachmentSizeInKb" ) / KIBIBYTE; } catch (_error) { return KIBIBYTE * 5; } }, "getMaximumIncomingTextAttachmentSizeInKb"); function getRenderDetailsForLimit(limitKb) { const units = ["kB", "MB", "GB"]; let u = -1; let limit = limitKb * KIBIBYTE; do { limit /= KIBIBYTE; u += 1; } while (limit >= KIBIBYTE && u < units.length - 1); return { limit: Math.trunc(limit), units: units[u] }; } __name(getRenderDetailsForLimit, "getRenderDetailsForLimit"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { KIBIBYTE, MEBIBYTE, getMaximumIncomingAttachmentSizeInKb, getMaximumIncomingTextAttachmentSizeInKb, getMaximumOutgoingAttachmentSizeInKb, getRenderDetailsForLimit }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var AudioRecorder_std_exports = {}; __export(AudioRecorder_std_exports, { ErrorDialogAudioRecorderType: () => ErrorDialogAudioRecorderType, RecordingState: () => RecordingState }); module.exports = __toCommonJS(AudioRecorder_std_exports); var ErrorDialogAudioRecorderType = /* @__PURE__ */ ((ErrorDialogAudioRecorderType2) => { ErrorDialogAudioRecorderType2[ErrorDialogAudioRecorderType2["ErrorRecording"] = 0] = "ErrorRecording"; ErrorDialogAudioRecorderType2[ErrorDialogAudioRecorderType2["Timeout"] = 1] = "Timeout"; return ErrorDialogAudioRecorderType2; })(ErrorDialogAudioRecorderType || {}); var RecordingState = /* @__PURE__ */ ((RecordingState2) => { RecordingState2["Recording"] = "recording"; RecordingState2["Initializing"] = "initializing"; RecordingState2["Idle"] = "idle"; return RecordingState2; })(RecordingState || {}); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { ErrorDialogAudioRecorderType, RecordingState }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var Avatar_std_exports = {}; __export(Avatar_std_exports, { GroupAvatarIcons: () => GroupAvatarIcons, PersonalAvatarIcons: () => PersonalAvatarIcons, getDefaultAvatars: () => getDefaultAvatars }); module.exports = __toCommonJS(Avatar_std_exports); var import_assert_std = require("../util/assert.std.js"); const PersonalAvatarIcons = [ "abstract_01", "abstract_02", "abstract_03", "cat", "dog", "fox", "tucan", "pig", "dinosour", "sloth", "incognito", "ghost" ]; const GroupAvatarIcons = [ "balloon", "book", "briefcase", "celebration", "drink", "football", "heart", "house", "melon", "soccerball", "sunset", "surfboard" ]; const groupIconColors = [ "A180", "A120", "A110", "A170", "A100", "A210", "A100", "A180", "A120", "A110", "A130", "A210" ]; const personalIconColors = [ "A130", "A120", "A170", "A190", "A140", "A190", "A120", "A160", "A130", "A180", "A210", "A100" ]; (0, import_assert_std.strictAssert)( groupIconColors.length === GroupAvatarIcons.length && personalIconColors.length === PersonalAvatarIcons.length, "colors.length !== icons.length" ); const groupDefaultAvatars = GroupAvatarIcons.map( (icon, index) => ({ id: index, color: groupIconColors[index], icon }) ); const personalDefaultAvatars = PersonalAvatarIcons.map((icon, index) => ({ id: index, color: personalIconColors[index], icon })); function getDefaultAvatars(isGroup) { if (isGroup) { return groupDefaultAvatars; } return personalDefaultAvatars; } __name(getDefaultAvatars, "getDefaultAvatars"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { GroupAvatarIcons, PersonalAvatarIcons, getDefaultAvatars }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var BodyRange_std_exports = {}; __export(BodyRange_std_exports, { BodyRange: () => BodyRange, DisplayStyle: () => DisplayStyle, SPOILER_REPLACEMENT: () => SPOILER_REPLACEMENT, applyRangeToText: () => applyRangeToText, applyRangesToText: () => applyRangesToText, areBodyRangesEqual: () => areBodyRangesEqual, collapseRangeTree: () => collapseRangeTree, groupContiguousSpoilers: () => groupContiguousSpoilers, insertRange: () => insertRange, processBodyRangesForSearchResult: () => processBodyRangesForSearchResult, trimMessageWhitespace: () => trimMessageWhitespace }); module.exports = __toCommonJS(BodyRange_std_exports); var import_lodash = __toESM(require("lodash")); var import_index_std = require("../protobuf/index.std.js"); var import_log_std = require("../logging/log.std.js"); var import_missingCaseError_std = require("../util/missingCaseError.std.js"); var import_isNotNil_std = require("../util/isNotNil.std.js"); var import_search_std = require("../util/search.std.js"); var import_assert_std = require("../util/assert.std.js"); const { isEqual, isNumber, omit, orderBy, partition } = import_lodash.default; const log = (0, import_log_std.createLogger)("BodyRange"); var DisplayStyle = /* @__PURE__ */ ((DisplayStyle2) => { DisplayStyle2["SearchKeywordHighlight"] = "SearchKeywordHighlight"; return DisplayStyle2; })(DisplayStyle || {}); var BodyRange; ((BodyRange2) => { ({ Style: BodyRange2.Style } = import_index_std.SignalService.BodyRange); function isRawRange(range) { return isMention(range) || isFormatting(range); } BodyRange2.isRawRange = isRawRange; __name(isRawRange, "isRawRange"); function isMention(bodyRange) { return "mentionAci" in bodyRange; } BodyRange2.isMention = isMention; __name(isMention, "isMention"); function isFormatting(bodyRange) { return "style" in bodyRange; } BodyRange2.isFormatting = isFormatting; __name(isFormatting, "isFormatting"); function isLink(node) { return "url" in node; } BodyRange2.isLink = isLink; __name(isLink, "isLink"); function isDisplayOnly(node) { return "displayStyle" in node; } BodyRange2.isDisplayOnly = isDisplayOnly; __name(isDisplayOnly, "isDisplayOnly"); })(BodyRange || (BodyRange = {})); function insertRange(range, rangeTree) { const [current, ...rest] = rangeTree; if (!current) { return [{ ...range, ranges: [] }]; } const rangeEnd = range.start + range.length; const currentEnd = current.start + current.length; if (rangeEnd <= current.start) { return [{ ...range, ranges: [] }, current, ...rest]; } if (range.start >= currentEnd) { return [current, ...insertRange(range, rest)]; } if (range.start >= current.start && rangeEnd <= currentEnd) { return [ { ...current, ranges: insertRange( { ...range, start: range.start - current.start }, current.ranges ) }, ...rest ]; } if (range.start < current.start && rangeEnd > currentEnd) { return [ { ...range, length: current.start - range.start, ranges: [] }, { ...current, ranges: insertRange( { ...range, start: 0, length: current.length }, current.ranges ) }, ...insertRange( { ...range, start: currentEnd, length: rangeEnd - currentEnd }, rest ) ]; } if (range.start < current.start && rangeEnd <= currentEnd) { return [ { ...range, length: current.start - range.start, ranges: [] }, { ...current, ranges: insertRange( { ...range, start: 0, length: range.length - (current.start - range.start) }, current.ranges ) }, ...rest ]; } if (range.start >= current.start && rangeEnd > currentEnd) { return [ { ...current, ranges: insertRange( { ...range, start: range.start - current.start, length: currentEnd - range.start }, current.ranges ) }, ...insertRange( { ...range, start: currentEnd, length: range.length - (currentEnd - range.start) }, rest ) ]; } log.error(`MessageTextRenderer: unhandled range ${range}`); throw new Error("unhandled range"); } __name(insertRange, "insertRange"); function rangeToPartialNode(range) { if (BodyRange.isFormatting(range)) { if (range.style === BodyRange.Style.BOLD) { return { isBold: true }; } if (range.style === BodyRange.Style.ITALIC) { return { isItalic: true }; } if (range.style === BodyRange.Style.MONOSPACE) { return { isMonospace: true }; } if (range.style === BodyRange.Style.SPOILER) { return { isSpoiler: true, spoilerId: range.spoilerId }; } if (range.style === BodyRange.Style.STRIKETHROUGH) { return { isStrikethrough: true }; } if (range.style === BodyRange.Style.NONE) { return {}; } return {}; } if (BodyRange.isLink(range)) { return { url: range.url }; } if (BodyRange.isDisplayOnly(range)) { if (range.displayStyle === "SearchKeywordHighlight" /* SearchKeywordHighlight */) { return { isKeywordHighlight: true }; } throw (0, import_missingCaseError_std.missingCaseError)(range.displayStyle); } throw (0, import_missingCaseError_std.missingCaseError)(range); } __name(rangeToPartialNode, "rangeToPartialNode"); function collapseRangeTree({ parentData, parentOffset = 0, text, tree }) { let collapsed = []; let offset = 0; let mentions = []; tree.forEach((range) => { if (BodyRange.isMention(range)) { mentions.push({ ...omit(range, ["ranges"]), start: range.start - offset }); return; } if (range.start > offset) { collapsed.push({ ...parentData, text: text.slice(offset, range.start), start: offset + parentOffset, length: range.start - offset, mentions }); mentions = []; } const partialNode = { ...parentData, ...rangeToPartialNode(range) }; collapsed = collapsed.concat( collapseRangeTree({ parentData: partialNode, parentOffset: range.start + parentOffset, text: text.slice(range.start, range.start + range.length), tree: range.ranges }) ); offset = range.start + range.length; }); if (text.length > offset) { collapsed.push({ ...parentData, text: text.slice(offset, text.length), start: offset + parentOffset, length: text.length - offset, mentions }); } return collapsed; } __name(collapseRangeTree, "collapseRangeTree"); function groupContiguousSpoilers(nodes) { const result = []; let spoilerContainer; nodes.forEach((node) => { if (node.isSpoiler) { if (spoilerContainer && isNumber(spoilerContainer.spoilerId) && spoilerContainer.spoilerId === node.spoilerId) { spoilerContainer.spoilerChildren = [ ...spoilerContainer.spoilerChildren || [], node ]; } else { spoilerContainer = void 0; } if (!spoilerContainer) { spoilerContainer = { ...node, isSpoiler: true, spoilerChildren: [node] }; result.push(spoilerContainer); } } else { spoilerContainer = void 0; result.push(node); } }); return result; } __name(groupContiguousSpoilers, "groupContiguousSpoilers"); const TRUNCATION_CHAR = "..."; const TRUNCATION_START = new RegExp(`^${import_search_std.SNIPPET_TRUNCATION_PLACEHOLDER}`); const TRUNCATION_END = new RegExp(`${import_search_std.SNIPPET_TRUNCATION_PLACEHOLDER}$`); function processBodyRangesForSearchResult({ snippet, body, bodyRanges }) { const cleanedSnippet = snippet.replace(new RegExp(import_search_std.SNIPPET_LEFT_PLACEHOLDER, "g"), "").replace(new RegExp(import_search_std.SNIPPET_RIGHT_PLACEHOLDER, "g"), ""); const withNoStartTruncation = cleanedSnippet.replace(TRUNCATION_START, ""); const withNoEndTruncation = withNoStartTruncation.replace(TRUNCATION_END, ""); const finalSnippet = cleanedSnippet.replace(TRUNCATION_START, TRUNCATION_CHAR).replace(TRUNCATION_END, TRUNCATION_CHAR); const truncationDelta = withNoStartTruncation.length !== cleanedSnippet.length ? TRUNCATION_CHAR.length : 0; let startOfSnippet = body.indexOf(withNoEndTruncation); if (startOfSnippet === -1) { (0, import_assert_std.assertDev)(false, `No match found for "${snippet}" inside "${body}"`); startOfSnippet = 0; } const endOfSnippet = startOfSnippet + withNoEndTruncation.length; const filteredBodyRanges = bodyRanges.filter((range) => { const { start } = range; const end = range.start + range.length; return end > startOfSnippet && start < endOfSnippet; }); const adjustedBodyRanges = filteredBodyRanges.map((range) => { const normalizedStart = range.start - startOfSnippet + truncationDelta; const start = Math.max(normalizedStart, truncationDelta); const end = Math.min( normalizedStart + range.length, withNoEndTruncation.length + truncationDelta ); return { ...range, start, length: end - start }; }); const highlightMatches = snippet.matchAll( new RegExp( `${import_search_std.SNIPPET_LEFT_PLACEHOLDER}(.*?)${import_search_std.SNIPPET_RIGHT_PLACEHOLDER}`, "dg" ) ); let placeholderCharsSkipped = 0; for (const highlightMatch of highlightMatches) { const { indices } = highlightMatch; const [wholeMatchStartIdx] = indices[0]; const [matchedWordStartIdx, matchedWordEndIdx] = indices[1]; adjustedBodyRanges.push({ start: wholeMatchStartIdx + -placeholderCharsSkipped + (truncationDelta ? TRUNCATION_CHAR.length - import_search_std.SNIPPET_TRUNCATION_PLACEHOLDER.length : 0), length: matchedWordEndIdx - matchedWordStartIdx, displayStyle: "SearchKeywordHighlight" /* SearchKeywordHighlight */ }); placeholderCharsSkipped += import_search_std.SNIPPET_LEFT_PLACEHOLDER.length + import_search_std.SNIPPET_RIGHT_PLACEHOLDER.length; } return { cleanedSnippet: finalSnippet, bodyRanges: adjustedBodyRanges }; } __name(processBodyRangesForSearchResult, "processBodyRangesForSearchResult"); const SPOILER_REPLACEMENT = "\u25A0\u25A0\u25A0\u25A0"; function replaceText(input, insert, start, end) { return input.slice(0, start) + insert + input.slice(end); } __name(replaceText, "replaceText"); function snapSpanToEdgesOfReplacement(span, replacement) { if (span.start >= span.end) { return null; } if (span.start > replacement.start && span.end <= replacement.end || span.start >= replacement.start && span.end < replacement.end) { return null; } let start; if (span.start < replacement.start) { start = span.start; } else if (span.start === replacement.start) { start = replacement.start; } else if (span.start < replacement.end) { start = replacement.start; } else if (span.start === replacement.end) { start = replacement.end; } else { start = span.start; } let end; if (span.end < replacement.start) { end = span.end; } else if (span.end === replacement.start) { end = replacement.start; } else if (span.end < replacement.end) { end = replacement.end; } else if (span.end === replacement.end) { end = replacement.end; } else { end = span.end; } if (start === end) { return null; } return { start, end }; } __name(snapSpanToEdgesOfReplacement, "snapSpanToEdgesOfReplacement"); function toSpan(range) { return { start: range.start, end: range.start + range.length }; } __name(toSpan, "toSpan"); function applyRangeToText(input, replacement) { let insert; if (BodyRange.isMention(replacement)) { insert = `@${replacement.replacementText}`; } else if (BodyRange.isFormatting(replacement) && replacement.style === BodyRange.Style.SPOILER) { insert = SPOILER_REPLACEMENT; } else { throw new Error("Invalid range"); } const updatedBody = replaceText( input.body, insert, replacement.start, replacement.start + replacement.length ); const updatedRanges = input.bodyRanges.map((otherRange) => { const otherRangeSpan = toSpan(otherRange); const replacementSpan = toSpan(replacement); const result = snapSpanToEdgesOfReplacement( otherRangeSpan, replacementSpan ); if (result == null) { return null; } let { start, end } = result; const insertionDiff = insert.length - replacement.length; if (start >= replacementSpan.end) { start += insertionDiff; } if (end >= replacementSpan.end) { end += insertionDiff; } return { ...otherRange, start, length: end - start }; }).filter((r) => { return r != null; }); return { body: updatedBody, bodyRanges: updatedRanges }; } __name(applyRangeToText, "applyRangeToText"); function _applyRangeOfType(input, condition) { const [matchedRanges, otherRanges] = partition(input.bodyRanges, condition); return matchedRanges.sort((a, b) => { return b.start - a.start; }).reduce( (prev, matchedRange) => { return applyRangeToText(prev, matchedRange); }, { body: input.body, bodyRanges: otherRanges } ); } __name(_applyRangeOfType, "_applyRangeOfType"); function applyRangesToText(input, options) { let state = input; if (state.bodyRanges.length === 0) { return state; } if (options.replaceSpoilers) { state = _applyRangeOfType(state, (bodyRange) => { return BodyRange.isFormatting(bodyRange) && bodyRange.style === BodyRange.Style.SPOILER; }); } if (options.replaceMentions) { state = _applyRangeOfType(state, (bodyRange) => { return BodyRange.isMention(bodyRange); }); } return state; } __name(applyRangesToText, "applyRangesToText"); function trimMessageWhitespace(input) { if (input.body == null) { return input; } let trimmedAtStart = input.body.trimStart(); let minimumIndex = input.body.length - trimmedAtStart.length; let allTrimmed = trimmedAtStart.trimEnd(); let maximumIndex = allTrimmed.length; if (minimumIndex === 0 && trimmedAtStart.length === maximumIndex) { return input; } let earliestMonospaceIndex = Number.MAX_SAFE_INTEGER; input.bodyRanges?.forEach((range) => { if (earliestMonospaceIndex === 0) { return; } if (!BodyRange.isFormatting(range) || range.style !== BodyRange.Style.MONOSPACE) { return; } if (range.start < earliestMonospaceIndex) { earliestMonospaceIndex = range.start; } }); if (earliestMonospaceIndex < minimumIndex) { trimmedAtStart = input.body.slice(earliestMonospaceIndex); minimumIndex = input.body.length - trimmedAtStart.length; allTrimmed = trimmedAtStart.trimEnd(); maximumIndex = allTrimmed.length; } if (earliestMonospaceIndex === 0 && trimmedAtStart.length === maximumIndex) { return input; } const bodyRanges = input.bodyRanges?.map((range) => { let workingRange = range; const rangeEnd = workingRange.start + workingRange.length; if (rangeEnd <= minimumIndex) { return void 0; } if (workingRange.start < minimumIndex) { const underMinimum = workingRange.start - minimumIndex; workingRange = { ...workingRange, start: Math.max(underMinimum, 0), length: workingRange.length + underMinimum }; } else { workingRange = { ...workingRange, start: workingRange.start - minimumIndex }; } const newRangeEnd = workingRange.start + workingRange.length; if (workingRange.start >= maximumIndex) { return void 0; } const overMaximum = newRangeEnd - maximumIndex; if (overMaximum > 0) { workingRange = { ...workingRange, length: workingRange.length - overMaximum }; } return workingRange; }).filter(import_isNotNil_std.isNotNil); return { body: allTrimmed, bodyRanges }; } __name(trimMessageWhitespace, "trimMessageWhitespace"); function normalizeBodyRanges(bodyRanges) { return orderBy(bodyRanges, ["start", "length"]).map((item) => { if (BodyRange.isMention(item)) { return { ...item, conversationID: void 0 }; } return item; }); } __name(normalizeBodyRanges, "normalizeBodyRanges"); function areBodyRangesEqual(left, right) { const normalizedLeft = normalizeBodyRanges(left); const sortedRight = normalizeBodyRanges(right); if (normalizedLeft.length !== sortedRight.length) { return false; } return isEqual(normalizedLeft, sortedRight); } __name(areBodyRangesEqual, "areBodyRangesEqual"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { BodyRange, DisplayStyle, SPOILER_REPLACEMENT, applyRangeToText, applyRangesToText, areBodyRangesEqual, collapseRangeTree, groupContiguousSpoilers, insertRange, processBodyRangesForSearchResult, trimMessageWhitespace }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var CallDisposition_std_exports = {}; __export(CallDisposition_std_exports, { AdhocCallStatus: () => AdhocCallStatus, CallDirection: () => CallDirection, CallHistoryFilterStatus: () => CallHistoryFilterStatus, CallLogEvent: () => CallLogEvent, CallMode: () => CallMode, CallStatusValue: () => CallStatusValue, CallType: () => CallType, ClearCallHistoryResult: () => ClearCallHistoryResult, DirectCallStatus: () => DirectCallStatus, GroupCallStatus: () => GroupCallStatus, LocalCallEvent: () => LocalCallEvent, RemoteCallEvent: () => RemoteCallEvent, callDetailsSchema: () => callDetailsSchema, callEventDetailsSchema: () => callEventDetailsSchema, callEventNormalizeSchema: () => callEventNormalizeSchema, callHistoryDetailsSchema: () => callHistoryDetailsSchema, callHistoryGroupSchema: () => callHistoryGroupSchema, callLogEventNormalizeSchema: () => callLogEventNormalizeSchema, isSameCallHistoryGroup: () => isSameCallHistoryGroup }); module.exports = __toCommonJS(CallDisposition_std_exports); var import_zod = require("zod"); var import_long = __toESM(require("long")); var import_ServiceId_std = require("./ServiceId.std.js"); var import_uuidToBytes_std = require("../util/uuidToBytes.std.js"); var import_index_std = require("../protobuf/index.std.js"); var Bytes = __toESM(require("../Bytes.std.js")); var import_Crypto_std = require("./Crypto.std.js"); var CallMode = /* @__PURE__ */ ((CallMode2) => { CallMode2["Direct"] = "Direct"; CallMode2["Group"] = "Group"; CallMode2["Adhoc"] = "Adhoc"; return CallMode2; })(CallMode || {}); var CallType = /* @__PURE__ */ ((CallType2) => { CallType2["Audio"] = "Audio"; CallType2["Video"] = "Video"; CallType2["Group"] = "Group"; CallType2["Adhoc"] = "Adhoc"; CallType2["Unknown"] = "Unknown"; return CallType2; })(CallType || {}); var CallDirection = /* @__PURE__ */ ((CallDirection2) => { CallDirection2["Incoming"] = "Incoming"; CallDirection2["Outgoing"] = "Outgoing"; CallDirection2["Unknown"] = "Unknown"; return CallDirection2; })(CallDirection || {}); var CallLogEvent = /* @__PURE__ */ ((CallLogEvent2) => { CallLogEvent2["Clear"] = "Clear"; CallLogEvent2["MarkedAsRead"] = "MarkedAsRead"; CallLogEvent2["MarkedAsReadInConversation"] = "MarkedAsReadInConversation"; return CallLogEvent2; })(CallLogEvent || {}); var LocalCallEvent = /* @__PURE__ */ ((LocalCallEvent2) => { LocalCallEvent2["Started"] = "LocalStarted"; LocalCallEvent2["Ringing"] = "LocalRinging"; LocalCallEvent2["Accepted"] = "LocalAccepted"; LocalCallEvent2["Declined"] = "LocalDeclined"; LocalCallEvent2["Hangup"] = "LocalHangup"; LocalCallEvent2["RemoteHangup"] = "LocalRemoteHangup"; LocalCallEvent2["Missed"] = "LocalMissed"; LocalCallEvent2["Delete"] = "LocalDelete"; return LocalCallEvent2; })(LocalCallEvent || {}); var RemoteCallEvent = /* @__PURE__ */ ((RemoteCallEvent2) => { RemoteCallEvent2["Accepted"] = "Accepted"; RemoteCallEvent2["NotAccepted"] = "NotAccepted"; RemoteCallEvent2["Delete"] = "Delete"; RemoteCallEvent2["Observed"] = "Observed"; return RemoteCallEvent2; })(RemoteCallEvent || {}); var CallStatusValue = /* @__PURE__ */ ((CallStatusValue2) => { CallStatusValue2["Pending"] = "Pending"; CallStatusValue2["Accepted"] = "Accepted"; CallStatusValue2["Missed"] = "Missed"; CallStatusValue2["MissedNotificationProfile"] = "MissedNotificationProfile"; CallStatusValue2["Declined"] = "Declined"; CallStatusValue2["Deleted"] = "Deleted"; CallStatusValue2["GenericGroupCall"] = "GenericGroupCall"; CallStatusValue2["GenericAdhocCall"] = "GenericAdhocCall"; CallStatusValue2["OutgoingRing"] = "OutgoingRing"; CallStatusValue2["Ringing"] = "Ringing"; CallStatusValue2["Joined"] = "Joined"; CallStatusValue2["JoinedAdhoc"] = "JoinedAdhoc"; CallStatusValue2["Unknown"] = "Unknown"; return CallStatusValue2; })(CallStatusValue || {}); var DirectCallStatus = /* @__PURE__ */ ((DirectCallStatus2) => { DirectCallStatus2["Pending"] = "Pending" /* Pending */; DirectCallStatus2["Accepted"] = "Accepted" /* Accepted */; DirectCallStatus2["Missed"] = "Missed" /* Missed */; DirectCallStatus2["MissedNotificationProfile"] = "MissedNotificationProfile" /* MissedNotificationProfile */; DirectCallStatus2["Declined"] = "Declined" /* Declined */; DirectCallStatus2["Deleted"] = "Deleted" /* Deleted */; DirectCallStatus2["Unknown"] = "Unknown" /* Unknown */; return DirectCallStatus2; })(DirectCallStatus || {}); var GroupCallStatus = /* @__PURE__ */ ((GroupCallStatus2) => { GroupCallStatus2["GenericGroupCall"] = "GenericGroupCall" /* GenericGroupCall */; GroupCallStatus2["OutgoingRing"] = "OutgoingRing" /* OutgoingRing */; GroupCallStatus2["Ringing"] = "Ringing" /* Ringing */; GroupCallStatus2["Joined"] = "Joined" /* Joined */; GroupCallStatus2["Accepted"] = "Accepted" /* Accepted */; GroupCallStatus2["Missed"] = "Missed" /* Missed */; GroupCallStatus2["MissedNotificationProfile"] = "MissedNotificationProfile" /* MissedNotificationProfile */; GroupCallStatus2["Declined"] = "Declined" /* Declined */; GroupCallStatus2["Deleted"] = "Deleted" /* Deleted */; return GroupCallStatus2; })(GroupCallStatus || {}); var AdhocCallStatus = /* @__PURE__ */ ((AdhocCallStatus2) => { AdhocCallStatus2["Generic"] = "GenericAdhocCall" /* GenericAdhocCall */; AdhocCallStatus2["Pending"] = "Pending" /* Pending */; AdhocCallStatus2["Joined"] = "JoinedAdhoc" /* JoinedAdhoc */; AdhocCallStatus2["Deleted"] = "Deleted" /* Deleted */; AdhocCallStatus2["Unknown"] = "Unknown" /* Unknown */; return AdhocCallStatus2; })(AdhocCallStatus || {}); var CallHistoryFilterStatus = /* @__PURE__ */ ((CallHistoryFilterStatus2) => { CallHistoryFilterStatus2["All"] = "All"; CallHistoryFilterStatus2["Missed"] = "Missed"; return CallHistoryFilterStatus2; })(CallHistoryFilterStatus || {}); var ClearCallHistoryResult = /* @__PURE__ */ ((ClearCallHistoryResult2) => { ClearCallHistoryResult2["Success"] = "Success"; ClearCallHistoryResult2["Error"] = "Error"; ClearCallHistoryResult2["ErrorDeletingCallLinks"] = "ErrorDeletingCallLinks"; return ClearCallHistoryResult2; })(ClearCallHistoryResult || {}); const ringerIdSchema = import_zod.z.union([import_ServiceId_std.aciSchema, import_zod.z.string(), import_zod.z.null()]); const callModeSchema = import_zod.z.nativeEnum(CallMode); const callTypeSchema = import_zod.z.nativeEnum(CallType); const callDirectionSchema = import_zod.z.nativeEnum(CallDirection); const callEventSchema = import_zod.z.union([ import_zod.z.nativeEnum(LocalCallEvent), import_zod.z.nativeEnum(RemoteCallEvent) ]); const callStatusSchema = import_zod.z.union([ import_zod.z.nativeEnum(DirectCallStatus), import_zod.z.nativeEnum(GroupCallStatus), import_zod.z.nativeEnum(AdhocCallStatus) ]); const callDetailsSchema = import_zod.z.object({ callId: import_zod.z.string(), peerId: import_zod.z.string(), ringerId: ringerIdSchema, startedById: import_ServiceId_std.aciSchema.or(import_zod.z.null()), mode: callModeSchema, type: callTypeSchema, direction: callDirectionSchema, timestamp: import_zod.z.number(), endedTimestamp: import_zod.z.number().or(import_zod.z.null()) }); const callEventDetailsSchema = callDetailsSchema.extend({ event: callEventSchema, eventSource: import_zod.z.string() }); const callHistoryDetailsSchema = callDetailsSchema.extend({ status: callStatusSchema }); const callHistoryGroupSchema = import_zod.z.object({ peerId: import_zod.z.string(), mode: callModeSchema, type: callTypeSchema, direction: callDirectionSchema, status: callStatusSchema, timestamp: import_zod.z.number(), children: import_zod.z.array( import_zod.z.object({ callId: import_zod.z.string(), timestamp: import_zod.z.number() }) ) }); const conversationPeerIdInBytesSchema = import_zod.z.instanceof(Uint8Array).transform((value) => { if (value.byteLength === import_Crypto_std.UUID_BYTE_SIZE) { const uuid = (0, import_uuidToBytes_std.bytesToUuid)(value); if (uuid != null) { return uuid; } } return Bytes.toBase64(value); }); const roomIdInBytesSchema = import_zod.z.instanceof(Uint8Array).transform((value) => Bytes.toHex(value)); const longToStringSchema = import_zod.z.instanceof(import_long.default).transform((long) => long.toString()); const longToNumberSchema = import_zod.z.instanceof(import_long.default).transform((long) => long.toNumber()); const callEventNormalizeSchema = import_zod.z.object({ callId: longToStringSchema, timestamp: longToNumberSchema, direction: import_zod.z.nativeEnum(import_index_std.SignalService.SyncMessage.CallEvent.Direction), event: import_zod.z.nativeEnum(import_index_std.SignalService.SyncMessage.CallEvent.Event) }).and( import_zod.z.union([ import_zod.z.object({ type: import_zod.z.nativeEnum(import_index_std.SignalService.SyncMessage.CallEvent.Type).refine((val) => val === import_index_std.SignalService.SyncMessage.CallEvent.Type.AD_HOC_CALL), peerId: roomIdInBytesSchema }), import_zod.z.object({ type: import_zod.z.nativeEnum(import_index_std.SignalService.SyncMessage.CallEvent.Type).refine((val) => val !== import_index_std.SignalService.SyncMessage.CallEvent.Type.AD_HOC_CALL), peerId: conversationPeerIdInBytesSchema }) ]) ); const callLogEventNormalizeSchema = import_zod.z.object({ type: import_zod.z.nativeEnum(import_index_std.SignalService.SyncMessage.CallLogEvent.Type), timestamp: longToNumberSchema, peerIdAsConversationId: conversationPeerIdInBytesSchema.optional(), peerIdAsRoomId: roomIdInBytesSchema.optional(), callId: longToStringSchema.optional() }); function isSameCallHistoryGroup(a, b) { return a.peerId === b.peerId && a.timestamp === b.timestamp && // For a bit more safety. a.mode === b.mode && a.type === b.type && a.direction === b.direction && a.status === b.status; } __name(isSameCallHistoryGroup, "isSameCallHistoryGroup"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { AdhocCallStatus, CallDirection, CallHistoryFilterStatus, CallLogEvent, CallMode, CallStatusValue, CallType, ClearCallHistoryResult, DirectCallStatus, GroupCallStatus, LocalCallEvent, RemoteCallEvent, callDetailsSchema, callEventDetailsSchema, callEventNormalizeSchema, callHistoryDetailsSchema, callHistoryGroupSchema, callLogEventNormalizeSchema, isSameCallHistoryGroup }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var CallLink_std_exports = {}; __export(CallLink_std_exports, { CallLinkNameMaxByteLength: () => CallLinkNameMaxByteLength, CallLinkNameMaxLength: () => CallLinkNameMaxLength, CallLinkRestrictions: () => CallLinkRestrictions, CallLinkUpdateSyncType: () => CallLinkUpdateSyncType, callLinkNameSchema: () => callLinkNameSchema, callLinkRecordSchema: () => callLinkRecordSchema, callLinkRestrictionsSchema: () => callLinkRestrictionsSchema, defunctCallLinkRecordSchema: () => defunctCallLinkRecordSchema, isCallLinkAdmin: () => isCallLinkAdmin, toCallLinkRestrictions: () => toCallLinkRestrictions }); module.exports = __toCommonJS(CallLink_std_exports); var import_zod = require("zod"); var import_numbers_std = require("../util/numbers.std.js"); var import_Bytes_std = require("../Bytes.std.js"); var import_schemas_std = require("../util/schemas.std.js"); var CallLinkUpdateSyncType = /* @__PURE__ */ ((CallLinkUpdateSyncType2) => { CallLinkUpdateSyncType2["Update"] = "Update"; CallLinkUpdateSyncType2["Delete"] = "Delete"; return CallLinkUpdateSyncType2; })(CallLinkUpdateSyncType || {}); const CallLinkNameMaxByteLength = 120; const CallLinkNameMaxLength = 32; const callLinkNameSchema = import_zod.z.string().refine((input) => { return (0, import_Bytes_std.byteLength)(input) <= 120; }); var CallLinkRestrictions = /* @__PURE__ */ ((CallLinkRestrictions2) => { CallLinkRestrictions2[CallLinkRestrictions2["None"] = 0] = "None"; CallLinkRestrictions2[CallLinkRestrictions2["AdminApproval"] = 1] = "AdminApproval"; CallLinkRestrictions2[CallLinkRestrictions2["Unknown"] = 2] = "Unknown"; return CallLinkRestrictions2; })(CallLinkRestrictions || {}); const callLinkRestrictionsSchema = import_zod.z.nativeEnum(CallLinkRestrictions); function toCallLinkRestrictions(restrictions) { return (0, import_schemas_std.parsePartial)( callLinkRestrictionsSchema, (0, import_numbers_std.safeParseInteger)(restrictions) ); } __name(toCallLinkRestrictions, "toCallLinkRestrictions"); const defunctCallLinkRecordSchema = import_zod.z.object({ roomId: import_zod.z.string(), rootKey: import_zod.z.instanceof(Uint8Array), epoch: import_zod.z.instanceof(Uint8Array).nullable(), adminKey: import_zod.z.instanceof(Uint8Array).nullable(), storageID: import_zod.z.string().nullable(), storageVersion: import_zod.z.number().int().nullable(), storageUnknownFields: import_zod.z.instanceof(Uint8Array).nullable(), storageNeedsSync: import_zod.z.union([import_zod.z.literal(1), import_zod.z.literal(0)]) }); const callLinkRecordSchema = import_zod.z.object({ roomId: import_zod.z.string(), // credentials rootKey: import_zod.z.instanceof(Uint8Array).nullable(), epoch: import_zod.z.instanceof(Uint8Array).nullable(), adminKey: import_zod.z.instanceof(Uint8Array).nullable(), // state name: callLinkNameSchema, restrictions: callLinkRestrictionsSchema, expiration: import_zod.z.number().int().nullable(), revoked: import_zod.z.union([import_zod.z.literal(1), import_zod.z.literal(0)]), deleted: import_zod.z.union([import_zod.z.literal(1), import_zod.z.literal(0)]).optional(), deletedAt: import_zod.z.number().int().nullable().optional(), storageID: import_zod.z.string().nullable(), storageVersion: import_zod.z.number().int().nullable(), storageUnknownFields: import_zod.z.instanceof(Uint8Array).nullable(), storageNeedsSync: import_zod.z.union([import_zod.z.literal(1), import_zod.z.literal(0)]) }); function isCallLinkAdmin(callLink) { return callLink.adminKey != null; } __name(isCallLinkAdmin, "isCallLinkAdmin"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { CallLinkNameMaxByteLength, CallLinkNameMaxLength, CallLinkRestrictions, CallLinkUpdateSyncType, callLinkNameSchema, callLinkRecordSchema, callLinkRestrictionsSchema, defunctCallLinkRecordSchema, isCallLinkAdmin, toCallLinkRestrictions }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var CallQualitySurvey_std_exports = {}; __export(CallQualitySurvey_std_exports, { CallQualitySurvey: () => CallQualitySurvey }); module.exports = __toCommonJS(CallQualitySurvey_std_exports); var CallQualitySurvey; ((CallQualitySurvey2) => { let Issue; ((Issue2) => { Issue2["AUDIO"] = "audio"; Issue2["AUDIO_STUTTERING"] = "audio_stuttering"; Issue2["AUDIO_LOCAL_ECHO"] = "audio_local_echo"; Issue2["AUDIO_REMOTE_ECHO"] = "audio_remote_echo"; Issue2["AUDIO_DROP"] = "audio_drop"; Issue2["VIDEO"] = "video"; Issue2["VIDEO_NO_CAMERA"] = "video_no_camera"; Issue2["VIDEO_LOW_QUALITY"] = "video_low_quality"; Issue2["VIDEO_LOW_RESOLUTION"] = "video_low_resolution"; Issue2["CALL_DROPPED"] = "call_dropped"; Issue2["OTHER"] = "other"; })(Issue = CallQualitySurvey2.Issue || (CallQualitySurvey2.Issue = {})); let CallType; ((CallType2) => { CallType2["DIRECT_VOICE"] = "direct_voice"; CallType2["DIRECT_VIDEO"] = "direct_video"; CallType2["GROUP"] = "group"; CallType2["CALL_LINK"] = "call_link"; })(CallType = CallQualitySurvey2.CallType || (CallQualitySurvey2.CallType = {})); })(CallQualitySurvey || (CallQualitySurvey = {})); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { CallQualitySurvey }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var Calling_std_exports = {}; __export(Calling_std_exports, { CALLING_REACTIONS_LIFETIME: () => CALLING_REACTIONS_LIFETIME, CallEndedReason: () => CallEndedReason, CallState: () => CallState, CallViewMode: () => CallViewMode, CallingDeviceType: () => CallingDeviceType, GroupCallConnectionState: () => GroupCallConnectionState, GroupCallJoinState: () => GroupCallJoinState, MAX_CALLING_REACTIONS: () => MAX_CALLING_REACTIONS, ScreenShareStatus: () => ScreenShareStatus }); module.exports = __toCommonJS(Calling_std_exports); const MAX_CALLING_REACTIONS = 5; const CALLING_REACTIONS_LIFETIME = 4e3; var CallViewMode = /* @__PURE__ */ ((CallViewMode2) => { CallViewMode2["Paginated"] = "Paginated"; CallViewMode2["Sidebar"] = "Sidebar"; CallViewMode2["Speaker"] = "Speaker"; CallViewMode2["Presentation"] = "Presentation"; return CallViewMode2; })(CallViewMode || {}); var CallState = /* @__PURE__ */ ((CallState2) => { CallState2["Prering"] = "idle"; CallState2["Ringing"] = "ringing"; CallState2["Accepted"] = "connected"; CallState2["Reconnecting"] = "connecting"; CallState2["Ended"] = "ended"; return CallState2; })(CallState || {}); var CallEndedReason = /* @__PURE__ */ ((CallEndedReason2) => { CallEndedReason2["LocalHangup"] = "LocalHangup"; CallEndedReason2["RemoteHangup"] = "RemoteHangup"; CallEndedReason2["RemoteHangupNeedPermission"] = "RemoteHangupNeedPermission"; CallEndedReason2["Declined"] = "Declined"; CallEndedReason2["Busy"] = "Busy"; CallEndedReason2["Glare"] = "Glare"; CallEndedReason2["ReCall"] = "ReCall"; CallEndedReason2["ReceivedOfferExpired"] = "ReceivedOfferExpired"; CallEndedReason2["ReceivedOfferWhileActive"] = "ReceivedOfferWhileActive"; CallEndedReason2["ReceivedOfferWithGlare"] = "ReceivedOfferWithGlare"; CallEndedReason2["SignalingFailure"] = "SignalingFailure"; CallEndedReason2["GlareFailure"] = "GlareFailure"; CallEndedReason2["ConnectionFailure"] = "ConnectionFailure"; CallEndedReason2["InternalFailure"] = "InternalFailure"; CallEndedReason2["Timeout"] = "Timeout"; CallEndedReason2["AcceptedOnAnotherDevice"] = "AcceptedOnAnotherDevice"; CallEndedReason2["DeclinedOnAnotherDevice"] = "DeclinedOnAnotherDevice"; CallEndedReason2["BusyOnAnotherDevice"] = "BusyOnAnotherDevice"; CallEndedReason2["UnexpectedReason"] = "UnexpectedReason"; return CallEndedReason2; })(CallEndedReason || {}); var GroupCallConnectionState = /* @__PURE__ */ ((GroupCallConnectionState2) => { GroupCallConnectionState2[GroupCallConnectionState2["NotConnected"] = 0] = "NotConnected"; GroupCallConnectionState2[GroupCallConnectionState2["Connecting"] = 1] = "Connecting"; GroupCallConnectionState2[GroupCallConnectionState2["Connected"] = 2] = "Connected"; GroupCallConnectionState2[GroupCallConnectionState2["Reconnecting"] = 3] = "Reconnecting"; return GroupCallConnectionState2; })(GroupCallConnectionState || {}); var GroupCallJoinState = /* @__PURE__ */ ((GroupCallJoinState2) => { GroupCallJoinState2[GroupCallJoinState2["NotJoined"] = 0] = "NotJoined"; GroupCallJoinState2[GroupCallJoinState2["Joining"] = 1] = "Joining"; GroupCallJoinState2[GroupCallJoinState2["Pending"] = 2] = "Pending"; GroupCallJoinState2[GroupCallJoinState2["Joined"] = 3] = "Joined"; return GroupCallJoinState2; })(GroupCallJoinState || {}); var CallingDeviceType = /* @__PURE__ */ ((CallingDeviceType2) => { CallingDeviceType2[CallingDeviceType2["CAMERA"] = 0] = "CAMERA"; CallingDeviceType2[CallingDeviceType2["MICROPHONE"] = 1] = "MICROPHONE"; CallingDeviceType2[CallingDeviceType2["SPEAKER"] = 2] = "SPEAKER"; return CallingDeviceType2; })(CallingDeviceType || {}); var ScreenShareStatus = /* @__PURE__ */ ((ScreenShareStatus2) => { ScreenShareStatus2["Connected"] = "Connected"; ScreenShareStatus2["Reconnecting"] = "Reconnecting"; ScreenShareStatus2["Disconnected"] = "Disconnected"; return ScreenShareStatus2; })(ScreenShareStatus || {}); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { CALLING_REACTIONS_LIFETIME, CallEndedReason, CallState, CallViewMode, CallingDeviceType, GroupCallConnectionState, GroupCallJoinState, MAX_CALLING_REACTIONS, ScreenShareStatus }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var ChatFolder_std_exports = {}; __export(ChatFolder_std_exports, { ALL_CHATS_FOLDER_REQUIRED_PARAMS: () => ALL_CHATS_FOLDER_REQUIRED_PARAMS, CHAT_FOLDER_DEFAULTS: () => CHAT_FOLDER_DEFAULTS, CHAT_FOLDER_DELETED_POSITION: () => CHAT_FOLDER_DELETED_POSITION, CHAT_FOLDER_NAME_MAX_CHAR_LENGTH: () => CHAT_FOLDER_NAME_MAX_CHAR_LENGTH, CHAT_FOLDER_PRESETS: () => CHAT_FOLDER_PRESETS, ChatFolderParamsSchema: () => ChatFolderParamsSchema, ChatFolderPresetSchema: () => ChatFolderPresetSchema, ChatFolderSchema: () => ChatFolderSchema, ChatFolderType: () => ChatFolderType, isConversationInChatFolder: () => isConversationInChatFolder, isSameChatFolderParams: () => isSameChatFolderParams, matchesChatFolderPreset: () => matchesChatFolderPreset, validateChatFolderParams: () => validateChatFolderParams }); module.exports = __toCommonJS(ChatFolder_std_exports); var import_zod = require("zod"); var grapheme = __toESM(require("../util/grapheme.std.js")); var import_isConversationUnread_std = require("../util/isConversationUnread.std.js"); const CHAT_FOLDER_NAME_MAX_CHAR_LENGTH = 32; const CHAT_FOLDER_DELETED_POSITION = 4294967295; var ChatFolderType = /* @__PURE__ */ ((ChatFolderType2) => { ChatFolderType2[ChatFolderType2["UNKNOWN"] = 0] = "UNKNOWN"; ChatFolderType2[ChatFolderType2["ALL"] = 1] = "ALL"; ChatFolderType2[ChatFolderType2["CUSTOM"] = 2] = "CUSTOM"; return ChatFolderType2; })(ChatFolderType || {}); const ChatFolderPresetSchema = import_zod.z.object({ folderType: import_zod.z.nativeEnum(ChatFolderType), showOnlyUnread: import_zod.z.boolean(), showMutedChats: import_zod.z.boolean(), includeAllIndividualChats: import_zod.z.boolean(), includeAllGroupChats: import_zod.z.boolean(), includedConversationIds: import_zod.z.array(import_zod.z.string().uuid()).readonly(), excludedConversationIds: import_zod.z.array(import_zod.z.string().uuid()).readonly() }); const ChatFolderParamsSchema = ChatFolderPresetSchema.extend({ name: import_zod.z.string().transform((input) => input.normalize().trim()) }); const ChatFolderSchema = ChatFolderParamsSchema.extend({ id: import_zod.z.intersection(import_zod.z.string(), import_zod.z.custom()), position: import_zod.z.number().int().gte(0), deletedAtTimestampMs: import_zod.z.number().int().positive(), storageID: import_zod.z.string().nullable(), storageVersion: import_zod.z.number().nullable(), storageUnknownFields: import_zod.z.instanceof(Uint8Array).nullable(), storageNeedsSync: import_zod.z.boolean() }); const CHAT_FOLDER_DEFAULTS = { folderType: 2 /* CUSTOM */, name: "", showOnlyUnread: false, showMutedChats: true, includeAllIndividualChats: false, includeAllGroupChats: false, includedConversationIds: [], excludedConversationIds: [] }; const ALL_CHATS_FOLDER_REQUIRED_PARAMS = { folderType: 1 /* ALL */, name: "", showOnlyUnread: false, showMutedChats: true, includeAllIndividualChats: true, includeAllGroupChats: true, includedConversationIds: [], excludedConversationIds: [] }; const CHAT_FOLDER_PRESETS = { UNREAD_CHATS: { ...CHAT_FOLDER_DEFAULTS, showOnlyUnread: true, // only unread includeAllIndividualChats: true, // all 1:1's includeAllGroupChats: true // all groups }, INDIVIDUAL_CHATS: { ...CHAT_FOLDER_DEFAULTS, includeAllIndividualChats: true // all 1:1's }, GROUP_CHATS: { ...CHAT_FOLDER_DEFAULTS, includeAllGroupChats: true // all groups } }; function validateChatFolderParams(params) { return params.name !== "" && grapheme.count(params.name) <= CHAT_FOLDER_NAME_MAX_CHAR_LENGTH; } __name(validateChatFolderParams, "validateChatFolderParams"); function matchesChatFolderPreset(params, preset) { return params.folderType === preset.folderType && params.showOnlyUnread === preset.showOnlyUnread && params.showMutedChats === preset.showMutedChats && params.includeAllIndividualChats === preset.includeAllIndividualChats && params.includeAllGroupChats === preset.includeAllGroupChats && isSameConversationIds( params.includedConversationIds, preset.includedConversationIds ) && isSameConversationIds( params.excludedConversationIds, preset.excludedConversationIds ); } __name(matchesChatFolderPreset, "matchesChatFolderPreset"); function isSameChatFolderParams(a, b) { return a.name === b.name && matchesChatFolderPreset(a, b); } __name(isSameChatFolderParams, "isSameChatFolderParams"); function isSameConversationIds(a, b) { return new Set(a).symmetricDifference(new Set(b)).size === 0; } __name(isSameConversationIds, "isSameConversationIds"); function _isConversationIncludedInChatFolder(chatFolder, conversation) { if (chatFolder.includeAllIndividualChats && conversation.type === "direct") { return true; } if (chatFolder.includeAllGroupChats && conversation.type === "group") { return true; } if (chatFolder.includedConversationIds.includes(conversation.id)) { return true; } return false; } __name(_isConversationIncludedInChatFolder, "_isConversationIncludedInChatFolder"); function _isConversationExcludedFromChatFolder(chatFolder, conversation, options) { if (!options.ignoreShowOnlyUnread) { if (chatFolder.showOnlyUnread && !(0, import_isConversationUnread_std.isConversationUnread)(conversation)) { return true; } } if (!options.ignoreShowMutedChats) { if (!chatFolder.showMutedChats && (conversation.muteExpiresAt ?? 0) > 0) { return true; } } if (chatFolder.excludedConversationIds.includes(conversation.id)) { return true; } return false; } __name(_isConversationExcludedFromChatFolder, "_isConversationExcludedFromChatFolder"); function isConversationInChatFolder(chatFolder, conversation, options = {}) { if (chatFolder.folderType === 1 /* ALL */) { return true; } return _isConversationIncludedInChatFolder(chatFolder, conversation) && !_isConversationExcludedFromChatFolder(chatFolder, conversation, options); } __name(isConversationInChatFolder, "isConversationInChatFolder"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { ALL_CHATS_FOLDER_REQUIRED_PARAMS, CHAT_FOLDER_DEFAULTS, CHAT_FOLDER_DELETED_POSITION, CHAT_FOLDER_NAME_MAX_CHAR_LENGTH, CHAT_FOLDER_PRESETS, ChatFolderParamsSchema, ChatFolderPresetSchema, ChatFolderSchema, ChatFolderType, isConversationInChatFolder, isSameChatFolderParams, matchesChatFolderPreset, validateChatFolderParams }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var Colors_std_exports = {}; __export(Colors_std_exports, { AVATAR_COLOR_COUNT: () => AVATAR_COLOR_COUNT, AvatarColorMap: () => AvatarColorMap, AvatarColors: () => AvatarColors, ContactNameColors: () => ContactNameColors, ConversationColors: () => ConversationColors, DEFAULT_CONVERSATION_COLOR: () => DEFAULT_CONVERSATION_COLOR, getAvatarColor: () => getAvatarColor }); module.exports = __toCommonJS(Colors_std_exports); var import_AxoTokens_std = require("../axo/AxoTokens.std.js"); const AvatarColorMap = new Map( import_AxoTokens_std.AxoTokens.Avatar.getAllColorNames().map((colorName) => { return [colorName, import_AxoTokens_std.AxoTokens.Avatar.getColorValues(colorName)]; }) ); const AvatarColors = import_AxoTokens_std.AxoTokens.Avatar.getAllColorNames(); const AVATAR_COLOR_COUNT = AvatarColors.length; const ConversationColors = [ "ultramarine", "crimson", "vermilion", "burlap", "forest", "wintergreen", "teal", "blue", "indigo", "violet", "plum", "taupe", "steel", "ember", "midnight", "infrared", "lagoon", "fluorescent", "basil", "sublime", "sea", "tangerine" ]; const ContactNameColors = [ "200", "120", "300", "010", "210", "330", "230", "180", "030", "340", "270", "090", "000", "150", "240", "040", "160", "280", "080", "320", "020", "140", "260", "060", "350", "100", "290", "130", "220", "050", "170", "250", "070", "190", "310", "110" ]; const DEFAULT_CONVERSATION_COLOR = { color: "ultramarine" }; function getAvatarColor(color) { return color || AvatarColors[0]; } __name(getAvatarColor, "getAvatarColor"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { AVATAR_COLOR_COUNT, AvatarColorMap, AvatarColors, ContactNameColors, ConversationColors, DEFAULT_CONVERSATION_COLOR, getAvatarColor }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var Conversation_std_exports = {}; __export(Conversation_std_exports, { deleteExternalFiles: () => deleteExternalFiles }); module.exports = __toCommonJS(Conversation_std_exports); async function deleteExternalFiles(conversation, { maybeDeleteAttachmentFile }) { if (!conversation) { return; } const { avatar, profileAvatar } = conversation; if (avatar && avatar.path) { await maybeDeleteAttachmentFile(avatar.path); } if (profileAvatar && profileAvatar.path) { await maybeDeleteAttachmentFile(profileAvatar.path); } } __name(deleteExternalFiles, "deleteExternalFiles"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { deleteExternalFiles }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var Crypto_std_exports = {}; __export(Crypto_std_exports, { AES_KEY_LENGTH: () => AES_KEY_LENGTH, ATTACHMENT_MAC_LENGTH: () => ATTACHMENT_MAC_LENGTH, CipherType: () => CipherType, DIGEST_LENGTH: () => DIGEST_LENGTH, HashType: () => HashType, IV_LENGTH: () => IV_LENGTH, KEY_SET_LENGTH: () => KEY_SET_LENGTH, MAC_LENGTH: () => MAC_LENGTH, PLAINTEXT_HASH_LENGTH: () => PLAINTEXT_HASH_LENGTH, UUID_BYTE_SIZE: () => UUID_BYTE_SIZE, isValidAttachmentKey: () => isValidAttachmentKey, isValidDigest: () => isValidDigest, isValidPlaintextHash: () => isValidPlaintextHash }); module.exports = __toCommonJS(Crypto_std_exports); var import_Bytes_std = require("../Bytes.std.js"); var HashType = /* @__PURE__ */ ((HashType2) => { HashType2["size256"] = "sha256"; HashType2["size512"] = "sha512"; return HashType2; })(HashType || {}); var CipherType = /* @__PURE__ */ ((CipherType2) => { CipherType2["AES256CBC"] = "aes-256-cbc"; CipherType2["AES256CTR"] = "aes-256-ctr"; CipherType2["AES256GCM"] = "aes-256-gcm"; return CipherType2; })(CipherType || {}); const UUID_BYTE_SIZE = 16; const IV_LENGTH = 16; const AES_KEY_LENGTH = 32; const MAC_LENGTH = 32; const ATTACHMENT_MAC_LENGTH = MAC_LENGTH; const DIGEST_LENGTH = 32; const PLAINTEXT_HASH_LENGTH = 32; const KEY_SET_LENGTH = AES_KEY_LENGTH + MAC_LENGTH; function isValidAttachmentKey(keyBase64) { if (typeof keyBase64 !== "string") { return false; } const bytes = (0, import_Bytes_std.fromBase64)(keyBase64); return bytes.byteLength === KEY_SET_LENGTH; } __name(isValidAttachmentKey, "isValidAttachmentKey"); function isValidDigest(digestBase64) { if (typeof digestBase64 !== "string") { return false; } const bytes = (0, import_Bytes_std.fromBase64)(digestBase64); return bytes.byteLength === DIGEST_LENGTH; } __name(isValidDigest, "isValidDigest"); function isValidPlaintextHash(plaintextHashHex) { if (typeof plaintextHashHex !== "string") { return false; } const bytes = (0, import_Bytes_std.fromHex)(plaintextHashHex); return bytes.byteLength === PLAINTEXT_HASH_LENGTH; } __name(isValidPlaintextHash, "isValidPlaintextHash"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { AES_KEY_LENGTH, ATTACHMENT_MAC_LENGTH, CipherType, DIGEST_LENGTH, HashType, IV_LENGTH, KEY_SET_LENGTH, MAC_LENGTH, PLAINTEXT_HASH_LENGTH, UUID_BYTE_SIZE, isValidAttachmentKey, isValidDigest, isValidPlaintextHash }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var CurrentChatFolders_std_exports = {}; __export(CurrentChatFolders_std_exports, { CurrentChatFolders: () => CurrentChatFolders, isCurrentAllChatFolder: () => isCurrentAllChatFolder, isCurrentChatFolder: () => isCurrentChatFolder, isCurrentCustomChatFolder: () => isCurrentCustomChatFolder }); module.exports = __toCommonJS(CurrentChatFolders_std_exports); var import_assert_std = require("../util/assert.std.js"); var import_ChatFolder_std = require("./ChatFolder.std.js"); function isCurrentChatFolder(chatFolder) { return chatFolder.deletedAtTimestampMs === 0 && chatFolder.folderType !== import_ChatFolder_std.ChatFolderType.UNKNOWN; } __name(isCurrentChatFolder, "isCurrentChatFolder"); function isCurrentAllChatFolder(chatFolder) { return isCurrentChatFolder(chatFolder) && chatFolder.folderType === import_ChatFolder_std.ChatFolderType.ALL; } __name(isCurrentAllChatFolder, "isCurrentAllChatFolder"); function isCurrentCustomChatFolder(chatFolder) { return isCurrentChatFolder(chatFolder) && chatFolder.folderType === import_ChatFolder_std.ChatFolderType.CUSTOM; } __name(isCurrentCustomChatFolder, "isCurrentCustomChatFolder"); var CurrentChatFolders; ((CurrentChatFolders2) => { function createEmpty() { return { order: [], lookup: {}, currentAllChatFolder: null, hasAnyCurrentCustomChatFolders: false }; } CurrentChatFolders2.createEmpty = createEmpty; __name(createEmpty, "createEmpty"); function fromArray(chatFolders) { let currentAllChatFolder = null; let hasAnyCurrentCustomChatFolders = false; const order = chatFolders.toSorted((a, b) => a.position - b.position).map((chatFolder) => chatFolder.id); const lookup = {}; for (const chatFolder of chatFolders) { if (isCurrentCustomChatFolder(chatFolder)) { hasAnyCurrentCustomChatFolders = true; } else if (isCurrentAllChatFolder(chatFolder)) { if (currentAllChatFolder != null) { throw new Error( `Multiple current all chats chat folders (${currentAllChatFolder.id}, ${chatFolder.id})` ); } currentAllChatFolder = chatFolder; } else { throw new TypeError( `Chat folder is not current ${chatFolder.id} (${chatFolder.folderType}, ${chatFolder.deletedAtTimestampMs})` ); } lookup[chatFolder.id] = chatFolder; } return { order, lookup, currentAllChatFolder, hasAnyCurrentCustomChatFolders }; } CurrentChatFolders2.fromArray = fromArray; __name(fromArray, "fromArray"); function size(state) { return state.order.length; } CurrentChatFolders2.size = size; __name(size, "size"); function has(state, id) { return Object.hasOwn(state.lookup, id); } CurrentChatFolders2.has = has; __name(has, "has"); function get(state, id) { if (has(state, id)) { return state.lookup[id] ?? null; } return null; } CurrentChatFolders2.get = get; __name(get, "get"); function expect(state, id, reason) { const chatFolder = get(state, id); (0, import_assert_std.strictAssert)( chatFolder != null, `Expected chat folder to exist in state ${id} (${reason})` ); return chatFolder; } CurrentChatFolders2.expect = expect; __name(expect, "expect"); function at(state, index) { const chatFolderId = state.order.at(index); if (chatFolderId != null) { return get(state, chatFolderId); } return null; } CurrentChatFolders2.at = at; __name(at, "at"); function toSortedArray(state) { return state.order.map((id) => { return expect(state, id, "toSortedArray"); }); } CurrentChatFolders2.toSortedArray = toSortedArray; __name(toSortedArray, "toSortedArray"); })(CurrentChatFolders || (CurrentChatFolders = {})); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { CurrentChatFolders, isCurrentAllChatFolder, isCurrentChatFolder, isCurrentCustomChatFolder }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var DNSFallback_std_exports = {}; __export(DNSFallback_std_exports, { DNSFallbackSchema: () => DNSFallbackSchema }); module.exports = __toCommonJS(DNSFallback_std_exports); var import_zod = __toESM(require("zod")); const DNSFallbackSchema = import_zod.default.array( import_zod.default.object({ domain: import_zod.default.string(), endpoints: import_zod.default.array( import_zod.default.object({ family: import_zod.default.enum(["ipv4", "ipv6"]), address: import_zod.default.string() }) ) }) ); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { DNSFallbackSchema }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var Dialogs_std_exports = {}; __export(Dialogs_std_exports, { DialogType: () => DialogType }); module.exports = __toCommonJS(Dialogs_std_exports); var DialogType = /* @__PURE__ */ ((DialogType2) => { DialogType2["None"] = "None"; DialogType2["AutoUpdate"] = "AutoUpdate"; DialogType2["Cannot_Update"] = "Cannot_Update"; DialogType2["Cannot_Update_Require_Manual"] = "Cannot_Update_Require_Manual"; DialogType2["UnsupportedOS"] = "UnsupportedOS"; DialogType2["MacOS_Read_Only"] = "MacOS_Read_Only"; DialogType2["DownloadReady"] = "DownloadReady"; DialogType2["FullDownloadReady"] = "FullDownloadReady"; DialogType2["Downloading"] = "Downloading"; DialogType2["DownloadedUpdate"] = "DownloadedUpdate"; return DialogType2; })(DialogType || {}); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { DialogType }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var Donations_std_exports = {}; __export(Donations_std_exports, { BOOST_ID: () => BOOST_ID, DonationProcessor: () => DonationProcessor, ONE_TIME_DONATION_CONFIG_ID: () => ONE_TIME_DONATION_CONFIG_ID, PaymentMethod: () => PaymentMethod, donationErrorTypeSchema: () => donationErrorTypeSchema, donationProcessorSchema: () => donationProcessorSchema, donationReceiptSchema: () => donationReceiptSchema, donationStateSchema: () => donationStateSchema, donationWorkflowSchema: () => donationWorkflowSchema, humanDonationAmountSchema: () => humanDonationAmountSchema, oneTimeDonationAmountsZod: () => oneTimeDonationAmountsZod, stripeDonationAmountSchema: () => stripeDonationAmountSchema, subscriptionConfigurationCurrencyZod: () => subscriptionConfigurationCurrencyZod }); module.exports = __toCommonJS(Donations_std_exports); var import_zod = require("zod"); const ONE_TIME_DONATION_CONFIG_ID = "1"; const BOOST_ID = "BOOST"; const donationStateSchema = import_zod.z.enum([ "INTENT", "INTENT_METHOD", "INTENT_CONFIRMED", // Deprecated "INTENT_REDIRECT", "PAYPAL_INTENT", "PAYPAL_APPROVED", "PAYMENT_CONFIRMED", "RECEIPT", "DONE" ]); var DonationProcessor = /* @__PURE__ */ ((DonationProcessor2) => { DonationProcessor2["Paypal"] = "PAYPAL"; DonationProcessor2["Stripe"] = "STRIPE"; return DonationProcessor2; })(DonationProcessor || {}); var PaymentMethod = /* @__PURE__ */ ((PaymentMethod2) => { PaymentMethod2["Card"] = "CARD"; PaymentMethod2["Paypal"] = "PAYPAL"; return PaymentMethod2; })(PaymentMethod || {}); const donationProcessorSchema = import_zod.z.nativeEnum(DonationProcessor); const donationErrorTypeSchema = import_zod.z.enum([ // Used if the user is redirected back from validation, but continuing forward fails "Failed3dsValidation", // Any other error "GeneralError", // Any 4xx error when adding payment method or confirming intent "PaymentDeclined", // When the user approves PayPal payment but they canceled it in-app, so we lost the // Paypal state. The user will not be charged, because they are only charged when we // confirm with the server. "PaypalError", // When the user cancels PayPal payment. "PaypalCanceled", // When it's been too long since the last step of the donation, and card wasn't charged "TimedOut", // When donation succeeds but badge application fails "BadgeApplicationFailed" ]); const coreDataSchema = import_zod.z.object({ // Guid used to prevent duplicates at stripe and in our db id: import_zod.z.string(), // Currency code, like USD currencyType: import_zod.z.string(), // Cents as whole numbers, so multiply by 100 paymentAmount: import_zod.z.number(), // The last time we transitioned into a new state. timestamp: import_zod.z.number() }); const stripeDataSchema = import_zod.z.object({ // Received after creation of intent clientSecret: import_zod.z.string(), // Parsed out of clientSecret - it's everything up to the '_secret_' // https://docs.stripe.com/api/payment_intents/object paymentIntentId: import_zod.z.string(), // Used for any validation that takes the user somewhere else returnToken: import_zod.z.string() }); const receiptContextSchema = import_zod.z.object({ receiptCredentialRequestContextBase64: import_zod.z.string(), receiptCredentialRequestBase64: import_zod.z.string() }); const donationReceiptSchema = import_zod.z.object({ ...coreDataSchema.shape }); const donationWorkflowSchema = import_zod.z.discriminatedUnion("type", [ import_zod.z.object({ // Track that user has chosen currency and amount, and we've successfully fetched an // intent. There is no need to persist this, because we'd need to update // currency/amount on the intent if we want to continue to use it. type: import_zod.z.literal(donationStateSchema.Enum.INTENT), ...coreDataSchema.shape, ...stripeDataSchema.shape }), import_zod.z.object({ // Once we are here, we can proceed without further user input. The user has entered // payment details and pressed the button to make the payment, and we have sent that // to stripe, which has saved that data behind a paymentMethodId. The only thing // that might require further user interaction: 3ds validation - see INTENT_REDIRECT. type: import_zod.z.literal(donationStateSchema.Enum.INTENT_METHOD), // Stripe persists the user's payment information for us, behind this id paymentMethodId: import_zod.z.string(), ...coreDataSchema.shape, ...stripeDataSchema.shape }), import_zod.z.object({ // Deprecated. We no longer enter this state -- PAYMENT_CONFIRMED has replaced it. // By this point, Stripe is attempting to charge the user's provided payment method. // However it will take some time (usually seconds, sometimes minutes or 1 day) to // finalize the transaction. We will only know when we successfully get a receipt // credential from the chat server. type: import_zod.z.literal(donationStateSchema.Enum.INTENT_CONFIRMED), ...coreDataSchema.shape, ...stripeDataSchema.shape, ...receiptContextSchema.shape }), import_zod.z.object({ // This state is shared by Stripe and PayPal. // Stripe: By this point, Stripe is attempting to charge the user's payment method. // However it will take some time (usually seconds, sometimes minutes or 1 day) to // finalize the transaction. We will only know when we successfully get a receipt // credential from the chat server. // PayPal: Payment should finalize immediately. The subsequent call to get a receipt // should always succeed. type: import_zod.z.literal(donationStateSchema.Enum.PAYMENT_CONFIRMED), processor: donationProcessorSchema, paymentIntentId: import_zod.z.string(), ...coreDataSchema.shape, ...receiptContextSchema.shape }), import_zod.z.object({ // An alternate state to PAYMENT_CONFIRMED. A response from Stripe indicated // the user's card requires 3ds authentication, so we need to redirect to their // bank, which will complete verification, then redirect back to us. We hand that // service a token to connect it back to this process. If the user never comes back, // we need to offer the redirect again. type: import_zod.z.literal(donationStateSchema.Enum.INTENT_REDIRECT), // Where user should be sent; in this state we are waiting for them to come back redirectTarget: import_zod.z.string(), ...coreDataSchema.shape, ...stripeDataSchema.shape, ...receiptContextSchema.shape }), import_zod.z.object({ // User has selected currency and amount, and we've initiated a PayPal payment // via the chat server. To complete the payment, the user needs to visit the // PayPal website. Upon approval, the website redirects to the app URI to // continue the donation process to get a receipt and badge from the chat server. // To cancel, a user can either cancel on the Paypal website, or cancel from within // the app (which just clears the active transaction locally). type: import_zod.z.literal(donationStateSchema.Enum.PAYPAL_INTENT), paypalPaymentId: import_zod.z.string(), // The user needs to visit this URL to complete payment on PayPal. approvalUrl: import_zod.z.string(), // When the user returns to the app, we check the returnToken to confirm it matches // the active workflow. returnToken: import_zod.z.string(), ...coreDataSchema.shape }), import_zod.z.object({ // After PayPal approval, the user is redirected back to us with a payerId and // paymentToken. We save them immediately, then // confirm the payment on the chat server. type: import_zod.z.literal(donationStateSchema.Enum.PAYPAL_APPROVED), paypalPaymentId: import_zod.z.string(), paypalPayerId: import_zod.z.string(), paypalPaymentToken: import_zod.z.string(), ...coreDataSchema.shape }), import_zod.z.object({ // We now have everything we need to redeem. We know the payment has gone through // successfully; we just need to redeem it on the server anonymously. type: import_zod.z.literal(donationStateSchema.Enum.RECEIPT), // The result of mixing the receiptCredentialResponse from the API from our // previously-generated receiptCredentialRequestContext receiptCredentialBase64: import_zod.z.string(), ...coreDataSchema.shape }), import_zod.z.object({ // After everything is done, we should notify the user the donation succeeded. // After we show a notification, or if the user initiates a new donation, // then this workflow can be deleted. type: import_zod.z.literal(donationStateSchema.Enum.DONE), id: coreDataSchema.shape.id, timestamp: coreDataSchema.shape.timestamp }) ]); const humanDonationAmountSchema = import_zod.z.number().nonnegative().brand("humanAmount"); const stripeDonationAmountSchema = import_zod.z.number().nonnegative().brand("stripeAmount"); const subscriptionConfigurationCurrencyZod = import_zod.z.object({ minimum: humanDonationAmountSchema, oneTime: import_zod.z.record(import_zod.z.string(), humanDonationAmountSchema.array()), supportedPaymentMethods: import_zod.z.array(import_zod.z.string()) }); const oneTimeDonationAmountsZod = import_zod.z.record( import_zod.z.string(), subscriptionConfigurationCurrencyZod ); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { BOOST_ID, DonationProcessor, ONE_TIME_DONATION_CONFIG_ID, PaymentMethod, donationErrorTypeSchema, donationProcessorSchema, donationReceiptSchema, donationStateSchema, donationWorkflowSchema, humanDonationAmountSchema, oneTimeDonationAmountsZod, stripeDonationAmountSchema, subscriptionConfigurationCurrencyZod }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var DonationsCardForm_std_exports = {}; __export(DonationsCardForm_std_exports, { CardCvcError: () => CardCvcError, CardExpirationError: () => CardExpirationError, CardNumberError: () => CardNumberError, cardFormToCardDetail: () => cardFormToCardDetail, getCardFormSettings: () => getCardFormSettings, getPossibleCardCvcSizes: () => getPossibleCardCvcSizes, getPossibleCardFormats: () => getPossibleCardFormats, parseCardCvc: () => parseCardCvc, parseCardExpiration: () => parseCardExpiration, parseCardForm: () => parseCardForm, parseCardNumber: () => parseCardNumber }); module.exports = __toCommonJS(DonationsCardForm_std_exports); var import_card_validator = __toESM(require("card-validator")); var import_credit_card_type = __toESM(require("credit-card-type")); var import_assert_std = require("../util/assert.std.js"); var CardNumberError = /* @__PURE__ */ ((CardNumberError2) => { CardNumberError2["EMPTY"] = "EMPTY"; CardNumberError2["INVALID_CHARS"] = "INVALID_CHARS"; CardNumberError2["INVALID_OR_INCOMPLETE_NUMBER"] = "INVALID_OR_INCOMPLETE_NUMBER"; CardNumberError2["INVALID_NUMBER"] = "INVALID_NUMBER"; return CardNumberError2; })(CardNumberError || {}); var CardExpirationError = /* @__PURE__ */ ((CardExpirationError2) => { CardExpirationError2["EMPTY"] = "EMPTY"; CardExpirationError2["INVALID_CHARS"] = "INVALID_CHARS"; CardExpirationError2["TOO_MANY_SLASHES"] = "TOO_MANY_SLASHES"; CardExpirationError2["MONTH_EMPTY"] = "MONTH_EMPTY"; CardExpirationError2["MONTH_TOO_LONG"] = "MONTH_TOO_LONG"; CardExpirationError2["YEAR_MISSING"] = "YEAR_MISSING"; CardExpirationError2["YEAR_EMPTY"] = "YEAR_EMPTY"; CardExpirationError2["YEAR_TOO_SHORT"] = "YEAR_TOO_SHORT"; CardExpirationError2["YEAR_TOO_LONG"] = "YEAR_TOO_LONG"; CardExpirationError2["MONTH_INVALID_INTEGER"] = "MONTH_INVALID_INTEGER"; CardExpirationError2["YEAR_INVALID_INTEGER"] = "YEAR_INVALID_INTEGER"; CardExpirationError2["MONTH_OUT_OF_RANGE"] = "MONTH_OUT_OF_RANGE"; CardExpirationError2["EXPIRED_PAST_YEAR"] = "EXPIRED_PAST_YEAR"; CardExpirationError2["EXPIRED_EARLIER_IN_YEAR"] = "EXPIRED_EARLIER_IN_YEAR"; CardExpirationError2["YEAR_TOO_FAR_IN_FUTURE"] = "YEAR_TOO_FAR_IN_FUTURE"; return CardExpirationError2; })(CardExpirationError || {}); var CardCvcError = /* @__PURE__ */ ((CardCvcError2) => { CardCvcError2["EMPTY"] = "EMPTY"; CardCvcError2["INVALID_CHARS"] = "INVALID_CHARS"; CardCvcError2["LENGTH_TOO_SHORT"] = "INVALID_LENGTH_TOO_SHORT"; CardCvcError2["LENGTH_TOO_LONG"] = "INVALID_LENGTH_TOO_LONG"; CardCvcError2["LENGTH_INVALID"] = "INVALID_LENGTH"; return CardCvcError2; })(CardCvcError || {}); function getPossibleCardFormats(input) { return (0, import_credit_card_type.default)(input).map((cardType) => { return { _debugName: cardType.niceType, cardNumber: { digitsLengths: cardType.lengths, digitsGaps: cardType.gaps }, cardCvc: { name: cardType.code.name, digitsLength: cardType.code.size } }; }); } __name(getPossibleCardFormats, "getPossibleCardFormats"); const DEFAULT_CARD_NUMBER_MAX_INPUT_LENGTH = 16 + 3; const DEFAULT_CARD_CVC_LABEL = "CVV"; const DEFAULT_CARD_CVC_MAX_INPUT_LENGTH = 3; function getCardFormSettings(possibleCardFormats) { let numberMaxInputLength = null; let cvcLabel = null; let cvcMaxInputLength = null; for (const format of possibleCardFormats) { const maxDigitsLength = Math.max(...format.cardNumber.digitsLengths); numberMaxInputLength = Math.max( numberMaxInputLength ?? -1, maxDigitsLength + format.cardNumber.digitsGaps.length ); cvcLabel ??= format.cardCvc.name; cvcMaxInputLength = Math.max( cvcMaxInputLength ?? -1, format.cardCvc.digitsLength ); } numberMaxInputLength ??= DEFAULT_CARD_NUMBER_MAX_INPUT_LENGTH; cvcLabel ??= DEFAULT_CARD_CVC_LABEL; cvcMaxInputLength ??= DEFAULT_CARD_CVC_MAX_INPUT_LENGTH; return { cardNumber: { maxInputLength: numberMaxInputLength }, cardCvc: { label: cvcLabel, maxInputLength: cvcMaxInputLength } }; } __name(getCardFormSettings, "getCardFormSettings"); const DEFAULT_POSSIBLE_CARD_CVC_SIZES = { minDigitsLength: 3, maxDigitsLength: 4, digitsLengths: /* @__PURE__ */ new Set([3, 4]) }; function getPossibleCardCvcSizes(possibleCardFormats) { const digitsLengths = /* @__PURE__ */ new Set(); for (const format of possibleCardFormats) { digitsLengths.add(format.cardCvc.digitsLength); } if (digitsLengths.size === 0) { return DEFAULT_POSSIBLE_CARD_CVC_SIZES; } const minDigitsLength = Math.min(...digitsLengths); const maxDigitsLength = Math.max(...digitsLengths); return { minDigitsLength, maxDigitsLength, digitsLengths }; } __name(getPossibleCardCvcSizes, "getPossibleCardCvcSizes"); function parseCardNumber(input) { const trimmed = input.trim(); if (trimmed === "") { return { error: "EMPTY" /* EMPTY */ }; } const invalidChars = trimmed.match(/[^\d ]/); if (invalidChars != null) { return { error: "INVALID_CHARS" /* INVALID_CHARS */ }; } const digits = trimmed.match(/\d/g)?.join("") ?? ""; const result = import_card_validator.default.number(digits, { // Note: Almost all cards have Luhn validation, Wikipedia notes a few // exceptions (ex: Union Pay & Diners Club enRoute). `card-validator` // disables luhn validation for Union Pay and the others are far less common // // These are the default options from `card-validator` but we may want to // change these values later, or base them on the card type skipLuhnValidation: false, luhnValidateUnionPay: false }); if (!result.isValid) { const error = result.isPotentiallyValid ? "INVALID_OR_INCOMPLETE_NUMBER" /* INVALID_OR_INCOMPLETE_NUMBER */ : "INVALID_NUMBER" /* INVALID_NUMBER */; if (digits.length >= 12 && digits.length <= 19) { return { digits, error }; } return { error }; } return { digits }; } __name(parseCardNumber, "parseCardNumber"); function isPositiveInteger(value) { return Number.isInteger(value) && value >= 0; } __name(isPositiveInteger, "isPositiveInteger"); function isValidMonth(value) { return value >= 1 && value <= 12; } __name(isValidMonth, "isValidMonth"); const CARD_EXPIRATION_MAX_YEARS_IN_FUTURE = 50; function parseCardExpiration(input, currentDate = /* @__PURE__ */ new Date()) { const trimmed = input.trim(); if (trimmed === "") { return { error: "EMPTY" /* EMPTY */ }; } const invalidChars = trimmed.match(/[^\d\\/]/); if (invalidChars != null) { return { error: "INVALID_CHARS" /* INVALID_CHARS */ }; } const [monthPart, yearPart, ...extraParts] = trimmed.split("/"); if (extraParts.length > 0) { return { error: "TOO_MANY_SLASHES" /* TOO_MANY_SLASHES */ }; } if (monthPart.length === 0) { return { error: "MONTH_EMPTY" /* MONTH_EMPTY */ }; } if (monthPart.length > 2) { return { error: "MONTH_TOO_LONG" /* MONTH_TOO_LONG */ }; } if (yearPart == null) { return { error: "YEAR_MISSING" /* YEAR_MISSING */ }; } if (yearPart.length === 0) { return { error: "YEAR_EMPTY" /* YEAR_EMPTY */ }; } if (yearPart.length < 2) { return { error: "YEAR_TOO_SHORT" /* YEAR_TOO_SHORT */ }; } if (yearPart.length > 2) { return { error: "YEAR_TOO_LONG" /* YEAR_TOO_LONG */ }; } const monthNumber = Number(monthPart); const relativeYearNumber = Number(yearPart); if (!isPositiveInteger(monthNumber)) { return { error: "MONTH_INVALID_INTEGER" /* MONTH_INVALID_INTEGER */ }; } if (!isPositiveInteger(relativeYearNumber)) { return { error: "YEAR_INVALID_INTEGER" /* YEAR_INVALID_INTEGER */ }; } const yearNumber = relativeYearNumber + 2e3; const month = String(monthNumber).padStart(2, "0"); const year = String(yearNumber).padStart(4, "0"); if (!isValidMonth(monthNumber)) { return { error: "MONTH_OUT_OF_RANGE" /* MONTH_OUT_OF_RANGE */ }; } const currentYear = currentDate.getFullYear(); const currentMonth = currentDate.getMonth() + 1; if (yearNumber < currentYear) { return { error: "EXPIRED_PAST_YEAR" /* EXPIRED_PAST_YEAR */ }; } if (yearNumber === currentYear && monthNumber < currentMonth) { return { month, year, error: "EXPIRED_EARLIER_IN_YEAR" /* EXPIRED_EARLIER_IN_YEAR */ }; } const maxYear = currentYear + CARD_EXPIRATION_MAX_YEARS_IN_FUTURE; if (yearNumber > maxYear) { return { month, year, error: "YEAR_TOO_FAR_IN_FUTURE" /* YEAR_TOO_FAR_IN_FUTURE */ }; } (0, import_assert_std.strictAssert)(month.length === 2, "parseCardExpiration: Invalid month length"); (0, import_assert_std.strictAssert)(year.length === 4, "parseCardExpiration: Invalid year length"); return { month, year }; } __name(parseCardExpiration, "parseCardExpiration"); function parseCardCvc(input, possibleCardFormats) { const digits = input.trim(); if (digits === "") { return { error: "EMPTY" /* EMPTY */ }; } const invalidChars = digits.match(/[^\d]/); if (invalidChars != null) { return { error: "INVALID_CHARS" /* INVALID_CHARS */ }; } const possibleCardCvcSizes = getPossibleCardCvcSizes(possibleCardFormats); let error = null; if (digits.length < possibleCardCvcSizes.minDigitsLength) { error = "INVALID_LENGTH_TOO_SHORT" /* LENGTH_TOO_SHORT */; } else if (digits.length > possibleCardCvcSizes.maxDigitsLength) { error = "INVALID_LENGTH_TOO_LONG" /* LENGTH_TOO_LONG */; } else if (!possibleCardCvcSizes.digitsLengths.has(digits.length)) { error = "INVALID_LENGTH" /* LENGTH_INVALID */; } if (error != null) { if (digits.length >= 3 && digits.length <= 4) { return { digits, error }; } return { error }; } return { digits }; } __name(parseCardCvc, "parseCardCvc"); function parseCardForm(fields) { const possibleCardFormats = getPossibleCardFormats(fields.cardNumber); const cardNumber = parseCardNumber(fields.cardNumber); const cardExpiration = parseCardExpiration(fields.cardExpiration); const cardCvc = parseCardCvc(fields.cardCvc, possibleCardFormats); return { cardNumber, cardExpiration, cardCvc }; } __name(parseCardForm, "parseCardForm"); function cardFormToCardDetail(result) { const number = result.cardNumber.digits; const expirationMonth = result.cardExpiration.month; const expirationYear = result.cardExpiration.year; const cvc = result.cardCvc.digits; if (number == null || expirationMonth == null || expirationYear == null || cvc == null) { return null; } return { number, expirationMonth, expirationYear, cvc }; } __name(cardFormToCardDetail, "cardFormToCardDetail"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { CardCvcError, CardExpirationError, CardNumberError, cardFormToCardDetail, getCardFormSettings, getPossibleCardCvcSizes, getPossibleCardFormats, parseCardCvc, parseCardExpiration, parseCardForm, parseCardNumber }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var EmbeddedContact_std_exports = {}; __export(EmbeddedContact_std_exports, { AddressType: () => AddressType, ContactFormType: () => ContactFormType, _validate: () => _validate, embeddedContactSelector: () => embeddedContactSelector, getDisplayName: () => getDisplayName, getName: () => getName, numberToAddressType: () => numberToAddressType, numberToEmailType: () => numberToEmailType, numberToPhoneType: () => numberToPhoneType, parseAndWriteAvatar: () => parseAndWriteAvatar, parsePhoneItem: () => parsePhoneItem }); module.exports = __toCommonJS(EmbeddedContact_std_exports); var import_lodash = __toESM(require("lodash")); var import_index_std = require("../protobuf/index.std.js"); var import_isNotNil_std = require("../util/isNotNil.std.js"); var import_PhoneNumber_std = require("./PhoneNumber.std.js"); var import_errors_std = require("./errors.std.js"); var import_getLocalAttachmentUrl_std = require("../util/getLocalAttachmentUrl.std.js"); const { omit } = import_lodash.default; var ContactFormType = /* @__PURE__ */ ((ContactFormType2) => { ContactFormType2[ContactFormType2["HOME"] = 1] = "HOME"; ContactFormType2[ContactFormType2["MOBILE"] = 2] = "MOBILE"; ContactFormType2[ContactFormType2["WORK"] = 3] = "WORK"; ContactFormType2[ContactFormType2["CUSTOM"] = 4] = "CUSTOM"; return ContactFormType2; })(ContactFormType || {}); var AddressType = /* @__PURE__ */ ((AddressType2) => { AddressType2[AddressType2["HOME"] = 1] = "HOME"; AddressType2[AddressType2["WORK"] = 2] = "WORK"; AddressType2[AddressType2["CUSTOM"] = 3] = "CUSTOM"; return AddressType2; })(AddressType || {}); const DEFAULT_PHONE_TYPE = import_index_std.SignalService.DataMessage.Contact.Phone.Type.HOME; const DEFAULT_EMAIL_TYPE = import_index_std.SignalService.DataMessage.Contact.Email.Type.HOME; const DEFAULT_ADDRESS_TYPE = import_index_std.SignalService.DataMessage.Contact.PostalAddress.Type.HOME; function numberToPhoneType(type) { if (type === import_index_std.SignalService.DataMessage.Contact.Phone.Type.MOBILE) { return type; } if (type === import_index_std.SignalService.DataMessage.Contact.Phone.Type.WORK) { return type; } if (type === import_index_std.SignalService.DataMessage.Contact.Phone.Type.CUSTOM) { return type; } return DEFAULT_PHONE_TYPE; } __name(numberToPhoneType, "numberToPhoneType"); function numberToEmailType(type) { if (type === import_index_std.SignalService.DataMessage.Contact.Email.Type.MOBILE) { return type; } if (type === import_index_std.SignalService.DataMessage.Contact.Email.Type.WORK) { return type; } if (type === import_index_std.SignalService.DataMessage.Contact.Email.Type.CUSTOM) { return type; } return DEFAULT_EMAIL_TYPE; } __name(numberToEmailType, "numberToEmailType"); function numberToAddressType(type) { if (type === import_index_std.SignalService.DataMessage.Contact.PostalAddress.Type.WORK) { return type; } if (type === import_index_std.SignalService.DataMessage.Contact.PostalAddress.Type.CUSTOM) { return type; } return DEFAULT_ADDRESS_TYPE; } __name(numberToAddressType, "numberToAddressType"); function embeddedContactSelector(contact, options) { const { firstNumber, serviceId, regionCode } = options; const { avatar } = contact; let avatarForUI; if (avatar && avatar.avatar) { if (avatar.avatar.error) { avatarForUI = void 0; } else { avatarForUI = { ...avatar, avatar: { ...avatar.avatar, url: avatar.avatar.path ? (0, import_getLocalAttachmentUrl_std.getLocalAttachmentUrl)(avatar.avatar) : void 0, // `error` case is handled above isPermanentlyUndownloadable: false } }; } } return { ...contact, firstNumber, serviceId, avatar: avatarForUI, number: contact.number && contact.number.map((item) => ({ ...item, value: (0, import_PhoneNumber_std.format)(item.value, { ourRegionCode: regionCode }) })) }; } __name(embeddedContactSelector, "embeddedContactSelector"); function getDisplayName({ name, organization }) { if (name?.nickname) { return name.nickname; } if (name?.givenName && name?.familyName) { return `${name.givenName} ${name.familyName}`; } if (organization) { return organization; } return void 0; } __name(getDisplayName, "getDisplayName"); function getName(contact) { const { name } = contact; const givenName = name && name.givenName || void 0; const familyName = name && name.familyName || void 0; return getDisplayName(contact) || givenName || familyName; } __name(getName, "getName"); function parseAndWriteAvatar(upgradeAttachment) { return async (contact, context, message) => { const { getRegionCode, logger } = context; const { avatar } = contact; const contactWithUpdatedAvatar = avatar && avatar.avatar ? { ...contact, avatar: { ...avatar, avatar: await upgradeAttachment(avatar.avatar, context, message) } } : omit(contact, ["avatar"]); const parsedContact = parseContact(contactWithUpdatedAvatar, { regionCode: getRegionCode() }); const error = _validate(parsedContact, { messageId: idForLogging(message) }); if (error) { logger.error( "parseAndWriteAvatar: contact was malformed.", (0, import_errors_std.toLogFormat)(error) ); } return parsedContact; }; } __name(parseAndWriteAvatar, "parseAndWriteAvatar"); function parseContact(contact, { regionCode }) { const boundParsePhone = /* @__PURE__ */ __name((phoneNumber) => parsePhoneItem(phoneNumber, { regionCode }), "boundParsePhone"); const skipEmpty = /* @__PURE__ */ __name((arr) => { const filtered = arr.filter(import_isNotNil_std.isNotNil); return filtered.length ? filtered : void 0; }, "skipEmpty"); const number = skipEmpty((contact.number || []).map(boundParsePhone)); const email = skipEmpty((contact.email || []).map(parseEmailItem)); const address = skipEmpty((contact.address || []).map(parseAddress)); let result = { ...omit(contact, ["avatar", "number", "email", "address"]), ...parseAvatar(contact.avatar) }; if (number) { result = { ...result, number }; } if (email) { result = { ...result, email }; } if (address) { result = { ...result, address }; } return result; } __name(parseContact, "parseContact"); function idForLogging(message) { return `${message.source}.${message.sourceDevice} ${message.sent_at}`; } __name(idForLogging, "idForLogging"); function _validate(contact, { messageId }) { const { organization } = contact; if (!getDisplayName(contact) && !organization) { return new Error( `Message ${messageId}: Contact had neither 'displayName' nor 'organization'` ); } return void 0; } __name(_validate, "_validate"); function parsePhoneItem(item, { regionCode }) { if (!item.value) { return void 0; } const value = regionCode ? (0, import_PhoneNumber_std.normalize)(item.value, { regionCode }) : item.value; return { ...item, type: item.type || DEFAULT_PHONE_TYPE, value: value ?? item.value }; } __name(parsePhoneItem, "parsePhoneItem"); function parseEmailItem(item) { if (!item.value) { return void 0; } return { ...item, type: item.type || DEFAULT_EMAIL_TYPE }; } __name(parseEmailItem, "parseEmailItem"); function parseAddress(address) { if (!address) { return void 0; } if (!address.street && !address.pobox && !address.neighborhood && !address.city && !address.region && !address.postcode && !address.country) { return void 0; } return { ...address, type: address.type || DEFAULT_ADDRESS_TYPE }; } __name(parseAddress, "parseAddress"); function parseAvatar(avatar) { if (!avatar) { return void 0; } return { avatar: { ...avatar, isProfile: avatar.isProfile || false } }; } __name(parseAvatar, "parseAvatar"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { AddressType, ContactFormType, _validate, embeddedContactSelector, getDisplayName, getName, numberToAddressType, numberToEmailType, numberToPhoneType, parseAndWriteAvatar, parsePhoneItem }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var ErrorWithToast_std_exports = {}; __export(ErrorWithToast_std_exports, { ErrorWithToast: () => ErrorWithToast }); module.exports = __toCommonJS(ErrorWithToast_std_exports); class ErrorWithToast extends Error { static { __name(this, "ErrorWithToast"); } toastType; constructor(message, toastType) { super(message); this.toastType = toastType; } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { ErrorWithToast }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var ForwardDraft_std_exports = {}; __export(ForwardDraft_std_exports, { isDraftEditable: () => isDraftEditable, isDraftForwardable: () => isDraftForwardable, sortByMessageOrder: () => sortByMessageOrder }); module.exports = __toCommonJS(ForwardDraft_std_exports); var import_lodash = __toESM(require("lodash")); var import_Attachment_std = require("../util/Attachment.std.js"); const { orderBy } = import_lodash.default; function isDraftEditable(draft) { if (draft.isSticker) { return false; } if (draft.hasContact) { return false; } const hasVoiceMessage = draft.attachments?.some(import_Attachment_std.isVoiceMessage) ?? false; if (hasVoiceMessage) { return false; } return true; } __name(isDraftEditable, "isDraftEditable"); function isDraftEmpty(draft) { const { messageBody, attachments, isSticker, hasContact } = draft; if (isSticker || hasContact) { return false; } if (attachments != null && attachments.length > 0) { return false; } if (messageBody != null && messageBody.length > 0) { return false; } return true; } __name(isDraftEmpty, "isDraftEmpty"); function isDraftForwardable(draft) { const { attachments } = draft; if (isDraftEmpty(draft)) { return false; } if (attachments != null && attachments.length > 0) { if (!attachments.every(import_Attachment_std.isDownloaded)) { return false; } } return true; } __name(isDraftForwardable, "isDraftForwardable"); function sortByMessageOrder(items, getMesssage) { return orderBy( items, [ (item) => getMesssage(item)?.received_at, (item) => getMesssage(item)?.sent_at ], ["ASC", "ASC"] ); } __name(sortByMessageOrder, "sortByMessageOrder"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { isDraftEditable, isDraftForwardable, sortByMessageOrder }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var GiftBadgeStates_std_exports = {}; __export(GiftBadgeStates_std_exports, { GiftBadgeStates: () => GiftBadgeStates }); module.exports = __toCommonJS(GiftBadgeStates_std_exports); var GiftBadgeStates = /* @__PURE__ */ ((GiftBadgeStates2) => { GiftBadgeStates2["Unopened"] = "Unopened"; GiftBadgeStates2["Opened"] = "Opened"; GiftBadgeStates2["Redeemed"] = "Redeemed"; GiftBadgeStates2["Failed"] = "Failed"; return GiftBadgeStates2; })(GiftBadgeStates || {}); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { GiftBadgeStates }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var GroupMemberLabels_std_exports = {}; __export(GroupMemberLabels_std_exports, { EMOJI_OUTGOING_BYTE_LIMIT: () => EMOJI_OUTGOING_BYTE_LIMIT, SERVER_EMOJI_BYTE_LIMIT: () => SERVER_EMOJI_BYTE_LIMIT, SERVER_STRING_BYTE_LIMIT: () => SERVER_STRING_BYTE_LIMIT, STRING_BYTE_LIMIT: () => STRING_BYTE_LIMIT, STRING_GRAPHEME_LIMIT: () => STRING_GRAPHEME_LIMIT, getCanAddLabel: () => getCanAddLabel, missingEmojiPlaceholder: () => missingEmojiPlaceholder }); module.exports = __toCommonJS(GroupMemberLabels_std_exports); const missingEmojiPlaceholder = "\u2370"; const STRING_BYTE_LIMIT = 96; const STRING_GRAPHEME_LIMIT = 24; const EMOJI_OUTGOING_BYTE_LIMIT = 48; const SERVER_STRING_BYTE_LIMIT = 512; const SERVER_EMOJI_BYTE_LIMIT = 64; function getCanAddLabel(conversation, membership) { return Boolean(membership && conversation.type === "group"); } __name(getCanAddLabel, "getCanAddLabel"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { EMOJI_OUTGOING_BYTE_LIMIT, SERVER_EMOJI_BYTE_LIMIT, SERVER_STRING_BYTE_LIMIT, STRING_BYTE_LIMIT, STRING_GRAPHEME_LIMIT, getCanAddLabel, missingEmojiPlaceholder }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var GroupSendEndorsements_std_exports = {}; __export(GroupSendEndorsements_std_exports, { groupSendCombinedEndorsementSchema: () => groupSendCombinedEndorsementSchema, groupSendEndorsementExpirationSchema: () => groupSendEndorsementExpirationSchema, groupSendEndorsementSchema: () => groupSendEndorsementSchema, groupSendEndorsementsDataSchema: () => groupSendEndorsementsDataSchema, groupSendMemberEndorsementSchema: () => groupSendMemberEndorsementSchema, groupSendTokenSchema: () => groupSendTokenSchema, toGroupSendToken: () => toGroupSendToken }); module.exports = __toCommonJS(GroupSendEndorsements_std_exports); var import_zod = require("zod"); var import_ServiceId_std = require("./ServiceId.std.js"); var Bytes = __toESM(require("../Bytes.std.js")); var import_schemas_std = require("../util/schemas.std.js"); const GROUPV2_ID_LENGTH = 32; const groupIdSchema = import_zod.z.string().refine((value) => { return Bytes.fromBase64(value).byteLength === GROUPV2_ID_LENGTH; }); const groupSendEndorsementExpirationSchema = import_zod.z.number().int().positive(); const groupSendEndorsementSchema = import_zod.z.instanceof(Uint8Array).refine((array) => { return array.byteLength > 0; }); const groupSendCombinedEndorsementSchema = import_zod.z.object({ groupId: groupIdSchema, expiration: groupSendEndorsementExpirationSchema, endorsement: groupSendEndorsementSchema }); const groupSendMemberEndorsementSchema = import_zod.z.object({ groupId: groupIdSchema, memberAci: import_ServiceId_std.aciSchema, expiration: groupSendEndorsementExpirationSchema, endorsement: groupSendEndorsementSchema }); const groupSendEndorsementsDataSchema = import_zod.z.object({ combinedEndorsement: groupSendCombinedEndorsementSchema, memberEndorsements: import_zod.z.array(groupSendMemberEndorsementSchema).min(1) }).refine((data) => { return data.memberEndorsements.every((memberEndorsement) => { return memberEndorsement.groupId === data.combinedEndorsement.groupId && memberEndorsement.expiration === data.combinedEndorsement.expiration; }); }); const groupSendTokenSchema = import_zod.z.instanceof(Uint8Array).brand("GroupSendToken"); function toGroupSendToken(token) { return (0, import_schemas_std.parseStrict)(groupSendTokenSchema, token); } __name(toGroupSendToken, "toGroupSendToken"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { groupSendCombinedEndorsementSchema, groupSendEndorsementExpirationSchema, groupSendEndorsementSchema, groupSendEndorsementsDataSchema, groupSendMemberEndorsementSchema, groupSendTokenSchema, toGroupSendToken }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var HTTPError_std_exports = {}; __export(HTTPError_std_exports, { HTTPError: () => HTTPError }); module.exports = __toCommonJS(HTTPError_std_exports); class HTTPError extends Error { static { __name(this, "HTTPError"); } name = "HTTPError"; code; responseHeaders; response; static fromResponse(response) { return new HTTPError(response.statusText, { code: response.status, headers: Object.fromEntries(response.headers), response }); } constructor(message, options) { super(`${message}; code: ${options.code}`, { cause: options.cause }); const { code: providedCode, headers, response, stack } = options; this.code = providedCode > 999 || providedCode < 100 ? -1 : providedCode; this.responseHeaders = headers; this.stack += ` Original stack: ${stack}`; this.response = response; } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { HTTPError }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var I18N_std_exports = {}; __export(I18N_std_exports, { HourCyclePreference: () => HourCyclePreference, HourCyclePreferenceSchema: () => HourCyclePreferenceSchema }); module.exports = __toCommonJS(I18N_std_exports); var import_zod = require("zod"); var HourCyclePreference = /* @__PURE__ */ ((HourCyclePreference2) => { HourCyclePreference2["Prefer24"] = "Prefer24"; HourCyclePreference2["Prefer12"] = "Prefer12"; HourCyclePreference2["UnknownPreference"] = "UnknownPreference"; return HourCyclePreference2; })(HourCyclePreference || {}); const HourCyclePreferenceSchema = import_zod.z.nativeEnum(HourCyclePreference); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { HourCyclePreference, HourCyclePreferenceSchema }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var IndexedDB_std_exports = {}; __export(IndexedDB_std_exports, { INDEXABLE_FALSE: () => INDEXABLE_FALSE, INDEXABLE_TRUE: () => INDEXABLE_TRUE, toIndexableBoolean: () => toIndexableBoolean, toIndexablePresence: () => toIndexablePresence }); module.exports = __toCommonJS(IndexedDB_std_exports); const INDEXABLE_FALSE = 0; const INDEXABLE_TRUE = 1; const toIndexableBoolean = /* @__PURE__ */ __name((value) => value ? INDEXABLE_TRUE : INDEXABLE_FALSE, "toIndexableBoolean"); const toIndexablePresence = /* @__PURE__ */ __name((value) => value ? INDEXABLE_TRUE : void 0, "toIndexablePresence"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { INDEXABLE_FALSE, INDEXABLE_TRUE, toIndexableBoolean, toIndexablePresence }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var InstallScreen_std_exports = {}; __export(InstallScreen_std_exports, { InstallScreenBackupError: () => InstallScreenBackupError, InstallScreenBackupStep: () => InstallScreenBackupStep, InstallScreenError: () => InstallScreenError, InstallScreenQRCodeError: () => InstallScreenQRCodeError, InstallScreenStep: () => InstallScreenStep, MAX_DEVICE_NAME_LENGTH: () => MAX_DEVICE_NAME_LENGTH }); module.exports = __toCommonJS(InstallScreen_std_exports); var InstallScreenStep = /* @__PURE__ */ ((InstallScreenStep2) => { InstallScreenStep2["NotStarted"] = "NotStarted"; InstallScreenStep2["QrCodeNotScanned"] = "QrCodeNotScanned"; InstallScreenStep2["Error"] = "Error"; InstallScreenStep2["LinkInProgress"] = "LinkInProgress"; InstallScreenStep2["BackupImport"] = "BackupImport"; return InstallScreenStep2; })(InstallScreenStep || {}); var InstallScreenBackupStep = /* @__PURE__ */ ((InstallScreenBackupStep2) => { InstallScreenBackupStep2["WaitForBackup"] = "WaitForBackup"; InstallScreenBackupStep2["Download"] = "Download"; InstallScreenBackupStep2["Process"] = "Process"; return InstallScreenBackupStep2; })(InstallScreenBackupStep || {}); var InstallScreenBackupError = /* @__PURE__ */ ((InstallScreenBackupError2) => { InstallScreenBackupError2["UnsupportedVersion"] = "UnsupportedVersion"; InstallScreenBackupError2["Retriable"] = "Retriable"; InstallScreenBackupError2["Fatal"] = "Fatal"; InstallScreenBackupError2["Canceled"] = "Canceled"; return InstallScreenBackupError2; })(InstallScreenBackupError || {}); var InstallScreenError = /* @__PURE__ */ ((InstallScreenError2) => { InstallScreenError2["TooManyDevices"] = "TooManyDevices"; InstallScreenError2["TooOld"] = "TooOld"; InstallScreenError2["ConnectionFailed"] = "ConnectionFailed"; InstallScreenError2["QRCodeFailed"] = "QRCodeFailed"; return InstallScreenError2; })(InstallScreenError || {}); var InstallScreenQRCodeError = /* @__PURE__ */ ((InstallScreenQRCodeError2) => { InstallScreenQRCodeError2["MaxRotations"] = "MaxRotations"; InstallScreenQRCodeError2["Timeout"] = "Timeout"; InstallScreenQRCodeError2["Unknown"] = "Unknown"; InstallScreenQRCodeError2["NetworkIssue"] = "NetworkIssue"; return InstallScreenQRCodeError2; })(InstallScreenQRCodeError || {}); const MAX_DEVICE_NAME_LENGTH = 50; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { InstallScreenBackupError, InstallScreenBackupStep, InstallScreenError, InstallScreenQRCodeError, InstallScreenStep, MAX_DEVICE_NAME_LENGTH }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var LinkPreview_std_exports = {}; __export(LinkPreview_std_exports, { LinkPreviewSourceType: () => LinkPreviewSourceType, findLinks: () => findLinks, getDomain: () => getDomain, getSafeDomain: () => getSafeDomain, isCallLink: () => isCallLink, isGroupLink: () => isGroupLink, isLinkSneaky: () => isLinkSneaky, isStickerPack: () => isStickerPack, isValidLink: () => isValidLink, isValidLinkPreview: () => isValidLinkPreview, shouldLinkifyMessage: () => shouldLinkifyMessage, shouldPreviewHref: () => shouldPreviewHref }); module.exports = __toCommonJS(LinkPreview_std_exports); var import_lodash = __toESM(require("lodash")); var import_url = __toESM(require("url")); var import_linkify_it = __toESM(require("linkify-it")); var import_url_std = require("../util/url.std.js"); var import_emoji_std = require("../util/emoji.std.js"); var import_grapheme_std = require("../util/grapheme.std.js"); var import_signalRoutes_std = require("../util/signalRoutes.std.js"); const { isNumber, compact, isEmpty, range } = import_lodash.default; var LinkPreviewSourceType = /* @__PURE__ */ ((LinkPreviewSourceType2) => { LinkPreviewSourceType2[LinkPreviewSourceType2["Composer"] = 0] = "Composer"; LinkPreviewSourceType2[LinkPreviewSourceType2["ForwardMessageModal"] = 1] = "ForwardMessageModal"; LinkPreviewSourceType2[LinkPreviewSourceType2["StoryCreator"] = 2] = "StoryCreator"; return LinkPreviewSourceType2; })(LinkPreviewSourceType || {}); const linkify = new import_linkify_it.default(); function isValidLink(maybeUrl) { if (maybeUrl == null) { return false; } try { const url = new URL(maybeUrl); return url.protocol === "https:"; } catch (_error) { return false; } } __name(isValidLink, "isValidLink"); function shouldPreviewHref(href) { const url = (0, import_url_std.maybeParseUrl)(href); return Boolean( url && url.protocol === "https:" && !isDomainExcluded(url) && !isLinkSneaky(href) ); } __name(shouldPreviewHref, "shouldPreviewHref"); function isValidLinkPreview(urlsInBody, preview, { isStory }) { const { url } = preview; if (!url) { return false; } if (!shouldPreviewHref(url)) { return false; } if (!urlsInBody.includes(url) && !isStory) { return false; } return true; } __name(isValidLinkPreview, "isValidLinkPreview"); const EXCLUDED_DOMAINS = [ "debuglogs.org", "example", "example.com", "example.net", "example.org", "invalid", "localhost", "onion", "test" ]; function isDomainExcluded(url) { for (const excludedDomain of EXCLUDED_DOMAINS) { if (url.hostname.endsWith(`.${excludedDomain}`) || url.hostname === excludedDomain) { return true; } } return false; } __name(isDomainExcluded, "isDomainExcluded"); const DIRECTIONAL_OVERRIDES = /[\u202c\u202d\u202e]/; const UNICODE_DRAWING = /[\u2500-\u25FF]/; function shouldLinkifyMessage(message) { if (!message) { return true; } if (DIRECTIONAL_OVERRIDES.test(message)) { return false; } return true; } __name(shouldLinkifyMessage, "shouldLinkifyMessage"); function isCallLink(link = "") { const url = (0, import_url_std.maybeParseUrl)(link); return url?.protocol === "https:" && import_signalRoutes_std.linkCallRoute.isMatch(url); } __name(isCallLink, "isCallLink"); function isStickerPack(link = "") { const url = (0, import_url_std.maybeParseUrl)(link); return url?.protocol === "https:" && import_signalRoutes_std.artAddStickersRoute.isMatch(url); } __name(isStickerPack, "isStickerPack"); function isGroupLink(link = "") { const url = (0, import_url_std.maybeParseUrl)(link); return url?.protocol === "https:" && import_signalRoutes_std.groupInvitesRoute.isMatch(url); } __name(isGroupLink, "isGroupLink"); function findLinks(text, caretLocation) { if (!shouldLinkifyMessage(text)) { return []; } const haveCaretLocation = isNumber(caretLocation); const textLength = (0, import_grapheme_std.count)(text || ""); const matches = linkify.match(text ? (0, import_emoji_std.replaceEmojiWithSpaces)(text) : "") || []; return compact( matches.map((match) => { if (!haveCaretLocation) { return match.text; } if (caretLocation === void 0) { return null; } if (match.lastIndex === textLength && caretLocation === textLength) { return match.text; } if (match.index > caretLocation || match.lastIndex < caretLocation) { return match.text; } return null; }) ); } __name(findLinks, "findLinks"); function getSafeDomain(href) { try { return getDomain(href); } catch { return void 0; } } __name(getSafeDomain, "getSafeDomain"); function getDomain(href) { const url = (0, import_url_std.maybeParseUrl)(href); if (!url || !url.hostname) { throw new Error("getDomain: Unable to extract hostname from href"); } return url.hostname; } __name(getDomain, "getDomain"); const VALID_URI_CHARACTERS = /* @__PURE__ */ new Set([ "%", // "gen-delims" ":", "/", "?", "#", "[", "]", "@", // "sub-delims" "!", "$", "&", "'", "(", ")", "*", "+", ",", ";", "=", // unreserved ...String.fromCharCode(...range(65, 91), ...range(97, 123)), ...range(10).map(String), "-", ".", "_", "~" ]); const ASCII_PATTERN = /[\u0020-\u007F]/g; const MAX_HREF_LENGTH = 2 ** 12; function isLinkSneaky(href) { if (href.length > MAX_HREF_LENGTH) { return true; } if (UNICODE_DRAWING.test(href)) { return true; } const url = (0, import_url_std.maybeParseUrl)(href); if (!url) { return true; } if (url.username || url.password) { return true; } if (!url.hostname) { return true; } if (url.hostname.length > 2048) { return true; } if (url.hostname.includes("%")) { return true; } const labels = url.hostname.split("."); if (labels.length < 2 || labels.some(isEmpty)) { return true; } const unicodeDomain = import_url.default.domainToUnicode ? import_url.default.domainToUnicode(url.hostname) : url.hostname; const withoutPeriods = unicodeDomain.replace(/\./g, ""); const hasASCII = ASCII_PATTERN.test(withoutPeriods); const withoutASCII = withoutPeriods.replace(ASCII_PATTERN, ""); const isMixed = hasASCII && withoutASCII.length > 0; if (isMixed) { return true; } const startOfPathAndHash = href.indexOf("/", url.protocol.length + 4); const pathAndHash = startOfPathAndHash === -1 ? "" : href.substr(startOfPathAndHash); return [...pathAndHash].some( (character) => !VALID_URI_CHARACTERS.has(character) ); } __name(isLinkSneaky, "isLinkSneaky"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { LinkPreviewSourceType, findLinks, getDomain, getSafeDomain, isCallLink, isGroupLink, isLinkSneaky, isStickerPack, isValidLink, isValidLinkPreview, shouldLinkifyMessage, shouldPreviewHref }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var LocalExport_std_exports = {}; __export(LocalExport_std_exports, { LocalBackupExportSteps: () => LocalBackupExportSteps, LocalExportErrors: () => LocalExportErrors, NotEnoughStorageError: () => NotEnoughStorageError, PlaintextExportSteps: () => PlaintextExportSteps, RanOutOfStorageError: () => RanOutOfStorageError, StoragePermissionsError: () => StoragePermissionsError, localBackupExportValidTransitions: () => localBackupExportValidTransitions, plaintextExportValidTransitions: () => plaintextExportValidTransitions }); module.exports = __toCommonJS(LocalExport_std_exports); var LocalExportErrors = /* @__PURE__ */ ((LocalExportErrors2) => { LocalExportErrors2["General"] = "General"; LocalExportErrors2["NotEnoughStorage"] = "NotEnoughStorage"; LocalExportErrors2["RanOutOfStorage"] = "RanOutOfStorage"; LocalExportErrors2["StoragePermissions"] = "StoragePermissions"; return LocalExportErrors2; })(LocalExportErrors || {}); class NotEnoughStorageError extends Error { constructor(bytesNeeded) { super("NotEnoughStorageError"); this.bytesNeeded = bytesNeeded; } static { __name(this, "NotEnoughStorageError"); } } class RanOutOfStorageError extends Error { constructor(bytesNeeded) { super("RanOutOfStorageError"); this.bytesNeeded = bytesNeeded; } static { __name(this, "RanOutOfStorageError"); } } class StoragePermissionsError extends Error { static { __name(this, "StoragePermissionsError"); } constructor() { super("StoragePermissionsError"); } } var LocalBackupExportSteps = /* @__PURE__ */ ((LocalBackupExportSteps2) => { LocalBackupExportSteps2["ExportingMessages"] = "ExportingMessages"; LocalBackupExportSteps2["ExportingAttachments"] = "ExportingAttachments"; LocalBackupExportSteps2["Complete"] = "Complete"; LocalBackupExportSteps2["Error"] = "Error"; return LocalBackupExportSteps2; })(LocalBackupExportSteps || {}); const localBackupExportValidTransitions = { ["ExportingMessages" /* ExportingMessages */]: /* @__PURE__ */ new Set([ "Complete" /* Complete */, "Error" /* Error */, "ExportingAttachments" /* ExportingAttachments */ ]), ["ExportingAttachments" /* ExportingAttachments */]: /* @__PURE__ */ new Set([ // When updating progress, we transition to the same step with new progress "ExportingAttachments" /* ExportingAttachments */, "Complete" /* Complete */, "Error" /* Error */ ]), // Terminal states ["Complete" /* Complete */]: /* @__PURE__ */ new Set([]), ["Error" /* Error */]: /* @__PURE__ */ new Set([]) }; var PlaintextExportSteps = /* @__PURE__ */ ((PlaintextExportSteps2) => { PlaintextExportSteps2["ConfirmingExport"] = "ConfirmingExport"; PlaintextExportSteps2["ChoosingLocation"] = "ChoosingLocation"; PlaintextExportSteps2["ConfirmingWithOS"] = "ConfirmingWithOS"; PlaintextExportSteps2["ExportingMessages"] = "ExportingMessages"; PlaintextExportSteps2["ExportingAttachments"] = "ExportingAttachments"; PlaintextExportSteps2["Complete"] = "Complete"; PlaintextExportSteps2["Error"] = "Error"; return PlaintextExportSteps2; })(PlaintextExportSteps || {}); const plaintextExportValidTransitions = { ["ConfirmingExport" /* ConfirmingExport */]: /* @__PURE__ */ new Set([ "ConfirmingWithOS" /* ConfirmingWithOS */ ]), ["ConfirmingWithOS" /* ConfirmingWithOS */]: /* @__PURE__ */ new Set([ "ChoosingLocation" /* ChoosingLocation */ ]), ["ChoosingLocation" /* ChoosingLocation */]: /* @__PURE__ */ new Set([ "ExportingMessages" /* ExportingMessages */ ]), ["ExportingMessages" /* ExportingMessages */]: /* @__PURE__ */ new Set([ "Complete" /* Complete */, "Error" /* Error */, "ExportingAttachments" /* ExportingAttachments */ ]), ["ExportingAttachments" /* ExportingAttachments */]: /* @__PURE__ */ new Set([ // When updating progress, we transition to the same step, new progress "ExportingAttachments" /* ExportingAttachments */, "Complete" /* Complete */, "Error" /* Error */ ]), // All three of these are terminal states ["Complete" /* Complete */]: /* @__PURE__ */ new Set([]), ["Error" /* Error */]: /* @__PURE__ */ new Set([]) }; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { LocalBackupExportSteps, LocalExportErrors, NotEnoughStorageError, PlaintextExportSteps, RanOutOfStorageError, StoragePermissionsError, localBackupExportValidTransitions, plaintextExportValidTransitions }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var Logging_std_exports = {}; __export(Logging_std_exports, { LogLevel: () => LogLevel }); module.exports = __toCommonJS(Logging_std_exports); var LogLevel = /* @__PURE__ */ ((LogLevel2) => { LogLevel2[LogLevel2["Fatal"] = 60] = "Fatal"; LogLevel2[LogLevel2["Error"] = 50] = "Error"; LogLevel2[LogLevel2["Warn"] = 40] = "Warn"; LogLevel2[LogLevel2["Info"] = 30] = "Info"; LogLevel2[LogLevel2["Debug"] = 20] = "Debug"; LogLevel2[LogLevel2["Trace"] = 10] = "Trace"; return LogLevel2; })(LogLevel || {}); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { LogLevel }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var MIME_std_exports = {}; __export(MIME_std_exports, { APPLICATION_JSON: () => APPLICATION_JSON, APPLICATION_OCTET_STREAM: () => APPLICATION_OCTET_STREAM, AUDIO_AAC: () => AUDIO_AAC, AUDIO_MP3: () => AUDIO_MP3, IMAGE_BMP: () => IMAGE_BMP, IMAGE_GIF: () => IMAGE_GIF, IMAGE_ICO: () => IMAGE_ICO, IMAGE_JPEG: () => IMAGE_JPEG, IMAGE_PNG: () => IMAGE_PNG, IMAGE_WEBP: () => IMAGE_WEBP, LONG_MESSAGE: () => LONG_MESSAGE, MIMETypeSchema: () => MIMETypeSchema, MIMETypeToString: () => MIMETypeToString, TEXT_ATTACHMENT: () => TEXT_ATTACHMENT, VIDEO_MP4: () => VIDEO_MP4, VIDEO_QUICKTIME: () => VIDEO_QUICKTIME, isAudio: () => isAudio, isGif: () => isGif, isHeic: () => isHeic, isImage: () => isImage, isJPEG: () => isJPEG, isLongMessage: () => isLongMessage, isVideo: () => isVideo, stringToMIMEType: () => stringToMIMEType, supportsIncrementalMac: () => supportsIncrementalMac }); module.exports = __toCommonJS(MIME_std_exports); var import_zod = require("zod"); const MIMETypeSchema = import_zod.z.string().brand("mimeType"); const stringToMIMEType = /* @__PURE__ */ __name((value) => { return value; }, "stringToMIMEType"); const MIMETypeToString = /* @__PURE__ */ __name((value) => { return value; }, "MIMETypeToString"); const APPLICATION_OCTET_STREAM = stringToMIMEType( "application/octet-stream" ); const APPLICATION_JSON = stringToMIMEType("application/json"); const AUDIO_AAC = stringToMIMEType("audio/aac"); const AUDIO_MP3 = stringToMIMEType("audio/mp3"); const IMAGE_GIF = stringToMIMEType("image/gif"); const IMAGE_JPEG = stringToMIMEType("image/jpeg"); const IMAGE_PNG = stringToMIMEType("image/png"); const IMAGE_WEBP = stringToMIMEType("image/webp"); const IMAGE_ICO = stringToMIMEType("image/x-icon"); const IMAGE_BMP = stringToMIMEType("image/bmp"); const VIDEO_MP4 = stringToMIMEType("video/mp4"); const VIDEO_QUICKTIME = stringToMIMEType("video/quicktime"); const LONG_MESSAGE = stringToMIMEType("text/x-signal-plain"); const TEXT_ATTACHMENT = stringToMIMEType("text/x-signal-story"); const isHeic = /* @__PURE__ */ __name((value, fileName) => value === "image/heic" || value === "image/heif" || fileName.toLowerCase().endsWith(".heic") || fileName.toLowerCase().endsWith(".heif"), "isHeic"); const isGif = /* @__PURE__ */ __name((value) => value === "image/gif", "isGif"); const isJPEG = /* @__PURE__ */ __name((value) => value === "image/jpeg", "isJPEG"); const isImage = /* @__PURE__ */ __name((value) => Boolean(value) && value.startsWith("image/"), "isImage"); const isVideo = /* @__PURE__ */ __name((value) => Boolean(value) && value.startsWith("video/"), "isVideo"); const isAudio = /* @__PURE__ */ __name((value) => Boolean(value) && value.startsWith("audio/") && !value.endsWith("aiff"), "isAudio"); const isLongMessage = /* @__PURE__ */ __name((value) => value === LONG_MESSAGE, "isLongMessage"); const supportsIncrementalMac = /* @__PURE__ */ __name((value) => { return value === VIDEO_MP4; }, "supportsIncrementalMac"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { APPLICATION_JSON, APPLICATION_OCTET_STREAM, AUDIO_AAC, AUDIO_MP3, IMAGE_BMP, IMAGE_GIF, IMAGE_ICO, IMAGE_JPEG, IMAGE_PNG, IMAGE_WEBP, LONG_MESSAGE, MIMETypeSchema, MIMETypeToString, TEXT_ATTACHMENT, VIDEO_MP4, VIDEO_QUICKTIME, isAudio, isGif, isHeic, isImage, isJPEG, isLongMessage, isVideo, stringToMIMEType, supportsIncrementalMac }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var MapAsync_std_exports = {}; module.exports = __toCommonJS(MapAsync_std_exports); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var MediaItem_std_exports = {}; module.exports = __toCommonJS(MediaItem_std_exports); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var Megaphone_std_exports = {}; __export(Megaphone_std_exports, { MegaphoneCtaId: () => MegaphoneCtaId, MegaphoneType: () => MegaphoneType, RemoteMegaphoneCtaDataSchema: () => RemoteMegaphoneCtaDataSchema, RemoteMegaphoneSchema: () => RemoteMegaphoneSchema, RemoteMegaphoneSnoozeCtaSchema: () => RemoteMegaphoneSnoozeCtaSchema, RemoteMegaphoneUnknownCtaDataSchema: () => RemoteMegaphoneUnknownCtaDataSchema, SNOOZE_DEFAULT_DURATION: () => SNOOZE_DEFAULT_DURATION, getMegaphoneLastSnoozeDurationMs: () => getMegaphoneLastSnoozeDurationMs, getMegaphoneSnoozeConfig: () => getMegaphoneSnoozeConfig }); module.exports = __toCommonJS(Megaphone_std_exports); var import_zod = require("zod"); var import_schemas_std = require("../util/schemas.std.js"); var import_index_std = require("../util/durations/index.std.js"); const SNOOZE_DEFAULT_DURATION_DAYS = 3; const SNOOZE_DEFAULT_CTA_DATA = { snoozeDurationDays: [SNOOZE_DEFAULT_DURATION_DAYS] }; const SNOOZE_DEFAULT_DURATION = SNOOZE_DEFAULT_DURATION_DAYS * import_index_std.DAY; var MegaphoneType = /* @__PURE__ */ ((MegaphoneType2) => { MegaphoneType2["UsernameOnboarding"] = "UsernameOnboarding"; MegaphoneType2["Remote"] = "Remote"; return MegaphoneType2; })(MegaphoneType || {}); var MegaphoneCtaId = /* @__PURE__ */ ((MegaphoneCtaId2) => { MegaphoneCtaId2["Donate"] = "donate"; MegaphoneCtaId2["Finish"] = "finish"; MegaphoneCtaId2["Snooze"] = "snooze"; return MegaphoneCtaId2; })(MegaphoneCtaId || {}); const RemoteMegaphoneSnoozeCtaSchema = import_zod.z.object({ snoozeDurationDays: import_zod.z.array(import_zod.z.number()) }); const RemoteMegaphoneUnknownCtaDataSchema = import_zod.z.record( import_zod.z.string(), import_zod.z.any() ); const RemoteMegaphoneCtaDataSchema = import_zod.z.union([ RemoteMegaphoneSnoozeCtaSchema, RemoteMegaphoneUnknownCtaDataSchema ]); const RemoteMegaphoneSchema = import_zod.z.object({ // Base remote note id: import_zod.z.intersection(import_zod.z.string(), import_zod.z.custom()), desktopMinVersion: import_zod.z.string().nullable(), priority: import_zod.z.number(), dontShowBeforeEpochMs: import_zod.z.number().int().positive(), dontShowAfterEpochMs: import_zod.z.number().int().positive(), showForNumberOfDays: import_zod.z.number().int().positive(), primaryCtaId: import_zod.z.string().nullable(), secondaryCtaId: import_zod.z.string().nullable(), primaryCtaData: RemoteMegaphoneCtaDataSchema.nullable(), secondaryCtaData: RemoteMegaphoneCtaDataSchema.nullable(), conditionalId: import_zod.z.string().nullable(), // Locale specific remote note title: import_zod.z.string(), body: import_zod.z.string(), primaryCtaText: import_zod.z.string().nullable(), secondaryCtaText: import_zod.z.string().nullable(), imagePath: import_zod.z.string(), // Local state localeFetched: import_zod.z.string(), shownAt: import_zod.z.number().int().positive().nullable(), snoozedAt: import_zod.z.number().int().positive().nullable(), snoozeCount: import_zod.z.number().int().positive(), isFinished: import_zod.z.boolean() }); function getMegaphoneSnoozeConfig(megaphone) { let parseableCtaData; if (megaphone.primaryCtaId === "snooze") { parseableCtaData = megaphone.primaryCtaData; } else if (megaphone.secondaryCtaId === "snooze") { parseableCtaData = megaphone.secondaryCtaData; } else { throw new Error("primaryCtaId or secondaryCtaId must be snooze"); } const result = (0, import_schemas_std.safeParsePartial)( RemoteMegaphoneSnoozeCtaSchema, parseableCtaData ?? {} ); return result.success ? result.data : SNOOZE_DEFAULT_CTA_DATA; } __name(getMegaphoneSnoozeConfig, "getMegaphoneSnoozeConfig"); function getMegaphoneLastSnoozeDurationMs(megaphone) { const { snoozeDurationDays } = getMegaphoneSnoozeConfig(megaphone); const lastSnoozeCount = Math.max(megaphone.snoozeCount - 1, 0); const snoozeIndex = Math.min(lastSnoozeCount, snoozeDurationDays.length - 1); return snoozeDurationDays[snoozeIndex] * import_index_std.DAY; } __name(getMegaphoneLastSnoozeDurationMs, "getMegaphoneLastSnoozeDurationMs"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { MegaphoneCtaId, MegaphoneType, RemoteMegaphoneCtaDataSchema, RemoteMegaphoneSchema, RemoteMegaphoneSnoozeCtaSchema, RemoteMegaphoneUnknownCtaDataSchema, SNOOZE_DEFAULT_DURATION, getMegaphoneLastSnoozeDurationMs, getMegaphoneSnoozeConfig }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var Message_std_exports = {}; __export(Message_std_exports, { getMentionsRegex: () => getMentionsRegex, messageAttrsToPreserveAfterErase: () => messageAttrsToPreserveAfterErase }); module.exports = __toCommonJS(Message_std_exports); var import_assert_std = require("../util/assert.std.js"); function getMentionsRegex() { return /\uFFFC/g; } __name(getMentionsRegex, "getMentionsRegex"); const messageAttrsToPreserveAfterErase = [ // TS required fields "id", "timestamp", "conversationId", "type", "sent_at", "received_at", // all other, non-TS-required fields to preserve "canReplyToStory", "deletedForEveryone", "deletedForEveryoneFailed", "deletedForEveryoneSendStatus", "deletedForEveryoneTimestamp", "editMessageReceivedAt", "editMessageReceivedAtMs", "editMessageTimestamp", "errors", "expirationStartTimestamp", "expireTimer", "isErased", "isTapToViewInvalid", "isViewOnce", "readAt", "readStatus", "received_at_ms", "requiredProtocolVersion", "schemaMigrationAttempts", "schemaVersion", "seenStatus", "sendStateByConversationId", "serverGuid", "serverTimestamp", "source", "sourceDevice", "sourceServiceId", "storyId", "synced", "unidentifiedDeliveries" ]; const messageAttrsToErase = [ "attachments", "body", "bodyAttachment", "bodyRanges", "callId", "changedId", "contact", "conversationMerge", "dataMessage", "decrypted_at", "droppedGV2MemberIds", "editHistory", "expirationTimerUpdate", "flags", "giftBadge", "group_update", "groupMigration", "groupV2Change", "hasUnreadPollVotes", "invitedGV2Members", "unidentifiedDeliveryReceived", "key_changed", "local", "logger", "mentionsMe", "message", "messageRequestResponseEvent", "messageTimer", "payment", "phoneNumberDiscovery", "pinMessage", "poll", "pollTerminateNotification", "preview", "profileChange", "quote", "reactions", "sendHQImages", "sms", "sticker", "storyDistributionListId", "storyReaction", "storyRecipientsVersion", "storyReplyContext", "supportedVersionAtReceive", "titleTransition", "verified", "verifiedChanged" ]; const allKeys = [ ...messageAttrsToPreserveAfterErase, ...messageAttrsToErase ]; const _enforceTypeCheck = {}; (0, import_assert_std.strictAssert)(_enforceTypeCheck != null, "type check"); const _checkKeys = void 0; (0, import_assert_std.strictAssert)(_checkKeys === void 0, "type check"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getMentionsRegex, messageAttrsToPreserveAfterErase }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var MessageRequestResponseEvent_std_exports = {}; __export(MessageRequestResponseEvent_std_exports, { MessageRequestResponseEvent: () => MessageRequestResponseEvent, MessageRequestResponseSource: () => MessageRequestResponseSource }); module.exports = __toCommonJS(MessageRequestResponseEvent_std_exports); var MessageRequestResponseEvent = /* @__PURE__ */ ((MessageRequestResponseEvent2) => { MessageRequestResponseEvent2["ACCEPT"] = "ACCEPT"; MessageRequestResponseEvent2["BLOCK"] = "BLOCK"; MessageRequestResponseEvent2["UNBLOCK"] = "UNBLOCK"; MessageRequestResponseEvent2["SPAM"] = "SPAM"; return MessageRequestResponseEvent2; })(MessageRequestResponseEvent || {}); var MessageRequestResponseSource = /* @__PURE__ */ ((MessageRequestResponseSource2) => { MessageRequestResponseSource2["LOCAL"] = "LOCAL"; MessageRequestResponseSource2["MRR_SYNC"] = "MRR_SYNC"; MessageRequestResponseSource2["BLOCK_SYNC"] = "BLOCK_SYNC"; MessageRequestResponseSource2["STORAGE_SERVICE"] = "STORAGE_SERVICE"; return MessageRequestResponseSource2; })(MessageRequestResponseSource || {}); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { MessageRequestResponseEvent, MessageRequestResponseSource }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var Nav_std_exports = {}; __export(Nav_std_exports, { NavTab: () => NavTab, ProfileEditorPage: () => ProfileEditorPage, SettingsPage: () => SettingsPage }); module.exports = __toCommonJS(Nav_std_exports); var NavTab = /* @__PURE__ */ ((NavTab2) => { NavTab2["Chats"] = "Chats"; NavTab2["Calls"] = "Calls"; NavTab2["Stories"] = "Stories"; NavTab2["Settings"] = "Settings"; return NavTab2; })(NavTab || {}); var SettingsPage = /* @__PURE__ */ ((SettingsPage2) => { SettingsPage2["Profile"] = "Profile"; SettingsPage2["General"] = "General"; SettingsPage2["Donations"] = "Donations"; SettingsPage2["Appearance"] = "Appearance"; SettingsPage2["Chats"] = "Chats"; SettingsPage2["Calls"] = "Calls"; SettingsPage2["Notifications"] = "Notifications"; SettingsPage2["Privacy"] = "Privacy"; SettingsPage2["DataUsage"] = "DataUsage"; SettingsPage2["Backups"] = "Backups"; SettingsPage2["Internal"] = "Internal"; SettingsPage2["ChatColor"] = "ChatColor"; SettingsPage2["ChatFolders"] = "ChatFolders"; SettingsPage2["DonationsDonateFlow"] = "DonationsDonateFlow"; SettingsPage2["DonationsReceiptList"] = "DonationsReceiptList"; SettingsPage2["EditChatFolder"] = "EditChatFolder"; SettingsPage2["NotificationProfilesHome"] = "NotificationProfilesHome"; SettingsPage2["NotificationProfilesCreateFlow"] = "NotificationProfilesCreateFlow"; SettingsPage2["PNP"] = "PNP"; SettingsPage2["BackupsDetails"] = "BackupsDetails"; SettingsPage2["LocalBackups"] = "LocalBackups"; SettingsPage2["LocalBackupsSetupFolder"] = "LocalBackupsSetupFolder"; SettingsPage2["LocalBackupsSetupKey"] = "LocalBackupsSetupKey"; SettingsPage2["LocalBackupsKeyReference"] = "LocalBackupsKeyReference"; return SettingsPage2; })(SettingsPage || {}); var ProfileEditorPage = /* @__PURE__ */ ((ProfileEditorPage2) => { ProfileEditorPage2["None"] = "None"; ProfileEditorPage2["BetterAvatar"] = "BetterAvatar"; ProfileEditorPage2["ProfileName"] = "ProfileName"; ProfileEditorPage2["Bio"] = "Bio"; ProfileEditorPage2["Username"] = "Username"; ProfileEditorPage2["UsernameLink"] = "UsernameLink"; return ProfileEditorPage2; })(ProfileEditorPage || {}); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { NavTab, ProfileEditorPage, SettingsPage }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var NotificationProfile_node_node_exports = {}; __export(NotificationProfile_node_node_exports, { generateNotificationProfileId: () => generateNotificationProfileId, isNotificationProfileId: () => isNotificationProfileId, normalizeNotificationProfileId: () => normalizeNotificationProfileId }); module.exports = __toCommonJS(NotificationProfile_node_node_exports); var import_Crypto_node = require("../Crypto.node.js"); var Bytes = __toESM(require("../Bytes.std.js")); var import_log_std = require("../logging/log.std.js"); var import_NotificationProfile_std = require("./NotificationProfile.std.js"); const log = (0, import_log_std.createLogger)("NotificationProfile-node"); function generateNotificationProfileId() { return normalizeNotificationProfileId( Bytes.toHex((0, import_Crypto_node.getRandomBytes)(import_NotificationProfile_std.NOTIFICATION_PROFILE_ID_LENGTH)), "generateNotificationProfileId" ); } __name(generateNotificationProfileId, "generateNotificationProfileId"); function isNotificationProfileId(value) { if (!value) { return false; } const bytes = Bytes.fromHex(value); return bytes.byteLength === import_NotificationProfile_std.NOTIFICATION_PROFILE_ID_LENGTH; } __name(isNotificationProfileId, "isNotificationProfileId"); function normalizeNotificationProfileId(id, context, logger = log) { const result = id.toLowerCase(); if (!isNotificationProfileId(result)) { logger.warn( `Normalizing invalid notification profile id: ${id} to ${result} in context "${context}"` ); return result; } return result; } __name(normalizeNotificationProfileId, "normalizeNotificationProfileId"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { generateNotificationProfileId, isNotificationProfileId, normalizeNotificationProfileId }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var NotificationProfile_std_exports = {}; __export(NotificationProfile_std_exports, { DEFAULT_PROFILE_COLOR: () => DEFAULT_PROFILE_COLOR, DayOfWeek: () => DayOfWeek, DayOfWeekUnknown: () => DayOfWeekUnknown, NOTIFICATION_PROFILE_ID_LENGTH: () => NOTIFICATION_PROFILE_ID_LENGTH, areAnyProfilesEnabledBySchedule: () => areAnyProfilesEnabledBySchedule, findNextProfileEvent: () => findNextProfileEvent, findNextScheduledDisable: () => findNextScheduledDisable, findNextScheduledEnable: () => findNextScheduledEnable, findNextScheduledEnableForAll: () => findNextScheduledEnableForAll, fromDayOfWeekArray: () => fromDayOfWeekArray, getDayOfWeek: () => getDayOfWeek, getEndTime: () => getEndTime, getMidnight: () => getMidnight, getProfileById: () => getProfileById, getStartTime: () => getStartTime, isProfileEnabledBySchedule: () => isProfileEnabledBySchedule, loopThroughWeek: () => loopThroughWeek, redactNotificationProfileId: () => redactNotificationProfileId, scheduleToTime: () => scheduleToTime, shouldNotify: () => shouldNotify, sortProfiles: () => sortProfiles, toDayOfWeekArray: () => toDayOfWeekArray }); module.exports = __toCommonJS(NotificationProfile_std_exports); var import_lodash = __toESM(require("lodash")); var import_index_std = require("../util/durations/index.std.js"); var import_assert_std = require("../util/assert.std.js"); const { isNumber, orderBy } = import_lodash.default; var DayOfWeek = /* @__PURE__ */ ((DayOfWeek2) => { DayOfWeek2[DayOfWeek2["MONDAY"] = 1] = "MONDAY"; DayOfWeek2[DayOfWeek2["TUESDAY"] = 2] = "TUESDAY"; DayOfWeek2[DayOfWeek2["WEDNESDAY"] = 3] = "WEDNESDAY"; DayOfWeek2[DayOfWeek2["THURSDAY"] = 4] = "THURSDAY"; DayOfWeek2[DayOfWeek2["FRIDAY"] = 5] = "FRIDAY"; DayOfWeek2[DayOfWeek2["SATURDAY"] = 6] = "SATURDAY"; DayOfWeek2[DayOfWeek2["SUNDAY"] = 7] = "SUNDAY"; return DayOfWeek2; })(DayOfWeek || {}); const DayOfWeekUnknown = 0; const DEFAULT_PROFILE_COLOR = 4293125118; const NOTIFICATION_PROFILE_ID_LENGTH = 16; function shouldNotify({ isCall, isMentionOrReply, conversationId, activeProfile }) { if (!activeProfile) { return true; } if (isCall && activeProfile.allowAllCalls) { return true; } if (isMentionOrReply && activeProfile.allowAllMentions) { return true; } if (activeProfile.allowedMembers.has(conversationId)) { return true; } return false; } __name(shouldNotify, "shouldNotify"); function findNextProfileEvent({ override, profiles, time }) { if (override?.enabled?.endsAtMs) { const profile = getProfileById(override.enabled.profileId, profiles); return { type: "willDisable", willDisableAt: override.enabled.endsAtMs, activeProfile: profile.id, clearEnableOverride: true }; } if (override?.enabled) { const profile = getProfileById(override.enabled.profileId, profiles); const isEnabled = isProfileEnabledBySchedule({ time, timeForSchedule: time - import_index_std.DAY, profile }) || isProfileEnabledBySchedule({ time, timeForSchedule: time, profile }); if (isEnabled) { const willDisableAt = findNextScheduledDisable({ time, profile }); (0, import_assert_std.strictAssert)( willDisableAt, "findNextProfileEvent: override enabled - profile is also enabled by schedule, it should disable!" ); return { type: "willDisable", willDisableAt, activeProfile: profile.id, clearEnableOverride: true }; } const nextEnableTime = findNextScheduledEnable({ time, profile }); if (!nextEnableTime) { return { type: "noChange", activeProfile: profile.id }; } const nextDisableTime = findNextScheduledDisable({ time: nextEnableTime + 1, profile }); (0, import_assert_std.strictAssert)( nextDisableTime, "findNextProfileEvent: override enabled - profile will enable by schedule, it should disable!" ); return { type: "willDisable", activeProfile: profile.id, willDisableAt: nextDisableTime, clearEnableOverride: true }; } if (override?.disabledAtMs) { const rightAfterDisable = override.disabledAtMs + 1; const nextScheduledEnable = findNextScheduledEnableForAll({ profiles, time: rightAfterDisable }); if (nextScheduledEnable) { return { type: "willEnable", willEnableAt: nextScheduledEnable.time, toEnable: nextScheduledEnable.profile.id, clearDisableOverride: true }; } return { type: "noChange", activeProfile: void 0 }; } const activeProfileBySchedule = areAnyProfilesEnabledBySchedule({ profiles, time }); if (activeProfileBySchedule) { const disabledAt = findNextScheduledDisable({ profile: activeProfileBySchedule, time }); const newerProfiles = profiles.filter( (item) => item.createdAtMs > activeProfileBySchedule.createdAtMs ); const preemptResult = findNextScheduledEnableForAll({ profiles: newerProfiles, time: time + 1 }); (0, import_assert_std.strictAssert)( disabledAt, `Schedule ${activeProfileBySchedule.id} is enabled by schedule right now, it should disable soon!` ); return { type: "willDisable", activeProfile: activeProfileBySchedule.id, willDisableAt: preemptResult ? Math.min(preemptResult.time, disabledAt) : disabledAt }; } const nextProfileToEnable = findNextScheduledEnableForAll({ profiles, time }); if (nextProfileToEnable) { return { type: "willEnable", willEnableAt: nextProfileToEnable.time, toEnable: nextProfileToEnable.profile.id }; } return { type: "noChange", activeProfile: void 0 }; } __name(findNextProfileEvent, "findNextProfileEvent"); function isProfileEnabledBySchedule({ time, timeForSchedule, profile }) { const day = getDayOfWeek(timeForSchedule); const midnight = getMidnight(timeForSchedule); const { scheduleEnabled, scheduleDaysEnabled, scheduleEndTime, scheduleStartTime } = profile; if (!scheduleEnabled || !scheduleDaysEnabled?.[day] || !isNumber(scheduleEndTime) || !isNumber(scheduleStartTime)) { return false; } const scheduleStart = getStartTime(midnight, { scheduleStartTime }); const scheduleEnd = getEndTime(midnight, { scheduleEndTime, scheduleStartTime }); if (time >= scheduleStart && time <= scheduleEnd) { return true; } return false; } __name(isProfileEnabledBySchedule, "isProfileEnabledBySchedule"); function getStartTime(midnight, { scheduleStartTime }) { const scheduleStart = scheduleToTime(midnight, scheduleStartTime); return scheduleStart; } __name(getStartTime, "getStartTime"); function getEndTime(midnight, { scheduleStartTime, scheduleEndTime }) { const scheduleStart = scheduleToTime(midnight, scheduleStartTime); const scheduleEnd = scheduleToTime(midnight, scheduleEndTime); if (scheduleEnd > scheduleStart) { return scheduleEnd; } return scheduleEnd + import_index_std.DAY; } __name(getEndTime, "getEndTime"); function areAnyProfilesEnabledBySchedule({ time, profiles }) { for (const profile of profiles) { const enabledYesterday = isProfileEnabledBySchedule({ time, timeForSchedule: time - import_index_std.DAY, profile }); if (enabledYesterday) { return profile; } const enabledNow = isProfileEnabledBySchedule({ time, timeForSchedule: time, profile }); if (enabledNow) { return profile; } } return void 0; } __name(areAnyProfilesEnabledBySchedule, "areAnyProfilesEnabledBySchedule"); function findNextScheduledDisable({ profile, time }) { const startingDay = getDayOfWeek(time); let result; const { scheduleEnabled } = profile; if (!scheduleEnabled) { return void 0; } loopThroughWeek({ time, startingDay, check: /* @__PURE__ */ __name(({ startOfDay, day }) => { const { scheduleDaysEnabled, scheduleEndTime, scheduleStartTime } = profile; if (!scheduleDaysEnabled?.[day] || !isNumber(scheduleEndTime) || !isNumber(scheduleStartTime)) { return false; } const scheduleEnd = getEndTime(startOfDay, { scheduleEndTime, scheduleStartTime }); if (time < scheduleEnd) { result = scheduleEnd; return true; } return false; }, "check") }); return result; } __name(findNextScheduledDisable, "findNextScheduledDisable"); function findNextScheduledEnable({ profile, time }) { const startingDay = getDayOfWeek(time); let result; const { scheduleEnabled } = profile; if (!scheduleEnabled) { return void 0; } loopThroughWeek({ time, startingDay, check: /* @__PURE__ */ __name(({ startOfDay, day }) => { const { scheduleDaysEnabled, scheduleEndTime, scheduleStartTime } = profile; if (!scheduleDaysEnabled?.[day] || !isNumber(scheduleEndTime) || !isNumber(scheduleStartTime)) { return false; } const scheduleStart = getStartTime(startOfDay, { scheduleStartTime }); if (time < scheduleStart) { result = scheduleStart; return true; } return false; }, "check") }); return result; } __name(findNextScheduledEnable, "findNextScheduledEnable"); function findNextScheduledEnableForAll({ profiles, time }) { let earliestResult; for (const profile of profiles) { const result = findNextScheduledEnable({ time, profile }); if (isNumber(result) && (!earliestResult || result < earliestResult.time)) { earliestResult = { profile, time: result }; } } return earliestResult; } __name(findNextScheduledEnableForAll, "findNextScheduledEnableForAll"); function getDayOfWeek(time) { const date = new Date(time); const day = date.getDay(); if (day === 0) { return 7 /* SUNDAY */; } if (day < 1 /* MONDAY */ || day > 7 /* SUNDAY */) { throw new Error(`getDayOfWeek: Got day that was out of range: ${day}`); } return day; } __name(getDayOfWeek, "getDayOfWeek"); function scheduleToTime(midnight, scheduleTime) { const hours = Math.floor(scheduleTime / 100); const minutes = scheduleTime % 100; return midnight + hours * import_index_std.HOUR + minutes * import_index_std.MINUTE; } __name(scheduleToTime, "scheduleToTime"); function getMidnight(time) { const now = new Date(time); const midnight = new Date( now.getFullYear(), now.getMonth(), now.getDate(), 0 ); return midnight.getTime(); } __name(getMidnight, "getMidnight"); function loopThroughWeek({ time, startingDay, check }) { const todayAtMidnight = getMidnight(time); let index = -1; while (index < 7 /* SUNDAY */) { let indexDay = startingDay + index; if (indexDay <= 0) { indexDay += 7 /* SUNDAY */; } if (indexDay > 7 /* SUNDAY */) { indexDay -= 7 /* SUNDAY */; } const startOfDay = todayAtMidnight + import_index_std.DAY * index; const result = check({ startOfDay, day: indexDay }); if (result) { return; } index += 1; } } __name(loopThroughWeek, "loopThroughWeek"); function getProfileById(id, profiles) { const profile = profiles.find((value) => value.id === id); if (!profile) { throw new Error( `getProfileById: Unable to find profile with id ${redactNotificationProfileId(id)}` ); } return profile; } __name(getProfileById, "getProfileById"); function sortProfiles(profiles) { return orderBy(profiles, ["createdAtMs"], ["desc"]); } __name(sortProfiles, "sortProfiles"); function redactNotificationProfileId(id) { return `[REDACTED]${id.slice(-3)}`; } __name(redactNotificationProfileId, "redactNotificationProfileId"); function fromDayOfWeekArray(scheduleDaysEnabled) { if (!scheduleDaysEnabled) { return void 0; } return { [1 /* MONDAY */]: scheduleDaysEnabled.includes(1 /* MONDAY */) || scheduleDaysEnabled.includes(DayOfWeekUnknown), [2 /* TUESDAY */]: scheduleDaysEnabled.includes(2 /* TUESDAY */), [3 /* WEDNESDAY */]: scheduleDaysEnabled.includes(3 /* WEDNESDAY */), [4 /* THURSDAY */]: scheduleDaysEnabled.includes(4 /* THURSDAY */), [5 /* FRIDAY */]: scheduleDaysEnabled.includes(5 /* FRIDAY */), [6 /* SATURDAY */]: scheduleDaysEnabled.includes(6 /* SATURDAY */), [7 /* SUNDAY */]: scheduleDaysEnabled.includes(7 /* SUNDAY */) }; } __name(fromDayOfWeekArray, "fromDayOfWeekArray"); function toDayOfWeekArray(scheduleDaysEnabled) { if (!scheduleDaysEnabled) { return void 0; } const scheduleDaysEnabledArray = []; if (scheduleDaysEnabled[1 /* MONDAY */]) { scheduleDaysEnabledArray.push(1 /* MONDAY */); } if (scheduleDaysEnabled[2 /* TUESDAY */]) { scheduleDaysEnabledArray.push(2 /* TUESDAY */); } if (scheduleDaysEnabled[3 /* WEDNESDAY */]) { scheduleDaysEnabledArray.push(3 /* WEDNESDAY */); } if (scheduleDaysEnabled[4 /* THURSDAY */]) { scheduleDaysEnabledArray.push(4 /* THURSDAY */); } if (scheduleDaysEnabled[5 /* FRIDAY */]) { scheduleDaysEnabledArray.push(5 /* FRIDAY */); } if (scheduleDaysEnabled[6 /* SATURDAY */]) { scheduleDaysEnabledArray.push(6 /* SATURDAY */); } if (scheduleDaysEnabled[7 /* SUNDAY */]) { scheduleDaysEnabledArray.push(7 /* SUNDAY */); } return scheduleDaysEnabledArray; } __name(toDayOfWeekArray, "toDayOfWeekArray"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { DEFAULT_PROFILE_COLOR, DayOfWeek, DayOfWeekUnknown, NOTIFICATION_PROFILE_ID_LENGTH, areAnyProfilesEnabledBySchedule, findNextProfileEvent, findNextScheduledDisable, findNextScheduledEnable, findNextScheduledEnableForAll, fromDayOfWeekArray, getDayOfWeek, getEndTime, getMidnight, getProfileById, getStartTime, isProfileEnabledBySchedule, loopThroughWeek, redactNotificationProfileId, scheduleToTime, shouldNotify, sortProfiles, toDayOfWeekArray }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var OptionalResource_std_exports = {}; __export(OptionalResource_std_exports, { OptionalResourceSchema: () => OptionalResourceSchema, OptionalResourcesDictSchema: () => OptionalResourcesDictSchema }); module.exports = __toCommonJS(OptionalResource_std_exports); var import_zod = __toESM(require("zod")); const OptionalResourceSchema = import_zod.default.object({ digest: import_zod.default.string(), url: import_zod.default.string(), size: import_zod.default.number() }); const OptionalResourcesDictSchema = import_zod.default.record( import_zod.default.string(), OptionalResourceSchema ); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { OptionalResourceSchema, OptionalResourcesDictSchema }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var Panels_std_exports = {}; __export(Panels_std_exports, { PanelType: () => PanelType }); module.exports = __toCommonJS(Panels_std_exports); var PanelType = /* @__PURE__ */ ((PanelType2) => { PanelType2["AllMedia"] = "AllMedia"; PanelType2["ChatColorEditor"] = "ChatColorEditor"; PanelType2["ContactDetails"] = "ContactDetails"; PanelType2["ConversationDetails"] = "ConversationDetails"; PanelType2["GroupInvites"] = "GroupInvites"; PanelType2["GroupLinkManagement"] = "GroupLinkManagement"; PanelType2["GroupPermissions"] = "GroupPermissions"; PanelType2["GroupV1Members"] = "GroupV1Members"; PanelType2["GroupMemberLabelEditor"] = "GroupMemberLabelEditor"; PanelType2["MessageDetails"] = "MessageDetails"; PanelType2["NotificationSettings"] = "NotificationSettings"; PanelType2["PinnedMessages"] = "PinnedMessages"; PanelType2["StickerManager"] = "StickerManager"; return PanelType2; })(PanelType || {}); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { PanelType }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var Payment_std_exports = {}; __export(Payment_std_exports, { PaymentEventKind: () => PaymentEventKind, isPaymentNotificationEvent: () => isPaymentNotificationEvent }); module.exports = __toCommonJS(Payment_std_exports); var PaymentEventKind = /* @__PURE__ */ ((PaymentEventKind2) => { PaymentEventKind2[PaymentEventKind2["Notification"] = 1] = "Notification"; PaymentEventKind2[PaymentEventKind2["ActivationRequest"] = 2] = "ActivationRequest"; PaymentEventKind2[PaymentEventKind2["Activation"] = 3] = "Activation"; return PaymentEventKind2; })(PaymentEventKind || {}); function isPaymentNotificationEvent(event) { return event.kind === 1 /* Notification */; } __name(isPaymentNotificationEvent, "isPaymentNotificationEvent"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { PaymentEventKind, isPaymentNotificationEvent }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var PhoneNumber_std_exports = {}; __export(PhoneNumber_std_exports, { format: () => format, getCountryCode: () => getCountryCode, isValidNumber: () => isValidNumber, normalize: () => normalize }); module.exports = __toCommonJS(PhoneNumber_std_exports); var import_memoizee = __toESM(require("memoizee")); var import_libphonenumberInstance_std = require("../util/libphonenumberInstance.std.js"); var import_log_std = require("../logging/log.std.js"); var Errors = __toESM(require("./errors.std.js")); const log = (0, import_log_std.createLogger)("PhoneNumber"); function _format(phoneNumber, options) { try { const { ourRegionCode } = options; const parsedNumber = import_libphonenumberInstance_std.instance.parse(phoneNumber); const regionCode = import_libphonenumberInstance_std.instance.getRegionCodeForNumber(parsedNumber); if (ourRegionCode && regionCode === ourRegionCode) { return import_libphonenumberInstance_std.instance.format(parsedNumber, import_libphonenumberInstance_std.PhoneNumberFormat.NATIONAL); } return import_libphonenumberInstance_std.instance.format(parsedNumber, import_libphonenumberInstance_std.PhoneNumberFormat.INTERNATIONAL); } catch (error) { return phoneNumber; } } __name(_format, "_format"); function getCountryCode(phoneNumber) { try { if (phoneNumber == null) { return void 0; } if (!isValidNumber(phoneNumber)) { return void 0; } const parsed = import_libphonenumberInstance_std.instance.parse(phoneNumber); return parsed.getCountryCode(); } catch (error) { const errorText = Errors.toLogFormat(error); log.info( `getCountryCode: Failed to get country code from ${phoneNumber}: ${errorText}` ); return void 0; } } __name(getCountryCode, "getCountryCode"); function isValidNumber(phoneNumber, options) { const { regionCode } = options || { regionCode: void 0 }; try { const parsedNumber = import_libphonenumberInstance_std.instance.parse(phoneNumber, regionCode); return import_libphonenumberInstance_std.instance.isValidNumber(parsedNumber); } catch (error) { return false; } } __name(isValidNumber, "isValidNumber"); const format = (0, import_memoizee.default)(_format, { primitive: true, // Convert the arguments to a unique string, required for primitive mode. normalizer: /* @__PURE__ */ __name((...args) => JSON.stringify(args), "normalizer"), max: 5e3 }); function normalize(phoneNumber, options) { const { regionCode } = options; try { const parsedNumber = import_libphonenumberInstance_std.instance.parse(phoneNumber, regionCode); if (import_libphonenumberInstance_std.instance.isValidNumber(parsedNumber)) { return import_libphonenumberInstance_std.instance.format(parsedNumber, import_libphonenumberInstance_std.PhoneNumberFormat.E164); } return void 0; } catch (error) { return void 0; } } __name(normalize, "normalize"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { format, getCountryCode, isValidNumber, normalize }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var PhoneNumberSharingMode_std_exports = {}; __export(PhoneNumberSharingMode_std_exports, { PhoneNumberSharingMode: () => PhoneNumberSharingMode, parsePhoneNumberSharingMode: () => parsePhoneNumberSharingMode }); module.exports = __toCommonJS(PhoneNumberSharingMode_std_exports); var import_enum_std = require("../util/enum.std.js"); var PhoneNumberSharingMode = /* @__PURE__ */ ((PhoneNumberSharingMode2) => { PhoneNumberSharingMode2["Everybody"] = "Everybody"; PhoneNumberSharingMode2["ContactsOnly"] = "ContactsOnly"; PhoneNumberSharingMode2["Nobody"] = "Nobody"; return PhoneNumberSharingMode2; })(PhoneNumberSharingMode || {}); const parsePhoneNumberSharingMode = (0, import_enum_std.makeEnumParser)( PhoneNumberSharingMode, "Nobody" /* Nobody */ ); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { PhoneNumberSharingMode, parsePhoneNumberSharingMode }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var PinnedMessage_std_exports = {}; module.exports = __toCommonJS(PinnedMessage_std_exports); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var PreferencesBackupPage_std_exports = {}; __export(PreferencesBackupPage_std_exports, { isBackupPage: () => isBackupPage }); module.exports = __toCommonJS(PreferencesBackupPage_std_exports); var import_Nav_std = require("./Nav.std.js"); function isBackupPage(page) { return page === import_Nav_std.SettingsPage.Backups || page === import_Nav_std.SettingsPage.BackupsDetails || page === import_Nav_std.SettingsPage.LocalBackups || page === import_Nav_std.SettingsPage.LocalBackupsSetupFolder || page === import_Nav_std.SettingsPage.LocalBackupsSetupKey || page === import_Nav_std.SettingsPage.LocalBackupsKeyReference; } __name(isBackupPage, "isBackupPage"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { isBackupPage }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var QualifiedAddress_std_exports = {}; __export(QualifiedAddress_std_exports, { QualifiedAddress: () => QualifiedAddress }); module.exports = __toCommonJS(QualifiedAddress_std_exports); var import_assert_std = require("../util/assert.std.js"); var import_ServiceId_std = require("./ServiceId.std.js"); var import_Address_std = require("./Address.std.js"); const QUALIFIED_ADDRESS_REGEXP = /^((?:PNI:)?[:0-9a-f-]+):((?:PNI:)?[:0-9a-f-]+).(\d+)$/i; class QualifiedAddress { constructor(ourServiceId, address) { this.ourServiceId = ourServiceId; this.address = address; } static { __name(this, "QualifiedAddress"); } get serviceId() { return this.address.serviceId; } get deviceId() { return this.address.deviceId; } toString() { return `${this.ourServiceId}:${this.address.toString()}`; } static parse(value) { const match = value.match(QUALIFIED_ADDRESS_REGEXP); (0, import_assert_std.strictAssert)(match != null, `Invalid QualifiedAddress: ${value}`); const [whole, ourServiceId, serviceId, deviceId] = match; (0, import_assert_std.strictAssert)(whole === value, "Integrity check"); (0, import_assert_std.strictAssert)( (0, import_ServiceId_std.isServiceIdString)(ourServiceId), "Our service id is incorrect" ); (0, import_assert_std.strictAssert)((0, import_ServiceId_std.isServiceIdString)(serviceId), "Their service id is incorrect"); return new QualifiedAddress( ourServiceId, import_Address_std.Address.create(serviceId, parseInt(deviceId, 10)) ); } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { QualifiedAddress }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var Reactions_std_exports = {}; __export(Reactions_std_exports, { ReactionReadStatus: () => ReactionReadStatus }); module.exports = __toCommonJS(Reactions_std_exports); var ReactionReadStatus = /* @__PURE__ */ ((ReactionReadStatus2) => { ReactionReadStatus2["Unread"] = "Unread"; ReactionReadStatus2["Read"] = "Read"; return ReactionReadStatus2; })(ReactionReadStatus || {}); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { ReactionReadStatus }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var Receipt_std_exports = {}; __export(Receipt_std_exports, { DELETE_SENT_PROTO_BATCHER_WAIT_MS: () => DELETE_SENT_PROTO_BATCHER_WAIT_MS, RECEIPT_BATCHER_WAIT_MS: () => RECEIPT_BATCHER_WAIT_MS, ReceiptType: () => ReceiptType, receiptSchema: () => receiptSchema }); module.exports = __toCommonJS(Receipt_std_exports); var import_zod = require("zod"); var import_ServiceId_std = require("./ServiceId.std.js"); const receiptSchema = import_zod.z.object({ messageId: import_zod.z.string(), conversationId: import_zod.z.string(), senderE164: import_zod.z.string().optional(), senderAci: import_ServiceId_std.aciSchema.optional(), timestamp: import_zod.z.number(), isDirectConversation: import_zod.z.boolean().optional() }); var ReceiptType = /* @__PURE__ */ ((ReceiptType2) => { ReceiptType2["Delivery"] = "deliveryReceipt"; ReceiptType2["Read"] = "readReceipt"; ReceiptType2["Viewed"] = "viewedReceipt"; return ReceiptType2; })(ReceiptType || {}); const RECEIPT_BATCHER_WAIT_MS = 250; const DELETE_SENT_PROTO_BATCHER_WAIT_MS = 250; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { DELETE_SENT_PROTO_BATCHER_WAIT_MS, RECEIPT_BATCHER_WAIT_MS, ReceiptType, receiptSchema }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var RendererConfig_std_exports = {}; __export(RendererConfig_std_exports, { directoryConfigSchema: () => directoryConfigSchema, rendererConfigSchema: () => rendererConfigSchema }); module.exports = __toCommonJS(RendererConfig_std_exports); var import_zod = require("zod"); var import_environment_std = require("../environment.std.js"); var import_StorageUIKeys_std = require("./StorageUIKeys.std.js"); var import_I18N_std = require("./I18N.std.js"); var import_DNSFallback_std = require("./DNSFallback.std.js"); const environmentSchema = import_zod.z.nativeEnum(import_environment_std.Environment); const configRequiredStringSchema = import_zod.z.string().nonempty(); const configOptionalStringSchema = configRequiredStringSchema.or(import_zod.z.undefined()); const directoryConfigSchema = import_zod.z.object({ directoryUrl: configRequiredStringSchema, directoryMRENCLAVE: configRequiredStringSchema }); const rendererConfigSchema = import_zod.z.object({ appInstance: configOptionalStringSchema, appStartInitialSpellcheckSetting: import_zod.z.boolean(), buildCreation: import_zod.z.number(), buildExpiration: import_zod.z.number(), cdnUrl0: configRequiredStringSchema, cdnUrl2: configRequiredStringSchema, cdnUrl3: configRequiredStringSchema, challengeUrl: configRequiredStringSchema, certificateAuthority: configRequiredStringSchema, contentProxyUrl: configRequiredStringSchema, crashDumpsPath: configRequiredStringSchema, ciMode: import_zod.z.enum(["full", "benchmark"]).or(import_zod.z.literal(false)), ciForceUnprocessed: import_zod.z.boolean(), devTools: import_zod.z.boolean(), disableIPv6: import_zod.z.boolean(), disableScreenSecurity: import_zod.z.boolean(), dnsFallback: import_DNSFallback_std.DNSFallbackSchema, environment: environmentSchema, isMockTestEnvironment: import_zod.z.boolean(), homePath: configRequiredStringSchema, hostname: configRequiredStringSchema, installPath: configRequiredStringSchema, osRelease: configRequiredStringSchema, osVersion: configRequiredStringSchema, availableLocales: import_zod.z.array(configRequiredStringSchema), resolvedTranslationsLocale: configRequiredStringSchema, resolvedTranslationsLocaleDirection: import_zod.z.enum(["ltr", "rtl"]), hourCyclePreference: import_I18N_std.HourCyclePreferenceSchema, preferredSystemLocales: import_zod.z.array(configRequiredStringSchema), localeOverride: import_zod.z.string().nullable(), name: configRequiredStringSchema, nodeVersion: configRequiredStringSchema, proxyUrl: configOptionalStringSchema, reducedMotionSetting: import_zod.z.boolean(), registrationChallengeUrl: configRequiredStringSchema, serverPublicParams: configRequiredStringSchema, serverTrustRoots: import_zod.z.array(configRequiredStringSchema), genericServerPublicParams: configRequiredStringSchema, backupServerPublicParams: configRequiredStringSchema, serverUrl: configRequiredStringSchema, sfuUrl: configRequiredStringSchema, storageUrl: configRequiredStringSchema, stripePublishableKey: configRequiredStringSchema, theme: import_StorageUIKeys_std.themeSettingSchema, updatesUrl: configRequiredStringSchema, resourcesUrl: configRequiredStringSchema, userDataPath: configRequiredStringSchema, version: configRequiredStringSchema, directoryConfig: directoryConfigSchema, // Only used by main window isMainWindowFullScreen: import_zod.z.boolean(), isMainWindowMaximized: import_zod.z.boolean(), // Only for tests argv: configOptionalStringSchema }); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { directoryConfigSchema, rendererConfigSchema }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var SafeStorageBackendChangeError_std_exports = {}; __export(SafeStorageBackendChangeError_std_exports, { SafeStorageBackendChangeError: () => SafeStorageBackendChangeError }); module.exports = __toCommonJS(SafeStorageBackendChangeError_std_exports); class SafeStorageBackendChangeError extends Error { static { __name(this, "SafeStorageBackendChangeError"); } name = "SafeStorageBackendChangeError"; currentBackend; previousBackend; constructor({ currentBackend, previousBackend }) { super( `Detected change in safeStorage backend, can't decrypt DB key (previous: ${previousBackend}, current: ${currentBackend})` ); this.currentBackend = currentBackend; this.previousBackend = previousBackend; } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { SafeStorageBackendChangeError }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var SafeStorageDecryptionError_std_exports = {}; __export(SafeStorageDecryptionError_std_exports, { SafeStorageDecryptionError: () => SafeStorageDecryptionError }); module.exports = __toCommonJS(SafeStorageDecryptionError_std_exports); class SafeStorageDecryptionError extends Error { static { __name(this, "SafeStorageDecryptionError"); } name = "SafeStorageDecryptionError"; } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { SafeStorageDecryptionError }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var SafetyNumberChangeSource_std_exports = {}; __export(SafetyNumberChangeSource_std_exports, { SafetyNumberChangeSource: () => SafetyNumberChangeSource }); module.exports = __toCommonJS(SafetyNumberChangeSource_std_exports); var SafetyNumberChangeSource = /* @__PURE__ */ ((SafetyNumberChangeSource2) => { SafetyNumberChangeSource2["InitiateCall"] = "InitiateCall"; SafetyNumberChangeSource2["JoinCall"] = "JoinCall"; SafetyNumberChangeSource2["MessageSend"] = "MessageSend"; SafetyNumberChangeSource2["Story"] = "Story"; return SafetyNumberChangeSource2; })(SafetyNumberChangeSource || {}); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { SafetyNumberChangeSource }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var SchemaVersion_std_exports = {}; __export(SchemaVersion_std_exports, { isValid: () => isValid }); module.exports = __toCommonJS(SchemaVersion_std_exports); var import_lodash = __toESM(require("lodash")); const { isNumber } = import_lodash.default; const isValid = /* @__PURE__ */ __name((value) => { return Boolean(isNumber(value) && value >= 0); }, "isValid"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { isValid }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var SealedSender_std_exports = {}; __export(SealedSender_std_exports, { SEALED_SENDER: () => SEALED_SENDER, ZERO_ACCESS_KEY: () => ZERO_ACCESS_KEY }); module.exports = __toCommonJS(SealedSender_std_exports); const ZERO_ACCESS_KEY = "AAAAAAAAAAAAAAAAAAAAAA=="; var SEALED_SENDER = /* @__PURE__ */ ((SEALED_SENDER2) => { SEALED_SENDER2[SEALED_SENDER2["UNKNOWN"] = 0] = "UNKNOWN"; SEALED_SENDER2[SEALED_SENDER2["ENABLED"] = 1] = "ENABLED"; SEALED_SENDER2[SEALED_SENDER2["DISABLED"] = 2] = "DISABLED"; SEALED_SENDER2[SEALED_SENDER2["UNRESTRICTED"] = 3] = "UNRESTRICTED"; return SEALED_SENDER2; })(SEALED_SENDER || {}); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { SEALED_SENDER, ZERO_ACCESS_KEY }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var ServerAlert_std_exports = {}; __export(ServerAlert_std_exports, { ServerAlert: () => ServerAlert }); module.exports = __toCommonJS(ServerAlert_std_exports); var ServerAlert = /* @__PURE__ */ ((ServerAlert2) => { ServerAlert2["CRITICAL_IDLE_PRIMARY_DEVICE"] = "critical_idle_primary_device"; ServerAlert2["IDLE_PRIMARY_DEVICE"] = "idle_primary_device"; return ServerAlert2; })(ServerAlert || {}); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { ServerAlert }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var ServiceId_std_exports = {}; __export(ServiceId_std_exports, { ServiceIdKind: () => ServiceIdKind, aciSchema: () => aciSchema, fromAciObject: () => fromAciObject, fromPniObject: () => fromPniObject, fromServiceIdObject: () => fromServiceIdObject, generateAci: () => generateAci, generatePni: () => generatePni, getAciFromPrefix: () => getAciFromPrefix, isPniString: () => isPniString, isServiceIdString: () => isServiceIdString, isUntaggedPniString: () => isUntaggedPniString, normalizePni: () => normalizePni, normalizeServiceId: () => normalizeServiceId, serviceIdSchema: () => serviceIdSchema, toTaggedPni: () => toTaggedPni, toUntaggedPni: () => toUntaggedPni, untaggedPniSchema: () => untaggedPniSchema }); module.exports = __toCommonJS(ServiceId_std_exports); var import_uuid = require("uuid"); var import_zod = require("zod"); var import_isValidUuid_std = require("../util/isValidUuid.std.js"); var import_log_std = require("../logging/log.std.js"); var import_isAciString_std = require("../util/isAciString.std.js"); const log = (0, import_log_std.createLogger)("ServiceId"); var ServiceIdKind = /* @__PURE__ */ ((ServiceIdKind2) => { ServiceIdKind2["ACI"] = "ACI"; ServiceIdKind2["PNI"] = "PNI"; ServiceIdKind2["Unknown"] = "Unknown"; return ServiceIdKind2; })(ServiceIdKind || {}); function isServiceIdString(value) { return (0, import_isAciString_std.isAciString)(value) || isPniString(value); } __name(isServiceIdString, "isServiceIdString"); function isPniString(value) { if (value == null) { return false; } if (value.startsWith("PNI:")) { return true; } return false; } __name(isPniString, "isPniString"); function isUntaggedPniString(value) { return (0, import_isValidUuid_std.isValidUuid)(value); } __name(isUntaggedPniString, "isUntaggedPniString"); function toTaggedPni(untagged) { return `PNI:${untagged}`; } __name(toTaggedPni, "toTaggedPni"); function toUntaggedPni(pni) { return pni.replace(/^PNI:/i, ""); } __name(toUntaggedPni, "toUntaggedPni"); const INVALID_SERVICE_ID_PATTERN = /^.*(.{3})/; function redactInvalidServiceId(input) { return input.replace(INVALID_SERVICE_ID_PATTERN, "[REDACTED]$1"); } __name(redactInvalidServiceId, "redactInvalidServiceId"); function normalizeServiceId(rawServiceId, context, logger = log) { if (rawServiceId == null) { return void 0; } const result = rawServiceId.toLowerCase().replace(/^pni:/, "PNI:"); if (!(0, import_isAciString_std.isAciString)(result) && !isPniString(result)) { const before = redactInvalidServiceId(rawServiceId); const after = redactInvalidServiceId(result); logger.warn( `Normalizing invalid serviceId: ${before} to ${after} in context "${context}"` ); return result; } return result; } __name(normalizeServiceId, "normalizeServiceId"); function normalizePni(rawPni, context, logger = log) { if (rawPni == null) { return void 0; } const result = rawPni.toLowerCase().replace(/^pni:/, "PNI:"); if (!isPniString(result)) { logger.warn( `Normalizing invalid pni: ${rawPni} to ${result} in context "${context}"` ); return result; } return result; } __name(normalizePni, "normalizePni"); function generateAci() { return (0, import_uuid.v4)(); } __name(generateAci, "generateAci"); function generatePni() { return `PNI:${(0, import_uuid.v4)()}`; } __name(generatePni, "generatePni"); function getAciFromPrefix(prefix) { let padded = prefix; while (padded.length < 8) { padded += "0"; } return `${padded}-0000-4000-8000-${"0".repeat(12)}`; } __name(getAciFromPrefix, "getAciFromPrefix"); const aciSchema = import_zod.z.string().refine(import_isAciString_std.isAciString).transform((x) => { if (!(0, import_isAciString_std.isAciString)(x)) { throw new Error("Refine did not throw!"); } return x; }); const untaggedPniSchema = import_zod.z.string().refine(isUntaggedPniString).transform((x) => { if (!isUntaggedPniString(x)) { throw new Error("Refine did not throw!"); } return x; }); const serviceIdSchema = import_zod.z.string().refine(isServiceIdString).transform((x) => { if (!isServiceIdString(x)) { throw new Error("Refine did not throw!"); } return x; }); function fromServiceIdObject(obj) { return obj.getServiceIdString(); } __name(fromServiceIdObject, "fromServiceIdObject"); function fromAciObject(obj) { return obj.getServiceIdString(); } __name(fromAciObject, "fromAciObject"); function fromPniObject(obj) { return obj.getServiceIdString(); } __name(fromPniObject, "fromPniObject"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { ServiceIdKind, aciSchema, fromAciObject, fromPniObject, fromServiceIdObject, generateAci, generatePni, getAciFromPrefix, isPniString, isServiceIdString, isUntaggedPniString, normalizePni, normalizeServiceId, serviceIdSchema, toTaggedPni, toUntaggedPni, untaggedPniSchema }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var Settings_std_exports = {}; __export(Settings_std_exports, { getDefaultSystemTraySetting: () => getDefaultSystemTraySetting, isAutoDownloadUpdatesSupported: () => isAutoDownloadUpdatesSupported, isAutoLaunchSupported: () => isAutoLaunchSupported, isContentProtectionEnabledByDefault: () => isContentProtectionEnabledByDefault, isContentProtectionNeeded: () => isContentProtectionNeeded, isContentProtectionSupported: () => isContentProtectionSupported, isDrawAttentionSupported: () => isDrawAttentionSupported, isHideMenuBarSupported: () => isHideMenuBarSupported, isMinimizeToAndStartInSystemTraySupported: () => isMinimizeToAndStartInSystemTraySupported, isNotificationGroupingSupported: () => isNotificationGroupingSupported, isSystemTraySupported: () => isSystemTraySupported, shouldHideExpiringMessageBody: () => shouldHideExpiringMessageBody }); module.exports = __toCommonJS(Settings_std_exports); var import_semver = __toESM(require("semver")); var import_SystemTraySetting_std = require("./SystemTraySetting.std.js"); var import_version_std = require("../util/version.std.js"); const MIN_WINDOWS_VERSION = "8.0.0"; const isNotificationGroupingSupported = /* @__PURE__ */ __name((OS) => !OS.isWindows() || OS.isWindows(MIN_WINDOWS_VERSION), "isNotificationGroupingSupported"); const isAutoLaunchSupported = /* @__PURE__ */ __name((OS) => OS.isWindows() || OS.isMacOS(), "isAutoLaunchSupported"); const isHideMenuBarSupported = /* @__PURE__ */ __name((OS) => !OS.isMacOS(), "isHideMenuBarSupported"); const isDrawAttentionSupported = /* @__PURE__ */ __name((OS) => !OS.isMacOS(), "isDrawAttentionSupported"); const isSystemTraySupported = /* @__PURE__ */ __name((OS) => OS.isWindows() || OS.isLinux(), "isSystemTraySupported"); const isContentProtectionSupported = /* @__PURE__ */ __name((OS) => OS.isWindows(), "isContentProtectionSupported"); const isContentProtectionNeeded = /* @__PURE__ */ __name((OS) => OS.isWindows(), "isContentProtectionNeeded"); const getDefaultSystemTraySetting = /* @__PURE__ */ __name((OS, appVersion) => { if (!isSystemTraySupported(OS)) { return import_SystemTraySetting_std.SystemTraySetting.DoNotUseSystemTray; } if (OS.isLinux() && (0, import_version_std.isProduction)(appVersion)) { return import_SystemTraySetting_std.SystemTraySetting.DoNotUseSystemTray; } return import_SystemTraySetting_std.SystemTraySetting.MinimizeToSystemTray; }, "getDefaultSystemTraySetting"); const isMinimizeToAndStartInSystemTraySupported = /* @__PURE__ */ __name((OS) => !OS.isWindows() && isSystemTraySupported(OS), "isMinimizeToAndStartInSystemTraySupported"); const isAutoDownloadUpdatesSupported = /* @__PURE__ */ __name((OS, appVersion) => { if ((0, import_version_std.isNotUpdatable)(appVersion)) { return false; } return OS.isWindows() || OS.isMacOS() || OS.isLinuxAppImage(); }, "isAutoDownloadUpdatesSupported"); const shouldHideExpiringMessageBody = /* @__PURE__ */ __name((OS, release) => OS.isWindows() || OS.isMacOS() && import_semver.default.lt(release, "21.1.0"), "shouldHideExpiringMessageBody"); const isContentProtectionEnabledByDefault = /* @__PURE__ */ __name((OS, release) => OS.isWindows() && import_semver.default.gte(release, "10.0.22000"), "isContentProtectionEnabledByDefault"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getDefaultSystemTraySetting, isAutoDownloadUpdatesSupported, isAutoLaunchSupported, isContentProtectionEnabledByDefault, isContentProtectionNeeded, isContentProtectionSupported, isDrawAttentionSupported, isHideMenuBarSupported, isMinimizeToAndStartInSystemTraySupported, isNotificationGroupingSupported, isSystemTraySupported, shouldHideExpiringMessageBody }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var SignalConversation_std_exports = {}; __export(SignalConversation_std_exports, { SIGNAL_ACI: () => SIGNAL_ACI, SIGNAL_AVATAR_PATH: () => SIGNAL_AVATAR_PATH }); module.exports = __toCommonJS(SignalConversation_std_exports); const SIGNAL_ACI = "11111111-1111-4111-8111-111111111111"; const SIGNAL_AVATAR_PATH = "images/profile-avatar.svg"; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { SIGNAL_ACI, SIGNAL_AVATAR_PATH }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var SocketStatus_std_exports = {}; __export(SocketStatus_std_exports, { SocketStatus: () => SocketStatus }); module.exports = __toCommonJS(SocketStatus_std_exports); var SocketStatus = /* @__PURE__ */ ((SocketStatus2) => { SocketStatus2["CONNECTING"] = "CONNECTING"; SocketStatus2["OPEN"] = "OPEN"; SocketStatus2["CLOSING"] = "CLOSING"; SocketStatus2["CLOSED"] = "CLOSED"; return SocketStatus2; })(SocketStatus || {}); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { SocketStatus }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var StorageUIKeys_std_exports = {}; __export(StorageUIKeys_std_exports, { STORAGE_UI_KEYS: () => STORAGE_UI_KEYS, themeSettingSchema: () => themeSettingSchema }); module.exports = __toCommonJS(StorageUIKeys_std_exports); var import_zod = require("zod"); const themeSettingSchema = import_zod.z.enum(["system", "light", "dark"]); const STORAGE_UI_KEYS = [ "always-relay-calls", "audio-notification", "audioMessage", "auto-download-update", "autoConvertEmoji", "badge-count-muted-conversations", "call-ringtone-notification", "call-system-notification", "customColors", "defaultConversationColor", "existingOnboardingStoryMessageIds", "hasCompletedSafetyNumberOnboarding", "hasCompletedUsernameLinkOnboarding", "hide-menu-bar", "incoming-call-notification", "navTabsCollapsed", "notification-draw-attention", "notification-setting", "pinnedConversationIds", "preferred-audio-input-device", "preferred-audio-output-device", "preferred-video-input-device", "preferredLeftPaneWidth", "preferredReactionEmoji", "sent-media-quality", "showStickerPickerHint", "showStickersIntroduction", "emojiSkinToneDefault", "textFormatting", "version", "zoomFactor" ]; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { STORAGE_UI_KEYS, themeSettingSchema }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var Stories_std_exports = {}; __export(Stories_std_exports, { HasStories: () => HasStories, MY_STORY_ID: () => MY_STORY_ID, ResolvedSendStatus: () => ResolvedSendStatus, StorySendMode: () => StorySendMode, StoryViewDirectionType: () => StoryViewDirectionType, StoryViewModeType: () => StoryViewModeType, StoryViewTargetType: () => StoryViewTargetType, getStoryDistributionListName: () => getStoryDistributionListName }); module.exports = __toCommonJS(Stories_std_exports); const MY_STORY_ID = "00000000-0000-0000-0000-000000000000"; var StoryViewDirectionType = /* @__PURE__ */ ((StoryViewDirectionType2) => { StoryViewDirectionType2["Next"] = "Next"; StoryViewDirectionType2["Previous"] = "Previous"; return StoryViewDirectionType2; })(StoryViewDirectionType || {}); var StoryViewTargetType = /* @__PURE__ */ ((StoryViewTargetType2) => { StoryViewTargetType2["Details"] = "Details"; StoryViewTargetType2["Views"] = "Views"; StoryViewTargetType2["Replies"] = "Replies"; return StoryViewTargetType2; })(StoryViewTargetType || {}); var StoryViewModeType = /* @__PURE__ */ ((StoryViewModeType2) => { StoryViewModeType2["All"] = "All"; StoryViewModeType2["Hidden"] = "Hidden"; StoryViewModeType2["MyStories"] = "MyStories"; StoryViewModeType2["Single"] = "Single"; StoryViewModeType2["Unread"] = "Unread"; StoryViewModeType2["User"] = "User"; return StoryViewModeType2; })(StoryViewModeType || {}); function getStoryDistributionListName(i18n, id, name) { return id === MY_STORY_ID ? i18n("icu:Stories__mine") : name; } __name(getStoryDistributionListName, "getStoryDistributionListName"); var HasStories = /* @__PURE__ */ ((HasStories2) => { HasStories2["Read"] = "Read"; HasStories2["Unread"] = "Unread"; return HasStories2; })(HasStories || {}); var StorySendMode = /* @__PURE__ */ ((StorySendMode2) => { StorySendMode2["IfActive"] = "IfActive"; StorySendMode2["Always"] = "Always"; StorySendMode2["Never"] = "Never"; return StorySendMode2; })(StorySendMode || {}); var ResolvedSendStatus = /* @__PURE__ */ ((ResolvedSendStatus2) => { ResolvedSendStatus2["Failed"] = "Failed"; ResolvedSendStatus2["PartiallySent"] = "PartiallySent"; ResolvedSendStatus2["Sending"] = "Sending"; ResolvedSendStatus2["Sent"] = "Sent"; return ResolvedSendStatus2; })(ResolvedSendStatus || {}); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { HasStories, MY_STORY_ID, ResolvedSendStatus, StorySendMode, StoryViewDirectionType, StoryViewModeType, StoryViewTargetType, getStoryDistributionListName }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var StoryDistributionId_std_exports = {}; __export(StoryDistributionId_std_exports, { generateStoryDistributionId: () => generateStoryDistributionId, isStoryDistributionId: () => isStoryDistributionId, normalizeStoryDistributionId: () => normalizeStoryDistributionId }); module.exports = __toCommonJS(StoryDistributionId_std_exports); var import_uuid = require("uuid"); var import_isValidUuid_std = require("../util/isValidUuid.std.js"); var import_log_std = require("../logging/log.std.js"); const log = (0, import_log_std.createLogger)("StoryDistributionId"); function isStoryDistributionId(value) { return (0, import_isValidUuid_std.isValidUuid)(value); } __name(isStoryDistributionId, "isStoryDistributionId"); function generateStoryDistributionId() { return (0, import_uuid.v4)(); } __name(generateStoryDistributionId, "generateStoryDistributionId"); function normalizeStoryDistributionId(distributionId, context, logger = log) { const result = distributionId.toLowerCase(); if (!isStoryDistributionId(result)) { logger.warn( `Normalizing invalid story distribution id: ${distributionId} to ${result} in context "${context}"` ); return result; } return result; } __name(normalizeStoryDistributionId, "normalizeStoryDistributionId"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { generateStoryDistributionId, isStoryDistributionId, normalizeStoryDistributionId }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var SystemTraySetting_std_exports = {}; __export(SystemTraySetting_std_exports, { SystemTraySetting: () => SystemTraySetting, parseSystemTraySetting: () => parseSystemTraySetting, shouldMinimizeToSystemTray: () => shouldMinimizeToSystemTray }); module.exports = __toCommonJS(SystemTraySetting_std_exports); var import_enum_std = require("../util/enum.std.js"); var SystemTraySetting = /* @__PURE__ */ ((SystemTraySetting2) => { SystemTraySetting2["Uninitialized"] = "Uninitialized"; SystemTraySetting2["DoNotUseSystemTray"] = "DoNotUseSystemTray"; SystemTraySetting2["MinimizeToSystemTray"] = "MinimizeToSystemTray"; SystemTraySetting2["MinimizeToAndStartInSystemTray"] = "MinimizeToAndStartInSystemTray"; return SystemTraySetting2; })(SystemTraySetting || {}); const shouldMinimizeToSystemTray = /* @__PURE__ */ __name((setting) => setting === "MinimizeToSystemTray" /* MinimizeToSystemTray */ || setting === "MinimizeToAndStartInSystemTray" /* MinimizeToAndStartInSystemTray */, "shouldMinimizeToSystemTray"); const parseSystemTraySetting = (0, import_enum_std.makeEnumParser)( SystemTraySetting, "Uninitialized" /* Uninitialized */ ); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { SystemTraySetting, parseSystemTraySetting, shouldMinimizeToSystemTray }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var Username_std_exports = {}; __export(Username_std_exports, { ConfirmUsernameResult: () => ConfirmUsernameResult, ReserveUsernameError: () => ReserveUsernameError, getDiscriminator: () => getDiscriminator, getNickname: () => getNickname, isCaseChange: () => isCaseChange }); module.exports = __toCommonJS(Username_std_exports); var ReserveUsernameError = /* @__PURE__ */ ((ReserveUsernameError2) => { ReserveUsernameError2["Unprocessable"] = "Unprocessable"; ReserveUsernameError2["Conflict"] = "Conflict"; ReserveUsernameError2["NotEnoughCharacters"] = "NotEnoughCharacters"; ReserveUsernameError2["TooManyCharacters"] = "TooManyCharacters"; ReserveUsernameError2["CheckStartingCharacter"] = "CheckStartingCharacter"; ReserveUsernameError2["CheckCharacters"] = "CheckCharacters"; ReserveUsernameError2["NotEnoughDiscriminator"] = "NotEnoughDiscriminator"; ReserveUsernameError2["AllZeroDiscriminator"] = "AllZeroDiscriminator"; ReserveUsernameError2["LeadingZeroDiscriminator"] = "LeadingZeroDiscriminator"; ReserveUsernameError2["TooManyAttempts"] = "TooManyAttempts"; return ReserveUsernameError2; })(ReserveUsernameError || {}); var ConfirmUsernameResult = /* @__PURE__ */ ((ConfirmUsernameResult2) => { ConfirmUsernameResult2["Ok"] = "Ok"; ConfirmUsernameResult2["OkRecovered"] = "OkRecovered"; ConfirmUsernameResult2["ConflictOrGone"] = "ConflictOrGone"; return ConfirmUsernameResult2; })(ConfirmUsernameResult || {}); function getNickname(username) { const match = username.match(/^(.*?)(?:\.|$)/); if (!match) { return void 0; } return match[1]; } __name(getNickname, "getNickname"); function getDiscriminator(username) { const match = username.match(/\.([0-9]*)$/); if (!match) { return void 0; } return match[1]; } __name(getDiscriminator, "getDiscriminator"); function isCaseChange({ previousUsername, username }) { return previousUsername?.toLowerCase() === username.toLowerCase(); } __name(isCaseChange, "isCaseChange"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { ConfirmUsernameResult, ReserveUsernameError, getDiscriminator, getNickname, isCaseChange }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var Util_std_exports = {}; __export(Util_std_exports, { ScrollBehavior: () => ScrollBehavior, SentMediaQualityType: () => SentMediaQualityType, SystemThemeType: () => SystemThemeType, ThemeType: () => ThemeType }); module.exports = __toCommonJS(Util_std_exports); var SentMediaQualityType = /* @__PURE__ */ ((SentMediaQualityType2) => { SentMediaQualityType2["standard"] = "standard"; SentMediaQualityType2["high"] = "high"; return SentMediaQualityType2; })(SentMediaQualityType || {}); var ThemeType = /* @__PURE__ */ ((ThemeType2) => { ThemeType2["light"] = "light"; ThemeType2["dark"] = "dark"; return ThemeType2; })(ThemeType || {}); var SystemThemeType = /* @__PURE__ */ ((SystemThemeType2) => { SystemThemeType2["light"] = "light"; SystemThemeType2["dark"] = "dark"; return SystemThemeType2; })(SystemThemeType || {}); var ScrollBehavior = /* @__PURE__ */ ((ScrollBehavior2) => { ScrollBehavior2["Default"] = "default"; ScrollBehavior2["Hard"] = "hard"; return ScrollBehavior2; })(ScrollBehavior || {}); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { ScrollBehavior, SentMediaQualityType, SystemThemeType, ThemeType }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var VerificationTransport_std_exports = {}; __export(VerificationTransport_std_exports, { VerificationTransport: () => VerificationTransport }); module.exports = __toCommonJS(VerificationTransport_std_exports); var VerificationTransport = /* @__PURE__ */ ((VerificationTransport2) => { VerificationTransport2["SMS"] = "SMS"; VerificationTransport2["Voice"] = "Voice"; return VerificationTransport2; })(VerificationTransport || {}); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { VerificationTransport }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var backups_node_exports = {}; __export(backups_node_exports, { BackupCredentialType: () => import_zkgroup.BackupCredentialType }); module.exports = __toCommonJS(backups_node_exports); var import_zkgroup = require("@signalapp/libsignal-client/dist/zkgroup/index.js"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { BackupCredentialType }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var emoji_std_exports = {}; __export(emoji_std_exports, { LocaleEmojiListSchema: () => LocaleEmojiListSchema, LocaleEmojiSchema: () => LocaleEmojiSchema }); module.exports = __toCommonJS(emoji_std_exports); var import_zod = __toESM(require("zod")); const LocaleEmojiSchema = import_zod.default.object({ emoji: import_zod.default.string(), shortName: import_zod.default.string(), tags: import_zod.default.string().array(), rank: import_zod.default.number() }); const LocaleEmojiListSchema = LocaleEmojiSchema.array(); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { LocaleEmojiListSchema, LocaleEmojiSchema }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var errors_std_exports = {}; __export(errors_std_exports, { ProfileDecryptError: () => ProfileDecryptError, toLocation: () => toLocation, toLogFormat: () => toLogFormat }); module.exports = __toCommonJS(errors_std_exports); var import_HTTPError_std = require("./HTTPError.std.js"); function toLogFormat(error) { let result = ""; if (error instanceof import_HTTPError_std.HTTPError) { return `HTTPError ${error.code}`; } if (error instanceof Error && error.stack) { result = error.stack; } else if (error && typeof error === "object" && "message" in error) { result = String(error.message); } else { result = String(error); } if (error && typeof error === "object" && "cause" in error) { result += ` Caused by: ${String(error.cause)}`; } return result; } __name(toLogFormat, "toLogFormat"); function toLocation(source, line, column) { if (source == null) { return "(@ unknown)"; } if (line != null && column != null) { return `(@ ${source}:${line}:${column})`; } if (line != null) { return `(@ ${source}:${line})`; } return `(@ ${source})`; } __name(toLocation, "toLocation"); class ProfileDecryptError extends Error { static { __name(this, "ProfileDecryptError"); } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { ProfileDecryptError, toLocation, toLogFormat }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var globalModals_std_exports = {}; __export(globalModals_std_exports, { UsernameOnboardingState: () => UsernameOnboardingState }); module.exports = __toCommonJS(globalModals_std_exports); var UsernameOnboardingState = /* @__PURE__ */ ((UsernameOnboardingState2) => { UsernameOnboardingState2["NeverShown"] = "NeverShown"; UsernameOnboardingState2["Open"] = "Open"; UsernameOnboardingState2["Closed"] = "Closed"; return UsernameOnboardingState2; })(UsernameOnboardingState || {}); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { UsernameOnboardingState }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var groups_std_exports = {}; __export(groups_std_exports, { ID_LENGTH: () => ID_LENGTH, ID_V1_LENGTH: () => ID_V1_LENGTH }); module.exports = __toCommonJS(groups_std_exports); const ID_V1_LENGTH = 16; const ID_LENGTH = 32; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { ID_LENGTH, ID_V1_LENGTH }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var leftPane_std_exports = {}; __export(leftPane_std_exports, { LeftPaneMode: () => LeftPaneMode }); module.exports = __toCommonJS(leftPane_std_exports); var LeftPaneMode = /* @__PURE__ */ ((LeftPaneMode2) => { LeftPaneMode2[LeftPaneMode2["Inbox"] = 0] = "Inbox"; LeftPaneMode2[LeftPaneMode2["Search"] = 1] = "Search"; LeftPaneMode2[LeftPaneMode2["Archive"] = 2] = "Archive"; LeftPaneMode2[LeftPaneMode2["Compose"] = 3] = "Compose"; LeftPaneMode2[LeftPaneMode2["ChooseGroupMembers"] = 4] = "ChooseGroupMembers"; LeftPaneMode2[LeftPaneMode2["FindByUsername"] = 5] = "FindByUsername"; LeftPaneMode2[LeftPaneMode2["FindByPhoneNumber"] = 6] = "FindByPhoneNumber"; LeftPaneMode2[LeftPaneMode2["SetGroupMetadata"] = 7] = "SetGroupMetadata"; return LeftPaneMode2; })(LeftPaneMode || {}); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { LeftPaneMode }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var menu_std_exports = {}; module.exports = __toCommonJS(menu_std_exports); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var LinkPreviews_std_exports = {}; __export(LinkPreviews_std_exports, { isSameLinkPreview: () => isSameLinkPreview }); module.exports = __toCommonJS(LinkPreviews_std_exports); function isSameLinkPreview(prev, next) { if (prev == null || next == null) { return prev == null && next == null; } if (prev.url !== next.url) { return false; } if (prev.title !== next.title) { return false; } if (prev.description !== next.description) { return false; } if (prev.image?.plaintextHash !== next.image?.plaintextHash) { return false; } return true; } __name(isSameLinkPreview, "isSameLinkPreview"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { isSameLinkPreview }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var MessageStatus_std_exports = {}; __export(MessageStatus_std_exports, { MessageStatuses: () => MessageStatuses }); module.exports = __toCommonJS(MessageStatus_std_exports); const MessageStatuses = [ "delivered", "error", "paused", "partial-sent", "read", "sending", "sent", "viewed" ]; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { MessageStatuses }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var notifications_std_exports = {}; __export(notifications_std_exports, { NotificationType: () => NotificationType, WindowsNotificationDataSchema: () => WindowsNotificationDataSchema, WindowsNotificationRequestSchema: () => WindowsNotificationRequestSchema, WindowsNotificationWorkerDataSchema: () => WindowsNotificationWorkerDataSchema }); module.exports = __toCommonJS(notifications_std_exports); var import_zod = __toESM(require("zod")); var NotificationType = /* @__PURE__ */ ((NotificationType2) => { NotificationType2["IncomingCall"] = "IncomingCall"; NotificationType2["IncomingGroupCall"] = "IncomingGroupCall"; NotificationType2["IsPresenting"] = "IsPresenting"; NotificationType2["Message"] = "Message"; NotificationType2["Reaction"] = "Reaction"; NotificationType2["MinimizedToTray"] = "MinimizedToTray"; return NotificationType2; })(NotificationType || {}); const WindowsNotificationDataSchema = import_zod.default.object({ avatarPath: import_zod.default.string().optional(), body: import_zod.default.string(), heading: import_zod.default.string(), token: import_zod.default.string(), type: import_zod.default.nativeEnum(NotificationType) }); const WindowsNotificationWorkerDataSchema = import_zod.default.object({ AUMID: import_zod.default.string() }); const WindowsNotificationRequestSchema = import_zod.default.union([ import_zod.default.object({ command: import_zod.default.literal("show"), notificationData: WindowsNotificationDataSchema }), import_zod.default.object({ command: import_zod.default.literal("clearAll") }), import_zod.default.object({ command: import_zod.default.literal("sendDummyKeystroke") }) ]); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { NotificationType, WindowsNotificationDataSchema, WindowsNotificationRequestSchema, WindowsNotificationWorkerDataSchema }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var safetyNumber_std_exports = {}; module.exports = __toCommonJS(safetyNumber_std_exports); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var support_std_exports = {}; __export(support_std_exports, { BETA_DOWNLOAD_URL: () => BETA_DOWNLOAD_URL, KEY_TRANSPARENCY_URL: () => KEY_TRANSPARENCY_URL, LINK_SIGNAL_DESKTOP: () => LINK_SIGNAL_DESKTOP, PRODUCTION_DOWNLOAD_URL: () => PRODUCTION_DOWNLOAD_URL, SAFETY_NUMBER_URL: () => SAFETY_NUMBER_URL, SYNCING_MESSAGES_SECURITY_URL: () => SYNCING_MESSAGES_SECURITY_URL, UNSUPPORTED_OS_URL: () => UNSUPPORTED_OS_URL }); module.exports = __toCommonJS(support_std_exports); const PRODUCTION_DOWNLOAD_URL = "https://signal.org/download/"; const BETA_DOWNLOAD_URL = "https://support.signal.org/beta"; const UNSUPPORTED_OS_URL = "https://support.signal.org/hc/articles/5109141421850"; const LINK_SIGNAL_DESKTOP = "https://support.signal.org/hc/articles/360007320451#desktop_multiple_device"; const SAFETY_NUMBER_URL = "https://support.signal.org/hc/articles/360007060632"; const KEY_TRANSPARENCY_URL = "https://support.signal.org/hc/articles/10223569377562"; const SYNCING_MESSAGES_SECURITY_URL = "https://support.signal.org/hc/articles/360007320391"; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { BETA_DOWNLOAD_URL, KEY_TRANSPARENCY_URL, LINK_SIGNAL_DESKTOP, PRODUCTION_DOWNLOAD_URL, SAFETY_NUMBER_URL, SYNCING_MESSAGES_SECURITY_URL, UNSUPPORTED_OS_URL }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var common_main_exports = {}; __export(common_main_exports, { Updater: () => Updater, createTempDir: () => createTempDir, createUpdateCacheDirIfNeeded: () => createUpdateCacheDirIfNeeded, deleteTempDir: () => deleteTempDir, getCliOptions: () => getCliOptions, getTempDir: () => getTempDir, getUpdateCheckUrl: () => getUpdateCheckUrl, getUpdateFileName: () => getUpdateFileName, getUpdatesBase: () => getUpdatesBase, getUpdatesFileName: () => getUpdatesFileName, getVersion: () => getVersion, isUpdateFileNameValid: () => isUpdateFileNameValid, parseYaml: () => parseYaml, validatePath: () => validatePath }); module.exports = __toCommonJS(common_main_exports); var import_node_fs = require("node:fs"); var import_fs_extra = __toESM(require("fs-extra")); var import_promises = require("node:fs/promises"); var import_lodash = __toESM(require("lodash")); var import_node_os = require("node:os"); var import_node_path = require("node:path"); var import_config = __toESM(require("config")); var import_dashdash = require("dashdash"); var import_js_yaml = require("js-yaml"); var import_semver = require("semver"); var import_got = __toESM(require("got")); var import_uuid = require("uuid"); var import_electron = require("electron"); var import_missingCaseError_std = require("../util/missingCaseError.std.js"); var import_attachments_node = require("../../app/attachments.node.js"); var import_window_state_std = require("../../app/window_state.std.js"); var import_Dialogs_std = require("../types/Dialogs.std.js"); var Errors = __toESM(require("../types/errors.std.js")); var import_assert_std = require("../util/assert.std.js"); var import_drop_std = require("../util/drop.std.js"); var durations = __toESM(require("../util/durations/index.std.js")); var import_version_std = require("../util/version.std.js"); var import_isPathInside_node = require("../util/isPathInside.node.js"); var import_packageJson_node = require("../util/packageJson.node.js"); var import_signature_node = require("./signature.node.js"); var import_differential_node = require("./differential.node.js"); var import_got_node = require("./got.node.js"); var import_util_node = require("./util.node.js"); var import_gracefulFs_node = require("../util/gracefulFs.node.js"); const { pathExists } = import_fs_extra.default; const { throttle } = import_lodash.default; const POLL_INTERVAL = 30 * durations.MINUTE; var DownloadMode = /* @__PURE__ */ ((DownloadMode2) => { DownloadMode2["DifferentialOnly"] = "DifferentialOnly"; DownloadMode2["FullOnly"] = "FullOnly"; DownloadMode2["Automatic"] = "Automatic"; DownloadMode2["ForceUpdate"] = "ForceUpdate"; return DownloadMode2; })(DownloadMode || {}); var CheckType = /* @__PURE__ */ ((CheckType2) => { CheckType2["Normal"] = "Normal"; CheckType2["AllowSameVersion"] = "AllowSameVersion"; CheckType2["ForceDownload"] = "ForceDownload"; return CheckType2; })(CheckType || {}); const MAX_AUTO_RETRY_ATTEMPTS = 1; const AUTO_RETRY_DELAY = durations.DAY; class Updater { static { __name(this, "Updater"); } fileName; version; cachedDifferentialData; logger; #sql; getMainWindow; #throttledSendDownloadingUpdate; #activeDownload; #markedCannotUpdate = false; #restarting = false; #canRunSilently; #autoRetryAttempts = 0; #autoRetryAfter; // Just a stable randomness that is used for determining the update time. The // value does not have to be consistent across restarts. #pollId = (0, import_uuid.v4)(); constructor({ canRunSilently, getMainWindow, logger, sql }) { this.#canRunSilently = canRunSilently; this.getMainWindow = getMainWindow; this.logger = logger; this.#sql = sql; this.#throttledSendDownloadingUpdate = throttle( (downloadedSize, downloadSize) => { const mainWindow = this.getMainWindow(); mainWindow?.webContents.send( "show-update-dialog", import_Dialogs_std.DialogType.Downloading, { downloadedSize, downloadSize } ); }, 50 ); import_electron.ipcMain.handle("updater/force-update", () => this.force()); } // // Public APIs // async force() { this.#markedCannotUpdate = false; return this.#checkForUpdatesMaybeInstall("ForceDownload" /* ForceDownload */); } // If the updater was about to restart the app but the user canceled it, show dialog // to let them retry the restart onRestartCanceled() { if (!this.#restarting) { return; } this.logger.info( "onRestartCanceled: restart was canceled. forcing update to reset updater state" ); this.#restarting = false; (0, import_window_state_std.markShouldNotQuit)(); (0, import_drop_std.drop)(this.#checkForUpdatesMaybeInstall("AllowSameVersion" /* AllowSameVersion */)); } async start() { this.logger.info("start: starting checks..."); this.#schedulePoll(); await this.deletePreviousInstallers(); await this.#checkForUpdatesMaybeInstall("Normal" /* Normal */); } // // Protected methods // setUpdateListener(performUpdateCallback) { import_electron.ipcMain.removeHandler("start-update"); import_electron.ipcMain.handleOnce("start-update", performUpdateCallback); } checkSystemRequirements(vendor) { if (vendor.requireManualUpdate === "true") { this.logger.warn("checkSystemRequirements: manual update required"); this.markCannotUpdate( new Error("yaml file has requireManualUpdate flag"), import_Dialogs_std.DialogType.Cannot_Update_Require_Manual ); return false; } if (vendor.minOSVersion && (0, import_semver.lt)((0, import_node_os.release)(), vendor.minOSVersion)) { this.logger.warn( `checkSystemRequirements: OS version ${(0, import_node_os.release)()} is less than the minimum supported version ${vendor.minOSVersion}` ); this.markCannotUpdate( new Error("yaml file has unsatisfied minOSVersion value"), import_Dialogs_std.DialogType.UnsupportedOS ); return false; } return true; } markCannotUpdate(error, dialogType = import_Dialogs_std.DialogType.Cannot_Update) { if (this.#markedCannotUpdate) { this.logger.warn( "markCannotUpdate: already marked", Errors.toLogFormat(error) ); return; } this.#markedCannotUpdate = true; this.logger.error( `markCannotUpdate: marking due to error: ${Errors.toLogFormat(error)}, dialogType: ${dialogType}` ); const mainWindow = this.getMainWindow(); mainWindow?.webContents.send("show-update-dialog", dialogType); this.setUpdateListener(async () => { this.logger.info("markCannotUpdate: retrying after user action"); this.#markedCannotUpdate = false; await this.#checkForUpdatesMaybeInstall("Normal" /* Normal */); }); } markRestarting() { this.logger.info( "markRestarting: preparing to restart application for update" ); this.#restarting = true; (0, import_window_state_std.markShouldQuit)(); } getUpdatesPublicKey() { return (0, import_signature_node.hexToBinary)(import_config.default.get("updatesPublicKey")); } // // Private methods // #schedulePoll() { const now = Date.now(); const earliestPollTime = now - now % POLL_INTERVAL + POLL_INTERVAL; const selectedPollTime = Math.round( earliestPollTime + Math.random() * POLL_INTERVAL ); const timeoutMs = selectedPollTime - now; this.logger.info(`schedulePoll: polling in ${timeoutMs}ms`); setTimeout(() => { (0, import_drop_std.drop)(this.#safePoll()); }, timeoutMs); } async #safePoll() { try { if (this.#autoRetryAfter != null && Date.now() < this.#autoRetryAfter) { this.logger.info(`safePoll: not polling until ${this.#autoRetryAfter}`); return; } this.logger.info("safePoll: polling now"); await this.#checkForUpdatesMaybeInstall("Normal" /* Normal */); } catch (error) { this.logger.warn(`safePoll: ${Errors.toLogFormat(error)}`); } finally { this.#schedulePoll(); } } async #downloadAndInstall(updateInfo, mode) { if (this.#activeDownload) { return this.#activeDownload; } try { this.#activeDownload = this.#doDownloadAndInstall(updateInfo, mode); return await this.#activeDownload; } finally { this.#activeDownload = void 0; } } async #doDownloadAndInstall(updateInfo, mode) { const { logger } = this; const { fileName: newFileName, version: newVersion } = updateInfo; try { const oldVersion = this.version; this.version = newVersion; let downloadResult; try { downloadResult = await this.#downloadUpdate(updateInfo, mode); } catch (error) { this.version = oldVersion; if (mode === "Automatic" /* Automatic */ && this.#autoRetryAttempts < MAX_AUTO_RETRY_ATTEMPTS) { this.#autoRetryAttempts += 1; this.#autoRetryAfter = Date.now() + AUTO_RETRY_DELAY; logger.warn( `downloadAndInstall: transient error ${Errors.toLogFormat(error)}, attempts=${this.#autoRetryAttempts}, retryAfter=${this.#autoRetryAfter}` ); return false; } throw error; } this.#autoRetryAttempts = 0; this.#autoRetryAfter = void 0; if (!downloadResult) { logger.warn("downloadAndInstall: no update was downloaded"); (0, import_assert_std.strictAssert)( mode !== "ForceUpdate" /* ForceUpdate */ && mode !== "Automatic" /* Automatic */ && mode !== "FullOnly" /* FullOnly */, "Automatic/full/force update mode downloads are guaranteed to happen or error" ); return false; } const { updateFilePath, signature } = downloadResult; const verified = await (0, import_signature_node.verifySignature)( updateFilePath, this.version, signature, this.getUpdatesPublicKey() ); if (!verified) { throw new Error( `Downloaded update did not pass signature verification (version: '${this.version}'; fileName: '${newFileName}')` ); } const isSilent = updateInfo.vendor?.requireUserConfirmation !== "true" && this.#canRunSilently(); const handler = await this.installUpdate(updateFilePath, isSilent); if (isSilent || mode === "ForceUpdate" /* ForceUpdate */) { await handler(); } else { this.setUpdateListener(handler); } const mainWindow = this.getMainWindow(); if (mode === "ForceUpdate" /* ForceUpdate */) { logger.info("downloadAndInstall: force update, no dialog..."); } else if (mainWindow) { logger.info("downloadAndInstall: showing update dialog..."); mainWindow.webContents.send( "show-update-dialog", mode === "Automatic" /* Automatic */ ? import_Dialogs_std.DialogType.AutoUpdate : import_Dialogs_std.DialogType.DownloadedUpdate, { version: this.version } ); } else { logger.warn( "downloadAndInstall: no mainWindow, cannot show update dialog" ); } return true; } catch (error) { logger.error( `downloadAndInstall: fatal error ${Errors.toLogFormat(error)}` ); this.markCannotUpdate(error); throw error; } } async #checkForUpdatesMaybeInstall(checkType) { const { logger } = this; logger.info("checkForUpdatesMaybeInstall: checking for update..."); const updateInfo = await this.#checkForUpdates(checkType); if (!updateInfo) { return; } const { version: newVersion } = updateInfo; if (checkType === "ForceDownload" /* ForceDownload */) { await this.#downloadAndInstall(updateInfo, "ForceUpdate" /* ForceUpdate */); return; } if (checkType === "Normal" /* Normal */) { if (this.version && !(0, import_semver.gt)(newVersion, this.version)) { return; } } else if (checkType === "AllowSameVersion" /* AllowSameVersion */) { if (this.version && !(0, import_semver.gte)(newVersion, this.version)) { return; } } else { throw (0, import_missingCaseError_std.missingCaseError)(checkType); } const autoDownloadUpdates = await this.#getAutoDownloadUpdateSetting(); if (autoDownloadUpdates) { await this.#downloadAndInstall(updateInfo, "Automatic" /* Automatic */); return; } let mode = "FullOnly" /* FullOnly */; if (updateInfo.differentialData) { mode = "DifferentialOnly" /* DifferentialOnly */; } await this.#offerUpdate(updateInfo, mode, 0); } async #offerUpdate(updateInfo, mode, attempt) { const { logger } = this; this.setUpdateListener(async () => { logger.info("offerUpdate: have not downloaded update, going to download"); const didDownload = await this.#downloadAndInstall(updateInfo, mode); if (!didDownload && mode === "DifferentialOnly" /* DifferentialOnly */) { this.logger.warn( "offerUpdate: Failed to download differential update, offering full" ); this.#throttledSendDownloadingUpdate.cancel(); return this.#offerUpdate( updateInfo, "FullOnly" /* FullOnly */, attempt + 1 ); } (0, import_assert_std.strictAssert)(didDownload, "FullOnly must always download update"); }); const mainWindow = this.getMainWindow(); if (!mainWindow) { logger.warn("offerUpdate: no mainWindow, cannot show update dialog"); return; } let downloadSize; if (mode === "DifferentialOnly" /* DifferentialOnly */) { (0, import_assert_std.strictAssert)( updateInfo.differentialData, "Must have differential data in DifferentialOnly mode" ); downloadSize = updateInfo.differentialData.downloadSize; } else { downloadSize = updateInfo.size; } logger.info(`offerUpdate: offering ${mode} update`); mainWindow.webContents.send( "show-update-dialog", attempt === 0 ? import_Dialogs_std.DialogType.DownloadReady : import_Dialogs_std.DialogType.FullDownloadReady, { downloadSize, downloadMode: mode, version: updateInfo.version } ); } async #checkForUpdates(checkType) { if ((0, import_version_std.isNotUpdatable)(import_packageJson_node.version)) { this.logger.info( "checkForUpdates: not checking for updates, this is not an updatable build" ); return; } const yaml = await getUpdateYaml(); const parsedYaml = parseYaml(yaml); const { vendor } = parsedYaml; if (vendor && !this.checkSystemRequirements(vendor)) { return; } const version = getVersion(parsedYaml); if (!version) { this.logger.warn( "checkForUpdates: no version extracted from downloaded yaml" ); return; } if (checkType === "Normal" /* Normal */ && !isVersionNewer(version)) { this.logger.info( `checkForUpdates: ${version} is not newer than ${import_packageJson_node.version}; no new update available` ); return; } if (checkType === "Normal" /* Normal */ && vendor?.noDelay !== "true") { try { const releasedAt = new Date(parsedYaml.releaseDate).getTime(); if (!(0, import_util_node.isTimeToUpdate)({ logger: this.logger, pollId: this.#pollId, releasedAt })) { return; } } catch (error) { this.logger.warn( `checkForUpdates: failed to compute delay for ${parsedYaml.releaseDate}` ); } } this.logger.info( `checkForUpdates: found newer version ${version} checkType=${checkType}` ); const fileName = getUpdateFileName( parsedYaml, process.platform, await this.#getArch() ); const sha512 = getSHA512(parsedYaml, fileName); (0, import_assert_std.strictAssert)(sha512 !== void 0, "Missing required hash"); const latestInstaller = await this.#getLatestCachedInstaller( (0, import_node_path.extname)(fileName) ); let differentialData; if (latestInstaller) { this.logger.info( `checkForUpdates: Found local installer ${latestInstaller}` ); const diffOptions = { oldFile: latestInstaller, newUrl: `${getUpdatesBase()}/${fileName}`, sha512 }; if (this.cachedDifferentialData && (0, import_differential_node.isValidPreparedData)(this.cachedDifferentialData, diffOptions)) { this.logger.info("checkForUpdates: using cached differential data"); differentialData = this.cachedDifferentialData; } else { try { differentialData = await (0, import_differential_node.prepareDownload)(diffOptions); this.cachedDifferentialData = differentialData; this.logger.info( "checkForUpdates: differential download size", differentialData.downloadSize ); } catch (error) { this.logger.error( "checkForUpdates: Failed to prepare differential update", Errors.toLogFormat(error) ); this.cachedDifferentialData = void 0; } } } return { fileName, size: getSize(parsedYaml, fileName), version, sha512, differentialData, vendor }; } async #getLatestCachedInstaller(extension) { const cacheDir = await createUpdateCacheDirIfNeeded(); const oldFiles = (await (0, import_promises.readdir)(cacheDir)).map((fileName) => { return (0, import_node_path.join)(cacheDir, fileName); }); return oldFiles.find((fileName) => (0, import_node_path.extname)(fileName) === extension); } async #downloadUpdate({ fileName, sha512, differentialData, size }, mode) { const baseUrl = getUpdatesBase(); const updateFileUrl = `${baseUrl}/${fileName}`; const updateOnProgress = mode !== "Automatic" /* Automatic */; const signatureFileName = (0, import_signature_node.getSignatureFileName)(fileName); const blockMapFileName = (0, import_differential_node.getBlockMapFileName)(fileName); const signatureUrl = `${baseUrl}/${signatureFileName}`; const blockMapUrl = `${baseUrl}/${blockMapFileName}`; let cacheDir = await createUpdateCacheDirIfNeeded(); const targetUpdatePath = (0, import_node_path.join)(cacheDir, fileName); const tempDir = await createTempDir(); const tempUpdatePath = (0, import_node_path.join)(tempDir, fileName); const tempBlockMapPath = (0, import_node_path.join)(tempDir, blockMapFileName); let tempPathFailover = false; try { validatePath(cacheDir, targetUpdatePath); validatePath(tempDir, tempUpdatePath); validatePath(tempDir, tempBlockMapPath); this.logger.info(`downloadUpdate: Downloading signature ${signatureUrl}`); const signature = Buffer.from( await (0, import_got.default)(signatureUrl, await (0, import_got_node.getGotOptions)()).text(), "hex" ); if (differentialData) { this.logger.info(`downloadUpdate: Saving blockmap ${blockMapUrl}`); await (0, import_promises.writeFile)(tempBlockMapPath, differentialData.newBlockMap); } else { try { this.logger.info( `downloadUpdate: Downloading blockmap ${blockMapUrl}` ); const blockMap = await (0, import_got.default)( blockMapUrl, await (0, import_got_node.getGotOptions)() ).buffer(); await (0, import_promises.writeFile)(tempBlockMapPath, blockMap); } catch (error) { this.logger.warn( "downloadUpdate: Failed to download blockmap, continuing", Errors.toLogFormat(error) ); } } let gotUpdate = false; if (!gotUpdate && await pathExists(targetUpdatePath)) { const checkResult = await (0, import_util_node.checkIntegrity)(targetUpdatePath, sha512); if (checkResult.ok) { this.logger.info( `downloadUpdate: Not downloading update ${updateFileUrl}, local file has the same hash` ); try { await (0, import_gracefulFs_node.gracefulRename)(this.logger, targetUpdatePath, tempUpdatePath); gotUpdate = true; } catch (error) { this.logger.error( "downloadUpdate: failed to move already downloaded file", Errors.toLogFormat(error) ); } } else { this.logger.error( "downloadUpdate: integrity check failure", checkResult.error ); } } const isDifferentialEnabled = differentialData && mode !== "FullOnly" /* FullOnly */; if (!gotUpdate && isDifferentialEnabled) { this.logger.info( `downloadUpdate: Downloading differential update ${updateFileUrl}` ); try { await (0, import_differential_node.download)(tempUpdatePath, differentialData, { statusCallback: updateOnProgress ? this.#throttledSendDownloadingUpdate : void 0, logger: this.logger }); gotUpdate = true; } catch (error) { this.logger.error( "downloadUpdate: Failed to apply differential update", Errors.toLogFormat(error) ); } } const isFullEnabled = mode !== "DifferentialOnly" /* DifferentialOnly */; if (!gotUpdate && isFullEnabled) { this.logger.info( `downloadUpdate: Downloading full update ${updateFileUrl}` ); await (0, import_gracefulFs_node.gracefulRmRecursive)(this.logger, cacheDir); cacheDir = await createUpdateCacheDirIfNeeded(); await this.#downloadAndReport( updateFileUrl, size, tempUpdatePath, updateOnProgress ); gotUpdate = true; } if (!gotUpdate) { return void 0; } this.logger.info( "downloadUpdate: Downloaded update, moving into cache dir" ); const restoreDir = await getTempDir(); await (0, import_gracefulFs_node.gracefulRename)(this.logger, cacheDir, restoreDir); try { await (0, import_gracefulFs_node.gracefulRename)(this.logger, tempDir, cacheDir); } catch (error) { try { await (0, import_gracefulFs_node.gracefulRename)(this.logger, restoreDir, cacheDir); } catch (restoreError) { this.logger.warn( "downloadUpdate: Failed to restore from backup folder, ignoring", Errors.toLogFormat(restoreError) ); try { await deleteTempDir(this.logger, restoreDir); } catch (cleanupError) { this.logger.warn( "downloadUpdate: Failed to remove backup folder after failed restore, ignoring", Errors.toLogFormat(cleanupError) ); } } this.logger.warn( "downloadUpdate: running update from a temporary folder due to error", Errors.toLogFormat(error) ); tempPathFailover = true; return { updateFilePath: tempUpdatePath, signature }; } try { await deleteTempDir(this.logger, restoreDir); } catch (error) { this.logger.warn( "downloadUpdate: Failed to remove backup folder, ignoring", Errors.toLogFormat(error) ); } return { updateFilePath: targetUpdatePath, signature }; } finally { if (!tempPathFailover) { await deleteTempDir(this.logger, tempDir); } } } async #downloadAndReport(updateFileUrl, downloadSize, targetUpdatePath, updateOnProgress = false) { const downloadStream = import_got.default.stream(updateFileUrl, await (0, import_got_node.getGotOptions)()); const writeStream = (0, import_node_fs.createWriteStream)(targetUpdatePath); await new Promise((resolve, reject) => { if (updateOnProgress) { let downloadedSize = 0; downloadStream.on("data", (data) => { downloadedSize += data.length; this.#throttledSendDownloadingUpdate(downloadedSize, downloadSize); }); } downloadStream.on("error", (error) => { reject(error); }); downloadStream.on("end", () => { resolve(); }); writeStream.on("error", (error) => { reject(error); }); downloadStream.pipe(writeStream); }); } async #getAutoDownloadUpdateSetting() { try { const result = await this.#sql.sqlRead( "getItemById", "auto-download-update" ); return result?.value ?? true; } catch (error) { this.logger.warn( "getAutoDownloadUpdateSetting: Failed to fetch, returning false", Errors.toLogFormat(error) ); return false; } } async #getArch() { if (process.arch === "arm64") { return process.arch; } if (process.platform !== "darwin" && process.platform !== "win32") { return process.arch; } if (import_electron.app.runningUnderARM64Translation) { this.logger.info("updater: running under arm64 translation"); return "arm64"; } this.logger.info("updater: not running under arm64 translation"); return process.arch; } } function validatePath(basePath, targetPath) { const normalized = (0, import_node_path.normalize)(targetPath); if (!(0, import_isPathInside_node.isPathInside)(normalized, basePath)) { throw new Error( `validatePath: Path ${normalized} is not under base path ${basePath}` ); } } __name(validatePath, "validatePath"); function getUpdateCheckUrl() { return `${getUpdatesBase()}/${getUpdatesFileName()}`; } __name(getUpdateCheckUrl, "getUpdateCheckUrl"); function getUpdatesBase() { return import_config.default.get("updatesUrl"); } __name(getUpdatesBase, "getUpdatesBase"); function getUpdatesFileName() { const prefix = getChannel(); if (process.platform === "darwin") { return `${prefix}-mac.yml`; } if (process.platform === "linux") { return `${prefix}-linux.yml`; } return `${prefix}.yml`; } __name(getUpdatesFileName, "getUpdatesFileName"); function getChannel() { if ((0, import_version_std.isNotUpdatable)(import_packageJson_node.version)) { return import_packageJson_node.version; } if ((0, import_version_std.isStaging)(import_packageJson_node.version)) { return "staging"; } if ((0, import_version_std.isAlpha)(import_packageJson_node.version)) { return "alpha"; } if ((0, import_version_std.isAxolotl)(import_packageJson_node.version)) { return "axolotl"; } if ((0, import_version_std.isBeta)(import_packageJson_node.version)) { return "beta"; } return "latest"; } __name(getChannel, "getChannel"); function isVersionNewer(newVersion) { return (0, import_semver.gt)(newVersion, import_packageJson_node.version); } __name(isVersionNewer, "isVersionNewer"); function getVersion(info) { return info && info.version; } __name(getVersion, "getVersion"); const validFile = /^[A-Za-z0-9._-]+$/; function isUpdateFileNameValid(name) { return validFile.test(name); } __name(isUpdateFileNameValid, "isUpdateFileNameValid"); function getUpdateFileName(info, platform, arch) { if (!info || !info.path) { throw new Error("getUpdateFileName: No path present in YAML file"); } let path; let fileFilter; if (platform === "darwin") { fileFilter = /* @__PURE__ */ __name(({ url }) => url.includes(arch) && url.endsWith(".zip"), "fileFilter"); } else if (platform === "win32") { fileFilter = /* @__PURE__ */ __name(({ url }) => url.includes(arch) && url.endsWith(".exe"), "fileFilter"); } else if (platform === "linux" && process.env.APPIMAGE != null) { fileFilter = /* @__PURE__ */ __name(({ url }) => url.endsWith(".AppImage"), "fileFilter"); } if (fileFilter) { const { files } = info; const candidates = files.filter(fileFilter); if (candidates.length === 1) { path = candidates[0].url; } } path = path ?? info.path; if (!isUpdateFileNameValid(path)) { throw new Error( `getUpdateFileName: Path '${path}' contains invalid characters` ); } return path; } __name(getUpdateFileName, "getUpdateFileName"); function getSHA512(info, fileName) { if (!info || !info.files) { throw new Error("getSHA512: No files present in YAML file"); } const foundFile = info.files.find((file) => file.url === fileName); return foundFile?.sha512; } __name(getSHA512, "getSHA512"); function getSize(info, fileName) { if (!info || !info.files) { throw new Error("getSize: No files present in YAML file"); } const foundFile = info.files.find((file) => file.url === fileName); return Number(foundFile?.size) || 0; } __name(getSize, "getSize"); function parseYaml(yaml) { return (0, import_js_yaml.load)(yaml, { schema: import_js_yaml.FAILSAFE_SCHEMA, json: true }); } __name(parseYaml, "parseYaml"); async function getUpdateYaml() { const targetUrl = getUpdateCheckUrl(); const body = await (0, import_got.default)(targetUrl, await (0, import_got_node.getGotOptions)()).text(); if (!body) { throw new Error("Got unexpected response back from update check"); } return body; } __name(getUpdateYaml, "getUpdateYaml"); function getBaseTempDir() { return import_electron.app ? (0, import_attachments_node.getTempPath)(import_electron.app.getPath("userData")) : (0, import_node_os.tmpdir)(); } __name(getBaseTempDir, "getBaseTempDir"); async function createTempDir() { const targetDir = await getTempDir(); await (0, import_promises.mkdir)(targetDir, { recursive: true }); return targetDir; } __name(createTempDir, "createTempDir"); async function getTempDir() { const baseTempDir = getBaseTempDir(); const uniqueName = (0, import_uuid.v4)(); if (!await pathExists(baseTempDir)) { await (0, import_promises.mkdir)(baseTempDir, { recursive: true }); } return (0, import_node_path.join)(baseTempDir, uniqueName); } __name(getTempDir, "getTempDir"); function getUpdateCacheDir() { return import_electron.app ? (0, import_attachments_node.getUpdateCachePath)(import_electron.app.getPath("userData")) : (0, import_node_os.tmpdir)(); } __name(getUpdateCacheDir, "getUpdateCacheDir"); async function createUpdateCacheDirIfNeeded() { const targetDir = getUpdateCacheDir(); await (0, import_promises.mkdir)(targetDir, { recursive: true }); return targetDir; } __name(createUpdateCacheDirIfNeeded, "createUpdateCacheDirIfNeeded"); async function deleteTempDir(logger, targetDir) { if (await pathExists(targetDir)) { const pathInfo = await (0, import_promises.stat)(targetDir); if (!pathInfo.isDirectory()) { throw new Error( `deleteTempDir: Cannot delete path '${targetDir}' because it is not a directory` ); } } const baseTempDir = getBaseTempDir(); if (!(0, import_isPathInside_node.isPathInside)(targetDir, baseTempDir)) { throw new Error( `deleteTempDir: Cannot delete path '${targetDir}' since it is not within base temp dir` ); } await (0, import_gracefulFs_node.gracefulRmRecursive)(logger, targetDir); } __name(deleteTempDir, "deleteTempDir"); function getCliOptions(options) { const parser = (0, import_dashdash.createParser)({ options }); const cliOptions = parser.parse(process.argv); if (cliOptions.help) { const help = parser.help().trimRight(); console.log(help); process.exit(0); } return cliOptions; } __name(getCliOptions, "getCliOptions"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { Updater, createTempDir, createUpdateCacheDirIfNeeded, deleteTempDir, getCliOptions, getTempDir, getUpdateCheckUrl, getUpdateFileName, getUpdatesBase, getUpdatesFileName, getVersion, isUpdateFileNameValid, parseYaml, validatePath }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var curve_node_exports = {}; __export(curve_node_exports, { keyPair: () => keyPair, sign: () => sign, verify: () => verify }); module.exports = __toCommonJS(curve_node_exports); var import_libsignal_client = require("@signalapp/libsignal-client"); function keyPair() { const privKey = import_libsignal_client.PrivateKey.generate(); const pubKey = privKey.getPublicKey(); return { publicKey: pubKey.serialize(), privateKey: privKey.serialize() }; } __name(keyPair, "keyPair"); function sign(privateKey, message) { const privKeyObj = import_libsignal_client.PrivateKey.deserialize(privateKey); const signature = privKeyObj.sign(message); return signature; } __name(sign, "sign"); function verify(publicKey, message, signature) { const pubKeyObj = import_libsignal_client.PublicKey.deserialize(publicKey); const result = pubKeyObj.verify(message, signature); return result; } __name(verify, "verify"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { keyPair, sign, verify }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var differential_node_exports = {}; __export(differential_node_exports, { computeDiff: () => computeDiff, download: () => download, downloadRanges: () => downloadRanges, getBlockMapFileName: () => getBlockMapFileName, isValidPreparedData: () => isValidPreparedData, parseBlockMap: () => parseBlockMap, prepareDownload: () => prepareDownload }); module.exports = __toCommonJS(differential_node_exports); var import_promises = require("node:fs/promises"); var import_promises2 = require("node:stream/promises"); var import_node_util = require("node:util"); var import_node_zlib = require("node:zlib"); var import_got = __toESM(require("got")); var import_lodash = __toESM(require("lodash")); var import_p_map = __toESM(require("p-map")); var import_dicer = __toESM(require("@indutny/dicer")); var import_assert_std = require("../util/assert.std.js"); var import_wrapEventEmitterOnce_node = require("../util/wrapEventEmitterOnce.node.js"); var import_got_node = require("./got.node.js"); var import_util_node = require("./util.node.js"); const { chunk: lodashChunk, noop } = import_lodash.default; const gunzip = (0, import_node_util.promisify)(import_node_zlib.gunzip); const SUPPORTED_VERSION = "2"; const MAX_SINGLE_REQ_RANGES = 50; const MAX_CONCURRENCY = 5; function getBlockMapFileName(fileName) { return `${fileName}.blockmap`; } __name(getBlockMapFileName, "getBlockMapFileName"); async function parseBlockMap(data) { const unpacked = await gunzip(data); const json = JSON.parse(unpacked.toString()); (0, import_assert_std.strictAssert)( json.version === SUPPORTED_VERSION, `Unsupported blockmap version: ${json.version}` ); (0, import_assert_std.strictAssert)( json.files.length === 1, `Unsupported blockmap file count: ${json.files.length}` ); const [file] = json.files; let { offset } = file; const blocks = new Array(); for (const [i, checksum] of file.checksums.entries()) { const size = file.sizes[i]; (0, import_assert_std.strictAssert)(size !== void 0, `missing block size: ${i}`); blocks.push({ offset, size, checksum }); offset += size; } return blocks; } __name(parseBlockMap, "parseBlockMap"); function computeDiff(oldMap, newMap) { const oldChecksums = /* @__PURE__ */ new Map(); for (const oldBlock of oldMap) { let list = oldChecksums.get(oldBlock.checksum); if (!list) { list = []; oldChecksums.set(oldBlock.checksum, list); } list.push(oldBlock); } const diff = new Array(); let writeOffset = 0; for (const newBlock of newMap) { const oldBlocks = oldChecksums.get(newBlock.checksum); if (oldBlocks) { const oldBlock = oldBlocks.shift(); (0, import_assert_std.strictAssert)(oldBlock, "Missing expected old block"); if (oldBlocks.length === 0) { oldChecksums.delete(newBlock.checksum); } (0, import_assert_std.strictAssert)( oldBlock.size === newBlock.size, `Block size mismatch: ${newBlock.checksum}, ${oldBlock.size} != ${newBlock.size}` ); diff.push({ action: "copy", size: oldBlock.size, readOffset: oldBlock.offset, writeOffset }); writeOffset += oldBlock.size; continue; } diff.push({ action: "download", size: newBlock.size, readOffset: newBlock.offset, writeOffset }); writeOffset += newBlock.size; } const optimizedDiff = new Array(); for (const entry of diff) { const last = optimizedDiff.length !== 0 ? optimizedDiff[optimizedDiff.length - 1] : void 0; const { action, readOffset, size } = entry; if (!last || last.action !== action || last.readOffset + last.size !== readOffset) { optimizedDiff.push(entry); continue; } last.size += size; } return optimizedDiff.filter(({ size }) => size !== 0); } __name(computeDiff, "computeDiff"); async function prepareDownload({ oldFile, newUrl, sha512 }) { const oldBlockMap = await parseBlockMap( await (0, import_promises.readFile)(getBlockMapFileName(oldFile)) ); const newBlockMapData = await (0, import_got.default)( getBlockMapFileName(newUrl), await (0, import_got_node.getGotOptions)() ).buffer(); const newBlockMap = await parseBlockMap(newBlockMapData); const diff = computeDiff(oldBlockMap, newBlockMap); let downloadSize = 0; for (const { action, size } of diff) { if (action === "download") { downloadSize += size; } } return { downloadSize, diff, oldFile, newUrl, newBlockMap: newBlockMapData, sha512 }; } __name(prepareDownload, "prepareDownload"); function isValidPreparedData({ oldFile, newUrl, sha512 }, options) { return oldFile === options.oldFile && newUrl === options.newUrl && sha512 === options.sha512; } __name(isValidPreparedData, "isValidPreparedData"); async function download(newFile, { diff, oldFile, newUrl, sha512 }, { statusCallback, logger, gotOptions } = {}) { const input = await (0, import_promises.open)(oldFile, "r"); const output = await (0, import_promises.open)(newFile, "w"); const abortController = new AbortController(); const { signal: abortSignal } = abortController; const copyActions = diff.filter(({ action }) => action === "copy"); const copyPromise = Promise.all( copyActions.map(async ({ readOffset, size, writeOffset }) => { const chunk = Buffer.alloc(size); const { bytesRead } = await input.read( chunk, 0, chunk.length, readOffset ); (0, import_assert_std.strictAssert)( bytesRead === size, `Not enough data to read from offset=${readOffset} size=${size}` ); if (abortSignal?.aborted) { return; } await output.write(chunk, 0, chunk.length, writeOffset); }) ); const downloadActions = diff.filter(({ action }) => action === "download"); let downloadSize = 0; for (const { size } of downloadActions) { downloadSize += size; } try { let downloadedSize = 0; await Promise.all([ copyPromise, downloadRanges({ url: newUrl, output, ranges: downloadActions, logger, abortSignal, gotOptions, chunkStatusCallback(chunkSize) { downloadedSize += chunkSize; if (!abortSignal.aborted) { statusCallback?.(downloadedSize, downloadSize); } } }) ]); } catch (error) { abortController.abort(); throw error; } finally { await Promise.all([input.close(), output.close()]); } const checkResult = await (0, import_util_node.checkIntegrity)(newFile, sha512); (0, import_assert_std.strictAssert)(checkResult.ok, checkResult.error ?? ""); } __name(download, "download"); async function downloadRanges(options) { const { ranges } = options; if (ranges.length > MAX_SINGLE_REQ_RANGES) { await (0, import_p_map.default)( lodashChunk(ranges, MAX_SINGLE_REQ_RANGES), (subRanges) => downloadRanges({ ...options, ranges: subRanges }), { concurrency: MAX_CONCURRENCY } ); return; } const { url, output, logger, abortSignal, chunkStatusCallback, gotOptions = await (0, import_got_node.getGotOptions)() } = options; logger?.info("updater/downloadRanges: downloading ranges", ranges.length); const diffByRange = /* @__PURE__ */ new Map(); for (const diff of ranges) { const { action, readOffset, size } = diff; (0, import_assert_std.strictAssert)(action === "download", "Incorrect action type"); diffByRange.set(`${readOffset}-${readOffset + size - 1}`, diff); } const stream = import_got.default.stream(url, { ...gotOptions, headers: { ...gotOptions.headers, range: `bytes=${Array.from(diffByRange.keys()).join(",")}` } }); const onPart = /* @__PURE__ */ __name(async (part) => { try { const diff = await takeDiffFromPart(part, diffByRange); await saveDiffStream({ diff, stream: part, abortSignal, output, chunkStatusCallback }); } catch (error) { dicer.destroy(error); } }, "onPart"); let boundary; try { const [{ statusCode, headers }] = await (0, import_wrapEventEmitterOnce_node.wrapEventEmitterOnce)( stream, "response" ); (0, import_assert_std.strictAssert)(statusCode === 206, `Invalid status code: ${statusCode}`); const match = headers["content-type"]?.match( /^multipart\/byteranges;\s*boundary=([^\s;]+)/ ); if (ranges.length === 1 && !match) { await saveDiffStream({ diff: ranges[0], stream, abortSignal, output, chunkStatusCallback }); return; } boundary = match[1]; } catch (error) { stream.on("error", noop); stream.destroy(); throw error; } const dicer = new import_dicer.default({ boundary }); const partPromises = new Array(); dicer.on("part", (part) => partPromises.push(onPart(part))); await (0, import_promises2.pipeline)(stream, dicer); await Promise.all(partPromises); if (abortSignal?.aborted) { return; } const missingRanges = Array.from(diffByRange.values()); if (missingRanges.length === 0) { return; } logger?.info( "updater/downloadRanges: downloading missing ranges", diffByRange.size ); return downloadRanges({ ...options, ranges: missingRanges }); } __name(downloadRanges, "downloadRanges"); async function takeDiffFromPart(part, diffByRange) { const [untypedHeaders] = await (0, import_wrapEventEmitterOnce_node.wrapEventEmitterOnce)(part, "header"); const headers = untypedHeaders; const contentRange = headers["content-range"]; (0, import_assert_std.strictAssert)(contentRange, "Missing Content-Range header for the part"); const match = contentRange.join(", ").match(/^bytes\s+(\d+-\d+)/); (0, import_assert_std.strictAssert)( match, `Invalid Content-Range header for the part: "${contentRange}"` ); const range = match[1]; const diff = diffByRange.get(range); (0, import_assert_std.strictAssert)(diff, `Diff not found for range="${range}"`); diffByRange.delete(range); return diff; } __name(takeDiffFromPart, "takeDiffFromPart"); async function saveDiffStream({ diff, stream, output, abortSignal, chunkStatusCallback }) { let offset = 0; for await (const chunk of stream) { (0, import_assert_std.strictAssert)( offset + chunk.length <= diff.size, `Server returned more data than expected, written=${offset} newChunk=${chunk.length} maxSize=${diff.size}` ); if (abortSignal?.aborted) { return; } await output.write(chunk, 0, chunk.length, offset + diff.writeOffset); offset += chunk.length; if (abortSignal?.aborted) { return; } chunkStatusCallback(chunk.length); } (0, import_assert_std.strictAssert)( offset === diff.size, `Not enough data to download from offset=${diff.readOffset} size=${diff.size}` ); } __name(saveDiffStream, "saveDiffStream"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { computeDiff, download, downloadRanges, getBlockMapFileName, isValidPreparedData, parseBlockMap, prepareDownload }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var Errors = __toESM(require("../types/errors.std.js")); var import_common_main = require("./common.main.js"); var import_curve_node = require("./curve.node.js"); var import_signature_node = require("./signature.node.js"); const OPTIONS = [ { names: ["help", "h"], type: "bool", help: "Print this help and exit." }, { names: ["key", "k"], type: "string", help: "Path where public key will go", default: "public.key" }, { names: ["private", "p"], type: "string", help: "Path where private key will go", default: "private.key" } ]; const cliOptions = (0, import_common_main.getCliOptions)(OPTIONS); go(cliOptions).catch((error) => { console.error("Something went wrong!", Errors.toLogFormat(error)); }); async function go(options) { const { key: publicKeyPath, private: privateKeyPath } = options; const { publicKey, privateKey } = (0, import_curve_node.keyPair)(); await Promise.all([ (0, import_signature_node.writeHexToPath)(publicKeyPath, publicKey), (0, import_signature_node.writeHexToPath)(privateKeyPath, privateKey) ]); } __name(go, "go"); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var import_node_path = require("node:path"); var import_node_fs = require("node:fs"); var import_pify = __toESM(require("pify")); var Errors = __toESM(require("../types/errors.std.js")); var import_common_main = require("./common.main.js"); var import_signature_node = require("./signature.node.js"); var import_packageJson_node = require("../util/packageJson.node.js"); const readdir = (0, import_pify.default)(import_node_fs.readdir); const OPTIONS = [ { names: ["help", "h"], type: "bool", help: "Print this help and exit." }, { names: ["private", "p"], type: "string", help: "Path to private key file (default: ./private.key)", default: "private.key" }, { names: ["update", "u"], type: "string", help: "Path to the update package (default: the .exe or .zip in ./release)" }, { names: ["version", "v"], type: "string", help: `Version number of this package (default: ${import_packageJson_node.version})`, default: import_packageJson_node.version } ]; const cliOptions = (0, import_common_main.getCliOptions)(OPTIONS); go(cliOptions).catch((error) => { console.error("Something went wrong!", Errors.toLogFormat(error)); }); async function go(options) { const { private: privateKeyPath, version } = options; let updatePaths; if (options.update) { updatePaths = [options.update]; } else { updatePaths = await findUpdatePaths(); } await Promise.all( updatePaths.map(async (updatePath) => { console.log("Signing with..."); console.log(` version: ${version}`); console.log(` update file: ${updatePath}`); console.log(` private key file: ${privateKeyPath}`); await (0, import_signature_node.writeSignature)(updatePath, version, privateKeyPath); }) ); } __name(go, "go"); const IS_EXE = /\.exe$/; const IS_ZIP = /\.zip$/; async function findUpdatePaths() { const releaseDir = (0, import_node_path.resolve)("release"); const files = await readdir(releaseDir); const max = files.length; const results = new Array(); for (let i = 0; i < max; i += 1) { const file = files[i]; const fullPath = (0, import_node_path.join)(releaseDir, file); if (IS_EXE.test(file) || IS_ZIP.test(file)) { results.push(fullPath); } } if (results.length === 0) { throw new Error("No suitable file found in 'release' folder!"); } return results; } __name(findUpdatePaths, "findUpdatePaths"); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var got_node_exports = {}; __export(got_node_exports, { GOT_CONNECT_TIMEOUT: () => GOT_CONNECT_TIMEOUT, GOT_LOOKUP_TIMEOUT: () => GOT_LOOKUP_TIMEOUT, GOT_SOCKET_TIMEOUT: () => GOT_SOCKET_TIMEOUT, getCertificateAuthority: () => getCertificateAuthority, getGotOptions: () => getGotOptions, getProxyUrl: () => getProxyUrl }); module.exports = __toCommonJS(got_node_exports); var import_config = __toESM(require("config")); var import_node_http = require("node:http"); var import_packageJson_node = require("../util/packageJson.node.js"); var import_getUserAgent_node = require("../util/getUserAgent.node.js"); var durations = __toESM(require("../util/durations/index.std.js")); var import_createHTTPSAgent_node = require("../util/createHTTPSAgent.node.js"); var import_createProxyAgent_node = require("../util/createProxyAgent.node.js"); const GOT_CONNECT_TIMEOUT = durations.MINUTE; const GOT_LOOKUP_TIMEOUT = durations.MINUTE; const GOT_SOCKET_TIMEOUT = durations.MINUTE; const GOT_RETRY_LIMIT = 3; function getProxyUrl() { return process.env.HTTPS_PROXY || process.env.https_proxy; } __name(getProxyUrl, "getProxyUrl"); function getCertificateAuthority() { return import_config.default.get("certificateAuthority"); } __name(getCertificateAuthority, "getCertificateAuthority"); async function getGotOptions() { const certificateAuthority = getCertificateAuthority(); const proxyUrl = getProxyUrl(); const agent = proxyUrl ? { http: await (0, import_createProxyAgent_node.createProxyAgent)(proxyUrl), https: await (0, import_createProxyAgent_node.createProxyAgent)(proxyUrl) } : { http: new import_node_http.Agent(), https: (0, import_createHTTPSAgent_node.createHTTPSAgent)() }; return { agent, https: { certificateAuthority }, headers: { "Cache-Control": "no-cache", "User-Agent": (0, import_getUserAgent_node.getUserAgent)(import_packageJson_node.version) }, timeout: { connect: GOT_CONNECT_TIMEOUT, lookup: GOT_LOOKUP_TIMEOUT, // This timeout is reset whenever we get new data on the socket socket: GOT_SOCKET_TIMEOUT }, retry: { limit: GOT_RETRY_LIMIT, errorCodes: [ "ETIMEDOUT", "ECONNRESET", "ECONNREFUSED", "EPIPE", "ENOTFOUND", "ENETUNREACH", "EAI_AGAIN" ], methods: ["GET", "HEAD"], statusCodes: [413, 429, 503] } }; } __name(getGotOptions, "getGotOptions"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { GOT_CONNECT_TIMEOUT, GOT_LOOKUP_TIMEOUT, GOT_SOCKET_TIMEOUT, getCertificateAuthority, getGotOptions, getProxyUrl }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var index_main_exports = {}; __export(index_main_exports, { force: () => force, onRestartCanceled: () => onRestartCanceled, start: () => start }); module.exports = __toCommonJS(index_main_exports); var import_config = __toESM(require("config")); var import_electron = require("electron"); var import_macos_main = require("./macos.main.js"); var import_windows_main = require("./windows.main.js"); var import_linuxAppImage_main = require("./linuxAppImage.main.js"); var import_linux_main = require("./linux.main.js"); let initialized = false; let updater; async function start(options) { const { platform } = process; const { logger } = options; if (initialized) { throw new Error("updater/start: Updates have already been initialized!"); } initialized = true; if (!logger) { throw new Error("updater/start: Must provide logger!"); } if (autoUpdateDisabled()) { logger.info( "updater/start: Updates disabled - not starting new version checks" ); return; } if (platform === "win32") { updater = new import_windows_main.WindowsUpdater(options); } else if (platform === "darwin") { updater = new import_macos_main.MacOSUpdater(options); } else if (platform === "linux") { if (process.env.APPIMAGE != null) { updater = new import_linuxAppImage_main.LinuxAppImageUpdater(options); } else { (0, import_linux_main.initLinux)(options); } } else { throw new Error(`updater/start: Unsupported platform ${platform}`); } await updater?.start(); } __name(start, "start"); async function force() { if (!initialized) { throw new Error("updater/force: Updates haven't been initialized!"); } if (updater) { await updater.force(); } } __name(force, "force"); function onRestartCanceled() { if (updater) { updater.onRestartCanceled(); } } __name(onRestartCanceled, "onRestartCanceled"); function autoUpdateDisabled() { return !import_electron.app.isPackaged || process.mas || !import_config.default.get("updatesEnabled"); } __name(autoUpdateDisabled, "autoUpdateDisabled"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { force, onRestartCanceled, start }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var linux_main_exports = {}; __export(linux_main_exports, { getUbuntuVersion: () => getUbuntuVersion, initLinux: () => initLinux, isLinuxVersionSupported: () => isLinuxVersionSupported }); module.exports = __toCommonJS(linux_main_exports); var import_node_os = require("node:os"); var import_node_fs = require("node:fs"); var import_node_path = require("node:path"); var import_electron = require("electron"); var import_asar = require("@electron/asar"); var import_zod = __toESM(require("zod")); var import_window_state_std = require("../../app/window_state.std.js"); var import_Dialogs_std = require("../types/Dialogs.std.js"); var Errors = __toESM(require("../types/errors.std.js")); var import_relaunch_main = require("../util/relaunch.main.js"); const MIN_UBUNTU_VERSION = "22.04"; const PackageSchema = import_zod.default.object({ version: import_zod.default.string() }); function getUbuntuVersion() { if (process.platform !== "linux") { return void 0; } const match = (0, import_node_os.version)().match(/^#\d+~([\d.]+)-Ubuntu\s/); if (!match) { return void 0; } return match[1]; } __name(getUbuntuVersion, "getUbuntuVersion"); function isLinuxVersionSupported(logger) { const ubuntu = getUbuntuVersion(); if (ubuntu !== void 0 && ubuntu < MIN_UBUNTU_VERSION) { logger?.warn( `updater/isLinuxVersionSupported: unsupported Ubuntu version ${ubuntu}` ); return false; } return true; } __name(isLinuxVersionSupported, "isLinuxVersionSupported"); function initLinux({ logger, getMainWindow }) { if (!import_electron.app.isPackaged) { throw new Error("Linux updates are not supported in development"); } if (!isLinuxVersionSupported(logger)) { getMainWindow()?.webContents.send( "show-update-dialog", import_Dialogs_std.DialogType.UnsupportedOS ); } import_electron.ipcMain.handle("start-update", () => { logger?.info("updater/linux: restarting"); (0, import_window_state_std.markShouldQuit)(); (0, import_relaunch_main.appRelaunch)(); import_electron.app.quit(); }); const asarPath = (0, import_node_path.join)(__dirname, "..", ".."); if (!asarPath.endsWith(".asar")) { throw new Error("updater/linux: not running from ASAR"); } const postinstFile = (0, import_node_path.join)(asarPath, "..", "..", ".signal-postinst"); (0, import_node_fs.watch)(postinstFile, (event) => { if (event !== "change") { return; } let version; try { const file = (0, import_asar.extractFile)(asarPath, "package.json").toString(); ({ version } = PackageSchema.parse(JSON.parse(file))); } catch (error) { logger?.error( "updater/linux: failed to parse updated asar", Errors.toLogFormat(error) ); return; } if (version === import_electron.app.getVersion()) { logger?.info("updater/linux: ignoring asar update, no version change"); return; } logger?.info(`updater/linux: asar updated to version=${version}`); getMainWindow()?.webContents.send( "show-update-dialog", import_Dialogs_std.DialogType.AutoUpdate, { version } ); }).unref(); } __name(initLinux, "initLinux"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getUbuntuVersion, initLinux, isLinuxVersionSupported }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var linuxAppImage_main_exports = {}; __export(linuxAppImage_main_exports, { LinuxAppImageUpdater: () => LinuxAppImageUpdater }); module.exports = __toCommonJS(linuxAppImage_main_exports); var import_promises = require("node:fs/promises"); var import_fs_extra = require("fs-extra"); var import_config = __toESM(require("config")); var import_electron = require("electron"); var import_semver = require("semver"); var import_common_main = require("./common.main.js"); var import_relaunch_main = require("../util/relaunch.main.js"); var import_signature_node = require("./signature.node.js"); var import_Dialogs_std = require("../types/Dialogs.std.js"); class LinuxAppImageUpdater extends import_common_main.Updater { static { __name(this, "LinuxAppImageUpdater"); } #installing = false; async deletePreviousInstallers() { } async installUpdate(updateFilePath) { const { logger } = this; return async () => { logger.info("downloadAndInstall: installing..."); try { await this.#install(updateFilePath); this.#installing = true; } catch (error) { this.markCannotUpdate(error); throw error; } this.setUpdateListener(this.restart); this.restart(); }; } restart() { this.logger.info("downloadAndInstall: restarting..."); this.markRestarting(); (0, import_relaunch_main.appRelaunch)(); import_electron.app.quit(); } getUpdatesPublicKey() { return (0, import_signature_node.hexToBinary)(import_config.default.get("appImageUpdatesPublicKey")); } async #install(updateFilePath) { if (this.#installing) { return; } const { logger } = this; logger.info("linuxAppImage/install: installing package..."); const appImageFile = process.env.APPIMAGE; if (appImageFile == null) { throw new Error("APPIMAGE env is not defined!"); } await (0, import_promises.unlink)(appImageFile); await (0, import_promises.copyFile)(updateFilePath, appImageFile); await (0, import_fs_extra.chmod)(appImageFile, 448); } checkSystemRequirements(vendor) { const { minGlibcVersion } = vendor; if (minGlibcVersion) { const parsedMinGlibcVersion = (0, import_semver.coerce)(minGlibcVersion); if (!parsedMinGlibcVersion) { this.logger.warn( `checkSystemRequirements: yaml had unparseable minGlibcVersion, ignoring. yaml value: ${minGlibcVersion}` ); return true; } const sysReport = process.report.getReport(); const glibcVersion = sysReport?.header?.glibcVersionRuntime; const parsedGlibcVersion = glibcVersion ? (0, import_semver.coerce)(glibcVersion) : null; if (!parsedGlibcVersion) { this.logger.warn( `checkSystemRequirements: yaml had minGlibcVersion but unable toget OS glibc version from system report, blocking update. system value: ${glibcVersion}` ); this.markCannotUpdate( new Error("system glibc version missing or unparseable"), import_Dialogs_std.DialogType.UnsupportedOS ); return false; } if ((0, import_semver.lt)(parsedGlibcVersion, parsedMinGlibcVersion)) { this.logger.warn( `checkSystemRequirements: OS glibc ${glibcVersion} is less than the minimum supported version ${minGlibcVersion}` ); this.markCannotUpdate( new Error("yaml file has unsatisfied minGlibcVersion value"), import_Dialogs_std.DialogType.UnsupportedOS ); return false; } } return true; } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { LinuxAppImageUpdater }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var macos_main_exports = {}; __export(macos_main_exports, { MacOSUpdater: () => MacOSUpdater }); module.exports = __toCommonJS(macos_main_exports); var import_node_url = require("node:url"); var import_electron = require("electron"); var import_promises = require("node:fs/promises"); var import_node_path = require("node:path"); var import_common_main = require("./common.main.js"); var import_explodePromise_std = require("../util/explodePromise.std.js"); var Errors = __toESM(require("../types/errors.std.js")); var import_Dialogs_std = require("../types/Dialogs.std.js"); class MacOSUpdater extends import_common_main.Updater { static { __name(this, "MacOSUpdater"); } async deletePreviousInstallers() { } async installUpdate(updateFilePath) { const { logger } = this; logger.info("downloadAndInstall: handing download to electron..."); try { await this.#handToAutoUpdate(updateFilePath); } catch (error) { const readOnly = "Cannot update while running on a read-only volume"; const message = error.message || ""; this.markCannotUpdate( error, message.includes(readOnly) ? import_Dialogs_std.DialogType.MacOS_Read_Only : import_Dialogs_std.DialogType.Cannot_Update ); throw error; } return async () => { logger.info("downloadAndInstall: restarting..."); this.markRestarting(); import_electron.autoUpdater.quitAndInstall(); }; } async #handToAutoUpdate(filePath) { const { logger } = this; const { promise, resolve, reject } = (0, import_explodePromise_std.explodePromise)(); const onError = /* @__PURE__ */ __name((...args) => { logger.error("autoUpdater: error", ...args.map(Errors.toLogFormat)); const [error] = args; cleanup(); reject(error); }, "onError"); const onDownloaded = /* @__PURE__ */ __name(() => { logger.info("autoUpdater: update-downloaded event fired"); cleanup(); resolve(); }, "onDownloaded"); function cleanup() { import_electron.autoUpdater.removeListener("error", onError); import_electron.autoUpdater.removeListener("update-downloaded", onDownloaded); } __name(cleanup, "cleanup"); import_electron.autoUpdater.on("error", onError); import_electron.autoUpdater.on("update-downloaded", onDownloaded); const updateUrl = (0, import_node_url.pathToFileURL)(filePath).href; const tempDir = await (0, import_common_main.createTempDir)(); try { const feedPath = (0, import_node_path.join)(tempDir, "feed.json"); await (0, import_promises.writeFile)( feedPath, JSON.stringify({ url: updateUrl }) ); import_electron.autoUpdater.setFeedURL({ url: (0, import_node_url.pathToFileURL)(feedPath).href, serverType: "json" }); import_electron.autoUpdater.checkForUpdates(); await promise; } finally { await (0, import_common_main.deleteTempDir)(this.logger, tempDir); } } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { MacOSUpdater }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var signature_node_exports = {}; __export(signature_node_exports, { _getFileHash: () => _getFileHash, binaryToHex: () => binaryToHex, generateSignature: () => generateSignature, getSignatureFileName: () => getSignatureFileName, getSignaturePath: () => getSignaturePath, hexToBinary: () => hexToBinary, loadHexFromPath: () => loadHexFromPath, verifySignature: () => verifySignature, writeHexToPath: () => writeHexToPath, writeSignature: () => writeSignature }); module.exports = __toCommonJS(signature_node_exports); var import_node_crypto = require("node:crypto"); var import_node_fs = require("node:fs"); var import_promises = require("node:stream/promises"); var import_node_path = require("node:path"); var import_pify = __toESM(require("pify")); var import_curve_node = require("./curve.node.js"); const readFile = (0, import_pify.default)(import_node_fs.readFile); const writeFile = (0, import_pify.default)(import_node_fs.writeFile); async function generateSignature(updatePackagePath, version, privateKeyPath) { const privateKey = await loadHexFromPath(privateKeyPath); const message = await generateMessage(updatePackagePath, version); return (0, import_curve_node.sign)(privateKey, message); } __name(generateSignature, "generateSignature"); async function verifySignature(updatePackagePath, version, signature, publicKey) { const message = await generateMessage(updatePackagePath, version); return (0, import_curve_node.verify)(publicKey, message, signature); } __name(verifySignature, "verifySignature"); async function generateMessage(updatePackagePath, version) { const hash = await _getFileHash(updatePackagePath); const messageString = `${Buffer.from(hash).toString("hex")}-${version}`; return Buffer.from(messageString); } __name(generateMessage, "generateMessage"); async function writeSignature(updatePackagePath, version, privateKeyPath) { const signaturePath = getSignaturePath(updatePackagePath); const signature = await generateSignature( updatePackagePath, version, privateKeyPath ); await writeHexToPath(signaturePath, signature); return signature; } __name(writeSignature, "writeSignature"); async function _getFileHash(updatePackagePath) { const hash = (0, import_node_crypto.createHash)("sha256"); await (0, import_promises.pipeline)((0, import_node_fs.createReadStream)(updatePackagePath), hash); return hash.digest(); } __name(_getFileHash, "_getFileHash"); function getSignatureFileName(fileName) { return `${fileName}.sig`; } __name(getSignatureFileName, "getSignatureFileName"); function getSignaturePath(updatePackagePath) { const updateFullPath = (0, import_node_path.resolve)(updatePackagePath); const updateDir = (0, import_node_path.dirname)(updateFullPath); const updateFileName = (0, import_node_path.basename)(updateFullPath); return (0, import_node_path.join)(updateDir, getSignatureFileName(updateFileName)); } __name(getSignaturePath, "getSignaturePath"); function hexToBinary(target) { return Buffer.from(target, "hex"); } __name(hexToBinary, "hexToBinary"); function binaryToHex(data) { return Buffer.from(data).toString("hex"); } __name(binaryToHex, "binaryToHex"); async function loadHexFromPath(target) { const hexString = await readFile(target, "utf8"); return hexToBinary(hexString); } __name(loadHexFromPath, "loadHexFromPath"); async function writeHexToPath(target, data) { await writeFile(target, binaryToHex(data)); } __name(writeHexToPath, "writeHexToPath"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { _getFileHash, binaryToHex, generateSignature, getSignatureFileName, getSignaturePath, hexToBinary, loadHexFromPath, verifySignature, writeHexToPath, writeSignature }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var util_node_exports = {}; __export(util_node_exports, { checkIntegrity: () => checkIntegrity, isTimeToUpdate: () => isTimeToUpdate }); module.exports = __toCommonJS(util_node_exports); var import_node_crypto = require("node:crypto"); var import_node_fs = require("node:fs"); var import_promises = require("node:stream/promises"); var Errors = __toESM(require("../types/errors.std.js")); var import_index_std = require("../util/durations/index.std.js"); async function checkIntegrity(fileName, sha512) { try { const hash = (0, import_node_crypto.createHash)("sha512"); await (0, import_promises.pipeline)((0, import_node_fs.createReadStream)(fileName), hash); const actualSHA512 = hash.digest("base64"); if (sha512 === actualSHA512) { return { ok: true }; } return { ok: false, error: `Integrity check failure: expected ${sha512}, got ${actualSHA512}` }; } catch (error) { return { ok: false, error: Errors.toLogFormat(error) }; } } __name(checkIntegrity, "checkIntegrity"); const MAX_UPDATE_DELAY = 6 * import_index_std.HOUR; function isTimeToUpdate({ logger, pollId, releasedAt, now = Date.now(), maxDelay = MAX_UPDATE_DELAY }) { if (!Number.isFinite(releasedAt) || Number.isNaN(releasedAt)) { logger.warn("isTimeToUpdate: invalid releasedAt"); return true; } if (releasedAt - import_index_std.HOUR > now) { logger.warn("isTimeToUpdate: releasedAt too far in the future"); return true; } const digest = (0, import_node_crypto.createHash)("sha512").update(pollId).update(Buffer.alloc(1)).update(new Date(releasedAt).toJSON()).digest(); const delay = maxDelay * (digest.readUInt32LE(0) / 4294967295); const updateAt = releasedAt + delay; if (now >= updateAt) { return true; } const remaining = Math.round((updateAt - now) / import_index_std.MINUTE); logger.info(`isTimeToUpdate: updating in ${remaining} minutes`); return false; } __name(isTimeToUpdate, "isTimeToUpdate"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { checkIntegrity, isTimeToUpdate }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var windows_main_exports = {}; __export(windows_main_exports, { WindowsUpdater: () => WindowsUpdater }); module.exports = __toCommonJS(windows_main_exports); var import_node_path = require("node:path"); var import_node_child_process = require("node:child_process"); var import_node_fs = require("node:fs"); var import_electron = require("electron"); var import_pify = __toESM(require("pify")); var import_common_main = require("./common.main.js"); const readdir = (0, import_pify.default)(import_node_fs.readdir); const unlink = (0, import_pify.default)(import_node_fs.unlink); const IS_EXE = /\.exe$/i; class WindowsUpdater extends import_common_main.Updater { static { __name(this, "WindowsUpdater"); } #installing = false; // This is fixed by our new install mechanisms... // https://github.com/signalapp/Signal-Desktop/issues/2369 // ...but we should also clean up those old installers. async deletePreviousInstallers() { const userDataPath = import_electron.app.getPath("userData"); const files = await readdir(userDataPath); await Promise.all( files.map(async (file) => { const isExe = IS_EXE.test(file); if (!isExe) { return; } const fullPath = (0, import_node_path.join)(userDataPath, file); try { await unlink(fullPath); } catch (error) { this.logger.error( `deletePreviousInstallers: couldn't delete file ${file}` ); } }) ); } async installUpdate(updateFilePath, isSilent) { const { logger } = this; return async () => { logger.info("downloadAndInstall: installing..."); try { await this.#install(updateFilePath, isSilent); this.#installing = true; } catch (error) { this.markCannotUpdate(error); throw error; } this.setUpdateListener(this.restart); this.restart(); }; } restart() { this.logger.info("downloadAndInstall: restarting..."); this.markRestarting(); import_electron.app.quit(); } async #install(filePath, isSilent) { if (this.#installing) { return; } const { logger } = this; logger.info("windows/install: installing package..."); const args = ["--updated"]; if (isSilent) { args.push("/S"); } const options = { detached: true, stdio: "ignore" // TypeScript considers this a plain string without help }; try { await spawn(filePath, args, options); } catch (error) { if (error.code === "UNKNOWN" || error.code === "EACCES") { logger.warn( "windows/install: Error running installer; Trying again with elevate.exe" ); await spawn(getElevatePath(), [filePath, ...args], options); return; } throw error; } } } function getElevatePath() { const installPath = import_electron.app.getAppPath(); return (0, import_node_path.join)(installPath, "resources", "elevate.exe"); } __name(getElevatePath, "getElevatePath"); async function spawn(exe, args, options) { return new Promise((resolve, reject) => { const emitter = (0, import_node_child_process.spawn)(exe, args, options); emitter.on("error", reject); emitter.unref(); setTimeout(resolve, 200); }); } __name(spawn, "spawn"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { WindowsUpdater }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var AbortableProcess_std_exports = {}; __export(AbortableProcess_std_exports, { AbortableProcess: () => AbortableProcess }); module.exports = __toCommonJS(AbortableProcess_std_exports); var import_explodePromise_std = require("./explodePromise.std.js"); class AbortableProcess { constructor(name, controller, resultPromise) { this.name = name; this.controller = controller; const { promise: abortPromise, reject: abortReject } = (0, import_explodePromise_std.explodePromise)(); this.#abortReject = abortReject; this.resultPromise = Promise.race([abortPromise, resultPromise]); } static { __name(this, "AbortableProcess"); } #abortReject; resultPromise; abort() { this.controller.abort(); this.#abortReject(new Error(`Process "${this.name}" was aborted`)); } getResult() { return this.resultPromise; } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { AbortableProcess }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var AsyncQueue_std_exports = {}; __export(AsyncQueue_std_exports, { AsyncQueue: () => AsyncQueue }); module.exports = __toCommonJS(AsyncQueue_std_exports); var import_lodash = __toESM(require("lodash")); const { once, noop } = import_lodash.default; class AsyncQueue { static { __name(this, "AsyncQueue"); } #onAdd = noop; #queue = []; #isReading = false; add(value) { this.#queue.push(value); this.#onAdd(); } async *[Symbol.asyncIterator]() { if (this.#isReading) { throw new Error("Cannot iterate over a queue more than once"); } this.#isReading = true; while (true) { yield* this.#queue; this.#queue = []; await new Promise((resolve) => { this.#onAdd = once(resolve); }); } } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { AsyncQueue }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var Attachment_std_exports = {}; __export(Attachment_std_exports, { _replaceUnicodeOrderOverridesSync: () => _replaceUnicodeOrderOverridesSync, areAllAttachmentsVisual: () => areAllAttachmentsVisual, cacheAttachmentBySignature: () => cacheAttachmentBySignature, canAttachmentHaveThumbnail: () => canAttachmentHaveThumbnail, canBeDownloaded: () => canBeDownloaded, canBeTranscoded: () => canBeTranscoded, canDisplayImage: () => canDisplayImage, canRenderAudio: () => canRenderAudio, defaultBlurHash: () => defaultBlurHash, doAttachmentsOnSameMessageMatch: () => doAttachmentsOnSameMessageMatch, getAlt: () => getAlt, getCachedAttachmentBySignature: () => getCachedAttachmentBySignature, getExtensionForDisplay: () => getExtensionForDisplay, getFileExtension: () => getFileExtension, getGridDimensions: () => getGridDimensions, getImageDimensionsForTimeline: () => getImageDimensionsForTimeline, getSuggestedFilename: () => getSuggestedFilename, getThumbnailUrl: () => getThumbnailUrl, getUndownloadedAttachmentSignature: () => getUndownloadedAttachmentSignature, getUrl: () => getUrl, hasData: () => hasData, hasFailed: () => hasFailed, hasImage: () => hasImage, hasNotResolved: () => hasNotResolved, hasRequiredInformationForLocalBackup: () => hasRequiredInformationForLocalBackup, hasRequiredInformationForRemoteBackup: () => hasRequiredInformationForRemoteBackup, hasRequiredInformationToDownloadFromTransitTier: () => hasRequiredInformationToDownloadFromTransitTier, hasVideoBlurHash: () => hasVideoBlurHash, hasVideoScreenshot: () => hasVideoScreenshot, isAttachmentLocallySaved: () => isAttachmentLocallySaved, isAudio: () => isAudio, isDownloadable: () => isDownloadable, isDownloaded: () => isDownloaded, isDownloading: () => isDownloading, isFile: () => isFile, isGIF: () => isGIF, isImage: () => isImage, isImageAttachment: () => isImageAttachment, isIncremental: () => isIncremental, isReadyToView: () => isReadyToView, isValid: () => isValid, isVideo: () => isVideo, isVideoAttachment: () => isVideoAttachment, isVisualMedia: () => isVisualMedia, isVoiceMessage: () => isVoiceMessage, loadData: () => loadData, partitionBodyAndNormalAttachments: () => partitionBodyAndNormalAttachments, removeSchemaVersion: () => removeSchemaVersion, replaceUnicodeOrderOverrides: () => replaceUnicodeOrderOverrides, replaceUnicodeV2: () => replaceUnicodeV2, save: () => save, shouldAttachmentEndUpInRemoteBackup: () => shouldAttachmentEndUpInRemoteBackup, shouldGenerateThumbnailForAttachmentType: () => shouldGenerateThumbnailForAttachmentType, wasImportedFromLocalBackup: () => wasImportedFromLocalBackup }); module.exports = __toCommonJS(Attachment_std_exports); var import_moment = __toESM(require("moment")); var import_lodash = __toESM(require("lodash")); var import_log_std = require("../logging/log.std.js"); var MIME = __toESM(require("../types/MIME.std.js")); var import_index_std = require("../protobuf/index.std.js"); var import_GoogleChrome_std = require("./GoogleChrome.std.js"); var import_Util_std = require("../types/Util.std.js"); var import_Crypto_std = require("../types/Crypto.std.js"); var import_missingCaseError_std = require("./missingCaseError.std.js"); const { isNumber, padStart, isFunction, isUndefined, isString, omit, partition } = import_lodash.default; const logging = (0, import_log_std.createLogger)("Attachment"); const MAX_TIMELINE_IMAGE_WIDTH = 300; const MAX_TIMELINE_IMAGE_HEIGHT = MAX_TIMELINE_IMAGE_WIDTH * 1.5; const MIN_TIMELINE_IMAGE_WIDTH = 200; const MIN_TIMELINE_IMAGE_HEIGHT = 50; const MAX_DISPLAYABLE_IMAGE_WIDTH = 8192; const MAX_DISPLAYABLE_IMAGE_HEIGHT = 8192; function isValid(rawAttachment) { if (!rawAttachment) { return false; } return true; } __name(isValid, "isValid"); const UNICODE_LEFT_TO_RIGHT_OVERRIDE = "\u202D"; const UNICODE_RIGHT_TO_LEFT_OVERRIDE = "\u202E"; const UNICODE_REPLACEMENT_CHARACTER = "\uFFFD"; const INVALID_CHARACTERS_PATTERN = new RegExp( `[${UNICODE_LEFT_TO_RIGHT_OVERRIDE}${UNICODE_RIGHT_TO_LEFT_OVERRIDE}]`, "g" ); function _replaceUnicodeOrderOverridesSync(attachment) { if (!isString(attachment.fileName)) { return attachment; } const normalizedFilename = attachment.fileName.replace( INVALID_CHARACTERS_PATTERN, UNICODE_REPLACEMENT_CHARACTER ); const newAttachment = { ...attachment, fileName: normalizedFilename }; return newAttachment; } __name(_replaceUnicodeOrderOverridesSync, "_replaceUnicodeOrderOverridesSync"); const replaceUnicodeOrderOverrides = /* @__PURE__ */ __name(async (attachment) => { return _replaceUnicodeOrderOverridesSync(attachment); }, "replaceUnicodeOrderOverrides"); const V2_UNWANTED_UNICODE = /[\u202A-\u202E\u2066-\u2069\u200E\u200F\u061C]/g; async function replaceUnicodeV2(attachment) { if (!isString(attachment.fileName)) { return attachment; } const fileName = attachment.fileName.replace( V2_UNWANTED_UNICODE, UNICODE_REPLACEMENT_CHARACTER ); return { ...attachment, fileName }; } __name(replaceUnicodeV2, "replaceUnicodeV2"); function removeSchemaVersion({ attachment, logger }) { if (!isValid(attachment)) { logger.error( "Attachment.removeSchemaVersion: Invalid input attachment:", attachment ); return attachment; } return omit(attachment, "schemaVersion"); } __name(removeSchemaVersion, "removeSchemaVersion"); function hasData(attachment) { return attachment.data instanceof Uint8Array; } __name(hasData, "hasData"); function loadData(readAttachmentV2Data) { if (!isFunction(readAttachmentV2Data)) { throw new TypeError("'readAttachmentData' must be a function"); } return async (attachment) => { if (!isValid(attachment)) { throw new TypeError("'attachment' is not valid"); } const isAlreadyLoaded = Boolean(attachment.data); if (isAlreadyLoaded) { return attachment; } if (!isString(attachment.path)) { throw new TypeError("'attachment.path' is required"); } const data = await readAttachmentV2Data(attachment); return { ...attachment, data, size: data.byteLength }; }; } __name(loadData, "loadData"); function getExtensionForDisplay({ fileName, contentType }) { if (fileName && fileName.indexOf(".") >= 0) { const lastPeriod = fileName.lastIndexOf("."); const extension = fileName.slice(lastPeriod + 1); if (extension.length) { return extension; } } if (!contentType) { return void 0; } const slash = contentType.indexOf("/"); if (slash >= 0) { return contentType.slice(slash + 1); } return void 0; } __name(getExtensionForDisplay, "getExtensionForDisplay"); function isAudio(attachments) { return Boolean( attachments && attachments[0] && attachments[0].contentType && !attachments[0].isCorrupted && MIME.isAudio(attachments[0].contentType) ); } __name(isAudio, "isAudio"); function canRenderAudio(attachments) { const firstAttachment = attachments && attachments[0]; if (!firstAttachment) { return false; } return isAudio(attachments) && (isDownloaded(firstAttachment) || isDownloadable(firstAttachment)); } __name(canRenderAudio, "canRenderAudio"); function canDisplayImage(attachments) { const { height, width } = attachments && attachments[0] ? attachments[0] : { height: 0, width: 0 }; return Boolean( height && height > 0 && height <= MAX_DISPLAYABLE_IMAGE_HEIGHT && width && width > 0 && width <= MAX_DISPLAYABLE_IMAGE_WIDTH ); } __name(canDisplayImage, "canDisplayImage"); function getThumbnailUrl(attachment) { if (attachment.thumbnail) { return attachment.thumbnail.url; } return getUrl(attachment); } __name(getThumbnailUrl, "getThumbnailUrl"); function getUrl(attachment) { if (attachment.screenshot) { return attachment.screenshot.url; } if (isVideoAttachment(attachment)) { return void 0; } return attachment.url ?? attachment.thumbnailFromBackup?.url; } __name(getUrl, "getUrl"); function isImage(attachments) { return Boolean( attachments && attachments[0] && attachments[0].contentType && (0, import_GoogleChrome_std.isImageTypeSupported)(attachments[0].contentType) ); } __name(isImage, "isImage"); function isImageAttachment(attachment) { return Boolean( attachment && attachment.contentType && (0, import_GoogleChrome_std.isImageTypeSupported)(attachment.contentType) ); } __name(isImageAttachment, "isImageAttachment"); function canBeTranscoded(attachment) { return Boolean( attachment && isImageAttachment(attachment) && !MIME.isGif(attachment.contentType) ); } __name(canBeTranscoded, "canBeTranscoded"); function hasImage(attachments) { return Boolean( attachments && attachments[0] && (attachments[0].url || attachments[0].pending || attachments[0].blurHash) ); } __name(hasImage, "hasImage"); function isVideo(attachments) { if (!attachments || attachments.length === 0) { return false; } return isVideoAttachment(attachments[0]); } __name(isVideo, "isVideo"); function isVideoAttachment(attachment) { if (!attachment || !attachment.contentType) { return false; } return (0, import_GoogleChrome_std.isVideoTypeSupported)(attachment.contentType); } __name(isVideoAttachment, "isVideoAttachment"); function isGIF(attachments) { if (!attachments || attachments.length !== 1) { return false; } const [attachment] = attachments; const flag = import_index_std.SignalService.AttachmentPointer.Flags.GIF; const hasFlag = ( // eslint-disable-next-line no-bitwise !isUndefined(attachment.flags) && (attachment.flags & flag) === flag ); return hasFlag && isVideoAttachment(attachment); } __name(isGIF, "isGIF"); function resolveNestedAttachment(attachment) { if (attachment?.textAttachment?.preview?.image) { return attachment.textAttachment.preview.image; } return attachment; } __name(resolveNestedAttachment, "resolveNestedAttachment"); function isIncremental(attachment) { return Boolean(attachment.incrementalMac && attachment.chunkSize); } __name(isIncremental, "isIncremental"); function isDownloaded(attachment) { const resolved = resolveNestedAttachment(attachment); return Boolean(resolved && (resolved.path || resolved.textAttachment)); } __name(isDownloaded, "isDownloaded"); function isReadyToView(attachment) { const fullyDownloaded = isDownloaded(attachment); if (fullyDownloaded) { return fullyDownloaded; } const resolved = resolveNestedAttachment(attachment); return Boolean( resolved && (resolved.path || resolved.textAttachment || isIncremental(resolved)) ); } __name(isReadyToView, "isReadyToView"); function hasNotResolved(attachment) { const resolved = resolveNestedAttachment(attachment); return Boolean(resolved && !resolved.url && !resolved.textAttachment); } __name(hasNotResolved, "hasNotResolved"); function isDownloading(attachment) { const resolved = resolveNestedAttachment(attachment); return Boolean(resolved && resolved.pending); } __name(isDownloading, "isDownloading"); function hasFailed(attachment) { const resolved = resolveNestedAttachment(attachment); return Boolean(resolved && resolved.error); } __name(hasFailed, "hasFailed"); function hasVideoBlurHash(attachments) { const firstAttachment = attachments ? attachments[0] : null; return Boolean(firstAttachment && firstAttachment.blurHash); } __name(hasVideoBlurHash, "hasVideoBlurHash"); function hasVideoScreenshot(attachments) { const firstAttachment = attachments ? attachments[0] : null; return firstAttachment && firstAttachment.screenshot && firstAttachment.screenshot.url; } __name(hasVideoScreenshot, "hasVideoScreenshot"); function getImageDimensionsForTimeline(attachment, forcedWidth) { const { height, width } = attachment; if (!height || !width) { return { height: MIN_TIMELINE_IMAGE_HEIGHT, width: MIN_TIMELINE_IMAGE_WIDTH }; } const aspectRatio = height / width; const targetWidth = forcedWidth || Math.max( Math.min(MAX_TIMELINE_IMAGE_WIDTH, width), MIN_TIMELINE_IMAGE_WIDTH ); const candidateHeight = Math.round(targetWidth * aspectRatio); return { width: targetWidth, height: Math.max( Math.min(MAX_TIMELINE_IMAGE_HEIGHT, candidateHeight), MIN_TIMELINE_IMAGE_HEIGHT ) }; } __name(getImageDimensionsForTimeline, "getImageDimensionsForTimeline"); function areAllAttachmentsVisual(attachments) { if (!attachments) { return false; } const max = attachments.length; for (let i = 0; i < max; i += 1) { const attachment = attachments[i]; if (!isImageAttachment(attachment) && !isVideoAttachment(attachment)) { return false; } } return true; } __name(areAllAttachmentsVisual, "areAllAttachmentsVisual"); function getGridDimensions(attachments) { if (!attachments || !attachments.length) { return null; } if (!isImage(attachments) && !isVideo(attachments)) { return null; } if (attachments.length === 1) { return getImageDimensionsForTimeline(attachments[0]); } if (attachments.length === 2) { return { height: 150, width: 300 }; } if (attachments.length === 3) { return { height: 200, width: 300 }; } if (attachments.length === 4) { return { height: 300, width: 300 }; } return { height: 250, width: 300 }; } __name(getGridDimensions, "getGridDimensions"); function getAlt(attachment, i18n) { if (isVideoAttachment(attachment)) { return i18n("icu:videoAttachmentAlt"); } return i18n("icu:imageAttachmentAlt"); } __name(getAlt, "getAlt"); const isVisualMedia = /* @__PURE__ */ __name((attachment) => { const { contentType } = attachment; if (isUndefined(contentType)) { return false; } if (isVoiceMessage(attachment)) { return false; } return MIME.isImage(contentType) || MIME.isVideo(contentType); }, "isVisualMedia"); const isFile = /* @__PURE__ */ __name((attachment) => { const { contentType } = attachment; if (isUndefined(contentType)) { return false; } if (isVisualMedia(attachment)) { return false; } if (isVoiceMessage(attachment)) { return false; } if (MIME.isLongMessage(contentType)) { return false; } return true; }, "isFile"); const isVoiceMessage = /* @__PURE__ */ __name((attachment) => { const flag = import_index_std.SignalService.AttachmentPointer.Flags.VOICE_MESSAGE; const hasFlag = ( // eslint-disable-next-line no-bitwise !isUndefined(attachment.flags) && (attachment.flags & flag) === flag ); if (hasFlag) { return true; } const isLegacyAndroidVoiceMessage = !isUndefined(attachment.contentType) && MIME.isAudio(attachment.contentType) && !attachment.fileName; if (isLegacyAndroidVoiceMessage) { return true; } return false; }, "isVoiceMessage"); const save = /* @__PURE__ */ __name(async ({ attachment, index, getUnusedFilename, readAttachmentData, saveAttachmentToDisk, timestamp, baseDir }) => { let data; if (attachment.path) { data = await readAttachmentData(attachment); } else if (attachment.data) { data = attachment.data; } else { throw new Error("Attachment had neither path nor data"); } const suggestedFilename = getSuggestedFilename({ attachment, timestamp, index }); const name = getUnusedFilename({ filename: suggestedFilename, baseDir }); const result = await saveAttachmentToDisk({ data, name, baseDir }); if (!result) { return null; } return result.fullPath; }, "save"); const getSuggestedFilename = /* @__PURE__ */ __name(({ attachment, timestamp, index, scenario = "saving-locally" }) => { const { fileName } = attachment; if (fileName) { return fileName; } let prefix; switch (scenario) { case "sending": prefix = "image"; break; case "saving-locally": prefix = "signal"; break; default: throw (0, import_missingCaseError_std.missingCaseError)(scenario); } const suffix = timestamp ? (0, import_moment.default)(timestamp).format("-YYYY-MM-DD-HHmmss") : ""; const fileType = getFileExtension(attachment); const extension = fileType ? `.${fileType}` : ""; const indexSuffix = isNumber(index) && index > 1 ? `_${padStart(index.toString(), 3, "0")}` : ""; return `${prefix}${suffix}${indexSuffix}${extension}`; }, "getSuggestedFilename"); const getFileExtension = /* @__PURE__ */ __name((attachment) => { if (!attachment.contentType) { return void 0; } switch (attachment.contentType) { case "video/quicktime": return "mov"; case "audio/mpeg": return "mp3"; default: return attachment.contentType.split("/")[1]; } }, "getFileExtension"); const defaultBlurHash = /* @__PURE__ */ __name((theme = import_Util_std.ThemeType.light) => { if (theme === import_Util_std.ThemeType.dark) { return "L05OQnoffQofoffQfQfQfQfQfQfQ"; } return "L1Q]+w-;fQ-;~qfQfQfQfQfQfQfQ"; }, "defaultBlurHash"); const canBeDownloaded = /* @__PURE__ */ __name((attachment) => { return Boolean(attachment.digest && attachment.key && !attachment.wasTooBig); }, "canBeDownloaded"); function doAttachmentsOnSameMessageMatch(attachmentA, attachmentB) { if ((0, import_Crypto_std.isValidPlaintextHash)(attachmentA.plaintextHash) && (0, import_Crypto_std.isValidPlaintextHash)(attachmentB.plaintextHash)) { return attachmentA.plaintextHash === attachmentB.plaintextHash; } if ((0, import_Crypto_std.isValidDigest)(attachmentA.digest) && (0, import_Crypto_std.isValidDigest)(attachmentB.digest)) { return attachmentA.digest === attachmentB.digest; } return false; } __name(doAttachmentsOnSameMessageMatch, "doAttachmentsOnSameMessageMatch"); function getUndownloadedAttachmentSignature(attachment) { return `${attachment.digest ?? ""}.${attachment.plaintextHash ?? ""}`; } __name(getUndownloadedAttachmentSignature, "getUndownloadedAttachmentSignature"); function cacheAttachmentBySignature(attachmentMap, attachment) { const { digest, plaintextHash } = attachment; if (digest) { attachmentMap.set(digest, attachment); } if (plaintextHash) { attachmentMap.set(plaintextHash, attachment); } } __name(cacheAttachmentBySignature, "cacheAttachmentBySignature"); function getCachedAttachmentBySignature(attachmentMap, attachment) { const { digest, plaintextHash } = attachment; if (digest) { if (attachmentMap.has(digest)) { return attachmentMap.get(digest); } } if (plaintextHash) { if (attachmentMap.has(plaintextHash)) { return attachmentMap.get(plaintextHash); } } return void 0; } __name(getCachedAttachmentBySignature, "getCachedAttachmentBySignature"); function hasRequiredInformationForRemoteBackup(attachment) { return (0, import_Crypto_std.isValidAttachmentKey)(attachment.key) && (0, import_Crypto_std.isValidPlaintextHash)(attachment.plaintextHash); } __name(hasRequiredInformationForRemoteBackup, "hasRequiredInformationForRemoteBackup"); function hasRequiredInformationForLocalBackup(attachment) { return (0, import_Crypto_std.isValidAttachmentKey)(attachment.localKey) && (0, import_Crypto_std.isValidPlaintextHash)(attachment.plaintextHash) && Boolean(attachment.path); } __name(hasRequiredInformationForLocalBackup, "hasRequiredInformationForLocalBackup"); function wasImportedFromLocalBackup(attachment) { return (0, import_Crypto_std.isValidPlaintextHash)(attachment.plaintextHash) && (0, import_Crypto_std.isValidAttachmentKey)(attachment.localKey) && Boolean(attachment.localBackupPath); } __name(wasImportedFromLocalBackup, "wasImportedFromLocalBackup"); function canAttachmentHaveThumbnail({ contentType }) { return (0, import_GoogleChrome_std.isVideoTypeSupported)(contentType) || (0, import_GoogleChrome_std.isImageTypeSupported)(contentType); } __name(canAttachmentHaveThumbnail, "canAttachmentHaveThumbnail"); function hasRequiredInformationToDownloadFromTransitTier(attachment) { const hasIntegrityCheck = (0, import_Crypto_std.isValidDigest)(attachment.digest) || (0, import_Crypto_std.isValidPlaintextHash)(attachment.plaintextHash); if (!hasIntegrityCheck) { return false; } if (!(0, import_Crypto_std.isValidAttachmentKey)(attachment.key)) { return false; } if (!attachment.cdnKey || attachment.cdnNumber == null) { return false; } return true; } __name(hasRequiredInformationToDownloadFromTransitTier, "hasRequiredInformationToDownloadFromTransitTier"); function shouldAttachmentEndUpInRemoteBackup({ attachment, hasMediaBackups }) { return hasMediaBackups && hasRequiredInformationForRemoteBackup(attachment); } __name(shouldAttachmentEndUpInRemoteBackup, "shouldAttachmentEndUpInRemoteBackup"); function isDownloadable(attachment) { return hasRequiredInformationToDownloadFromTransitTier(attachment) || shouldAttachmentEndUpInRemoteBackup({ attachment, // TODO: DESKTOP-8905 hasMediaBackups: true }); } __name(isDownloadable, "isDownloadable"); function isAttachmentLocallySaved(attachment) { return Boolean(attachment.path); } __name(isAttachmentLocallySaved, "isAttachmentLocallySaved"); function partitionBodyAndNormalAttachments({ attachments, existingBodyAttachment }, { logId, logger = logging }) { const [bodyAttachments, normalAttachments] = partition( attachments, (attachment) => MIME.isLongMessage(attachment.contentType) ); if (bodyAttachments.length > 1) { logger.warn( `${logId}: Received more than one long message attachment, dropping ${bodyAttachments.length - 1}` ); } if (bodyAttachments.length > 0) { if (existingBodyAttachment) { logger.warn(`${logId}: there is already an existing body attachment`); } else { logger.info( `${logId}: Moving a long message attachment to message.bodyAttachment` ); } } return { bodyAttachment: existingBodyAttachment ?? bodyAttachments[0], attachments: normalAttachments }; } __name(partitionBodyAndNormalAttachments, "partitionBodyAndNormalAttachments"); const MESSAGE_ATTACHMENT_TYPES_NEEDING_THUMBNAILS = /* @__PURE__ */ new Set(["attachment", "sticker"]); function shouldGenerateThumbnailForAttachmentType(type) { return MESSAGE_ATTACHMENT_TYPES_NEEDING_THUMBNAILS.has(type); } __name(shouldGenerateThumbnailForAttachmentType, "shouldGenerateThumbnailForAttachmentType"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { _replaceUnicodeOrderOverridesSync, areAllAttachmentsVisual, cacheAttachmentBySignature, canAttachmentHaveThumbnail, canBeDownloaded, canBeTranscoded, canDisplayImage, canRenderAudio, defaultBlurHash, doAttachmentsOnSameMessageMatch, getAlt, getCachedAttachmentBySignature, getExtensionForDisplay, getFileExtension, getGridDimensions, getImageDimensionsForTimeline, getSuggestedFilename, getThumbnailUrl, getUndownloadedAttachmentSignature, getUrl, hasData, hasFailed, hasImage, hasNotResolved, hasRequiredInformationForLocalBackup, hasRequiredInformationForRemoteBackup, hasRequiredInformationToDownloadFromTransitTier, hasVideoBlurHash, hasVideoScreenshot, isAttachmentLocallySaved, isAudio, isDownloadable, isDownloaded, isDownloading, isFile, isGIF, isImage, isImageAttachment, isIncremental, isReadyToView, isValid, isVideo, isVideoAttachment, isVisualMedia, isVoiceMessage, loadData, partitionBodyAndNormalAttachments, removeSchemaVersion, replaceUnicodeOrderOverrides, replaceUnicodeV2, save, shouldAttachmentEndUpInRemoteBackup, shouldGenerateThumbnailForAttachmentType, wasImportedFromLocalBackup }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var AttachmentCrypto_std_exports = {}; __export(AttachmentCrypto_std_exports, { getAesCbcCiphertextSize: () => getAesCbcCiphertextSize, getAttachmentCiphertextSize: () => getAttachmentCiphertextSize, getCiphertextSize: () => getCiphertextSize }); module.exports = __toCommonJS(AttachmentCrypto_std_exports); var import_Crypto_std = require("../types/Crypto.std.js"); var import_AttachmentDownload_std = require("../types/AttachmentDownload.std.js"); var import_logPadSize_std = require("./logPadSize.std.js"); var import_missingCaseError_std = require("./missingCaseError.std.js"); function getCiphertextSize(plaintextLength) { const paddedPlaintextSize = (0, import_logPadSize_std.logPadSize)(plaintextLength); return import_Crypto_std.IV_LENGTH + getAesCbcCiphertextSize(paddedPlaintextSize) + import_Crypto_std.ATTACHMENT_MAC_LENGTH; } __name(getCiphertextSize, "getCiphertextSize"); function getAesCbcCiphertextSize(plaintextLength) { const AES_CBC_BLOCK_SIZE = 16; return (1 + Math.floor(plaintextLength / AES_CBC_BLOCK_SIZE)) * AES_CBC_BLOCK_SIZE; } __name(getAesCbcCiphertextSize, "getAesCbcCiphertextSize"); function getAttachmentCiphertextSize({ unpaddedPlaintextSize, mediaTier }) { const paddedSize = (0, import_logPadSize_std.logPadSize)(unpaddedPlaintextSize); switch (mediaTier) { case import_AttachmentDownload_std.MediaTier.STANDARD: return getCiphertextSize(paddedSize); case import_AttachmentDownload_std.MediaTier.BACKUP: return getCiphertextSize(getCiphertextSize(paddedSize)); default: throw (0, import_missingCaseError_std.missingCaseError)(mediaTier); } } __name(getAttachmentCiphertextSize, "getAttachmentCiphertextSize"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getAesCbcCiphertextSize, getAttachmentCiphertextSize, getCiphertextSize }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var BackOff_std_exports = {}; __export(BackOff_std_exports, { BackOff: () => BackOff, EXTENDED_FIBONACCI_TIMEOUTS: () => EXTENDED_FIBONACCI_TIMEOUTS, FIBONACCI: () => FIBONACCI, FIBONACCI_TIMEOUTS: () => FIBONACCI_TIMEOUTS }); module.exports = __toCommonJS(BackOff_std_exports); const SECOND = 1e3; const FIBONACCI = [1, 2, 3, 5, 8, 13, 21, 34, 55]; const FIBONACCI_TIMEOUTS = [ 1 * SECOND, 2 * SECOND, 3 * SECOND, 5 * SECOND, 8 * SECOND, 13 * SECOND, 21 * SECOND, 34 * SECOND, 55 * SECOND ]; const EXTENDED_FIBONACCI_TIMEOUTS = [ ...FIBONACCI_TIMEOUTS, 89 * SECOND, 144 * SECOND, 233 * SECOND, 377 * SECOND, 610 * SECOND, 987 * SECOND, 1597 * SECOND // ~26 minutes ]; const DEFAULT_RANDOM = /* @__PURE__ */ __name(() => Math.random(), "DEFAULT_RANDOM"); class BackOff { constructor(timeouts, options = {}) { this.timeouts = timeouts; this.options = options; } static { __name(this, "BackOff"); } #count = 0; get() { let result = this.timeouts[this.#count]; const { jitter = 0, random = DEFAULT_RANDOM } = this.options; if (jitter < result) { result += random() * jitter; } return result; } getAndIncrement() { const result = this.get(); if (!this.isFull()) { this.#count += 1; } return result; } reset(newTimeouts) { if (newTimeouts !== void 0) { this.timeouts = newTimeouts; } this.#count = 0; } isFull() { return this.#count === this.timeouts.length - 1; } getIndex() { return this.#count; } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { BackOff, EXTENDED_FIBONACCI_TIMEOUTS, FIBONACCI, FIBONACCI_TIMEOUTS }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var BodyRange_node_exports = {}; __export(BodyRange_node_exports, { filterAndClean: () => filterAndClean, hydrateRanges: () => hydrateRanges }); module.exports = __toCommonJS(BodyRange_node_exports); var import_lodash = __toESM(require("lodash")); var import_BodyRange_std = require("../types/BodyRange.std.js"); var import_log_std = require("../logging/log.std.js"); var import_isNotNil_std = require("./isNotNil.std.js"); var import_dropNull_std = require("./dropNull.std.js"); var import_ServiceId_node = require("./ServiceId.node.js"); const { isNumber } = import_lodash.default; const log = (0, import_log_std.createLogger)("BodyRange"); const { BOLD, ITALIC, MONOSPACE, SPOILER, STRIKETHROUGH, NONE } = import_BodyRange_std.BodyRange.Style; const MENTION_NAME = "mention"; const MAX_PER_TYPE = 250; function filterAndClean(ranges) { if (!ranges) { return void 0; } const countByTypeRecord = { [MENTION_NAME]: 0, [BOLD]: 0, [ITALIC]: 0, [MONOSPACE]: 0, [SPOILER]: 0, [STRIKETHROUGH]: 0, [NONE]: 0 }; return ranges.map((range) => { const { start: startFromRange, length, ...restOfRange } = range; const start = startFromRange ?? 0; if (!isNumber(length)) { log.warn("filterAndClean: Dropping bodyRange with non-number length"); return void 0; } let rawMentionAci; let mentionAciBinary; if ("mentionAci" in range) { rawMentionAci = (0, import_dropNull_std.dropNull)(range.mentionAci); } if ("mentionAciBinary" in range && range.mentionAciBinary instanceof Uint8Array) { mentionAciBinary = (0, import_dropNull_std.dropNull)(range.mentionAciBinary); } let mentionAci; if (rawMentionAci != null || mentionAciBinary?.length) { mentionAci = (0, import_ServiceId_node.fromAciUuidBytesOrString)( mentionAciBinary, rawMentionAci, "BodyRange.mentionAci" ); } if (mentionAci) { countByTypeRecord[MENTION_NAME] += 1; if (countByTypeRecord[MENTION_NAME] > MAX_PER_TYPE) { return void 0; } return { start, length, mentionAci }; } if ("style" in range && range.style) { countByTypeRecord[range.style] += 1; if (countByTypeRecord[range.style] > MAX_PER_TYPE) { return void 0; } return { ...restOfRange, start, length, style: range.style }; } log.warn("filterAndClean: Dropping unknown bodyRange"); return void 0; }).filter(import_isNotNil_std.isNotNil); } __name(filterAndClean, "filterAndClean"); function hydrateRanges(ranges, conversationSelector) { if (!ranges) { return void 0; } return filterAndClean(ranges)?.map((range) => { if (import_BodyRange_std.BodyRange.isMention(range)) { const conversation = conversationSelector(range.mentionAci); return { ...range, conversationID: conversation.id, replacementText: conversation.title }; } return range; }); } __name(hydrateRanges, "hydrateRanges"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { filterAndClean, hydrateRanges }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var DelimitedStream_node_exports = {}; __export(DelimitedStream_node_exports, { DelimitedStream: () => DelimitedStream }); module.exports = __toCommonJS(DelimitedStream_node_exports); var import_node_stream = require("node:stream"); var import_missingCaseError_std = require("./missingCaseError.std.js"); var State = /* @__PURE__ */ ((State2) => { State2["Prefix"] = "Prefix"; State2["Data"] = "Data"; return State2; })(State || {}); class DelimitedStream extends import_node_stream.Transform { static { __name(this, "DelimitedStream"); } #state = "Prefix" /* Prefix */; #prefixValue = 0; #prefixSize = 0; #parts = new Array(); constructor() { super({ readableObjectMode: true }); } _transform(chunk, _encoding, done) { let offset = 0; while (offset < chunk.length) { if (this.#state === "Prefix" /* Prefix */) { const b = chunk[offset]; offset += 1; const isLast = (b & 128) === 0; const value = b & 127; this.#prefixValue |= value << 7 * this.#prefixSize; this.#prefixSize += 1; if (this.#prefixSize > 4) { done(new Error("Delimiter encoding overflow")); return; } if (isLast) { this.#state = "Data" /* Data */; } } else if (this.#state === "Data" /* Data */) { const toTake = Math.min(this.#prefixValue, chunk.length - offset); const part = chunk.slice(offset, offset + toTake); offset += toTake; this.#prefixValue -= toTake; this.#parts.push(part); if (this.#prefixValue <= 0) { this.#state = "Prefix" /* Prefix */; this.#prefixSize = 0; this.#prefixValue = 0; const whole = Buffer.concat(this.#parts); this.#parts = []; this.push(whole); } } else { throw (0, import_missingCaseError_std.missingCaseError)(this.#state); } } done(); } _flush(done) { if (this.#state !== "Prefix" /* Prefix */) { done(new Error("Unfinished data")); return; } if (this.#prefixSize !== 0) { done(new Error("Unfinished prefix")); return; } done(); } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { DelimitedStream }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var GoogleChrome_std_exports = {}; __export(GoogleChrome_std_exports, { getSupportedImageTypes: () => getSupportedImageTypes, getSupportedVideoTypes: () => getSupportedVideoTypes, isImageTypeSupported: () => isImageTypeSupported, isVideoTypeSupported: () => isVideoTypeSupported }); module.exports = __toCommonJS(GoogleChrome_std_exports); const SUPPORTED_IMAGE_MIME_TYPES = { "image/avif": true, "image/bmp": true, "image/gif": true, "image/jpeg": true, // No need to support SVG "image/svg+xml": false, "image/webp": true, "image/x-xbitmap": true, // ICO "image/vnd.microsoft.icon": true, "image/ico": true, "image/icon": true, "image/x-icon": true, // PNG "image/apng": true, "image/png": true }; const isImageTypeSupported = /* @__PURE__ */ __name((mimeType) => SUPPORTED_IMAGE_MIME_TYPES[mimeType] === true, "isImageTypeSupported"); const SUPPORTED_VIDEO_MIME_TYPES = { "video/mp4": true, "video/ogg": true, "video/webm": true }; const isVideoTypeSupported = /* @__PURE__ */ __name((mimeType) => SUPPORTED_VIDEO_MIME_TYPES[mimeType] === true, "isVideoTypeSupported"); const getSupportedImageTypes = /* @__PURE__ */ __name(() => { const keys = Object.keys(SUPPORTED_IMAGE_MIME_TYPES); return keys.filter((contentType) => SUPPORTED_IMAGE_MIME_TYPES[contentType]); }, "getSupportedImageTypes"); const getSupportedVideoTypes = /* @__PURE__ */ __name(() => { const keys = Object.keys(SUPPORTED_VIDEO_MIME_TYPES); return keys.filter((contentType) => SUPPORTED_VIDEO_MIME_TYPES[contentType]); }, "getSupportedVideoTypes"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getSupportedImageTypes, getSupportedVideoTypes, isImageTypeSupported, isVideoTypeSupported }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var JobQueue_std_exports = {}; __export(JobQueue_std_exports, { storageJobQueue: () => storageJobQueue }); module.exports = __toCommonJS(JobQueue_std_exports); var import_p_queue = __toESM(require("p-queue")); var import_TaskWithTimeout_std = __toESM(require("../textsecure/TaskWithTimeout.std.js")); function createJobQueue(label) { const jobQueue = new import_p_queue.default({ concurrency: 1 }); return (job, id = "") => { const taskWithTimeout = (0, import_TaskWithTimeout_std.default)(job, `${label} ${id}`); return jobQueue.add(taskWithTimeout); }; } __name(createJobQueue, "createJobQueue"); const storageJobQueue = createJobQueue("storageService"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { storageJobQueue }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var LatestQueue_std_exports = {}; __export(LatestQueue_std_exports, { LatestQueue: () => LatestQueue }); module.exports = __toCommonJS(LatestQueue_std_exports); var import_drop_std = require("./drop.std.js"); class LatestQueue { static { __name(this, "LatestQueue"); } #isRunning; #queuedTask; #onceEmptyCallbacks; constructor() { this.#isRunning = false; this.#onceEmptyCallbacks = []; } /** * Does one of the following: * * 1. Runs the task immediately. * 2. Enqueues the task, destroying any previously-enqueued task. In other words, 0 or 1 * tasks will be enqueued at a time. */ add(task) { if (this.#isRunning) { this.#queuedTask = task; } else { this.#isRunning = true; (0, import_drop_std.drop)( task().finally(() => { this.#isRunning = false; const queuedTask = this.#queuedTask; if (queuedTask) { this.#queuedTask = void 0; this.add(queuedTask); } else { try { this.#onceEmptyCallbacks.forEach((callback) => { callback(); }); } finally { this.#onceEmptyCallbacks = []; } } }) ); } } /** * Adds a callback to be called the first time the queue goes from "running" to "empty". */ onceEmpty(callback) { this.#onceEmptyCallbacks.push(callback); } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { LatestQueue }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var MemoryStream_node_exports = {}; __export(MemoryStream_node_exports, { MemoryStream: () => MemoryStream }); module.exports = __toCommonJS(MemoryStream_node_exports); var import_io = require("@signalapp/libsignal-client/dist/io.js"); class MemoryStream extends import_io.InputStream { constructor(buffer) { super(); this.buffer = buffer; } static { __name(this, "MemoryStream"); } #offset = 0; async read(amount) { const result = this.buffer.subarray(this.#offset, this.#offset + amount); this.#offset += amount; return result; } async skip(amount) { this.#offset += amount; } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { MemoryStream }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var ServiceId_node_exports = {}; __export(ServiceId_node_exports, { fromAciUuidBytes: () => fromAciUuidBytes, fromAciUuidBytesOrString: () => fromAciUuidBytesOrString, fromPniUuidBytesOrUntaggedString: () => fromPniUuidBytesOrUntaggedString, fromServiceIdBinaryOrString: () => fromServiceIdBinaryOrString, toAciObject: () => toAciObject, toPniObject: () => toPniObject, toServiceIdObject: () => toServiceIdObject }); module.exports = __toCommonJS(ServiceId_node_exports); var import_libsignal_client = require("@signalapp/libsignal-client"); var import_ServiceId_std = require("../types/ServiceId.std.js"); var Bytes = __toESM(require("../Bytes.std.js")); var import_normalizeAci_std = require("./normalizeAci.std.js"); function toServiceIdObject(serviceId) { return import_libsignal_client.ServiceId.parseFromServiceIdString(serviceId); } __name(toServiceIdObject, "toServiceIdObject"); function toAciObject(aci) { return import_libsignal_client.Aci.parseFromServiceIdString(aci); } __name(toAciObject, "toAciObject"); function toPniObject(pni) { return import_libsignal_client.Pni.parseFromServiceIdString(pni); } __name(toPniObject, "toPniObject"); function fromServiceIdBinaryOrString(bytes, fallback, context) { if (Bytes.isNotEmpty(bytes)) { return (0, import_ServiceId_std.fromServiceIdObject)(import_libsignal_client.ServiceId.parseFromServiceIdBinary(bytes)); } if (fallback) { return (0, import_ServiceId_std.normalizeServiceId)(fallback, context); } return void 0; } __name(fromServiceIdBinaryOrString, "fromServiceIdBinaryOrString"); function fromAciUuidBytes(bytes) { if (Bytes.isNotEmpty(bytes)) { return (0, import_ServiceId_std.fromAciObject)(import_libsignal_client.Aci.fromUuidBytes(bytes)); } return void 0; } __name(fromAciUuidBytes, "fromAciUuidBytes"); function fromAciUuidBytesOrString(bytes, fallback, context) { if (Bytes.isNotEmpty(bytes)) { return fromAciUuidBytes(bytes); } if (fallback) { return (0, import_normalizeAci_std.normalizeAci)(fallback, context); } return void 0; } __name(fromAciUuidBytesOrString, "fromAciUuidBytesOrString"); function fromPniUuidBytesOrUntaggedString(bytes, fallback, context) { if (Bytes.isNotEmpty(bytes)) { return (0, import_ServiceId_std.fromPniObject)(import_libsignal_client.Pni.fromUuidBytes(bytes)); } if (fallback && (0, import_ServiceId_std.isUntaggedPniString)(fallback)) { return (0, import_ServiceId_std.normalizePni)((0, import_ServiceId_std.toTaggedPni)(fallback), context); } return void 0; } __name(fromPniUuidBytesOrUntaggedString, "fromPniUuidBytesOrUntaggedString"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { fromAciUuidBytes, fromAciUuidBytesOrString, fromPniUuidBytesOrUntaggedString, fromServiceIdBinaryOrString, toAciObject, toPniObject, toServiceIdObject }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var Sound_std_exports = {}; __export(Sound_std_exports, { Sound: () => Sound, SoundType: () => SoundType }); module.exports = __toCommonJS(Sound_std_exports); var import_log_std = require("../logging/log.std.js"); var import_missingCaseError_std = require("./missingCaseError.std.js"); const log = (0, import_log_std.createLogger)("Sound"); var SoundType = /* @__PURE__ */ ((SoundType2) => { SoundType2[SoundType2["CallingHangUp"] = 0] = "CallingHangUp"; SoundType2[SoundType2["CallingHandRaised"] = 1] = "CallingHandRaised"; SoundType2[SoundType2["CallingPresenting"] = 2] = "CallingPresenting"; SoundType2[SoundType2["Pop"] = 3] = "Pop"; SoundType2[SoundType2["Ringtone"] = 4] = "Ringtone"; SoundType2[SoundType2["TriTone"] = 5] = "TriTone"; SoundType2[SoundType2["VoiceNoteEnd"] = 6] = "VoiceNoteEnd"; SoundType2[SoundType2["VoiceNoteStart"] = 7] = "VoiceNoteStart"; SoundType2[SoundType2["Whoosh"] = 8] = "Whoosh"; return SoundType2; })(SoundType || {}); class Sound { static { __name(this, "Sound"); } static sounds = /* @__PURE__ */ new Map(); static context; #loop; #node; #soundType; constructor(options) { this.#loop = Boolean(options.loop); this.#soundType = options.soundType; } async play() { let soundBuffer = Sound.sounds.get(this.#soundType); if (!soundBuffer) { try { const src = Sound.getSrc(this.#soundType); const buffer = await Sound.loadSoundFile(src); const decodedBuffer = await this.#context.decodeAudioData(buffer); Sound.sounds.set(this.#soundType, decodedBuffer); soundBuffer = decodedBuffer; } catch (err) { log.error(`error: ${err}`); return; } } const soundNode = this.#context.createBufferSource(); soundNode.buffer = soundBuffer; const volumeNode = this.#context.createGain(); soundNode.connect(volumeNode); volumeNode.connect(this.#context.destination); soundNode.loop = this.#loop; soundNode.start(0, 0); this.#node = soundNode; } stop() { if (this.#node) { this.#node.stop(0); this.#node = void 0; } } get #context() { if (!Sound.context) { Sound.context = new AudioContext(); } return Sound.context; } static async loadSoundFile(src) { const xhr = new XMLHttpRequest(); xhr.open("GET", src, true); xhr.responseType = "arraybuffer"; return new Promise((resolve, reject) => { xhr.onload = () => { if (xhr.status === 200) { resolve(xhr.response); return; } reject(new Error(`Request failed: ${xhr.statusText}`)); }; xhr.onerror = () => { reject(new Error(`Request failed, most likely file not found: ${src}`)); }; xhr.send(); }); } static getSrc(soundStyle) { if (soundStyle === 1 /* CallingHandRaised */) { return "sounds/notification_simple-01.ogg"; } if (soundStyle === 0 /* CallingHangUp */) { return "sounds/navigation-cancel.ogg"; } if (soundStyle === 2 /* CallingPresenting */) { return "sounds/navigation_selection-complete-celebration.ogg"; } if (soundStyle === 3 /* Pop */) { return "sounds/pop.ogg"; } if (soundStyle === 5 /* TriTone */) { return "sounds/notification.ogg"; } if (soundStyle === 4 /* Ringtone */) { return "sounds/ringtone_minimal.ogg"; } if (soundStyle === 6 /* VoiceNoteEnd */) { return "sounds/state-change_confirm-up.ogg"; } if (soundStyle === 7 /* VoiceNoteStart */) { return "sounds/state-change_confirm-down.ogg"; } if (soundStyle === 8 /* Whoosh */) { return "sounds/whoosh.ogg"; } throw (0, import_missingCaseError_std.missingCaseError)(soundStyle); } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { Sound, SoundType }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var StartupQueue_std_exports = {}; __export(StartupQueue_std_exports, { StartupQueue: () => StartupQueue }); module.exports = __toCommonJS(StartupQueue_std_exports); var import_p_queue = __toESM(require("p-queue")); var Errors = __toESM(require("../types/errors.std.js")); var import_log_std = require("../logging/log.std.js"); const log = (0, import_log_std.createLogger)("StartupQueue"); let startupProcessingQueue; class StartupQueue { static { __name(this, "StartupQueue"); } #map = /* @__PURE__ */ new Map(); #running = new import_p_queue.default({ // mostly io-bound work that is not very parallelizable // small number should be sufficient concurrency: 5 }); add(id, value, f) { const existing = this.#map.get(id); if (existing && existing.value >= value) { return; } this.#map.set(id, { value, callback: f }); } flush() { log.info("Processing", this.#map.size, "actions"); const values = Array.from(this.#map.values()); this.#map.clear(); for (const { callback } of values) { void this.#running.add(async () => { try { return callback(); } catch (error) { log.error( "Failed to process item due to error", Errors.toLogFormat(error) ); throw error; } }); } } #shutdown() { log.info(`Waiting for ${this.#running.pending} tasks to drain`); return this.#running.onIdle(); } static initialize() { startupProcessingQueue = new StartupQueue(); } static isAvailable() { return Boolean(startupProcessingQueue); } static add(id, value, f) { startupProcessingQueue?.add(id, value, f); } static flush() { startupProcessingQueue?.flush(); startupProcessingQueue = void 0; } static async shutdown() { if (startupProcessingQueue != null) { await startupProcessingQueue.#shutdown(); } } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { StartupQueue }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var Stickers_std_exports = {}; __export(Stickers_std_exports, { isPackIdValid: () => isPackIdValid, redactPackId: () => redactPackId }); module.exports = __toCommonJS(Stickers_std_exports); const VALID_PACK_ID_REGEXP = /^[0-9a-f]{32}$/i; function isPackIdValid(packId) { return typeof packId === "string" && VALID_PACK_ID_REGEXP.test(packId); } __name(isPackIdValid, "isPackIdValid"); function redactPackId(packId) { return `[REDACTED]${packId.slice(-3)}`; } __name(redactPackId, "redactPackId"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { isPackIdValid, redactPackId }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var TaskDeduplicator_std_exports = {}; __export(TaskDeduplicator_std_exports, { TaskDeduplicator: () => TaskDeduplicator }); module.exports = __toCommonJS(TaskDeduplicator_std_exports); var import_assert_std = require("./assert.std.js"); var import_explodePromise_std = require("./explodePromise.std.js"); class TaskDeduplicator { constructor(name, task) { this.name = name; this.#task = task; } static { __name(this, "TaskDeduplicator"); } #task; #current; #remaining = 0; #abortController; async run(abortSignal) { const { promise: localAbort, reject: localReject } = (0, import_explodePromise_std.explodePromise)(); if (abortSignal != null) { this.#remaining += 1; abortSignal.addEventListener("abort", () => { this.#remaining -= 1; if (this.#remaining === 0) { (0, import_assert_std.strictAssert)( this.#abortController != null, `TaskDeduplicator(${this.name}): missing abort controller` ); this.#abortController.abort(); } localReject(new Error("Aborted")); }); } if (this.#current != null) { return Promise.race([this.#current, localAbort]); } this.#abortController = new AbortController(); try { this.#current = this.#task(this.#abortController.signal); return await Promise.race([this.#current, localAbort]); } finally { this.#current = void 0; this.#abortController = void 0; this.#remaining = 0; } } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { TaskDeduplicator }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var Zone_std_exports = {}; __export(Zone_std_exports, { Zone: () => Zone }); module.exports = __toCommonJS(Zone_std_exports); class Zone { constructor(name, options = {}) { this.name = name; this.options = options; } static { __name(this, "Zone"); } supportsPendingKyberPreKeysToRemove() { return this.options.pendingKyberPreKeysToRemove === true; } supportsPendingPreKeysToRemove() { return this.options.pendingPreKeysToRemove === true; } supportsPendingSenderKeys() { return this.options.pendingSenderKeys === true; } supportsPendingSessions() { return this.options.pendingSessions === true; } supportsPendingUnprocessed() { return this.options.pendingUnprocessed === true; } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { Zone }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var appendMacStream_node_exports = {}; __export(appendMacStream_node_exports, { MAC_KEY_SIZE: () => MAC_KEY_SIZE, MAC_SIZE: () => MAC_SIZE, appendMacStream: () => appendMacStream }); module.exports = __toCommonJS(appendMacStream_node_exports); var import_node_crypto = require("node:crypto"); var import_node_stream = require("node:stream"); var import_Crypto_std = require("../types/Crypto.std.js"); const MAC_KEY_SIZE = 32; const MAC_SIZE = 32; function appendMacStream(macKey, onMac) { if (macKey.byteLength !== MAC_KEY_SIZE) { throw new Error("appendMacStream: invalid macKey length"); } const hmac = (0, import_node_crypto.createHmac)(import_Crypto_std.HashType.size256, macKey); return new import_node_stream.Transform({ transform(chunk, _encoding, callback) { try { hmac.update(chunk); callback(null, chunk); } catch (error) { callback(error); } }, flush(callback) { try { const mac = hmac.digest(); onMac?.(mac); callback(null, mac); } catch (error) { callback(error); } } }); } __name(appendMacStream, "appendMacStream"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { MAC_KEY_SIZE, MAC_SIZE, appendMacStream }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var areObjectEntriesEqual_std_exports = {}; __export(areObjectEntriesEqual_std_exports, { areObjectEntriesEqual: () => areObjectEntriesEqual }); module.exports = __toCommonJS(areObjectEntriesEqual_std_exports); const areObjectEntriesEqual = /* @__PURE__ */ __name((a, b, keys) => a === b || keys.every((key) => a[key] === b[key]), "areObjectEntriesEqual"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { areObjectEntriesEqual }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var arePinnedConversationsEqual_node_exports = {}; __export(arePinnedConversationsEqual_node_exports, { arePinnedConversationsEqual: () => arePinnedConversationsEqual }); module.exports = __toCommonJS(arePinnedConversationsEqual_node_exports); var Bytes = __toESM(require("../Bytes.std.js")); var import_index_std = require("../protobuf/index.std.js"); var import_ServiceId_node = require("./ServiceId.node.js"); function arePinnedConversationsEqual(localValue, remoteValue) { if (localValue.length !== remoteValue.length) { return false; } return localValue.every( (localPinnedConversation, index) => { const remotePinnedConversation = remoteValue[index]; const { contact, groupMasterKey, legacyGroupId } = localPinnedConversation; if (contact) { const { contact: remoteContact } = remotePinnedConversation; if (!remoteContact) { return false; } const serviceId = (0, import_ServiceId_node.fromServiceIdBinaryOrString)( contact.serviceIdBinary, contact.serviceId, `arePinnedConversationsEqual(${index}).local` ); const remoteServiceId = (0, import_ServiceId_node.fromServiceIdBinaryOrString)( remoteContact.serviceIdBinary, remoteContact.serviceId, `arePinnedConversationsEqual(${index}).remote` ); return serviceId === remoteServiceId; } if (groupMasterKey && groupMasterKey.length) { return Bytes.areEqual( groupMasterKey, remotePinnedConversation.groupMasterKey ); } if (legacyGroupId && legacyGroupId.length) { return Bytes.areEqual( legacyGroupId, remotePinnedConversation.legacyGroupId ); } return false; } ); } __name(arePinnedConversationsEqual, "arePinnedConversationsEqual"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { arePinnedConversationsEqual }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var arrayBufferToObjectURL_std_exports = {}; __export(arrayBufferToObjectURL_std_exports, { arrayBufferToObjectURL: () => arrayBufferToObjectURL }); module.exports = __toCommonJS(arrayBufferToObjectURL_std_exports); const arrayBufferToObjectURL = /* @__PURE__ */ __name(({ data, type }) => { if (!(data instanceof ArrayBuffer)) { throw new TypeError("`data` must be an ArrayBuffer"); } const blob = new Blob([data], { type }); return URL.createObjectURL(blob); }, "arrayBufferToObjectURL"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { arrayBufferToObjectURL }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var assert_std_exports = {}; __export(assert_std_exports, { assertDev: () => assertDev, devDebugger: () => devDebugger, softAssert: () => softAssert, strictAssert: () => strictAssert }); module.exports = __toCommonJS(assert_std_exports); var import_environment_std = require("../environment.std.js"); var import_log_std = require("../logging/log.std.js"); var Errors = __toESM(require("../types/errors.std.js")); const log = (0, import_log_std.createLogger)("assert"); function devDebugger() { if ((0, import_environment_std.getEnvironment)() === import_environment_std.Environment.Development) { debugger; } } __name(devDebugger, "devDebugger"); function softAssert(condition, message) { if (!condition) { devDebugger(); const err = new Error(message); log.warn("softAssert failure:", Errors.toLogFormat(err)); } } __name(softAssert, "softAssert"); function assertDev(condition, message) { if (!condition) { const err = new Error(message); if ((0, import_environment_std.getEnvironment)() !== import_environment_std.Environment.PackagedApp) { devDebugger(); throw err; } log.error("failure:", Errors.toLogFormat(err)); } } __name(assertDev, "assertDev"); function strictAssert(condition, message) { if (condition === false || condition == null) { throw new Error(message); } } __name(strictAssert, "strictAssert"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { assertDev, devDebugger, softAssert, strictAssert }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var assignWithNoUnnecessaryAllocation_std_exports = {}; __export(assignWithNoUnnecessaryAllocation_std_exports, { assignWithNoUnnecessaryAllocation: () => assignWithNoUnnecessaryAllocation }); module.exports = __toCommonJS(assignWithNoUnnecessaryAllocation_std_exports); var import_lodash = __toESM(require("lodash")); const { has } = import_lodash.default; function assignWithNoUnnecessaryAllocation(obj, source) { for (const key in source) { if (!has(source, key)) { continue; } if (!(key in obj) || obj[key] !== source[key]) { return { ...obj, ...source }; } } return obj; } __name(assignWithNoUnnecessaryAllocation, "assignWithNoUnnecessaryAllocation"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { assignWithNoUnnecessaryAllocation }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var asyncIterables_std_exports = {}; __export(asyncIterables_std_exports, { concat: () => concat, wrapPromise: () => wrapPromise }); module.exports = __toCommonJS(asyncIterables_std_exports); function concat(iterables) { return new ConcatAsyncIterable(iterables); } __name(concat, "concat"); class ConcatAsyncIterable { constructor(iterables) { this.iterables = iterables; } static { __name(this, "ConcatAsyncIterable"); } async *[Symbol.asyncIterator]() { for (const iterable of this.iterables) { for await (const value of iterable) { yield value; } } } } function wrapPromise(promise) { return new WrapPromiseAsyncIterable(promise); } __name(wrapPromise, "wrapPromise"); class WrapPromiseAsyncIterable { constructor(promise) { this.promise = promise; } static { __name(this, "WrapPromiseAsyncIterable"); } async *[Symbol.asyncIterator]() { for await (const value of await this.promise) { yield value; } } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { concat, wrapPromise }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var attachmentPath_node_exports = {}; __export(attachmentPath_node_exports, { createName: () => createName, getRelativePath: () => getRelativePath }); module.exports = __toCommonJS(attachmentPath_node_exports); var import_node_path = require("node:path"); var import_lodash = __toESM(require("lodash")); var import_Crypto_node = require("../Crypto.node.js"); var Bytes = __toESM(require("../Bytes.std.js")); const { isString } = import_lodash.default; const getRelativePath = /* @__PURE__ */ __name((name) => { if (!isString(name)) { throw new TypeError("'name' must be a string"); } const prefix = name.slice(0, 2); return (0, import_node_path.join)(prefix, name); }, "getRelativePath"); const createName = /* @__PURE__ */ __name((suffix = "") => `${Bytes.toHex((0, import_Crypto_node.getRandomBytes)(32))}${suffix}`, "createName"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { createName, getRelativePath }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var markAttachmentAsPermanentlyErrored_std_exports = {}; __export(markAttachmentAsPermanentlyErrored_std_exports, { markAttachmentAsPermanentlyErrored: () => markAttachmentAsPermanentlyErrored }); module.exports = __toCommonJS(markAttachmentAsPermanentlyErrored_std_exports); var import_lodash = __toESM(require("lodash")); const { omit } = import_lodash.default; function markAttachmentAsPermanentlyErrored(attachment, { backfillError }) { return { ...omit(attachment, ["key", "id"]), pending: false, error: true, backfillError }; } __name(markAttachmentAsPermanentlyErrored, "markAttachmentAsPermanentlyErrored"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { markAttachmentAsPermanentlyErrored }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var migrateDataToFilesystem_std_exports = {}; __export(migrateDataToFilesystem_std_exports, { migrateDataToFileSystem: () => migrateDataToFileSystem }); module.exports = __toCommonJS(migrateDataToFilesystem_std_exports); var import_lodash = __toESM(require("lodash")); const { isFunction, isTypedArray, isUndefined, omit } = import_lodash.default; async function migrateDataToFileSystem(attachment, { writeNewAttachmentData, getExistingAttachmentDataForReuse, getPlaintextHashForInMemoryAttachment, logger }, message) { if (!isFunction(writeNewAttachmentData)) { throw new TypeError("'writeNewAttachmentData' must be a function"); } const { data } = attachment; const attachmentHasData = !isUndefined(data); const shouldSkipSchemaUpgrade = !attachmentHasData; if (shouldSkipSchemaUpgrade) { return attachment; } if (!isTypedArray(data)) { logger.warn( "migrateDataToFileSystem: Attachment had non-array `data` field; deleting." ); return omit({ ...attachment }, ["data"]); } const plaintextHash = getPlaintextHashForInMemoryAttachment(data); const existingData = await getExistingAttachmentDataForReuse({ plaintextHash, messageId: message.id, contentType: attachment.contentType, logId: "migrateDataToFileSystem" }); const attachmentWithoutData = omit(attachment, ["data"]); if (existingData) { return { ...attachmentWithoutData, plaintextHash, ...existingData }; } const newAttachmentData = await writeNewAttachmentData(data); return { ...attachmentWithoutData, ...newAttachmentData }; } __name(migrateDataToFileSystem, "migrateDataToFileSystem"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { migrateDataToFileSystem }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var avatarTextSizeCalculator_std_exports = {}; __export(avatarTextSizeCalculator_std_exports, { getFittedFontSize: () => getFittedFontSize, getFontSizes: () => getFontSizes }); module.exports = __toCommonJS(avatarTextSizeCalculator_std_exports); var import_emojis_std = require("../components/fun/data/emojis.std.js"); function getFontSizes(bubbleSize) { return { diameter: Math.ceil(bubbleSize * 0.75), singleEmoji: Math.ceil(bubbleSize * 0.6), smol: Math.ceil(bubbleSize * 0.05), text: Math.ceil(bubbleSize * 0.45) }; } __name(getFontSizes, "getFontSizes"); function getFittedFontSize(bubbleSize, text, measure) { const sizes = getFontSizes(bubbleSize); const emojifyData = (0, import_emojis_std.getEmojifyData)(text); let candidateFontSize = sizes.text; if (emojifyData.isEmojiOnlyText && emojifyData.emojiCount === 1) { candidateFontSize = sizes.singleEmoji; } for (candidateFontSize; candidateFontSize >= sizes.smol; candidateFontSize -= 1) { const { height, width } = measure(candidateFontSize); if (width < sizes.diameter && height < sizes.diameter) { return candidateFontSize; } } return candidateFontSize; } __name(getFittedFontSize, "getFittedFontSize"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getFittedFontSize, getFontSizes }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var awaitObject_std_exports = {}; __export(awaitObject_std_exports, { awaitObject: () => awaitObject }); module.exports = __toCommonJS(awaitObject_std_exports); async function awaitObject(settings) { const keys = Object.keys(settings); const promises = new Array(); for (const key of keys) { promises.push(settings[key]); } const values = await Promise.all(promises); const result = {}; for (const [i, key] of keys.entries()) { result[key] = values[i]; } return result; } __name(awaitObject, "awaitObject"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { awaitObject }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var batcher_std_exports = {}; __export(batcher_std_exports, { createBatcher: () => createBatcher, waitForAllBatchers: () => waitForAllBatchers }); module.exports = __toCommonJS(batcher_std_exports); var import_p_queue = __toESM(require("p-queue")); var import_sleep_std = require("./sleep.std.js"); var import_log_std = require("../logging/log.std.js"); var Errors = __toESM(require("../types/errors.std.js")); var import_clearTimeoutIfNecessary_std = require("./clearTimeoutIfNecessary.std.js"); var import_index_std = require("./durations/index.std.js"); var import_drop_std = require("./drop.std.js"); const log = (0, import_log_std.createLogger)("batcher"); let batchers = new Array(); const waitForAllBatchers = /* @__PURE__ */ __name(async () => { log.info("waitForAllBatchers"); try { await Promise.all(batchers.map((item) => item.flushAndWait())); } catch (error) { log.error( "waitForAllBatchers: error flushing all", Errors.toLogFormat(error) ); } }, "waitForAllBatchers"); function createBatcher(options) { let batcher; let timeout; let items = []; const queue = new import_p_queue.default({ concurrency: 1, timeout: import_index_std.MINUTE * 30, throwOnTimeout: true }); function _getWait() { if (typeof options.wait === "number") { return options.wait; } return options.wait(); } __name(_getWait, "_getWait"); function _kickBatchOff() { (0, import_clearTimeoutIfNecessary_std.clearTimeoutIfNecessary)(timeout); timeout = null; const itemsRef = items; items = []; (0, import_drop_std.drop)( queue.add(async () => { await options.processBatch(itemsRef); }) ); } __name(_kickBatchOff, "_kickBatchOff"); function add(item) { items.push(item); if (items.length === 1) { timeout = setTimeout(_kickBatchOff, _getWait()); } else if (items.length >= options.maxSize) { _kickBatchOff(); } } __name(add, "add"); function removeAll(needle) { items = items.filter((item) => item !== needle); } __name(removeAll, "removeAll"); function anyPending() { return queue.size > 0 || queue.pending > 0 || items.length > 0; } __name(anyPending, "anyPending"); async function onIdle() { while (anyPending()) { if (queue.size > 0 || queue.pending > 0) { await queue.onIdle(); } if (items.length > 0) { await (0, import_sleep_std.sleep)(_getWait() * 2); } } } __name(onIdle, "onIdle"); function unregister() { batchers = batchers.filter((item) => item !== batcher); } __name(unregister, "unregister"); async function flushAndWait() { log.info(`Flushing ${options.name} batcher items.length=${items.length}`); while (anyPending()) { _kickBatchOff(); if (queue.size > 0 || queue.pending > 0) { await queue.onIdle(); } } log.info(`Flushing complete ${options.name} for batcher`); } __name(flushAndWait, "flushAndWait"); batcher = { add, removeAll, anyPending, onIdle, flushAndWait, unregister }; batchers.push(batcher); return batcher; } __name(createBatcher, "createBatcher"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { createBatcher, waitForAllBatchers }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var stats_std_exports = {}; __export(stats_std_exports, { regress: () => regress, stats: () => stats }); module.exports = __toCommonJS(stats_std_exports); function stats(list, percentiles = []) { if (list.length === 0) { throw new Error("Empty list given to stats"); } let mean = 0; let stddev = 0; for (const value of list) { mean += value; stddev += value ** 2; } mean /= list.length; stddev /= list.length; stddev -= mean ** 2; stddev = Math.sqrt(stddev); const sorted = list.slice().sort((a, b) => a - b); const result = { mean, stddev }; for (const p of percentiles) { result[`p${p}`] = sorted[Math.floor(sorted.length * p / 100)]; } return result; } __name(stats, "stats"); const STUDENT_T = [ 318.309, 22.327, 10.215, 7.173, 5.893, 5.208, 4.785, 4.501, 4.297, 4.144, 4.025, 3.93, 3.852, 3.787, 3.733, 3.686, 3.646, 3.61, 3.579, 3.552, 3.527, 3.505, 3.485, 3.467, 3.45, 3.435, 3.421, 3.408, 3.396, 3.385, 3.375, 3.365, 3.356, 3.348, 3.34, 3.333, 3.326, 3.319, 3.313, 3.307, 3.301, 3.296, 3.291, 3.286, 3.281, 3.277, 3.273, 3.269, 3.265, 3.261, 3.258, 3.255, 3.251, 3.248, 3.245, 3.242, 3.239, 3.237, 3.234, 3.232, 3.229, 3.227, 3.225, 3.223, 3.22, 3.218, 3.216, 3.214, 3.213, 3.211, 3.209, 3.207, 3.206, 3.204, 3.202, 3.201, 3.199, 3.198, 3.197, 3.195, 3.194, 3.193, 3.191, 3.19, 3.189, 3.188, 3.187, 3.185, 3.184, 3.183, 3.182, 3.181, 3.18, 3.179, 3.178, 3.177, 3.176, 3.175, 3.175, 3.174, // Infinity 3.09 ]; function regress(samples) { const bins = /* @__PURE__ */ new Map(); for (const { x, y } of samples) { let bin = bins.get(x); if (bin === void 0) { bin = []; bins.set(x, bin); } bin.push(y); } let outliers = 0; let severeOutliers = 0; for (const [, ys] of bins) { ys.sort(); const p25 = ys[Math.floor(ys.length * 0.25)] ?? -Infinity; const p75 = ys[Math.ceil(ys.length * 0.75)] ?? Infinity; const iqr = p75 - p25; const outlierLow = p25 - iqr * 1.5; const outlierHigh = p75 + iqr * 1.5; const badOutlierLow = p25 - iqr * 3; const badOutlierHigh = p75 + iqr * 3; for (const d of ys) { if (d < badOutlierLow || d > badOutlierHigh) { severeOutliers += 1; } else if (d < outlierLow || d > outlierHigh) { outliers += 1; } } } if (samples.length < 2) { throw new Error("Low sample count"); } let meanY = 0; let meanX = 0; for (const { y, x } of samples) { meanY += y; meanX += x; } meanY /= samples.length; meanX /= samples.length; let slopeNum = 0; let slopeDenom = 0; for (const { y, x } of samples) { slopeNum += (y - meanY) * (x - meanX); slopeDenom += (x - meanX) ** 2; } const slope = slopeNum / slopeDenom; const yIntercept = meanY - slope * meanX; let stdError = 0; for (const { y, x } of samples) { stdError += (y - yIntercept - slope * x) ** 2; } stdError /= samples.length - 2; stdError /= slopeDenom; stdError = Math.sqrt(stdError); return { yIntercept, slope, confidence: STUDENT_T[Math.min(samples.length, STUDENT_T.length - 1)] * stdError, outliers, severeOutliers }; } __name(regress, "regress"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { regress, stats }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var buildExpiration_std_exports = {}; __export(buildExpiration_std_exports, { getBuildExpirationTimestamp: () => getBuildExpirationTimestamp, hasBuildExpired: () => hasBuildExpired }); module.exports = __toCommonJS(buildExpiration_std_exports); var import_environment_std = require("../environment.std.js"); var import_version_std = require("./version.std.js"); var import_timestamp_std = require("./timestamp.std.js"); var import_index_std = require("./durations/index.std.js"); const NINETY_ONE_DAYS = 91 * import_index_std.DAY; const THIRTY_ONE_DAYS = 31 * import_index_std.DAY; const SIXTY_DAYS = 60 * import_index_std.DAY; function getBuildExpirationTimestamp({ version, packagedBuildExpiration, remoteBuildExpiration, autoDownloadUpdate, logger }) { const localBuildExpiration = (0, import_version_std.isNotUpdatable)(version) || autoDownloadUpdate ? packagedBuildExpiration : packagedBuildExpiration - SIXTY_DAYS; let result; let type; if (remoteBuildExpiration && remoteBuildExpiration < localBuildExpiration) { type = "remote"; result = remoteBuildExpiration; } else { type = "local"; result = localBuildExpiration; } logger.info(`Build expires (${type}): ${new Date(result).toISOString()}`); return result; } __name(getBuildExpirationTimestamp, "getBuildExpirationTimestamp"); function hasBuildExpired({ buildExpirationTimestamp, autoDownloadUpdate, now, logger }) { if ((0, import_environment_std.getEnvironment)() !== import_environment_std.Environment.PackagedApp && buildExpirationTimestamp === 0) { return false; } if ((0, import_timestamp_std.isInPast)(buildExpirationTimestamp)) { return true; } const safeExpirationMs = autoDownloadUpdate ? NINETY_ONE_DAYS : THIRTY_ONE_DAYS; const buildExpirationDuration = buildExpirationTimestamp - now; const tooFarIntoFuture = buildExpirationDuration > safeExpirationMs; if (tooFarIntoFuture) { logger.error( "Build expiration is set too far into the future", buildExpirationTimestamp ); } return tooFarIntoFuture || (0, import_timestamp_std.isInPast)(buildExpirationTimestamp); } __name(hasBuildExpired, "hasBuildExpired"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getBuildExpirationTimestamp, hasBuildExpired }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var callLinkRootKeyToUrl_std_exports = {}; __export(callLinkRootKeyToUrl_std_exports, { callLinkRootKeyToUrl: () => callLinkRootKeyToUrl }); module.exports = __toCommonJS(callLinkRootKeyToUrl_std_exports); function callLinkRootKeyToUrl(rootKey) { if (!rootKey) { return; } return `https://signal.link/call/#key=${rootKey}`; } __name(callLinkRootKeyToUrl, "callLinkRootKeyToUrl"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { callLinkRootKeyToUrl }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var callLinks_std_exports = {}; __export(callLinks_std_exports, { CALL_LINK_DEFAULT_STATE: () => CALL_LINK_DEFAULT_STATE, callLinkToConversation: () => callLinkToConversation, fromAdminKeyBytes: () => fromAdminKeyBytes, getKeyAndEpochFromCallLink: () => getKeyAndEpochFromCallLink, getKeyFromCallLink: () => getKeyFromCallLink, getPlaceholderCallLinkConversation: () => getPlaceholderCallLinkConversation, isCallHistoryForUnusedCallLink: () => isCallHistoryForUnusedCallLink, toAdminKeyBytes: () => toAdminKeyBytes, toCallHistoryFromUnusedCallLink: () => toCallHistoryFromUnusedCallLink }); module.exports = __toCommonJS(callLinks_std_exports); var import_uuid = require("uuid"); var Bytes = __toESM(require("../Bytes.std.js")); var import_CallLink_std = require("../types/CallLink.std.js"); var import_getColorForCallLink_std = require("./getColorForCallLink.std.js"); var import_CallDisposition_std = require("../types/CallDisposition.std.js"); const CALL_LINK_DEFAULT_STATE = { name: "", restrictions: import_CallLink_std.CallLinkRestrictions.Unknown, revoked: false, expiration: null, storageNeedsSync: false }; function getKeyFromCallLink(callLink) { const url = new URL(callLink); if (url == null) { throw new Error("Failed to parse call link URL"); } const hash = url.hash.slice(1); const hashParams = new URLSearchParams(hash); return hashParams.get("key") || ""; } __name(getKeyFromCallLink, "getKeyFromCallLink"); function getKeyAndEpochFromCallLink(callLink) { const url = new URL(callLink); if (url == null) { throw new Error("Failed to parse call link URL"); } const hash = url.hash.slice(1); const hashParams = new URLSearchParams(hash); return { key: hashParams.get("key") || "", epoch: hashParams.get("epoch") || "" }; } __name(getKeyAndEpochFromCallLink, "getKeyAndEpochFromCallLink"); function callLinkToConversation(callLink, i18n) { const { roomId, name, rootKey } = callLink; return { id: roomId, type: "callLink", color: (0, import_getColorForCallLink_std.getColorForCallLink)(rootKey), isMe: false, title: name || i18n("icu:calling__call-link-default-title"), acceptedMessageRequest: true, badges: [] }; } __name(callLinkToConversation, "callLinkToConversation"); function getPlaceholderCallLinkConversation(roomId, i18n) { return { id: roomId, type: "callLink", isMe: false, title: i18n("icu:calling__call-link-default-title"), acceptedMessageRequest: true, badges: [] }; } __name(getPlaceholderCallLinkConversation, "getPlaceholderCallLinkConversation"); function toAdminKeyBytes(adminKey) { return Bytes.fromBase64(adminKey); } __name(toAdminKeyBytes, "toAdminKeyBytes"); function fromAdminKeyBytes(adminKey) { return Bytes.toBase64(adminKey); } __name(fromAdminKeyBytes, "fromAdminKeyBytes"); function toCallHistoryFromUnusedCallLink(callLink) { return { callId: (0, import_uuid.v4)(), peerId: callLink.roomId, ringerId: null, startedById: null, mode: import_CallDisposition_std.CallMode.Adhoc, type: import_CallDisposition_std.CallType.Adhoc, direction: import_CallDisposition_std.CallDirection.Incoming, timestamp: Date.now(), endedTimestamp: null, status: import_CallDisposition_std.AdhocCallStatus.Pending }; } __name(toCallHistoryFromUnusedCallLink, "toCallHistoryFromUnusedCallLink"); function isCallHistoryForUnusedCallLink(callHistory) { const { ringerId, startedById, endedTimestamp, mode, type, direction, status } = callHistory; return ringerId == null && startedById == null && endedTimestamp == null && mode === import_CallDisposition_std.CallMode.Adhoc && type === import_CallDisposition_std.CallType.Adhoc && direction === import_CallDisposition_std.CallDirection.Incoming && status === import_CallDisposition_std.AdhocCallStatus.Pending; } __name(isCallHistoryForUnusedCallLink, "isCallHistoryForUnusedCallLink"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { CALL_LINK_DEFAULT_STATE, callLinkToConversation, fromAdminKeyBytes, getKeyAndEpochFromCallLink, getKeyFromCallLink, getPlaceholderCallLinkConversation, isCallHistoryForUnusedCallLink, toAdminKeyBytes, toCallHistoryFromUnusedCallLink }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var callLinksRingrtc_node_exports = {}; __export(callLinksRingrtc_node_exports, { callLinkFromRecord: () => callLinkFromRecord, callLinkRestrictionsToRingRTC: () => callLinkRestrictionsToRingRTC, callLinkStateFromRingRTC: () => callLinkStateFromRingRTC, callLinkToRecord: () => callLinkToRecord, defunctCallLinkFromRecord: () => defunctCallLinkFromRecord, defunctCallLinkToRecord: () => defunctCallLinkToRecord, fromEpochBytes: () => fromEpochBytes, fromRootKeyBytes: () => fromRootKeyBytes, getCallLinkRootKeyFromUrlKey: () => getCallLinkRootKeyFromUrlKey, getRoomIdFromCallLink: () => getRoomIdFromCallLink, getRoomIdFromRootKey: () => getRoomIdFromRootKey, getRoomIdFromRootKeyString: () => getRoomIdFromRootKeyString, toEpochBytes: () => toEpochBytes, toRootKeyBytes: () => toRootKeyBytes }); module.exports = __toCommonJS(callLinksRingrtc_node_exports); var import_ringrtc = require("@signalapp/ringrtc"); var import_zod = require("zod"); var import_CallLink_std = require("../types/CallLink.std.js"); var import_unicodeSlice_std = require("./unicodeSlice.std.js"); var import_callLinks_std = require("./callLinks.std.js"); var import_schemas_std = require("./schemas.std.js"); var Bytes = __toESM(require("../Bytes.std.js")); function callLinkStateFromRingRTC(state) { return { name: (0, import_unicodeSlice_std.unicodeSlice)(state.name, 0, import_CallLink_std.CallLinkNameMaxByteLength), restrictions: (0, import_CallLink_std.toCallLinkRestrictions)(state.restrictions), revoked: state.revoked, expiration: state.expiration.getTime() }; } __name(callLinkStateFromRingRTC, "callLinkStateFromRingRTC"); const RingRTCCallLinkRestrictionsSchema = import_zod.z.nativeEnum( import_ringrtc.CallLinkRestrictions ); function callLinkRestrictionsToRingRTC(restrictions) { return (0, import_schemas_std.parseStrict)(RingRTCCallLinkRestrictionsSchema, restrictions); } __name(callLinkRestrictionsToRingRTC, "callLinkRestrictionsToRingRTC"); function getRoomIdFromRootKey(rootKey) { return Bytes.toHex(rootKey.deriveRoomId()); } __name(getRoomIdFromRootKey, "getRoomIdFromRootKey"); function getRoomIdFromRootKeyString(rootKeyString) { const callLinkRootKey = import_ringrtc.CallLinkRootKey.parse(rootKeyString); return getRoomIdFromRootKey(callLinkRootKey); } __name(getRoomIdFromRootKeyString, "getRoomIdFromRootKeyString"); function getCallLinkRootKeyFromUrlKey(key) { return import_ringrtc.CallLinkRootKey.parse(key).bytes; } __name(getCallLinkRootKeyFromUrlKey, "getCallLinkRootKeyFromUrlKey"); function getRoomIdFromCallLink(url) { const keyString = (0, import_callLinks_std.getKeyFromCallLink)(url); const key = import_ringrtc.CallLinkRootKey.parse(keyString); return getRoomIdFromRootKey(key); } __name(getRoomIdFromCallLink, "getRoomIdFromCallLink"); function toRootKeyBytes(rootKey) { return import_ringrtc.CallLinkRootKey.parse(rootKey).bytes; } __name(toRootKeyBytes, "toRootKeyBytes"); function fromRootKeyBytes(rootKey) { return import_ringrtc.CallLinkRootKey.fromBytes(rootKey).toString(); } __name(fromRootKeyBytes, "fromRootKeyBytes"); function toEpochBytes(epoch) { return import_ringrtc.CallLinkEpoch.parse(epoch).bytes; } __name(toEpochBytes, "toEpochBytes"); function fromEpochBytes(epoch) { return import_ringrtc.CallLinkEpoch.fromBytes(epoch).toString(); } __name(fromEpochBytes, "fromEpochBytes"); function callLinkFromRecord(record) { if (record.rootKey == null) { throw new Error("CallLink.callLinkFromRecord: rootKey is null"); } const rootKey = fromRootKeyBytes(record.rootKey); const epoch = record.epoch ? fromEpochBytes(record.epoch) : null; const adminKey = record.adminKey ? (0, import_callLinks_std.fromAdminKeyBytes)(record.adminKey) : null; return { roomId: record.roomId, rootKey, epoch, adminKey, name: record.name, restrictions: (0, import_CallLink_std.toCallLinkRestrictions)(record.restrictions), revoked: record.revoked === 1, expiration: record.expiration, storageID: record.storageID || void 0, storageVersion: record.storageVersion || void 0, storageUnknownFields: record.storageUnknownFields || void 0, storageNeedsSync: record.storageNeedsSync === 1 }; } __name(callLinkFromRecord, "callLinkFromRecord"); function callLinkToRecord(callLink) { if (callLink.rootKey == null) { throw new Error("CallLink.callLinkToRecord: rootKey is null"); } const rootKey = toRootKeyBytes(callLink.rootKey); const epoch = callLink.epoch ? toEpochBytes(callLink.epoch) : null; const adminKey = callLink.adminKey ? (0, import_callLinks_std.toAdminKeyBytes)(callLink.adminKey) : null; return (0, import_schemas_std.parseStrict)(import_CallLink_std.callLinkRecordSchema, { roomId: callLink.roomId, rootKey, epoch, adminKey, name: callLink.name, restrictions: callLink.restrictions, revoked: callLink.revoked ? 1 : 0, expiration: callLink.expiration, storageID: callLink.storageID || null, storageVersion: callLink.storageVersion || null, storageUnknownFields: callLink.storageUnknownFields || null, storageNeedsSync: callLink.storageNeedsSync ? 1 : 0 }); } __name(callLinkToRecord, "callLinkToRecord"); function defunctCallLinkFromRecord(record) { if (record.rootKey == null) { throw new Error("CallLink.defunctCallLinkFromRecord: rootKey is null"); } const rootKey = fromRootKeyBytes(record.rootKey); const adminKey = record.adminKey ? (0, import_callLinks_std.fromAdminKeyBytes)(record.adminKey) : null; const epoch = record.epoch ? fromEpochBytes(record.epoch) : null; return { roomId: record.roomId, rootKey, adminKey, epoch, storageID: record.storageID || void 0, storageVersion: record.storageVersion || void 0, storageUnknownFields: record.storageUnknownFields || void 0, storageNeedsSync: record.storageNeedsSync === 1 }; } __name(defunctCallLinkFromRecord, "defunctCallLinkFromRecord"); function defunctCallLinkToRecord(defunctCallLink) { if (defunctCallLink.rootKey == null) { throw new Error("CallLink.defunctCallLinkToRecord: rootKey is null"); } const rootKey = toRootKeyBytes(defunctCallLink.rootKey); const epoch = defunctCallLink.epoch ? toEpochBytes(defunctCallLink.epoch) : null; const adminKey = defunctCallLink.adminKey ? (0, import_callLinks_std.toAdminKeyBytes)(defunctCallLink.adminKey) : null; return (0, import_schemas_std.parseStrict)(import_CallLink_std.defunctCallLinkRecordSchema, { roomId: defunctCallLink.roomId, rootKey, epoch, adminKey, storageID: defunctCallLink.storageID || null, storageVersion: defunctCallLink.storageVersion || null, storageUnknownFields: defunctCallLink.storageUnknownFields || null, storageNeedsSync: defunctCallLink.storageNeedsSync ? 1 : 0 }); } __name(defunctCallLinkToRecord, "defunctCallLinkToRecord"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { callLinkFromRecord, callLinkRestrictionsToRingRTC, callLinkStateFromRingRTC, callLinkToRecord, defunctCallLinkFromRecord, defunctCallLinkToRecord, fromEpochBytes, fromRootKeyBytes, getCallLinkRootKeyFromUrlKey, getRoomIdFromCallLink, getRoomIdFromRootKey, getRoomIdFromRootKeyString, toEpochBytes, toRootKeyBytes }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var callingGetParticipantName_std_exports = {}; __export(callingGetParticipantName_std_exports, { getParticipantName: () => getParticipantName }); module.exports = __toCommonJS(callingGetParticipantName_std_exports); function getParticipantName(participant) { return participant.nicknameGivenName || participant.systemNickname || participant.systemGivenName || participant.firstName || participant.title; } __name(getParticipantName, "getParticipantName"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getParticipantName }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var callingIsReconnecting_std_exports = {}; __export(callingIsReconnecting_std_exports, { isReconnecting: () => isReconnecting }); module.exports = __toCommonJS(callingIsReconnecting_std_exports); var import_Calling_std = require("../types/Calling.std.js"); var import_CallDisposition_std = require("../types/CallDisposition.std.js"); var import_isGroupOrAdhocCall_std = require("./isGroupOrAdhocCall.std.js"); function isReconnecting(activeCall) { return (0, import_isGroupOrAdhocCall_std.isGroupOrAdhocActiveCall)(activeCall) && activeCall.connectionState === import_Calling_std.GroupCallConnectionState.Reconnecting || activeCall.callMode === import_CallDisposition_std.CallMode.Direct && activeCall.callState === import_Calling_std.CallState.Reconnecting; } __name(isReconnecting, "isReconnecting"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { isReconnecting }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var callingMessageToProto_node_exports = {}; __export(callingMessageToProto_node_exports, { callingMessageToProto: () => callingMessageToProto }); module.exports = __toCommonJS(callingMessageToProto_node_exports); var import_ringrtc = require("@signalapp/ringrtc"); var import_long = __toESM(require("long")); var import_index_std = require("../protobuf/index.std.js"); var import_log_std = require("../logging/log.std.js"); var import_errors_std = require("../types/errors.std.js"); var import_missingCaseError_std = require("./missingCaseError.std.js"); const log = (0, import_log_std.createLogger)("callingMessageToProto"); function callingMessageToProto({ offer, answer, iceCandidates, busy, hangup, destinationDeviceId, opaque }, urgency) { let opaqueField; if (opaque) { opaqueField = { ...opaque, data: opaque.data }; } if (urgency !== void 0) { opaqueField = { ...opaqueField ?? {}, urgency: urgencyToProto(urgency) }; } return { offer: offer ? { ...offer, id: import_long.default.fromValue(offer.callId), type: offer.type, opaque: offer.opaque } : void 0, answer: answer ? { ...answer, id: import_long.default.fromValue(answer.callId), opaque: answer.opaque } : void 0, iceUpdate: iceCandidates ? iceCandidates.map((candidate) => { return { ...candidate, id: import_long.default.fromValue(candidate.callId), opaque: candidate.opaque }; }) : void 0, busy: busy ? { ...busy, id: import_long.default.fromValue(busy.callId) } : void 0, hangup: hangup ? { ...hangup, id: import_long.default.fromValue(hangup.callId), type: hangup.type } : void 0, destinationDeviceId, opaque: opaqueField }; } __name(callingMessageToProto, "callingMessageToProto"); function urgencyToProto(urgency) { switch (urgency) { case import_ringrtc.CallMessageUrgency.Droppable: return import_index_std.SignalService.CallMessage.Opaque.Urgency.DROPPABLE; case import_ringrtc.CallMessageUrgency.HandleImmediately: return import_index_std.SignalService.CallMessage.Opaque.Urgency.HANDLE_IMMEDIATELY; default: log.error((0, import_errors_std.toLogFormat)((0, import_missingCaseError_std.missingCaseError)(urgency))); return import_index_std.SignalService.CallMessage.Opaque.Urgency.DROPPABLE; } } __name(urgencyToProto, "urgencyToProto"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { callingMessageToProto }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var callingNotification_std_exports = {}; __export(callingNotification_std_exports, { getCallingIcon: () => getCallingIcon, getCallingNotificationText: () => getCallingNotificationText, getDirectCallNotificationText: () => getDirectCallNotificationText }); module.exports = __toCommonJS(callingNotification_std_exports); var import_CallDisposition_std = require("../types/CallDisposition.std.js"); var import_missingCaseError_std = require("./missingCaseError.std.js"); var import_assert_std = require("./assert.std.js"); var import_timestamp_std = require("./timestamp.std.js"); var import_index_std = require("./durations/index.std.js"); function getDirectCallNotificationText(callDirection, callType, callStatus, i18n) { if (callStatus === import_CallDisposition_std.DirectCallStatus.Pending || callStatus === import_CallDisposition_std.DirectCallStatus.Unknown) { if (callDirection === import_CallDisposition_std.CallDirection.Incoming) { return callType === import_CallDisposition_std.CallType.Video ? i18n("icu:incomingVideoCall") : i18n("icu:incomingAudioCall"); } return callType === import_CallDisposition_std.CallType.Video ? i18n("icu:outgoingVideoCall") : i18n("icu:outgoingAudioCall"); } if (callStatus === import_CallDisposition_std.DirectCallStatus.Accepted) { if (callDirection === import_CallDisposition_std.CallDirection.Incoming) { return callType === import_CallDisposition_std.CallType.Video ? i18n("icu:acceptedIncomingVideoCall") : i18n("icu:acceptedIncomingAudioCall"); } return callType === import_CallDisposition_std.CallType.Video ? i18n("icu:acceptedOutgoingVideoCall") : i18n("icu:acceptedOutgoingAudioCall"); } if (callStatus === import_CallDisposition_std.DirectCallStatus.Declined) { if (callDirection === import_CallDisposition_std.CallDirection.Incoming) { return callType === import_CallDisposition_std.CallType.Video ? i18n("icu:declinedIncomingVideoCall") : i18n("icu:declinedIncomingAudioCall"); } return callType === import_CallDisposition_std.CallType.Video ? i18n("icu:missedOrDeclinedOutgoingVideoCall") : i18n("icu:missedOrDeclinedOutgoingAudioCall"); } if (callStatus === import_CallDisposition_std.DirectCallStatus.Missed || callStatus === import_CallDisposition_std.DirectCallStatus.MissedNotificationProfile) { if (callDirection === import_CallDisposition_std.CallDirection.Incoming) { return callType === import_CallDisposition_std.CallType.Video ? i18n("icu:missedIncomingVideoCall") : i18n("icu:missedIncomingAudioCall"); } return callType === import_CallDisposition_std.CallType.Video ? i18n("icu:missedOrDeclinedOutgoingVideoCall") : i18n("icu:missedOrDeclinedOutgoingAudioCall"); } if (callStatus === import_CallDisposition_std.DirectCallStatus.Deleted) { throw new Error( "getDirectCallNotificationText: Cannot render deleted call" ); } throw (0, import_missingCaseError_std.missingCaseError)(callStatus); } __name(getDirectCallNotificationText, "getDirectCallNotificationText"); function getGroupCallNotificationText({ groupCallEnded, creator, callHistory, i18n }) { if (groupCallEnded) { const { direction, status, timestamp } = callHistory; if (direction === import_CallDisposition_std.CallDirection.Incoming) { if (status === import_CallDisposition_std.GroupCallStatus.Declined) { return i18n("icu:CallHistory__DescriptionVideoCall--Declined"); } if (status === import_CallDisposition_std.GroupCallStatus.Missed) { return i18n("icu:CallHistory__DescriptionVideoCall--Missed"); } if ((0, import_timestamp_std.isMoreRecentThan)(timestamp, 5 * import_index_std.MINUTE)) { return i18n("icu:calling__call-notification__ended"); } return i18n("icu:acceptedIncomingVideoCall"); } if ((0, import_timestamp_std.isMoreRecentThan)(timestamp, 5 * import_index_std.MINUTE)) { return i18n("icu:calling__call-notification__ended"); } return i18n("icu:acceptedOutgoingVideoCall"); } if (creator == null) { return i18n("icu:calling__call-notification__started-by-someone"); } if (creator.isMe) { return i18n("icu:calling__call-notification__started-by-you"); } return i18n("icu:calling__call-notification__started", { name: creator.systemGivenName ?? creator.title }); } __name(getGroupCallNotificationText, "getGroupCallNotificationText"); function getCallingNotificationText(callingNotification, i18n) { const { callHistory, callCreator: creator, groupCallEnded } = callingNotification; if (callHistory == null) { return null; } if (callHistory.mode === import_CallDisposition_std.CallMode.Direct) { return getDirectCallNotificationText( callHistory.direction, callHistory.type, callHistory.status, i18n ); } if (callHistory.mode === import_CallDisposition_std.CallMode.Group) { (0, import_assert_std.strictAssert)( groupCallEnded != null, "getCallingNotificationText: groupCallEnded shouldnt be null for a group call" ); return getGroupCallNotificationText({ groupCallEnded, creator, callHistory, i18n }); } if (callHistory.mode === import_CallDisposition_std.CallMode.Adhoc) { return null; } throw (0, import_missingCaseError_std.missingCaseError)(callHistory.mode); } __name(getCallingNotificationText, "getCallingNotificationText"); function getCallingIcon(callType, callDirection, callStatus) { if (callType === import_CallDisposition_std.CallType.Audio) { if (callStatus === import_CallDisposition_std.DirectCallStatus.Accepted) { return callDirection === import_CallDisposition_std.CallDirection.Incoming ? "audio-incoming" : "audio-outgoing"; } if (callStatus === import_CallDisposition_std.DirectCallStatus.Missed || callStatus === import_CallDisposition_std.DirectCallStatus.Declined) { return "audio-missed"; } return "phone"; } if (callType === import_CallDisposition_std.CallType.Video) { if (callStatus === import_CallDisposition_std.DirectCallStatus.Accepted) { return callDirection === import_CallDisposition_std.CallDirection.Incoming ? "video-incoming" : "video-outgoing"; } if (callStatus === import_CallDisposition_std.DirectCallStatus.Missed || callStatus === import_CallDisposition_std.DirectCallStatus.Declined) { return "video-missed"; } return "video"; } if (callType === import_CallDisposition_std.CallType.Group || callType === import_CallDisposition_std.CallType.Adhoc) { return "video"; } if (callType === import_CallDisposition_std.CallType.Unknown) { return "video"; } throw (0, import_missingCaseError_std.missingCaseError)(callType); } __name(getCallingIcon, "getCallingIcon"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getCallingIcon, getCallingNotificationText, getDirectCallNotificationText }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var canvasToBlob_std_exports = {}; __export(canvasToBlob_std_exports, { canvasToBlob: () => canvasToBlob }); module.exports = __toCommonJS(canvasToBlob_std_exports); var import_MIME_std = require("../types/MIME.std.js"); async function canvasToBlob(canvas, mimeType = import_MIME_std.IMAGE_JPEG, quality) { return new Promise( (resolve, reject) => canvas.toBlob( (result) => { if (result) { resolve(result); } else { reject(new Error("Couldn't convert the canvas to a Blob")); } }, mimeType, quality ) ); } __name(canvasToBlob, "canvasToBlob"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { canvasToBlob }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var canvasToBytes_std_exports = {}; __export(canvasToBytes_std_exports, { canvasToBytes: () => canvasToBytes }); module.exports = __toCommonJS(canvasToBytes_std_exports); var import_canvasToBlob_std = require("./canvasToBlob.std.js"); async function canvasToBytes(canvas, mimeType, quality) { const blob = await (0, import_canvasToBlob_std.canvasToBlob)(canvas, mimeType, quality); return new Uint8Array(await blob.arrayBuffer()); } __name(canvasToBytes, "canvasToBytes"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { canvasToBytes }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var characters_std_exports = {}; __export(characters_std_exports, { count: () => count }); module.exports = __toCommonJS(characters_std_exports); function count(str) { return Array.from(str).length; } __name(count, "count"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { count }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var clearTimeoutIfNecessary_std_exports = {}; __export(clearTimeoutIfNecessary_std_exports, { clearTimeoutIfNecessary: () => clearTimeoutIfNecessary }); module.exports = __toCommonJS(clearTimeoutIfNecessary_std_exports); function clearTimeoutIfNecessary(timeout) { if (timeout) { clearTimeout(timeout); } } __name(clearTimeoutIfNecessary, "clearTimeoutIfNecessary"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { clearTimeoutIfNecessary }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var combineNames_std_exports = {}; __export(combineNames_std_exports, { combineNames: () => combineNames }); module.exports = __toCommonJS(combineNames_std_exports); const CJK_Compatibility = /[\u3300-\u33FF]/; const CJK_Compatibility_Forms = /[\uFE30-\uFE4F]/; const CJK_Compatibility_Ideographs = /[\uF900-\uFAFF]/; const CJK_Compatibility_Ideographs_Supplement = /\uD87E[\uDC00-\uDE1F]/; const CJK_Radicals_Supplement = /[\u2E80-\u2EFF]/; const CJK_Strokes = /[\u31C0-\u31EF]/; const CJK_Symbols_And_Punctuation = /[\u3000-\u303F]/; const CJK_Unified_Ideographs = /[\u4E00-\u9FFF]/; const CJK_Unified_Ideographs_Extension_A = /[\u3400-\u4DBF]/; const CJK_Unified_Ideographs_Extension_B = /[\uD840-\uD868][\uDC00-\uDFFF]|\uD869[\uDC00-\uDEDF]/; const CJK_Unified_Ideographs_Extension_C = /\uD869[\uDF00-\uDFFF]|[\uD86A-\uD86C][\uDC00-\uDFFF]|\uD86D[\uDC00-\uDF3F]/; const CJK_Unified_Ideographs_Extension_D = /\uD86D[\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1F]/; const CJK_Unified_Ideographs_Extension_E = /\uD86E[\uDC20-\uDFFF]|[\uD86F-\uD872][\uDC00-\uDFFF]|\uD873[\uDC00-\uDEAF]/; const Enclosed_CJK_Letters_And_Months = /[\u3200-\u32FF]/; const Kangxi_Radicals = /[\u2F00-\u2FDF]/; const Ideographic_Description_Characters = /[\u2FF0-\u2FFF]/; const Hiragana = /[\u3040-\u309F]/; const Katakana = /[\u30A0-\u30FF]/; const Katakana_Phonetic_Extensions = /[\u31F0-\u31FF]/; const Hangul_Compatibility_Jamo = /[\u3130-\u318F]/; const Hangul_Jamo = /[\u1100-\u11FF]/; const Hangul_Jamo_Extended_A = /[\uA960-\uA97F]/; const Hangul_Jamo_Extended_B = /[\uD7B0-\uD7FF]/; const Hangul_Syllables = /[\uAC00-\uD7AF]/; const isIdeographic = /[\u3006\u3007\u3021-\u3029\u3038-\u303A\u3400-\u4DB5\u4E00-\u9FEF\uF900-\uFA6D\uFA70-\uFAD9]|[\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD821[\uDC00-\uDFF7]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDD70-\uDEFB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]/; function combineNames(given, family) { if (!given && !family) { return void 0; } if (!given) { return family; } if (!family) { return given; } if (isAllCKJV(family) && isAllCKJV(given)) { return `${family}${given}`; } return `${given} ${family}`; } __name(combineNames, "combineNames"); function isAllCKJV(name) { for (const codePoint of name) { if (!isCKJV(codePoint)) { return false; } } return true; } __name(isAllCKJV, "isAllCKJV"); function isCKJV(codePoint) { if (codePoint === " ") { return true; } return CJK_Compatibility.test(codePoint) || CJK_Compatibility_Forms.test(codePoint) || CJK_Compatibility_Ideographs.test(codePoint) || CJK_Compatibility_Ideographs_Supplement.test(codePoint) || CJK_Radicals_Supplement.test(codePoint) || CJK_Strokes.test(codePoint) || CJK_Symbols_And_Punctuation.test(codePoint) || CJK_Unified_Ideographs.test(codePoint) || CJK_Unified_Ideographs_Extension_A.test(codePoint) || CJK_Unified_Ideographs_Extension_B.test(codePoint) || CJK_Unified_Ideographs_Extension_C.test(codePoint) || CJK_Unified_Ideographs_Extension_D.test(codePoint) || CJK_Unified_Ideographs_Extension_E.test(codePoint) || Enclosed_CJK_Letters_And_Months.test(codePoint) || Kangxi_Radicals.test(codePoint) || Ideographic_Description_Characters.test(codePoint) || Hiragana.test(codePoint) || Katakana.test(codePoint) || Katakana_Phonetic_Extensions.test(codePoint) || Hangul_Compatibility_Jamo.test(codePoint) || Hangul_Jamo.test(codePoint) || Hangul_Jamo_Extended_A.test(codePoint) || Hangul_Jamo_Extended_B.test(codePoint) || Hangul_Syllables.test(codePoint) || isIdeographic.test(codePoint); } __name(isCKJV, "isCKJV"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { combineNames }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var computeBlurHashUrl_std_exports = {}; __export(computeBlurHashUrl_std_exports, { computeBlurHashUrl: () => computeBlurHashUrl }); module.exports = __toCommonJS(computeBlurHashUrl_std_exports); var import_blurhash = require("blurhash"); var Bytes = __toESM(require("../Bytes.std.js")); const BITMAP_HEADER = new Uint8Array([ // Header // See https://en.wikipedia.org/wiki/BMP_file_format#Bitmap_file_header // 0x00: BM 66, 77, // 0x02: Size = 3072 + 14 + 40 54, 12, 0, 0, // 0x06: Reserved 0, 0, 0, 0, // 0x0a: Pixels Offset = 14 + 40 54, 0, 0, 0, // BIP Header // See https://en.wikipedia.org/wiki/BMP_file_format#cite_ref-bmp_2-2 // 0x0e: Size=40 40, 0, 0, 0, // 0x12: Width=32 32, 0, 0, 0, // 0x16: Height=-32 (top-down) 224, 255, 255, 255, // 0x1a: Num Color Planes 1, 0, // 0x1c: Bits per Pixel = 24 24, 0, // 0x1e: Compression Method 0, 0, 0, 0, // 0x22: Image size = 3072 0, 12, 0, 0, // 0x26: Horizontal Resolution 1, 0, 0, 0, // 0x2a: Vertical Resolution 1, 0, 0, 0, // 0x2e: Number of Colors in Palette 0, 0, 0, 0, // 0x32: Number of Important Colors 0, 0, 0, 0 ]); const PIXEL_COUNT = 32 * 32; function writeUInt32LE(bytes, value, position) { bytes[position + 0] = value >>> 0 & 255; bytes[position + 1] = value >>> 8 & 255; bytes[position + 2] = value >>> 16 & 255; bytes[position + 3] = value >>> 24 & 255; } __name(writeUInt32LE, "writeUInt32LE"); function computeBlurHashUrl(blurHash, desiredWidth = 1, desiredHeight = 1) { const invAspect = Math.abs(desiredHeight) / (Math.abs(desiredWidth) + 1e-23); let width = Math.sqrt(PIXEL_COUNT / (invAspect + 1e-23)); width = Math.round(width); width >>= 2; width <<= 2; width = Math.max(2, width); let height = width * invAspect; height = Math.round(height); height = Math.max(2, height); const rgba = (0, import_blurhash.decode)(blurHash, width, height); const bgrSize = rgba.byteLength / 4 * 3; const bitmap = new Uint8Array(BITMAP_HEADER.byteLength + bgrSize); bitmap.set(BITMAP_HEADER); writeUInt32LE(bitmap, bitmap.byteLength, 2); writeUInt32LE(bitmap, width, 18); writeUInt32LE(bitmap, -height, 22); writeUInt32LE(bitmap, bgrSize, 34); for (let i = 0, j = BITMAP_HEADER.byteLength; i < rgba.byteLength; i += 4, j += 3) { bitmap[j + 2] = rgba[i]; bitmap[j + 1] = rgba[i + 1]; bitmap[j] = rgba[i + 2]; } return `data:image/bmp;base64,${Bytes.toBase64(bitmap)}`; } __name(computeBlurHashUrl, "computeBlurHashUrl"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { computeBlurHashUrl }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var consoleLogger_std_exports = {}; __export(consoleLogger_std_exports, { consoleLogger: () => consoleLogger }); module.exports = __toCommonJS(consoleLogger_std_exports); const consoleLogger = { fatal(...args) { console.error(...args); }, error(...args) { console.error(...args); }, warn(...args) { console.warn(...args); }, info(...args) { console.info(...args); }, debug(...args) { console.debug(...args); }, trace(...args) { console.log(...args); }, child() { return consoleLogger; } }; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { consoleLogger }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var contactSpoofing_std_exports = {}; __export(contactSpoofing_std_exports, { ContactSpoofingType: () => ContactSpoofingType }); module.exports = __toCommonJS(contactSpoofing_std_exports); var ContactSpoofingType = /* @__PURE__ */ ((ContactSpoofingType2) => { ContactSpoofingType2[ContactSpoofingType2["DirectConversationWithSameTitle"] = 0] = "DirectConversationWithSameTitle"; ContactSpoofingType2[ContactSpoofingType2["MultipleGroupMembersWithSameTitle"] = 1] = "MultipleGroupMembersWithSameTitle"; return ContactSpoofingType2; })(ContactSpoofingType || {}); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { ContactSpoofingType }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var copyDataMessageIntoMessage_std_exports = {}; __export(copyDataMessageIntoMessage_std_exports, { copyDataMessageIntoMessage: () => copyDataMessageIntoMessage }); module.exports = __toCommonJS(copyDataMessageIntoMessage_std_exports); function copyDataMessageIntoMessage(dataMessage, message) { return { ...message, ...dataMessage // TODO: DESKTOP-5278 // There are type conflicts between MessageAttributesType and the protos // that are passed in here. // eslint-disable-next-line @typescript-eslint/no-explicit-any }; } __name(copyDataMessageIntoMessage, "copyDataMessageIntoMessage"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { copyDataMessageIntoMessage }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var countMutedStats_std_exports = {}; __export(countMutedStats_std_exports, { countAllChatFoldersMutedStats: () => countAllChatFoldersMutedStats }); module.exports = __toCommonJS(countMutedStats_std_exports); var import_ChatFolder_std = require("../types/ChatFolder.std.js"); var import_CurrentChatFolders_std = require("../types/CurrentChatFolders.std.js"); var import_isConversationMuted_std = require("./isConversationMuted.std.js"); function createMutedStats() { return { chatsMutedCount: 0, chatsUnmutedCount: 0 }; } __name(createMutedStats, "createMutedStats"); function countAllChatFoldersMutedStats(currentChatFolders, conversations) { const results = /* @__PURE__ */ new Map(); const sortedChatFolders = import_CurrentChatFolders_std.CurrentChatFolders.toSortedArray(currentChatFolders); for (const conversation of conversations) { const isMuted = (0, import_isConversationMuted_std.isConversationMuted)(conversation); for (const chatFolder of sortedChatFolders) { if ((0, import_ChatFolder_std.isConversationInChatFolder)(chatFolder, conversation)) { let mutedStats = results.get(chatFolder.id); if (mutedStats == null) { mutedStats = createMutedStats(); results.set(chatFolder.id, mutedStats); } if (isMuted) { mutedStats.chatsMutedCount += 1; } else { mutedStats.chatsUnmutedCount += 1; } } } } return results; } __name(countAllChatFoldersMutedStats, "countAllChatFoldersMutedStats"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { countAllChatFoldersMutedStats }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var countUnreadStats_std_exports = {}; __export(countUnreadStats_std_exports, { _canCountConversation: () => _canCountConversation, _countConversation: () => _countConversation, _createUnreadStats: () => _createUnreadStats, _shouldExcludeMuted: () => _shouldExcludeMuted, countAllChatFoldersUnreadStats: () => countAllChatFoldersUnreadStats, countAllConversationsUnreadStats: () => countAllConversationsUnreadStats, countConversationUnreadStats: () => countConversationUnreadStats, isConversationUnread: () => isConversationUnread }); module.exports = __toCommonJS(countUnreadStats_std_exports); var import_ChatFolder_std = require("../types/ChatFolder.std.js"); var import_CurrentChatFolders_std = require("../types/CurrentChatFolders.std.js"); var import_isConversationMuted_std = require("./isConversationMuted.std.js"); function _createUnreadStats() { return { unreadCount: 0, unreadMentionsCount: 0, readChatsMarkedUnreadCount: 0 }; } __name(_createUnreadStats, "_createUnreadStats"); function _shouldExcludeMuted(includeMuted) { return includeMuted === "setting-off" || includeMuted === "force-exclude"; } __name(_shouldExcludeMuted, "_shouldExcludeMuted"); function _canCountConversation(conversation, options) { if (conversation.activeAt == null || conversation.activeAt === 0) { return false; } if (conversation.isArchived) { return false; } if (_shouldExcludeMuted(options.includeMuted) && ((0, import_isConversationMuted_std.isConversationMuted)(conversation) || options.activeProfile && !options.activeProfile.allowedMembers.has(conversation.id))) { return false; } if (conversation.left) { return false; } return true; } __name(_canCountConversation, "_canCountConversation"); function _countConversation(unreadStats, conversation) { const mutable = unreadStats; const { unreadCount = 0, unreadMentionsCount = 0, markedUnread = false } = conversation; const hasUnreadCount = unreadCount > 0 || unreadMentionsCount > 0; if (hasUnreadCount) { mutable.unreadCount += unreadCount; mutable.unreadMentionsCount += unreadMentionsCount; } else if (markedUnread) { mutable.readChatsMarkedUnreadCount += 1; } } __name(_countConversation, "_countConversation"); function isConversationUnread(conversation, options) { if (!_canCountConversation(conversation, options)) { return false; } const { unreadCount, unreadMentionsCount, markedUnread } = conversation; if (unreadCount != null && unreadCount !== 0) { return true; } if (unreadMentionsCount != null && unreadMentionsCount !== 0) { return true; } if (markedUnread) { return true; } return false; } __name(isConversationUnread, "isConversationUnread"); function countConversationUnreadStats(conversation, options) { const unreadStats = _createUnreadStats(); if (_canCountConversation(conversation, options)) { _countConversation(unreadStats, conversation); } return unreadStats; } __name(countConversationUnreadStats, "countConversationUnreadStats"); function countAllConversationsUnreadStats(conversations, options) { const unreadStats = _createUnreadStats(); for (const conversation of conversations) { if (conversation && _canCountConversation(conversation, options)) { _countConversation(unreadStats, conversation); } } return unreadStats; } __name(countAllConversationsUnreadStats, "countAllConversationsUnreadStats"); function countAllChatFoldersUnreadStats(currentChatFolders, conversations, options) { const results = /* @__PURE__ */ new Map(); const sortedChatFolders = import_CurrentChatFolders_std.CurrentChatFolders.toSortedArray(currentChatFolders); for (const conversation of conversations) { if (!_canCountConversation(conversation, options)) { continue; } const { unreadCount = 0, unreadMentionsCount = 0, markedUnread = false } = conversation; if (unreadCount === 0 && unreadMentionsCount === 0 && !markedUnread) { continue; } for (const chatFolder of sortedChatFolders) { if ((0, import_ChatFolder_std.isConversationInChatFolder)(chatFolder, conversation)) { let unreadStats = results.get(chatFolder.id); if (unreadStats == null) { unreadStats = _createUnreadStats(); results.set(chatFolder.id, unreadStats); } _countConversation(unreadStats, conversation); } } } return results; } __name(countAllChatFoldersUnreadStats, "countAllChatFoldersUnreadStats"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { _canCountConversation, _countConversation, _createUnreadStats, _shouldExcludeMuted, countAllChatFoldersUnreadStats, countAllConversationsUnreadStats, countConversationUnreadStats, isConversationUnread }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var createAvatarData_std_exports = {}; __export(createAvatarData_std_exports, { createAvatarData: () => createAvatarData }); module.exports = __toCommonJS(createAvatarData_std_exports); var import_uuid = require("uuid"); function createAvatarData(partialAvatarData) { return { id: (0, import_uuid.v4)(), ...partialAvatarData }; } __name(createAvatarData, "createAvatarData"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { createAvatarData }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var createHTTPSAgent_node_exports = {}; __export(createHTTPSAgent_node_exports, { Agent: () => Agent, createHTTPSAgent: () => createHTTPSAgent, happyEyeballs: () => happyEyeballs }); module.exports = __toCommonJS(createHTTPSAgent_node_exports); var import_node_https = require("node:https"); var import_node_tls = __toESM(require("node:tls")); var import_node_util = require("node:util"); var import_p_timeout = __toESM(require("p-timeout")); var import_log_std = require("../logging/log.std.js"); var import_dns_node = require("./dns.node.js"); var import_assert_std = require("./assert.std.js"); var import_parseIntOrThrow_std = require("./parseIntOrThrow.std.js"); var import_sleep_std = require("./sleep.std.js"); var import_index_std = require("./durations/index.std.js"); var import_dropNull_std = require("./dropNull.std.js"); var import_explodePromise_std = require("./explodePromise.std.js"); const log = (0, import_log_std.createLogger)("createHTTPSAgent"); const DELAY_MS = 500; const CONNECT_THRESHOLD_MS = import_index_std.SECOND; const CONNECT_TIMEOUT_MS = 10 * import_index_std.SECOND; const electronLookup = (0, import_node_util.promisify)(import_dns_node.electronLookup); const HOST_LOG_ALLOWLIST = /* @__PURE__ */ new Set([ // Production "chat.signal.org", "storage.signal.org", "cdsi.signal.org", "cdn.signal.org", "cdn2.signal.org", "cdn3.signal.org", // Staging "chat.staging.signal.org", "storage-staging.signal.org", "cdsi.staging.signal.org", "cdn-staging.signal.org", "cdn2-staging.signal.org", "create.staging.signal.art", // Common "updates2.signal.org", "sfu.voip.signal.org" ]); class Agent extends import_node_https.Agent { static { __name(this, "Agent"); } constructor(options = {}) { super({ ...options, lookup: electronLookup }); } createConnection = (0, import_node_util.callbackify)( async (options) => { const { host = options.hostname, port: portString } = options; (0, import_assert_std.strictAssert)(host, "Agent.createConnection: Missing options.host"); (0, import_assert_std.strictAssert)(portString, "Agent.createConnection: Missing options.port"); const port = (0, import_parseIntOrThrow_std.parseIntOrThrow)( portString, "Agent.createConnection: options.port is not an integer" ); const addresses = await electronLookup(host, { all: true }); const start = Date.now(); const { socket, address, v4Attempts, v6Attempts } = await happyEyeballs({ addresses, port, tlsOptions: { ca: options.ca, servername: options.servername ?? (0, import_dropNull_std.dropNull)(options.host) } }); if (HOST_LOG_ALLOWLIST.has(host)) { const duration = Date.now() - start; const logLine = `createHTTPSAgent.createConnection(${host}): connected to IPv${address.family} addr after ${duration}ms (attempts v4=${v4Attempts} v6=${v6Attempts})`; if (v4Attempts + v6Attempts > 1 || duration > CONNECT_THRESHOLD_MS) { log.warn(logLine); } else { log.info(logLine); } } return socket; } ); } async function happyEyeballs({ addresses, port = 443, tlsOptions, connect = defaultConnect }) { let v4Attempts = 0; let v6Attempts = 0; const interleaved = (0, import_dns_node.interleaveAddresses)(addresses); const abortControllers = interleaved.map(() => new AbortController()); const results = await Promise.allSettled( interleaved.map(async (addr, index) => { const abortController = abortControllers[index]; if (index !== 0) { await (0, import_sleep_std.sleep)(index * DELAY_MS, abortController.signal); } if (addr.family === 4) { v4Attempts += 1; } else { v6Attempts += 1; } let socket; try { socket = await (0, import_p_timeout.default)( connect({ address: addr.address, port, tlsOptions, abortSignal: abortController.signal }), CONNECT_TIMEOUT_MS, "createHTTPSAgent.connect: connection timed out" ); } catch (error) { abortController.abort(); throw error; } if (abortController.signal.aborted) { throw new Error("Aborted"); } for (const otherController of abortControllers) { if (otherController !== abortController) { otherController.abort(); } } return { socket, abortController, index }; }) ); const fulfilled = results.find(({ status }) => status === "fulfilled"); if (fulfilled) { (0, import_assert_std.strictAssert)( fulfilled.status === "fulfilled", "Fulfilled promise was not fulfilled" ); const { socket, index } = fulfilled.value; return { socket, address: interleaved[index], v4Attempts, v6Attempts }; } (0, import_assert_std.strictAssert)( results[0].status === "rejected", "No fulfilled promises, but no rejected either" ); for (const controller of abortControllers) { controller.abort(); } throw results[0].reason; } __name(happyEyeballs, "happyEyeballs"); async function defaultConnect({ port, address, tlsOptions, abortSignal }) { const socket = import_node_tls.default.connect(port, address, { ...tlsOptions }); abortSignal?.addEventListener( "abort", () => socket.destroy(new Error("Aborted")) ); const { promise: onHandshake, resolve, reject } = (0, import_explodePromise_std.explodePromise)(); socket.once("secureConnect", resolve); socket.once("error", reject); try { await onHandshake; } finally { socket.removeListener("secureConnect", resolve); socket.removeListener("error", reject); } return socket; } __name(defaultConnect, "defaultConnect"); function createHTTPSAgent(options = {}) { return new Agent(options); } __name(createHTTPSAgent, "createHTTPSAgent"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { Agent, createHTTPSAgent, happyEyeballs }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var createProxyAgent_node_exports = {}; __export(createProxyAgent_node_exports, { createProxyAgent: () => createProxyAgent }); module.exports = __toCommonJS(createProxyAgent_node_exports); var import_node_net = __toESM(require("node:net")); var import_node_url = require("node:url"); var import_promises = require("node:dns/promises"); var import_log_std = require("../logging/log.std.js"); var import_createHTTPSAgent_node = require("./createHTTPSAgent.node.js"); var import_explodePromise_std = require("./explodePromise.std.js"); var import_index_std = require("./durations/index.std.js"); var import_drop_std = require("./drop.std.js"); const log = (0, import_log_std.createLogger)("createProxyAgent"); const CONNECT_THRESHOLD_MS = import_index_std.SECOND; const SOCKS_PROTOCOLS = /* @__PURE__ */ new Set([ "socks:", "socks4:", "socks4a:", "socks5:", "socks5h:" ]); async function createProxyAgent(proxyUrl) { const { port: portStr, hostname: proxyHost, protocol } = new import_node_url.URL(proxyUrl); let defaultPort; if (protocol === "http:") { defaultPort = 80; } else if (protocol === "https:") { defaultPort = 443; } else if (SOCKS_PROTOCOLS.has(protocol)) { defaultPort = 1080; } const port = portStr ? parseInt(portStr, 10) : defaultPort; async function happyLookup(host) { const addresses = await (0, import_promises.lookup)(host, { all: true }); if (host !== proxyHost) { const idx = Math.floor(Math.random() * addresses.length); return addresses[idx]; } const start = Date.now(); const { socket, address, v4Attempts, v6Attempts } = await (0, import_createHTTPSAgent_node.happyEyeballs)({ addresses, port, connect }); const duration = Date.now() - start; const logLine = `createProxyAgent.lookup(${host}): connected to IPv${address.family} addr after ${duration}ms (attempts v4=${v4Attempts} v6=${v6Attempts})`; if (v4Attempts + v6Attempts > 1 || duration > CONNECT_THRESHOLD_MS) { log.warn(logLine); } else { log.info(logLine); } socket.destroy(); return address; } __name(happyLookup, "happyLookup"); async function happyLookupWithCallback(host, opts, callback) { try { const addr = await happyLookup(host); if (opts.all) { callback(null, [addr]); } else { const { address, family } = addr; callback(null, address, family); } } catch (error) { callback(error, "", -1); } } __name(happyLookupWithCallback, "happyLookupWithCallback"); const { ProxyAgent } = await import("proxy-agent"); return new ProxyAgent({ lookup: port !== void 0 ? (host, opts, callback) => (0, import_drop_std.drop)( happyLookupWithCallback( host, opts, callback ) ) : void 0, getProxyForUrl() { return proxyUrl; } }); } __name(createProxyAgent, "createProxyAgent"); async function connect({ port, address, abortSignal }) { const socket = import_node_net.default.connect({ port, host: address, signal: abortSignal }); const { promise: onConnect, resolve, reject } = (0, import_explodePromise_std.explodePromise)(); socket.once("connect", resolve); socket.once("error", reject); try { await onConnect; } finally { socket.removeListener("connect", resolve); socket.removeListener("error", reject); } return socket; } __name(connect, "connect"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { createProxyAgent }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var createSupportUrl_std_exports = {}; __export(createSupportUrl_std_exports, { createSupportUrl: () => createSupportUrl }); module.exports = __toCommonJS(createSupportUrl_std_exports); const SUPPORT_LANGUAGES = [ "ar", "bn", "de", "en-us", "es", "fr", "hi", "hi-in", "hc", "id", "it", "ja", "ko", "mr", "ms", "nl", "pl", "pt", "ru", "sv", "ta", "te", "tr", "uk", "ur", "vi", "zh-cn", "zh-tw" ]; function createSupportUrl({ locale, query = {} }) { const language = SUPPORT_LANGUAGES.includes(locale) ? locale : "en-us"; const url = new URL(`https://support.signal.org/hc/${language}/requests/new`); url.searchParams.set("desktop", ""); for (const key of Object.keys(query)) { if (key === "desktop") { continue; } url.searchParams.set(key, query[key]); } return url.toString().replace("desktop=", "desktop"); } __name(createSupportUrl, "createSupportUrl"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { createSupportUrl }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var decipherWithAesKey_node_exports = {}; __export(decipherWithAesKey_node_exports, { decipherWithAesKey: () => decipherWithAesKey }); module.exports = __toCommonJS(decipherWithAesKey_node_exports); var import_node_crypto = require("node:crypto"); var import_node_buffer = require("node:buffer"); var import_node_stream = require("node:stream"); var import_Crypto_std = require("../types/Crypto.std.js"); var import_assert_std = require("./assert.std.js"); function decipherWithAesKey(aesKey) { let maybeIvBytes = import_node_buffer.Buffer.alloc(0); let decipher = null; return new import_node_stream.Transform({ transform(chunk, _encoding, callback) { try { if (decipher != null) { callback(null, decipher.update(chunk)); return; } maybeIvBytes = import_node_buffer.Buffer.concat([maybeIvBytes, chunk]); if (maybeIvBytes.byteLength < import_Crypto_std.IV_LENGTH) { callback(null, null); return; } const iv = maybeIvBytes.subarray(0, import_Crypto_std.IV_LENGTH); const remainder = maybeIvBytes.subarray(import_Crypto_std.IV_LENGTH); maybeIvBytes = null; decipher = (0, import_node_crypto.createDecipheriv)(import_Crypto_std.CipherType.AES256CBC, aesKey, iv); callback(null, decipher.update(remainder)); } catch (error) { callback(error); } }, flush(callback) { try { (0, import_assert_std.strictAssert)(decipher != null, "decipher must be set"); callback(null, decipher.final()); } catch (error) { callback(error); } } }); } __name(decipherWithAesKey, "decipherWithAesKey"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { decipherWithAesKey }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var deconstructLookup_std_exports = {}; __export(deconstructLookup_std_exports, { deconstructLookup: () => deconstructLookup }); module.exports = __toCommonJS(deconstructLookup_std_exports); var import_getOwn_std = require("./getOwn.std.js"); var import_assert_std = require("./assert.std.js"); const deconstructLookup = /* @__PURE__ */ __name((lookup, keys) => { const result = []; keys.forEach((key) => { const value = (0, import_getOwn_std.getOwn)(lookup, key); if (value) { result.push(value); } else { (0, import_assert_std.assertDev)(false, `deconstructLookup: lookup failed for ${key}; dropping`); } }); return result; }, "deconstructLookup"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { deconstructLookup }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var deepClone_std_exports = {}; __export(deepClone_std_exports, { deepClone: () => deepClone }); module.exports = __toCommonJS(deepClone_std_exports); function deepClone(value) { return structuredClone(value); } __name(deepClone, "deepClone"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { deepClone }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var deleteForMe_types_std_exports = {}; __export(deleteForMe_types_std_exports, { MAX_MESSAGE_COUNT: () => MAX_MESSAGE_COUNT }); module.exports = __toCommonJS(deleteForMe_types_std_exports); const MAX_MESSAGE_COUNT = 500; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { MAX_MESSAGE_COUNT }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var deprecated_std_exports = {}; __export(deprecated_std_exports, { deprecated: () => deprecated }); module.exports = __toCommonJS(deprecated_std_exports); var import_environment_std = require("../environment.std.js"); var import_log_std = require("../logging/log.std.js"); const log = (0, import_log_std.createLogger)("deprecated"); function deprecated(message) { if ((0, import_environment_std.getEnvironment)() !== import_environment_std.Environment.PackagedApp) { log.error(`This method is deprecated: ${message}`); } } __name(deprecated, "deprecated"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { deprecated }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var diffArraysAsSets_std_exports = {}; __export(diffArraysAsSets_std_exports, { diffArraysAsSets: () => diffArraysAsSets }); module.exports = __toCommonJS(diffArraysAsSets_std_exports); function diffArraysAsSets(starting, current) { const startingSet = new Set(starting); const currentSet = new Set(current); const removed = []; for (const item of startingSet) { if (!currentSet.has(item)) { removed.push(item); } } const added = []; for (const item of currentSet) { if (!startingSet.has(item)) { added.push(item); } } return { added, removed }; } __name(diffArraysAsSets, "diffArraysAsSets"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { diffArraysAsSets }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var dns_node_exports = {}; __export(dns_node_exports, { electronLookup: () => electronLookup, interleaveAddresses: () => interleaveAddresses, setFallback: () => setFallback, setIPv6Enabled: () => setIPv6Enabled }); module.exports = __toCommonJS(dns_node_exports); var electron = __toESM(require("electron")); var import_p_timeout = __toESM(require("p-timeout")); var import_assert_std = require("./assert.std.js"); var import_drop_std = require("./drop.std.js"); var import_index_std = require("./durations/index.std.js"); const LOOKUP_TIMEOUT_MS = 5 * import_index_std.SECOND; const fallbackAddrs = /* @__PURE__ */ new Map(); function setFallback(dnsFallback) { fallbackAddrs.clear(); for (const { domain, endpoints } of dnsFallback) { fallbackAddrs.set(domain, endpoints); } } __name(setFallback, "setFallback"); let ipv6Enabled = true; function setIPv6Enabled(value) { ipv6Enabled = value; } __name(setIPv6Enabled, "setIPv6Enabled"); function lookupAll(hostname, opts, callback) { (0, import_assert_std.strictAssert)(typeof opts === "object", "missing options"); (0, import_assert_std.strictAssert)(typeof callback === "function", "missing callback"); async function run() { let result; let queryType; if (opts.family === 4) { queryType = "A"; } else if (opts.family === 6) { queryType = "AAAA"; } try { if (electron.net) { result = await (0, import_p_timeout.default)( electron.net.resolveHost(hostname, { queryType }), LOOKUP_TIMEOUT_MS, "lookupAll: Electron lookup timed out" ); } else { result = await (0, import_p_timeout.default)( electron.ipcRenderer.invoke("net.resolveHost", hostname, queryType), LOOKUP_TIMEOUT_MS, "lookupAll: Electron lookup timed out" ); } } catch (error) { const fallback = fallbackAddrs.get(hostname); if (fallback) { result = { endpoints: fallback.slice() }; } else { callback(error, []); return; } } let addresses = result.endpoints.map(({ address, family }) => { let numericFamily = -1; if (family === "ipv4") { numericFamily = 4; } else if (family === "ipv6") { numericFamily = 6; } return { address, family: numericFamily }; }); if (!ipv6Enabled) { const ipv4Only = addresses.filter(({ family }) => family !== 6); if (ipv4Only.length !== 0) { addresses = ipv4Only; } } if (!opts.all) { const random = addresses.at(Math.floor(Math.random() * addresses.length)); if (random === void 0) { callback(new Error(`Hostname: ${hostname} cannot be resolved`), "", -1); return; } callback(null, random.address, random.family); return; } callback(null, addresses); } __name(run, "run"); (0, import_drop_std.drop)(run()); } __name(lookupAll, "lookupAll"); function interleaveAddresses(addresses) { const firstAddr = addresses.find( ({ family }) => family === 4 || family === 6 ); if (!firstAddr) { throw new Error("interleaveAddresses: no addresses to interleave"); } const v4 = addresses.filter(({ family }) => family === 4); const v6 = addresses.filter(({ family }) => family === 6); const interleaved = new Array(); while (v4.length !== 0 || v6.length !== 0) { const v4Entry = v4.pop(); const v6Entry = v6.pop(); if (firstAddr.family === 4) { if (v4Entry !== void 0) { interleaved.push(v4Entry); } if (v6Entry !== void 0) { interleaved.push(v6Entry); } } else { if (v6Entry !== void 0) { interleaved.push(v6Entry); } if (v4Entry !== void 0) { interleaved.push(v4Entry); } } } return interleaved; } __name(interleaveAddresses, "interleaveAddresses"); const electronLookup = lookupAll; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { electronLookup, interleaveAddresses, setFallback, setIPv6Enabled }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var drop_std_exports = {}; __export(drop_std_exports, { drop: () => drop }); module.exports = __toCommonJS(drop_std_exports); function drop(promise) { void promise; } __name(drop, "drop"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { drop }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var dropNull_std_exports = {}; __export(dropNull_std_exports, { convertUndefinedToNull: () => convertUndefinedToNull, dropNull: () => dropNull, shallowConvertUndefinedToNull: () => shallowConvertUndefinedToNull, shallowDropNull: () => shallowDropNull }); module.exports = __toCommonJS(dropNull_std_exports); function dropNull(value) { if (value === null) { return void 0; } return value; } __name(dropNull, "dropNull"); function shallowDropNull(value) { if (value == null) { return void 0; } const result = {}; for (const [key, propertyValue] of Object.entries(value)) { result[key] = dropNull(propertyValue); } return result; } __name(shallowDropNull, "shallowDropNull"); function convertUndefinedToNull(value) { if (value === void 0) { return null; } return value; } __name(convertUndefinedToNull, "convertUndefinedToNull"); function shallowConvertUndefinedToNull(obj) { const result = {}; for (const [key, propertyValue] of Object.entries(obj)) { result[key] = convertUndefinedToNull(propertyValue); } return result; } __name(shallowConvertUndefinedToNull, "shallowConvertUndefinedToNull"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { convertUndefinedToNull, dropNull, shallowConvertUndefinedToNull, shallowDropNull }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var dropZero_std_exports = {}; __export(dropZero_std_exports, { dropZero: () => dropZero }); module.exports = __toCommonJS(dropZero_std_exports); var import_lodash = __toESM(require("lodash")); const { isNumber } = import_lodash.default; function dropZero(value) { if (isNumber(value) && value !== 0) { return value; } return void 0; } __name(dropZero, "dropZero"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { dropZero }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var durationToPlaybackText_std_exports = {}; __export(durationToPlaybackText_std_exports, { durationToPlaybackText: () => durationToPlaybackText }); module.exports = __toCommonJS(durationToPlaybackText_std_exports); const durationToPlaybackText = /* @__PURE__ */ __name((time) => { const hours = Math.floor(time / 3600); let minutes = Math.floor(time % 3600 / 60).toString(); let seconds = Math.floor(time % 60).toString(); if (hours !== 0 && minutes.length < 2) { minutes = `0${minutes}`; } if (seconds.length < 2) { seconds = `0${seconds}`; } return hours ? `${hours}:${minutes}:${seconds}` : `${minutes}:${seconds}`; }, "durationToPlaybackText"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { durationToPlaybackText }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var constants_std_exports = {}; __export(constants_std_exports, { DAY: () => DAY, HOUR: () => HOUR, MINUTE: () => MINUTE, MONTH: () => MONTH, SECOND: () => SECOND, WEEK: () => WEEK }); module.exports = __toCommonJS(constants_std_exports); const SECOND = 1e3; const MINUTE = SECOND * 60; const HOUR = MINUTE * 60; const DAY = HOUR * 24; const WEEK = DAY * 7; const MONTH = DAY * 30; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { DAY, HOUR, MINUTE, MONTH, SECOND, WEEK }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var duration_in_seconds_std_exports = {}; __export(duration_in_seconds_std_exports, { DurationInSeconds: () => DurationInSeconds }); module.exports = __toCommonJS(duration_in_seconds_std_exports); var Constants = __toESM(require("./constants.std.js")); var DurationInSeconds; ((DurationInSeconds2) => { DurationInSeconds2.fromMillis = /* @__PURE__ */ __name((ms) => ms / Constants.SECOND, "fromMillis"); DurationInSeconds2.fromSeconds = /* @__PURE__ */ __name((seconds) => seconds, "fromSeconds"); DurationInSeconds2.fromMinutes = /* @__PURE__ */ __name((m) => m * Constants.MINUTE / Constants.SECOND, "fromMinutes"); DurationInSeconds2.fromHours = /* @__PURE__ */ __name((h) => h * Constants.HOUR / Constants.SECOND, "fromHours"); DurationInSeconds2.fromDays = /* @__PURE__ */ __name((d) => d * Constants.DAY / Constants.SECOND, "fromDays"); DurationInSeconds2.fromWeeks = /* @__PURE__ */ __name((d) => d * Constants.WEEK / Constants.SECOND, "fromWeeks"); DurationInSeconds2.fromMonths = /* @__PURE__ */ __name((d) => d * Constants.MONTH / Constants.SECOND, "fromMonths"); DurationInSeconds2.toSeconds = /* @__PURE__ */ __name((d) => d, "toSeconds"); DurationInSeconds2.toMillis = /* @__PURE__ */ __name((d) => d * Constants.SECOND, "toMillis"); DurationInSeconds2.toHours = /* @__PURE__ */ __name((d) => d * Constants.SECOND / Constants.HOUR, "toHours"); DurationInSeconds2.ZERO = DurationInSeconds2.fromSeconds(0); DurationInSeconds2.HOUR = DurationInSeconds2.fromHours(1); DurationInSeconds2.MINUTE = DurationInSeconds2.fromMinutes(1); DurationInSeconds2.DAY = DurationInSeconds2.fromDays(1); DurationInSeconds2.WEEK = DurationInSeconds2.fromWeeks(1); })(DurationInSeconds || (DurationInSeconds = {})); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { DurationInSeconds }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default")); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var index_std_exports = {}; __export(index_std_exports, { DurationInSeconds: () => import_duration_in_seconds_std.DurationInSeconds }); module.exports = __toCommonJS(index_std_exports); __reExport(index_std_exports, require("./constants.std.js"), module.exports); var import_duration_in_seconds_std = require("./duration-in-seconds.std.js"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { DurationInSeconds, ...require("./constants.std.js") }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var editHelpers_std_exports = {}; __export(editHelpers_std_exports, { getChangesForPropAtTimestamp: () => getChangesForPropAtTimestamp, getPropForTimestamp: () => getPropForTimestamp, getTargetOfThisEditTimestamp: () => getTargetOfThisEditTimestamp }); module.exports = __toCommonJS(editHelpers_std_exports); var import_lodash = __toESM(require("lodash")); var import_assert_std = require("./assert.std.js"); const { isNumber, sortBy } = import_lodash.default; function getTargetOfThisEditTimestamp({ message, targetTimestamp }) { const { timestamp: originalTimestamp, editHistory } = message; if (!editHistory) { return originalTimestamp; } const sentItems = editHistory.filter((item) => { return item.timestamp <= targetTimestamp; }); const mostRecent = sortBy( sentItems, (item) => item.timestamp ); const { length } = mostRecent; if (length > 1) { return mostRecent[length - 2].timestamp; } if (length > 0) { return mostRecent[length - 1].timestamp; } return originalTimestamp; } __name(getTargetOfThisEditTimestamp, "getTargetOfThisEditTimestamp"); function getPropForTimestamp({ log, message, prop, targetTimestamp }) { const logId = `getPropForTimestamp(${targetTimestamp}})`; const { editHistory } = message; const targetEdit = editHistory?.find( (item) => item.timestamp === targetTimestamp ); if (!targetEdit) { if (editHistory) { log.warn(`${logId}: No edit found, using top-level data`); } return message[prop]; } return targetEdit[prop]; } __name(getPropForTimestamp, "getPropForTimestamp"); function getChangesForPropAtTimestamp({ log, message, prop, targetTimestamp, value }) { const logId = `getChangesForPropAtTimestamp(${targetTimestamp})`; const { editHistory } = message; let partialProps; if (editHistory) { const targetEditIndex = editHistory.findIndex( (item) => item.timestamp === targetTimestamp ); const targetEdit = isNumber(targetEditIndex) ? editHistory[targetEditIndex] : void 0; if (!targetEdit) { if (editHistory) { log.warn(`${logId}: No edit found, updating top-level data`); } return { [prop]: value }; } (0, import_assert_std.strictAssert)( isNumber(targetEditIndex), "Got targetEdit, but no targetEditIndex" ); const newEditHistory = [...editHistory]; newEditHistory[targetEditIndex] = { ...targetEdit, [prop]: value }; partialProps = { editHistory: newEditHistory }; } const { editMessageTimestamp } = message; if (!editHistory || !editMessageTimestamp || editMessageTimestamp === targetTimestamp) { partialProps = { ...partialProps, [prop]: value }; } return partialProps; } __name(getChangesForPropAtTimestamp, "getChangesForPropAtTimestamp"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getChangesForPropAtTimestamp, getPropForTimestamp, getTargetOfThisEditTimestamp }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var emoji_std_exports = {}; __export(emoji_std_exports, { replaceEmojiWithSpaces: () => replaceEmojiWithSpaces, splitByEmoji: () => splitByEmoji }); module.exports = __toCommonJS(emoji_std_exports); var import_emoji_regex = __toESM(require("emoji-regex")); var import_assert_std = require("./assert.std.js"); var import_iterables_std = require("./iterables.std.js"); const REGEXP = (0, import_emoji_regex.default)(); const MAX_EMOJI_TO_MATCH = 5e3; function replaceEmojiWithSpaces(value) { return value.replace(REGEXP, " "); } __name(replaceEmojiWithSpaces, "replaceEmojiWithSpaces"); function splitByEmoji(value) { const emojis = (0, import_iterables_std.take)(value.matchAll(REGEXP), MAX_EMOJI_TO_MATCH); const result = []; let lastIndex = 0; for (const match of emojis) { const nonEmojiText = value.slice(lastIndex, match.index); if (nonEmojiText) { result.push({ type: "text", value: nonEmojiText }); } result.push({ type: "emoji", value: match[0] }); (0, import_assert_std.assertDev)(match.index !== void 0, "`matchAll` should provide indices"); lastIndex = match.index + match[0].length; } const finalNonEmojiText = value.slice(lastIndex); if (finalNonEmojiText) { result.push({ type: "text", value: finalNonEmojiText }); } return result; } __name(splitByEmoji, "splitByEmoji"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { replaceEmojiWithSpaces, splitByEmoji }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var enum_std_exports = {}; __export(enum_std_exports, { makeEnumParser: () => makeEnumParser }); module.exports = __toCommonJS(enum_std_exports); function makeEnumParser(enumToParse, defaultValue) { const enumValues = new Set(Object.values(enumToParse)); const isEnumValue = /* @__PURE__ */ __name((value) => typeof value === "string" && enumValues.has(value), "isEnumValue"); return (value) => isEnumValue(value) ? value : defaultValue; } __name(makeEnumParser, "makeEnumParser"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { makeEnumParser }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var expirationTimer_std_exports = {}; __export(expirationTimer_std_exports, { DEFAULT_DURATIONS_IN_SECONDS: () => DEFAULT_DURATIONS_IN_SECONDS, DEFAULT_DURATIONS_SET: () => DEFAULT_DURATIONS_SET, INITIAL_EXPIRE_TIMER_VERSION: () => INITIAL_EXPIRE_TIMER_VERSION, calculateExpirationTimestamp: () => calculateExpirationTimestamp, format: () => format }); module.exports = __toCommonJS(expirationTimer_std_exports); var import_humanize_duration = __toESM(require("humanize-duration")); var import_lodash = __toESM(require("lodash")); var import_index_std = require("./durations/index.std.js"); const { isNumber } = import_lodash.default; const INITIAL_EXPIRE_TIMER_VERSION = 1; const SECONDS_PER_WEEK = 604800; const DEFAULT_DURATIONS_IN_SECONDS = [ import_index_std.DurationInSeconds.ZERO, import_index_std.DurationInSeconds.fromWeeks(4), import_index_std.DurationInSeconds.fromWeeks(1), import_index_std.DurationInSeconds.fromDays(1), import_index_std.DurationInSeconds.fromHours(8), import_index_std.DurationInSeconds.fromHours(1), import_index_std.DurationInSeconds.fromMinutes(5), import_index_std.DurationInSeconds.fromSeconds(30) ]; const DEFAULT_DURATIONS_SET = new Set( DEFAULT_DURATIONS_IN_SECONDS ); function format(i18n, dirtySeconds, { capitalizeOff = false, largest } = {}) { let seconds = Math.abs(dirtySeconds || 0); if (!seconds) { return capitalizeOff ? i18n("icu:off") : i18n("icu:disappearingMessages__off"); } seconds = Math.max(Math.floor(seconds), 1); const locale = i18n.getLocale().replace(/-/g, "_"); const localeWithoutRegion = locale.split("_", 1)[0]; const fallbacks = []; if (localeWithoutRegion !== locale) { fallbacks.push(localeWithoutRegion); } if (localeWithoutRegion === "nb" || localeWithoutRegion === "nn") { fallbacks.push("no"); } if (localeWithoutRegion !== "en") { fallbacks.push("en"); } if (locale === "zh_HK") { fallbacks.push("zh_TW"); } const allUnits = ["y", "mo", "w", "d", "h", "m", "s"]; const defaultUnits = seconds % SECONDS_PER_WEEK === 0 ? ["w"] : ["d", "h", "m", "s"]; return (0, import_humanize_duration.default)(seconds * import_index_std.SECOND, { // if we have an explicit `largest` specified, // allow it to pick from all the units units: largest ? allUnits : defaultUnits, largest, language: locale, ...fallbacks.length ? { fallbacks } : {} }); } __name(format, "format"); function calculateExpirationTimestamp({ expireTimer, expirationStartTimestamp }) { return isNumber(expirationStartTimestamp) && isNumber(expireTimer) ? expirationStartTimestamp + import_index_std.DurationInSeconds.toMillis(expireTimer) : void 0; } __name(calculateExpirationTimestamp, "calculateExpirationTimestamp"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { DEFAULT_DURATIONS_IN_SECONDS, DEFAULT_DURATIONS_SET, INITIAL_EXPIRE_TIMER_VERSION, calculateExpirationTimestamp, format }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var explodePromise_std_exports = {}; __export(explodePromise_std_exports, { explodePromise: () => explodePromise }); module.exports = __toCommonJS(explodePromise_std_exports); function explodePromise() { let resolve; let reject; const promise = new Promise((innerResolve, innerReject) => { resolve = innerResolve; reject = innerReject; }); return { promise, // Typescript thinks that resolve and reject can be undefined here. // eslint-disable-next-line @typescript-eslint/no-non-null-assertion resolve, // eslint-disable-next-line @typescript-eslint/no-non-null-assertion reject }; } __name(explodePromise, "explodePromise"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { explodePromise }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var exponentialBackoff_std_exports = {}; __export(exponentialBackoff_std_exports, { exponentialBackoffMaxAttempts: () => exponentialBackoffMaxAttempts, exponentialBackoffSleepTime: () => exponentialBackoffSleepTime }); module.exports = __toCommonJS(exponentialBackoff_std_exports); var import_assert_std = require("./assert.std.js"); var durations = __toESM(require("./durations/index.std.js")); const BACKOFF_FACTOR = 1.9; const MAX_BACKOFF = 15 * durations.MINUTE; const FIRST_BACKOFFS = [0, 190]; function exponentialBackoffSleepTime(attempt, options = { maxBackoffTime: MAX_BACKOFF, multiplier: BACKOFF_FACTOR, firstBackoffs: FIRST_BACKOFFS }) { const numHardcodedBackoffs = options.firstBackoffs.length; (0, import_assert_std.strictAssert)( numHardcodedBackoffs > 0, "must include explicit first backoffs" ); if (attempt - 1 < numHardcodedBackoffs) { return options.firstBackoffs[attempt - 1]; } const lastHardcodedBackoff = options.firstBackoffs.at(-1); (0, import_assert_std.strictAssert)( lastHardcodedBackoff != null && lastHardcodedBackoff > 0, "lastHardcodedBackoff must be a positive number" ); return Math.min( options.maxBackoffTime, lastHardcodedBackoff / options.multiplier * options.multiplier ** (attempt - numHardcodedBackoffs + 1) ); } __name(exponentialBackoffSleepTime, "exponentialBackoffSleepTime"); function exponentialBackoffMaxAttempts(desiredDurationMs, options) { let attempts = 0; let total = 0; do { attempts += 1; total += exponentialBackoffSleepTime(attempts, options); } while (total < desiredDurationMs); return attempts; } __name(exponentialBackoffMaxAttempts, "exponentialBackoffMaxAttempts"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { exponentialBackoffMaxAttempts, exponentialBackoffSleepTime }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var fileToBytes_std_exports = {}; __export(fileToBytes_std_exports, { fileToBytes: () => fileToBytes }); module.exports = __toCommonJS(fileToBytes_std_exports); function fileToBytes(file) { return new Promise((resolve, rejectPromise) => { const FR = new FileReader(); FR.onload = () => { if (!FR.result || typeof FR.result === "string") { rejectPromise(new Error("bytesFromFile: No result!")); return; } resolve(new Uint8Array(FR.result)); }; FR.onerror = rejectPromise; FR.onabort = rejectPromise; FR.readAsArrayBuffer(file); }); } __name(fileToBytes, "fileToBytes"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { fileToBytes }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var filterAndSortConversations_std_exports = {}; __export(filterAndSortConversations_std_exports, { filterAndSortConversations: () => filterAndSortConversations }); module.exports = __toCommonJS(filterAndSortConversations_std_exports); var import_libphonenumberInstance_std = require("./libphonenumberInstance.std.js"); var import_index_std = require("./durations/index.std.js"); var import_fuse_std = require("./fuse.std.js"); var import_countUnreadStats_std = require("./countUnreadStats.std.js"); var import_getE164_std = require("./getE164.std.js"); var import_removeDiacritics_std = require("./removeDiacritics.std.js"); var import_isAciString_std = require("./isAciString.std.js"); const ACTIVE_AT_SCORE_FACTOR = 1 / import_index_std.WEEK * 0.01; const ARCHIVED_PENALTY = 0.3; const LEFT_GROUP_PENALTY = 1; const FUSE_OPTIONS = { // A small-but-nonzero threshold lets us match parts of E164s better, and makes the // search a little more forgiving. threshold: 0.2, includeScore: true, useExtendedSearch: true, // We sort manually anyway shouldSort: true, // the default of 100 is not enough to catch a word at the end of a convo/group title // 200 is about right (contact names can get longer than the max for group titles) distance: 200, keys: [ { name: "searchableTitle", weight: 1 }, { name: "title", weight: 1 }, { name: "name", weight: 1 }, { name: "username", weight: 1 }, { name: "e164", weight: 0.5 } ], getFn: /* @__PURE__ */ __name((convo, path) => { if (path === "e164" || path.length === 1 && path[0] === "e164") { return (0, import_getE164_std.getE164)(convo) ?? ""; } return (0, import_fuse_std.fuseGetFnRemoveDiacritics)(convo, path); }, "getFn") }; const COMMANDS = /* @__PURE__ */ new Map(); function filterConversationsByUnread(conversations, includeMuted) { return conversations.filter((conversation) => { return (0, import_countUnreadStats_std.isConversationUnread)(conversation, { activeProfile: void 0, includeMuted }); }); } __name(filterConversationsByUnread, "filterConversationsByUnread"); COMMANDS.set("serviceIdEndsWith", (conversations, query) => { return conversations.filter((convo) => convo.serviceId?.endsWith(query)); }); COMMANDS.set("aciEndsWith", (conversations, query) => { return conversations.filter( (convo) => (0, import_isAciString_std.isAciString)(convo.serviceId) && convo.serviceId.endsWith(query) ); }); COMMANDS.set("pniEndsWith", (conversations, query) => { return conversations.filter((convo) => convo.pni?.endsWith(query)); }); COMMANDS.set("idEndsWith", (conversations, query) => { return conversations.filter((convo) => convo.id?.endsWith(query)); }); COMMANDS.set("e164EndsWith", (conversations, query) => { return conversations.filter((convo) => convo.e164?.endsWith(query)); }); COMMANDS.set("groupIdEndsWith", (conversations, query) => { return conversations.filter((convo) => convo.groupId?.endsWith(query)); }); COMMANDS.set("unread", (conversations, query) => { const includeMuted = /^(?:m|muted)$/i.test(query) || false; return filterConversationsByUnread( conversations, includeMuted ? "force-include" : "force-exclude" ); }); function searchConversations(conversations, searchTerm, regionCode) { const maybeCommand = searchTerm.match(/^!([^\s:]+)(?::(.*))?$/); if (maybeCommand) { const [, commandName, query] = maybeCommand; const command = COMMANDS.get(commandName); if (command) { return command(conversations, query).map((item) => ({ item })); } } const phoneNumber = (0, import_libphonenumberInstance_std.parseAndFormatPhoneNumber)(searchTerm, regionCode); let extendedSearchTerm = (0, import_removeDiacritics_std.removeDiacritics)(searchTerm); if (phoneNumber) { extendedSearchTerm += ` | ${phoneNumber.e164}`; } const index = (0, import_fuse_std.getCachedFuseIndex)(conversations, FUSE_OPTIONS); return index.search(extendedSearchTerm); } __name(searchConversations, "searchConversations"); function startsWithLetter(title) { return /^\p{Letter}/u.test(title); } __name(startsWithLetter, "startsWithLetter"); function sortAlphabetically(a, b) { const aStartsWithLetter = startsWithLetter(a.title); const bStartsWithLetter = startsWithLetter(b.title); if (aStartsWithLetter && !bStartsWithLetter) { return -1; } if (!aStartsWithLetter && bStartsWithLetter) { return 1; } return a.title.localeCompare(b.title); } __name(sortAlphabetically, "sortAlphabetically"); function filterAndSortConversations(conversations, searchTerm, regionCode, filterByUnread = false, conversationToInject) { let filteredConversations = filterByUnread ? filterConversationsByUnread(conversations, "force-include") : conversations; if (conversationToInject) { filteredConversations = [...filteredConversations, conversationToInject]; } if (searchTerm.length) { const now = Date.now(); const withoutUnknownAndFiltered = filteredConversations.filter( (item) => item.titleNoDefault ); return searchConversations( withoutUnknownAndFiltered, searchTerm, regionCode ).slice().sort((a, b) => { const { activeAt: aActiveAt = 0, left: aLeft = false, isArchived: aArchived } = a.item; const { activeAt: bActiveAt = 0, left: bLeft = false, isArchived: bArchived } = b.item; const aScore = (now - aActiveAt) * ACTIVE_AT_SCORE_FACTOR + (a.score ?? 0) + (aLeft ? LEFT_GROUP_PENALTY : 0) + (aArchived ? ARCHIVED_PENALTY : 0); const bScore = (now - bActiveAt) * ACTIVE_AT_SCORE_FACTOR + (b.score ?? 0) + (bLeft ? LEFT_GROUP_PENALTY : 0) + (bArchived ? ARCHIVED_PENALTY : 0); const activeScore = aScore - bScore; if (activeScore !== 0) { return activeScore; } return sortAlphabetically(a.item, b.item); }).map((result) => result.item); } return filteredConversations.concat().sort((a, b) => { const aScore = a.activeAt ?? 0; const bScore = b.activeAt ?? 0; const score = bScore - aScore; if (score !== 0) { return score; } return sortAlphabetically(a, b); }); } __name(filterAndSortConversations, "filterAndSortConversations"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { filterAndSortConversations }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var finalStream_node_exports = {}; __export(finalStream_node_exports, { finalStream: () => finalStream }); module.exports = __toCommonJS(finalStream_node_exports); var import_node_stream = require("node:stream"); function finalStream(finalizer) { return new import_node_stream.Transform({ transform(data, enc, callback) { this.push(Buffer.from(data, enc)); callback(); }, async final(callback) { try { await finalizer(); } catch (error) { callback(error); return; } callback(null); } }); } __name(finalStream, "finalStream"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { finalStream }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var focusableSelectors_std_exports = {}; __export(focusableSelectors_std_exports, { focusableSelector: () => focusableSelector, focusableSelectors: () => focusableSelectors, matchOrQueryFocusable: () => matchOrQueryFocusable }); module.exports = __toCommonJS(focusableSelectors_std_exports); const not = { inert: ":not([inert]):not([inert] *)", negTabIndex: ':not([tabindex^="-"])', disabled: ":not(:disabled)" }; const focusableSelectors = [ `a[href]${not.inert}${not.negTabIndex}`, `area[href]${not.inert}${not.negTabIndex}`, `input:not([type="hidden"]):not([type="radio"])${not.inert}${not.negTabIndex}${not.disabled}`, `input[type="radio"]${not.inert}${not.negTabIndex}${not.disabled}`, `select${not.inert}${not.negTabIndex}${not.disabled}`, `textarea${not.inert}${not.negTabIndex}${not.disabled}`, `button${not.inert}${not.negTabIndex}${not.disabled}`, `details${not.inert} > summary:first-of-type${not.negTabIndex}`, // Discard until Firefox supports `:has()` // See: https://github.com/KittyGiraudel/focusable-selectors/issues/12 // `details:not(:has(> summary))${not.inert}${not.negTabIndex}`, `iframe${not.inert}${not.negTabIndex}`, `audio[controls]${not.inert}${not.negTabIndex}`, `video[controls]${not.inert}${not.negTabIndex}`, `[contenteditable]${not.inert}${not.negTabIndex}`, `[tabindex]${not.inert}${not.negTabIndex}` ]; const focusableSelector = focusableSelectors.join(", "); function matchOrQueryFocusable(element) { return element.matches(focusableSelector) ? element : element.querySelector(focusableSelector); } __name(matchOrQueryFocusable, "matchOrQueryFocusable"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { focusableSelector, focusableSelectors, matchOrQueryFocusable }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var formatDuration_std_exports = {}; __export(formatDuration_std_exports, { formatDuration: () => formatDuration }); module.exports = __toCommonJS(formatDuration_std_exports); var import_moment = __toESM(require("moment")); const HOUR = 1e3 * 60 * 60; function formatDuration(seconds) { const time = import_moment.default.utc(seconds * 1e3); if (seconds > HOUR) { return time.format("H:mm:ss"); } return time.format("m:ss"); } __name(formatDuration, "formatDuration"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { formatDuration }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var formatFileSize_std_exports = {}; __export(formatFileSize_std_exports, { formatFileSize: () => formatFileSize }); module.exports = __toCommonJS(formatFileSize_std_exports); var import_filesize = __toESM(require("filesize")); const MB = 1e3 * 1e3; function formatFileSize(size) { return (0, import_filesize.default)(size, { round: size < MB ? 0 : 1 }); } __name(formatFileSize, "formatFileSize"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { formatFileSize }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var fuse_std_exports = {}; __export(fuse_std_exports, { fuseGetFnRemoveDiacritics: () => fuseGetFnRemoveDiacritics, getCachedFuseIndex: () => getCachedFuseIndex }); module.exports = __toCommonJS(fuse_std_exports); var import_fuse = __toESM(require("fuse.js")); var import_removeDiacritics_std = require("./removeDiacritics.std.js"); const cachedIndices = /* @__PURE__ */ new Map(); function getCachedFuseIndex(list, options) { let indicesForOptions = cachedIndices.get( options ); if (!indicesForOptions) { indicesForOptions = /* @__PURE__ */ new WeakMap(); cachedIndices.set(options, indicesForOptions); } let index = indicesForOptions.get(list); if (!index) { index = new import_fuse.default(list, options); indicesForOptions.set(list, index); } return index; } __name(getCachedFuseIndex, "getCachedFuseIndex"); const fuseGetFnRemoveDiacritics = /* @__PURE__ */ __name((...args) => { const text = import_fuse.default.config.getFn(...args); if (!text) { return text; } if (typeof text === "string") { return (0, import_removeDiacritics_std.removeDiacritics)(text); } return text.map(import_removeDiacritics_std.removeDiacritics); }, "fuseGetFnRemoveDiacritics"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { fuseGetFnRemoveDiacritics, getCachedFuseIndex }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var generateBlurHash_std_exports = {}; __export(generateBlurHash_std_exports, { generateBlurHash: () => generateBlurHash }); module.exports = __toCommonJS(generateBlurHash_std_exports); var import_blurhash = require("blurhash"); function generateBlurHash(argb = 4294704123) { return (0, import_blurhash.encode)( new Uint8ClampedArray([ /* eslint-disable no-bitwise */ // Flipping from argb to rgba 255 & argb >> 16, // R 255 & argb >> 8, // G 255 & argb >> 0, // B 255 // A (ignored) /* eslint-enable no-bitwise */ ]), 1, // width (data is just one pixel) 1, // height (data is just one pixel) 1, // x components (just the average color) 1 // y components (just the average color) ); } __name(generateBlurHash, "generateBlurHash"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { generateBlurHash }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var generateConfigMatrix_std_exports = {}; __export(generateConfigMatrix_std_exports, { generateConfigMatrix: () => generateConfigMatrix }); module.exports = __toCommonJS(generateConfigMatrix_std_exports); function generateConfigMatrix(combinations) { let result = [{}]; const entries = [...Object.entries(combinations)]; if (entries.length === 0 || entries.every(([, values]) => values.length === 0)) { return []; } for (const [key, values] of entries) { result = values.map( (value) => result.map((config) => ({ ...config, [key]: value })) ).flat(); } return result; } __name(generateConfigMatrix, "generateConfigMatrix"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { generateConfigMatrix }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var generateMessageId_node_exports = {}; __export(generateMessageId_node_exports, { generateMessageId: () => generateMessageId }); module.exports = __toCommonJS(generateMessageId_node_exports); var import_uuid = require("uuid"); var import_Crypto_node = require("../Crypto.node.js"); function generateMessageId(counter) { const uuid = (0, import_Crypto_node.getRandomBytes)(16); uuid[0] = counter / 1099511627776 & 255; uuid[1] = counter / 4294967296 & 255; uuid[2] = counter / 16777216 & 255; uuid[3] = counter / 65536 & 255; uuid[4] = counter / 256 & 255; uuid[5] = counter / 1 & 255; uuid[6] &= 15; uuid[6] |= 112; uuid[8] &= 63; uuid[8] |= 128; return { id: (0, import_uuid.stringify)(uuid), received_at: counter }; } __name(generateMessageId, "generateMessageId"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { generateMessageId }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var getAccessControlOptions_std_exports = {}; __export(getAccessControlOptions_std_exports, { getAccessControlOptions: () => getAccessControlOptions }); module.exports = __toCommonJS(getAccessControlOptions_std_exports); var import_index_std = require("../protobuf/index.std.js"); const AccessControlEnum = import_index_std.SignalService.AccessControl.AccessRequired; function getAccessControlOptions(i18n) { return [ { text: i18n("icu:GroupV2--all-members"), value: AccessControlEnum.MEMBER }, { text: i18n("icu:GroupV2--only-admins"), value: AccessControlEnum.ADMINISTRATOR } ]; } __name(getAccessControlOptions, "getAccessControlOptions"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getAccessControlOptions }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var getAnalogTime_std_exports = {}; __export(getAnalogTime_std_exports, { getAnalogTime: () => getAnalogTime }); module.exports = __toCommonJS(getAnalogTime_std_exports); const HOURS = [0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330]; const NEXT_HOUR_DEG = 30; function getAnalogTime() { const date = /* @__PURE__ */ new Date(); const minutesBy60 = 60 / date.getMinutes(); const minute = 360 / minutesBy60; const hourIndex = date.getHours() % 12; const currentHour = HOURS[hourIndex] ?? 0; const hour = currentHour + NEXT_HOUR_DEG / minutesBy60; return { hour, minute }; } __name(getAnalogTime, "getAnalogTime"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getAnalogTime }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var getAppErrorIcon_node_exports = {}; __export(getAppErrorIcon_node_exports, { getAppErrorIcon: () => getAppErrorIcon }); module.exports = __toCommonJS(getAppErrorIcon_node_exports); var import_electron = require("electron"); var import_node_path = require("node:path"); function getAppErrorIcon() { const iconPath = (0, import_node_path.join)( __dirname, "..", "..", "images", "app-icon-with-error.png" ); return import_electron.nativeImage.createFromPath(iconPath); } __name(getAppErrorIcon, "getAppErrorIcon"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getAppErrorIcon }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var getBasicAuth_std_exports = {}; __export(getBasicAuth_std_exports, { getBasicAuth: () => getBasicAuth }); module.exports = __toCommonJS(getBasicAuth_std_exports); var import_Bytes_std = require("../Bytes.std.js"); function getBasicAuth({ username, password }) { const auth = (0, import_Bytes_std.toBase64)((0, import_Bytes_std.fromString)(`${username}:${password}`)); return `Basic ${auth}`; } __name(getBasicAuth, "getBasicAuth"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getBasicAuth }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var getClassNamesFor_std_exports = {}; __export(getClassNamesFor_std_exports, { getClassNamesFor: () => getClassNamesFor }); module.exports = __toCommonJS(getClassNamesFor_std_exports); var import_classnames = __toESM(require("classnames")); function getClassNamesFor(...modules) { return (modifier) => { if (modifier === void 0) { return ""; } const cx = modules.flatMap((m) => m ? m.split(" ") : void 0).map( (parentModule) => parentModule ? `${parentModule}${modifier}` : void 0 ); return (0, import_classnames.default)(cx); }; } __name(getClassNamesFor, "getClassNamesFor"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getClassNamesFor }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var getColorForCallLink_std_exports = {}; __export(getColorForCallLink_std_exports, { getColorForCallLink: () => getColorForCallLink }); module.exports = __toCommonJS(getColorForCallLink_std_exports); var import_AxoTokens_std = require("../axo/AxoTokens.std.js"); const BASE_16_CONSONANT_ALPHABET = "bcdfghkmnpqrstxz"; function getColorForCallLink(rootKey) { const rootKeyStart = rootKey.slice(0, 2); const upper = (BASE_16_CONSONANT_ALPHABET.indexOf(rootKeyStart[0]) || 0) * 16; const lower = BASE_16_CONSONANT_ALPHABET.indexOf(rootKeyStart[1]) || 0; const firstByte = upper + lower; return import_AxoTokens_std.AxoTokens.Avatar.getColorNameByHash(firstByte); } __name(getColorForCallLink, "getColorForCallLink"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getColorForCallLink }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var getConversationColorAttributes_std_exports = {}; __export(getConversationColorAttributes_std_exports, { getConversationColorAttributes: () => getConversationColorAttributes }); module.exports = __toCommonJS(getConversationColorAttributes_std_exports); function getConversationColorAttributes(conversationColors, defaultConversationColor) { const conversationColor = conversationColors.conversationColor || defaultConversationColor.color; const customColor = conversationColor !== "custom" ? void 0 : conversationColors.customColor || defaultConversationColor.customColorData?.value; const customColorId = conversationColor !== "custom" ? void 0 : conversationColors.customColorId || defaultConversationColor.customColorData?.id; return { conversationColor, customColor, customColorId }; } __name(getConversationColorAttributes, "getConversationColorAttributes"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getConversationColorAttributes }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var getConversationTitleForPanelType_std_exports = {}; __export(getConversationTitleForPanelType_std_exports, { getConversationTitleForPanelType: () => getConversationTitleForPanelType }); module.exports = __toCommonJS(getConversationTitleForPanelType_std_exports); var import_log_std = require("../logging/log.std.js"); var import_Panels_std = require("../types/Panels.std.js"); const log = (0, import_log_std.createLogger)("getConversationTitleForPanelType"); function getConversationTitleForPanelType(i18n, panelType) { if (!panelType) { return void 0; } if (panelType === import_Panels_std.PanelType.AllMedia) { return void 0; } if (panelType === import_Panels_std.PanelType.ChatColorEditor) { return i18n("icu:ChatColorPicker__menu-title"); } if (panelType === import_Panels_std.PanelType.ContactDetails) { return void 0; } if (panelType === import_Panels_std.PanelType.ConversationDetails) { return void 0; } if (panelType === import_Panels_std.PanelType.GroupInvites) { return i18n("icu:ConversationDetails--requests-and-invites"); } if (panelType === import_Panels_std.PanelType.GroupMemberLabelEditor) { return i18n("icu:ConversationDetails--member-label"); } if (panelType === import_Panels_std.PanelType.GroupLinkManagement) { return i18n("icu:ConversationDetails--group-link"); } if (panelType === import_Panels_std.PanelType.GroupPermissions) { return i18n("icu:permissions"); } if (panelType === import_Panels_std.PanelType.NotificationSettings) { return i18n("icu:ConversationDetails--notifications"); } if (panelType === import_Panels_std.PanelType.PinnedMessages) { return i18n("icu:PinnedMessagesPanel__Title"); } if (panelType === import_Panels_std.PanelType.StickerManager) { return void 0; } if (panelType === import_Panels_std.PanelType.GroupV1Members || panelType === import_Panels_std.PanelType.MessageDetails) { return void 0; } const unknownType = panelType; log.warn(`Got unexpected type ${unknownType}`); return void 0; } __name(getConversationTitleForPanelType, "getConversationTitleForPanelType"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getConversationTitleForPanelType }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var getE164_std_exports = {}; __export(getE164_std_exports, { getE164: () => getE164 }); module.exports = __toCommonJS(getE164_std_exports); var import_isInSystemContacts_std = require("./isInSystemContacts.std.js"); function getE164(attributes) { const { e164, profileKey, sharingPhoneNumber } = attributes; if (!sharingPhoneNumber && profileKey && !(0, import_isInSystemContacts_std.isInSystemContacts)(attributes)) { return void 0; } return e164; } __name(getE164, "getE164"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getE164 }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var getFontNameByTextScript_std_exports = {}; __export(getFontNameByTextScript_std_exports, { fontSniffer: () => fontSniffer, getFontNameByTextScript: () => getFontNameByTextScript }); module.exports = __toCommonJS(getFontNameByTextScript_std_exports); var import_assert_std = require("./assert.std.js"); const FONT_MAP = { base: [ "sans-serif", "sans-serif", "sans-serif", "serif", "serif", "sans-serif" ], latin: [ "Inter", "Inter", "Inter", '"EB Garamond"', "Parisienne", '"Barlow Condensed"' ], cyrillic: [ "Inter", "Inter", "Inter", '"EB Garamond"', '"American Typewriter Semibold", "Cambria Bold"', '"SF Pro Light (System Light)", "Calibri Light"' ], devanagari: [ '"Kohinoor Devanagari Regular", "Utsaah Regular"', '"Kohinoor Devanagari Regular", "Utsaah Regular"', '"Kohinoor Devanagari Semibold", "Utsaah Bold"', '"Devanagari Sangam MN Regular", "Kokila Regular"', '"Devanagari Sangam MN Bold", "Kokila Bold"', '"Kohinoor Devanagari Light", "Utsaah Regular"' ], arabic: [ '"SF Arabic Regular", "Segoe UI Arabic Regular"', '"SF Arabic Regular", "Segoe UI Arabic Regular"', '"SF Arabic Bold", "Segoe UI Arabic Bold"', '"Geeza Pro Regular", "Sakkal Majalla Regular"', '"Geeza Pro Bold", "Sakkal Majalla Bold"', '"SF Arabic Black", "Segoe UI Arabic Bold"' ], japanese: [ '"Hiragino Sans W3"', '"Hiragino Sans W3"', '"Hiragino Sans W7"', '"Hiragino Mincho Pro W3"', '"Hiragino Mincho Pro W6"', '"Hiragino Maru Gothic Pro N"' ], zhhk: [ '"PingFang HK Regular", "MingLiU Regular"', '"PingFang HK Regular", "MingLiU Regular"', '"PingFang HK Semibold", "MingLiU Regular"', '"PingFang HK Ultralight", "MingLiU Regular"', '"PingFang HK Thin", "MingLiU Regular"', '"PingFang HK Light", "MingLiU Regular"' ], zhtc: [ '"PingFang TC Regular", "JhengHei TC Regular"', '"PingFang TC Regular", "JhengHei TC Regular"', '"PingFang TC Semibold", "JhengHei TC Bold"', '"PingFang TC Ultralight", "JhengHei TC Light"', '"PingFang TC Thin", "JhengHei TC Regular"', '"PingFang TC Light", "JhengHei TC Bold"' ], zhsc: [ '"PingFang SC Regular", SimHei', '"PingFang SC Regular", SimHei', '"PingFang SC Semibold", SimHei', '"PingFang SC Ultralight", SimHei', '"PingFang SC Thin", SimHei', '"PingFang SC Light", SimHei' ] }; const rxArabic = /\p{Script=Arab}/u; const rxCJK = /\p{Script=Han}/u; const rxCyrillic = /\p{Script=Cyrl}/u; const rxDevanagari = /\p{Script=Deva}/u; const rxJapanese = /\p{Script=Hira}|\p{Script=Kana}/u; const rxLatin = /\p{Script=Latn}/u; const fontSniffer = { hasArabic(text) { return rxArabic.test(text); }, hasCJK(text) { return rxCJK.test(text); }, hasCyrillic(text) { return rxCyrillic.test(text); }, hasDevanagari(text) { return rxDevanagari.test(text); }, hasJapanese(text) { return rxJapanese.test(text); }, hasLatin(text) { return rxLatin.test(text); } }; function getFontNameByTextScript(text, textStyleIndex, i18n) { (0, import_assert_std.strictAssert)( textStyleIndex >= 0 && textStyleIndex <= 5, "text style is not between 0-5" ); const fonts = [FONT_MAP.base[textStyleIndex]]; if (fontSniffer.hasArabic(text)) { fonts.push(FONT_MAP.arabic[textStyleIndex]); } if (fontSniffer.hasCJK(text)) { const locale = i18n?.getLocale(); if (locale === "zh-TW") { fonts.push(FONT_MAP.zhtc[textStyleIndex]); } else if (locale === "zh-HK") { fonts.push(FONT_MAP.zhhk[textStyleIndex]); } else { fonts.push(FONT_MAP.zhsc[textStyleIndex]); } } if (fontSniffer.hasCyrillic(text)) { fonts.push(FONT_MAP.cyrillic[textStyleIndex]); } if (fontSniffer.hasDevanagari(text)) { fonts.push(FONT_MAP.devanagari[textStyleIndex]); } if (fontSniffer.hasJapanese(text)) { fonts.push(FONT_MAP.japanese[textStyleIndex]); } if (fontSniffer.hasLatin(text)) { fonts.push(FONT_MAP.latin[textStyleIndex]); } return fonts.reverse().join(", "); } __name(getFontNameByTextScript, "getFontNameByTextScript"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { fontSniffer, getFontNameByTextScript }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var getFreeDiskSpace_node_exports = {}; __export(getFreeDiskSpace_node_exports, { getFreeDiskSpace: () => getFreeDiskSpace }); module.exports = __toCommonJS(getFreeDiskSpace_node_exports); var import_promises = require("node:fs/promises"); async function getFreeDiskSpace(target) { const { bsize, bavail } = await (0, import_promises.statfs)(target); return bsize * bavail; } __name(getFreeDiskSpace, "getFreeDiskSpace"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getFreeDiskSpace }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var getHSL_std_exports = {}; __export(getHSL_std_exports, { calculateLightness: () => calculateLightness, getHSL: () => getHSL }); module.exports = __toCommonJS(getHSL_std_exports); const LIGHTNESS_TABLE = { 0: 45, 60: 30, 180: 30, 240: 50, 300: 40, 360: 45 }; function getLightnessFromHue(hue, min, max) { const percentage = (hue - min) * 100 / (max - min); const minValue = LIGHTNESS_TABLE[min]; const maxValue = LIGHTNESS_TABLE[max]; return percentage * (maxValue - minValue) / 100 + minValue; } __name(getLightnessFromHue, "getLightnessFromHue"); function calculateLightness(hue) { let lightness = 45; if (hue < 60) { lightness = getLightnessFromHue(hue, 0, 60); } else if (hue < 180) { lightness = 30; } else if (hue < 240) { lightness = getLightnessFromHue(hue, 180, 240); } else if (hue < 300) { lightness = getLightnessFromHue(hue, 240, 300); } else { lightness = getLightnessFromHue(hue, 300, 360); } return lightness; } __name(calculateLightness, "calculateLightness"); function adjustLightnessValue(lightness, percentIncrease) { return lightness + lightness * percentIncrease; } __name(adjustLightnessValue, "adjustLightnessValue"); function getHSL({ hue, saturation, lightness }, adjustedLightness = 0) { return `hsl(${hue}, ${saturation}%, ${lightness == null || adjustedLightness !== 0 ? adjustLightnessValue(calculateLightness(hue), adjustedLightness) : lightness * 100}%)`; } __name(getHSL, "getHSL"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { calculateLightness, getHSL }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var getICUMessageParams_std_exports = {}; __export(getICUMessageParams_std_exports, { getICUMessageParams: () => getICUMessageParams }); module.exports = __toCommonJS(getICUMessageParams_std_exports); var import_icu_messageformat_parser = require("@formatjs/icu-messageformat-parser"); var import_missingCaseError_std = require("./missingCaseError.std.js"); function getICUMessageParams(message, defaultRichTextElementNames = []) { const params = /* @__PURE__ */ new Map(); function visitOptions(options) { for (const option of Object.values(options)) { visit(option.value); } } __name(visitOptions, "visitOptions"); function visit(elements) { for (const element of elements) { switch (element.type) { case import_icu_messageformat_parser.TYPE.argument: params.set(element.value, { type: "string" }); break; case import_icu_messageformat_parser.TYPE.date: params.set(element.value, { type: "Date" }); break; case import_icu_messageformat_parser.TYPE.literal: break; case import_icu_messageformat_parser.TYPE.number: params.set(element.value, { type: "number" }); break; case import_icu_messageformat_parser.TYPE.plural: params.set(element.value, { type: "number" }); visitOptions(element.options); break; case import_icu_messageformat_parser.TYPE.pound: break; case import_icu_messageformat_parser.TYPE.select: { const validOptions = Object.entries(element.options).filter(([key, { value }]) => key !== "other" || value.length).map(([key]) => key); params.set(element.value, { type: "select", validOptions }); visitOptions(element.options); break; } case import_icu_messageformat_parser.TYPE.tag: params.set(element.value, { type: "jsx" }); visit(element.children); break; case import_icu_messageformat_parser.TYPE.time: params.set(element.value, { type: "time" }); break; default: throw (0, import_missingCaseError_std.missingCaseError)(element); } } } __name(visit, "visit"); visit((0, import_icu_messageformat_parser.parse)(message)); for (const defaultRichTextElementName of defaultRichTextElementNames) { params.delete(defaultRichTextElementName); } return params; } __name(getICUMessageParams, "getICUMessageParams"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getICUMessageParams }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var getInitials_std_exports = {}; __export(getInitials_std_exports, { getInitials: () => getInitials }); module.exports = __toCommonJS(getInitials_std_exports); function getInitials(name) { if (!name) { return void 0; } const parsedName = name.replace(/[^\p{L}\p{Z}]+/gu, "").replace(/\p{Z}+/gu, " ").trim(); if (!parsedName) { return void 0; } if (parsedName.length === 2 && parsedName === parsedName.toUpperCase()) { return parsedName; } const parts = parsedName.split(" "); const partsLen = parts.length; return partsLen === 1 ? parts[0].charAt(0) : parts[0].charAt(0) + parts[partsLen - 1].charAt(0); } __name(getInitials, "getInitials"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getInitials }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var getLocalAttachmentUrl_std_exports = {}; __export(getLocalAttachmentUrl_std_exports, { AttachmentDisposition: () => AttachmentDisposition, getLocalAttachmentUrl: () => getLocalAttachmentUrl }); module.exports = __toCommonJS(getLocalAttachmentUrl_std_exports); var import_lodash = __toESM(require("lodash")); var import_assert_std = require("./assert.std.js"); const { isNumber } = import_lodash.default; var AttachmentDisposition = /* @__PURE__ */ ((AttachmentDisposition2) => { AttachmentDisposition2["Attachment"] = "attachment"; AttachmentDisposition2["AvatarData"] = "avatarData"; AttachmentDisposition2["Draft"] = "draft"; AttachmentDisposition2["Download"] = "download"; AttachmentDisposition2["Sticker"] = "sticker"; AttachmentDisposition2["Temporary"] = "temporary"; return AttachmentDisposition2; })(AttachmentDisposition || {}); function getLocalAttachmentUrl(attachment, { disposition = "attachment" /* Attachment */ } = {}) { let { path } = attachment; if (disposition === "download" /* Download */) { (0, import_assert_std.strictAssert)( attachment.incrementalMac && attachment.chunkSize, "To view downloads, must have incrementalMac/chunkSize" ); path = attachment.downloadPath; } (0, import_assert_std.strictAssert)(path != null, `${disposition} attachment was missing path`); path = path.replace(/\\/g, "/"); let url; if (disposition === "download" /* Download */) { url = new URL(`attachment://v2/${path}`); } else if (attachment.version !== 2) { url = new URL(`attachment://v1/${path}`); } else { url = new URL(`attachment://v${attachment.version}/${path}`); if (attachment.localKey != null) { url.searchParams.set("key", attachment.localKey); } } if (attachment.size != null) { url.searchParams.set("size", attachment.size.toString()); } if (attachment.contentType != null) { url.searchParams.set("contentType", attachment.contentType); } if (disposition !== "attachment" /* Attachment */) { url.searchParams.set("disposition", disposition); } if (disposition === "download" /* Download */) { if (!attachment.key) { throw new Error("getLocalAttachmentUrl: Missing attachment key!"); } url.searchParams.set("key", attachment.key); if (!attachment.digest) { throw new Error("getLocalAttachmentUrl: Missing attachment digest!"); } url.searchParams.set("digest", attachment.digest); if (!attachment.incrementalMac) { throw new Error( "getLocalAttachmentUrl: Missing attachment incrementalMac!" ); } url.searchParams.set("incrementalMac", attachment.incrementalMac); if (!isNumber(attachment.chunkSize)) { throw new Error( "getLocalAttachmentUrl: Missing attachment incrementalMac!" ); } url.searchParams.set("chunkSize", attachment.chunkSize.toString()); } if (attachment.copied) { url.searchParams.set("weakReference", "1"); } return url.toString(); } __name(getLocalAttachmentUrl, "getLocalAttachmentUrl"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { AttachmentDisposition, getLocalAttachmentUrl }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var getMacAndUpdateHmac_node_exports = {}; __export(getMacAndUpdateHmac_node_exports, { getMacAndUpdateHmac: () => getMacAndUpdateHmac }); module.exports = __toCommonJS(getMacAndUpdateHmac_node_exports); var import_node_buffer = require("node:buffer"); var import_node_stream = require("node:stream"); var import_Crypto_std = require("../types/Crypto.std.js"); function getMacAndUpdateHmac(hmac, onTheirMac) { let maybeMacBytes = import_node_buffer.Buffer.alloc(0); function updateWithKnownNonMacBytes() { let knownNonMacBytes = null; if (maybeMacBytes.byteLength > import_Crypto_std.MAC_LENGTH) { knownNonMacBytes = maybeMacBytes.subarray(0, -import_Crypto_std.MAC_LENGTH); maybeMacBytes = maybeMacBytes.subarray(-import_Crypto_std.MAC_LENGTH); hmac.update(knownNonMacBytes); } return knownNonMacBytes; } __name(updateWithKnownNonMacBytes, "updateWithKnownNonMacBytes"); return new import_node_stream.Transform({ transform(chunk, _encoding, callback) { try { maybeMacBytes = import_node_buffer.Buffer.concat([maybeMacBytes, chunk]); const knownNonMac = updateWithKnownNonMacBytes(); callback(null, knownNonMac); } catch (error) { callback(error); } }, flush(callback) { try { onTheirMac(maybeMacBytes); callback(null, null); } catch (error) { callback(error); } } }); } __name(getMacAndUpdateHmac, "getMacAndUpdateHmac"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getMacAndUpdateHmac }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var getMessageSentTimestamp_std_exports = {}; __export(getMessageSentTimestamp_std_exports, { getMessageSentTimestamp: () => getMessageSentTimestamp }); module.exports = __toCommonJS(getMessageSentTimestamp_std_exports); var import_assert_std = require("./assert.std.js"); function getMessageSentTimestamp({ editMessageTimestamp, sent_at: sentAt, timestamp }, { includeEdits = true, log }) { if (includeEdits && editMessageTimestamp) { return editMessageTimestamp; } if (sentAt) { return sentAt; } if (timestamp) { log.error("message lacked sent_at. Falling back to timestamp"); return timestamp; } (0, import_assert_std.assertDev)( false, "message lacked sent_at and timestamp. Falling back to current time" ); return Date.now(); } __name(getMessageSentTimestamp, "getMessageSentTimestamp"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getMessageSentTimestamp }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var getMessageSentTimestampSet_std_exports = {}; __export(getMessageSentTimestampSet_std_exports, { getMessageSentTimestampSet: () => getMessageSentTimestampSet }); module.exports = __toCommonJS(getMessageSentTimestampSet_std_exports); function getMessageSentTimestampSet({ sent_at: sentAt, editHistory }) { return /* @__PURE__ */ new Set([ sentAt, ...editHistory?.map(({ timestamp }) => timestamp) ?? [] ]); } __name(getMessageSentTimestampSet, "getMessageSentTimestampSet"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getMessageSentTimestampSet }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var getMessageTimestamp_std_exports = {}; __export(getMessageTimestamp_std_exports, { getMessageTimestamp: () => getMessageTimestamp }); module.exports = __toCommonJS(getMessageTimestamp_std_exports); function getMessageTimestamp(message) { return message.received_at_ms || message.received_at; } __name(getMessageTimestamp, "getMessageTimestamp"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getMessageTimestamp }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var getMuteOptions_std_exports = {}; __export(getMuteOptions_std_exports, { getMuteOptions: () => getMuteOptions, getMuteValuesOptions: () => getMuteValuesOptions }); module.exports = __toCommonJS(getMuteOptions_std_exports); var durations = __toESM(require("./durations/index.std.js")); var import_getMutedUntilText_std = require("./getMutedUntilText.std.js"); var import_isConversationMuted_std = require("./isConversationMuted.std.js"); function getMuteValuesOptions(i18n) { return [ { name: i18n("icu:muteHour"), value: durations.HOUR }, { name: i18n("icu:muteEightHours"), value: 8 * durations.HOUR }, { name: i18n("icu:muteDay"), value: durations.DAY }, { name: i18n("icu:muteWeek"), value: durations.WEEK }, { name: i18n("icu:muteAlways"), value: Number.MAX_SAFE_INTEGER } ]; } __name(getMuteValuesOptions, "getMuteValuesOptions"); function getMuteOptions(muteExpiresAt, i18n) { return [ ...muteExpiresAt && (0, import_isConversationMuted_std.isConversationMuted)({ muteExpiresAt }) ? [ { name: (0, import_getMutedUntilText_std.getMutedUntilText)(muteExpiresAt, i18n), disabled: true, value: -1 }, { name: i18n("icu:unmute"), value: 0 } ] : [], ...getMuteValuesOptions(i18n) ]; } __name(getMuteOptions, "getMuteOptions"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getMuteOptions, getMuteValuesOptions }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var getMutedUntilText_std_exports = {}; __export(getMutedUntilText_std_exports, { getMutedUntilText: () => getMutedUntilText }); module.exports = __toCommonJS(getMutedUntilText_std_exports); var import_moment = __toESM(require("moment")); var import_timestamp_std = require("./timestamp.std.js"); function getMutedUntilText(muteExpiresAt, i18n) { if (Number(muteExpiresAt) >= Number.MAX_SAFE_INTEGER) { return i18n("icu:muteExpirationLabelAlways"); } const expires = (0, import_moment.default)(muteExpiresAt); const muteExpirationUntil = (0, import_timestamp_std.isToday)(expires) ? expires.format("LT") : expires.format("L, LT"); return i18n("icu:muteExpirationLabel", { duration: muteExpirationUntil }); } __name(getMutedUntilText, "getMutedUntilText"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getMutedUntilText }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var getOwn_std_exports = {}; __export(getOwn_std_exports, { getOwn: () => getOwn }); module.exports = __toCommonJS(getOwn_std_exports); function getOwn(obj, key) { return Object.hasOwn(obj, key) ? obj[key] : void 0; } __name(getOwn, "getOwn"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getOwn }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var getQuoteBodyText_std_exports = {}; __export(getQuoteBodyText_std_exports, { getQuoteBodyText: () => getQuoteBodyText }); module.exports = __toCommonJS(getQuoteBodyText_std_exports); var EmbeddedContact = __toESM(require("../types/EmbeddedContact.std.js")); function getQuoteBodyText({ messageAttributes, id, i18n }) { const storyReactionEmoji = messageAttributes.storyReaction?.emoji; if (id != null) { const { editHistory } = messageAttributes; const editedMessage = editHistory && editHistory.find((edit) => edit.timestamp === id); if (editedMessage && editedMessage.body) { return editedMessage.body; } } const { body, contact: embeddedContact, poll } = messageAttributes; const embeddedContactName = embeddedContact && embeddedContact.length > 0 ? EmbeddedContact.getName(embeddedContact[0]) : ""; const pollText = poll ? i18n("icu:Poll--preview", { pollQuestion: poll.question }) : void 0; return body || embeddedContactName || pollText || storyReactionEmoji; } __name(getQuoteBodyText, "getQuoteBodyText"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getQuoteBodyText }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var getSendTarget_std_exports = {}; __export(getSendTarget_std_exports, { getSendTarget: () => getSendTarget }); module.exports = __toCommonJS(getSendTarget_std_exports); function getSendTarget({ serviceId, pni }) { return serviceId || pni; } __name(getSendTarget, "getSendTarget"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getSendTarget }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var getStoryBackground_std_exports = {}; __export(getStoryBackground_std_exports, { COLOR_BLACK_INT: () => COLOR_BLACK_INT, COLOR_WHITE_INT: () => COLOR_WHITE_INT, getBackgroundColor: () => getBackgroundColor, getHexFromNumber: () => getHexFromNumber, getStoryBackground: () => getStoryBackground }); module.exports = __toCommonJS(getStoryBackground_std_exports); const COLOR_BLACK_ALPHA_90 = "rgba(0, 0, 0, 0.9)"; const COLOR_BLACK_INT = 4278190080; const COLOR_WHITE_INT = 4294704123; function getHexFromNumber(color) { return `#${color.toString(16).slice(2)}`; } __name(getHexFromNumber, "getHexFromNumber"); function getBackgroundColor({ color, gradient }) { if (gradient?.colors?.length && gradient?.colors.length === gradient?.positions?.length) { const values = [`${gradient.angle}deg`]; for (const [i, step] of gradient.colors.entries()) { const position = gradient.positions[i] ?? 1; const stepHex = getHexFromNumber(step || COLOR_WHITE_INT); if (position == null) { values.push(stepHex); } else { values.push(`${stepHex} ${position * 100}%`); } } return `linear-gradient(${values.join(", ")}) border-box`; } if (gradient) { return `linear-gradient(${gradient.angle}deg, ${getHexFromNumber( gradient.startColor || COLOR_WHITE_INT )}, ${getHexFromNumber(gradient.endColor || COLOR_WHITE_INT)}) border-box`; } return getHexFromNumber(color || COLOR_WHITE_INT); } __name(getBackgroundColor, "getBackgroundColor"); function getStoryBackground(attachment) { if (!attachment) { return COLOR_BLACK_ALPHA_90; } if (attachment.textAttachment) { return getBackgroundColor(attachment.textAttachment); } if (attachment.screenshot && attachment.screenshot.url) { return `url("${attachment.screenshot.url}")`; } if (attachment.url) { return `url("${attachment.url}")`; } return COLOR_BLACK_ALPHA_90; } __name(getStoryBackground, "getStoryBackground"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { COLOR_BLACK_INT, COLOR_WHITE_INT, getBackgroundColor, getHexFromNumber, getStoryBackground }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var getStoryReplyText_std_exports = {}; __export(getStoryReplyText_std_exports, { getStoryReplyText: () => getStoryReplyText }); module.exports = __toCommonJS(getStoryReplyText_std_exports); var import_Attachment_std = require("./Attachment.std.js"); function getStoryReplyText(i18n, attachment) { if (!attachment) { return i18n("icu:Quote__story-unavailable"); } const attachments = [attachment]; if ((0, import_Attachment_std.isImage)(attachments)) { return i18n("icu:message--getNotificationText--photo"); } if ((0, import_Attachment_std.isGIF)(attachments)) { return i18n("icu:message--getNotificationText--gif"); } if ((0, import_Attachment_std.isVideo)(attachments)) { return i18n("icu:message--getNotificationText--video"); } if (attachment.textAttachment && attachment.textAttachment.text) { return attachment.textAttachment.text; } return i18n("icu:message--getNotificationText--file"); } __name(getStoryReplyText, "getStoryReplyText"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getStoryReplyText }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var getStreamWithTimeout_node_exports = {}; __export(getStreamWithTimeout_node_exports, { StreamTimeoutError: () => StreamTimeoutError, getStreamWithTimeout: () => getStreamWithTimeout, getTimeoutStream: () => getTimeoutStream }); module.exports = __toCommonJS(getStreamWithTimeout_node_exports); var import_node_stream = require("node:stream"); var Bytes = __toESM(require("../Bytes.std.js")); var import_clearTimeoutIfNecessary_std = require("./clearTimeoutIfNecessary.std.js"); var import_explodePromise_std = require("./explodePromise.std.js"); class StreamTimeoutError extends Error { static { __name(this, "StreamTimeoutError"); } } function getStreamWithTimeout(stream, { name, timeout, abortController }) { const { promise, resolve, reject } = (0, import_explodePromise_std.explodePromise)(); const chunks = new Array(); let timer; const clearTimer = /* @__PURE__ */ __name(() => { (0, import_clearTimeoutIfNecessary_std.clearTimeoutIfNecessary)(timer); timer = void 0; }, "clearTimer"); const reset = /* @__PURE__ */ __name(() => { clearTimer(); timer = setTimeout(() => { abortController.abort(); reject(new StreamTimeoutError(`getStreamWithTimeout(${name}) timed out`)); }, timeout); }, "reset"); stream.on("data", (chunk) => { reset(); chunks.push(chunk); }); stream.on("end", () => { clearTimer(); resolve(Bytes.concatenate(chunks)); }); stream.on("error", (error) => { clearTimer(); reject(error); }); reset(); return promise; } __name(getStreamWithTimeout, "getStreamWithTimeout"); function getTimeoutStream({ name, timeout, abortController }) { const timeoutStream = new import_node_stream.Transform(); let timer; const clearTimer = /* @__PURE__ */ __name(() => { (0, import_clearTimeoutIfNecessary_std.clearTimeoutIfNecessary)(timer); timer = void 0; }, "clearTimer"); const reset = /* @__PURE__ */ __name(() => { clearTimer(); timer = setTimeout(() => { abortController.abort(); timeoutStream.emit( "error", new StreamTimeoutError(`getStreamWithTimeout(${name}) timed out`) ); clearTimer(); }, timeout); }, "reset"); timeoutStream._transform = /* @__PURE__ */ __name(function transform(chunk, _encoding, done) { try { reset(); } catch (error) { return done(error); } this.push(chunk); done(); }, "transform"); reset(); return timeoutStream; } __name(getTimeoutStream, "getTimeoutStream"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { StreamTimeoutError, getStreamWithTimeout, getTimeoutStream }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var getStringForConversationMerge_std_exports = {}; __export(getStringForConversationMerge_std_exports, { getStringForConversationMerge: () => getStringForConversationMerge }); module.exports = __toCommonJS(getStringForConversationMerge_std_exports); function getStringForConversationMerge({ obsoleteConversationTitle, obsoleteConversationNumber, conversationTitle, i18n }) { if (!obsoleteConversationTitle) { return i18n("icu:ConversationMerge--notification--no-title", { conversationTitle }); } if (obsoleteConversationNumber) { return i18n("icu:ConversationMerge--notification--with-e164", { conversationTitle, obsoleteConversationNumber }); } return i18n("icu:ConversationMerge--notification", { obsoleteConversationTitle, conversationTitle }); } __name(getStringForConversationMerge, "getStringForConversationMerge"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getStringForConversationMerge }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var getStringForPhoneNumberDiscovery_std_exports = {}; __export(getStringForPhoneNumberDiscovery_std_exports, { getStringForPhoneNumberDiscovery: () => getStringForPhoneNumberDiscovery }); module.exports = __toCommonJS(getStringForPhoneNumberDiscovery_std_exports); function getStringForPhoneNumberDiscovery({ phoneNumber, i18n, conversationTitle, sharedGroup }) { if (sharedGroup) { return i18n("icu:PhoneNumberDiscovery--notification--withSharedGroup", { phoneNumber, conversationTitle, sharedGroup }); } return i18n("icu:PhoneNumberDiscovery--notification--noSharedGroup", { phoneNumber, conversationTitle }); } __name(getStringForPhoneNumberDiscovery, "getStringForPhoneNumberDiscovery"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getStringForPhoneNumberDiscovery }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var getStringForProfileChange_std_exports = {}; __export(getStringForProfileChange_std_exports, { getStringForProfileChange: () => getStringForProfileChange }); module.exports = __toCommonJS(getStringForProfileChange_std_exports); function getStringForProfileChange(change, changedContact, i18n) { if (change.type === "name") { return changedContact.name ? i18n("icu:contactChangedProfileName", { sender: changedContact.title, oldProfile: change.oldName, newProfile: change.newName }) : i18n("icu:changedProfileName", { oldProfile: change.oldName, newProfile: change.newName }); } throw new Error("TimelineItem: Unknown type!"); } __name(getStringForProfileChange, "getStringForProfileChange"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getStringForProfileChange }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var getTestMegaphone_std_exports = {}; __export(getTestMegaphone_std_exports, { TEST_MEGAPHONE_IMAGE: () => TEST_MEGAPHONE_IMAGE, internalGetTestMegaphone: () => internalGetTestMegaphone, isTestMegaphone: () => isTestMegaphone, isTestMegaphoneId: () => isTestMegaphoneId }); module.exports = __toCommonJS(getTestMegaphone_std_exports); var import_Megaphone_std = require("../types/Megaphone.std.js"); var import_index_std = require("./durations/index.std.js"); const INTERNAL_TEST_ID = "INTERNAL_TEST"; const TEST_MEGAPHONE_IMAGE = "images/donate-heart.png"; function internalGetTestMegaphone(props) { return { priority: 100, desktopMinVersion: "1.0.0", dontShowBeforeEpochMs: Date.now() - 1 * import_index_std.DAY, dontShowAfterEpochMs: Date.now() + 14 * import_index_std.DAY, showForNumberOfDays: 30, conditionalId: "internal", primaryCtaId: import_Megaphone_std.MegaphoneCtaId.Donate, primaryCtaData: null, secondaryCtaId: import_Megaphone_std.MegaphoneCtaId.Snooze, secondaryCtaData: { snoozeDurationDays: [5, 7, 100] }, localeFetched: "en", title: "Donate Today", body: "As a nonprofit, Signal needs your support.", imagePath: TEST_MEGAPHONE_IMAGE, primaryCtaText: "Donate", secondaryCtaText: "Snooze", snoozeCount: 0, snoozedAt: null, shownAt: null, isFinished: false, ...props, id: INTERNAL_TEST_ID }; } __name(internalGetTestMegaphone, "internalGetTestMegaphone"); function isTestMegaphone(megaphone) { return megaphone.id === INTERNAL_TEST_ID; } __name(isTestMegaphone, "isTestMegaphone"); function isTestMegaphoneId(id) { return id === INTERNAL_TEST_ID; } __name(isTestMegaphoneId, "isTestMegaphoneId"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { TEST_MEGAPHONE_IMAGE, internalGetTestMegaphone, isTestMegaphone, isTestMegaphoneId }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var getUserAgent_node_exports = {}; __export(getUserAgent_node_exports, { getUserAgent: () => getUserAgent }); module.exports = __toCommonJS(getUserAgent_node_exports); var import_node_os = __toESM(require("node:os")); var import_getOwn_std = require("./getOwn.std.js"); const PLATFORM_STRINGS = { win32: "Windows", darwin: "macOS", linux: "Linux" }; function getUserAgent(appVersion, release = import_node_os.default.release()) { const platformString = (0, import_getOwn_std.getOwn)(PLATFORM_STRINGS, process.platform); let result = `Signal-Desktop/${appVersion}`; if (platformString) { result += ` ${platformString} ${release}`; } return result; } __name(getUserAgent, "getUserAgent"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getUserAgent }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var gracefulFs_node_exports = {}; __export(gracefulFs_node_exports, { gracefulRename: () => gracefulRename, gracefulRmRecursive: () => gracefulRmRecursive }); module.exports = __toCommonJS(gracefulFs_node_exports); var import_promises = require("node:fs/promises"); var import_index_std = require("./durations/index.std.js"); var import_timestamp_std = require("./timestamp.std.js"); var import_sleep_std = require("./sleep.std.js"); async function doGracefulFSOperation({ name, operation, args, logger, startedAt, retryCount, retryAfter = 5 * import_index_std.SECOND, timeout = 5 * import_index_std.MINUTE }) { const logId = `gracefulFS(${name})`; try { await operation(...args); if (retryCount !== 0) { logger.info( `${logId}: succeeded after ${retryCount} retries, ${args.join(", ")}` ); } } catch (error) { if (error.code !== "EACCES" && error.code !== "EPERM") { throw error; } if ((0, import_timestamp_std.isOlderThan)(startedAt, timeout)) { logger.warn(`${logId}: timed out, ${args.join(", ")}`); throw error; } logger.warn( `${logId}: got ${error.code} when running on ${args.join(", ")}; retrying in one second. (retryCount=${retryCount})` ); await (0, import_sleep_std.sleep)(retryAfter); return doGracefulFSOperation({ name, operation, args, logger, startedAt, retryCount: retryCount + 1, retryAfter, timeout }); } } __name(doGracefulFSOperation, "doGracefulFSOperation"); async function gracefulRename(logger, fromPath, toPath) { return doGracefulFSOperation({ name: "rename", operation: import_promises.rename, args: [fromPath, toPath], logger, startedAt: Date.now(), retryCount: 0 }); } __name(gracefulRename, "gracefulRename"); function rmRecursive(path) { return (0, import_promises.rm)(path, { recursive: true, force: true }); } __name(rmRecursive, "rmRecursive"); async function gracefulRmRecursive(logger, path) { return doGracefulFSOperation({ name: "rmRecursive", operation: rmRecursive, args: [path], logger, startedAt: Date.now(), retryCount: 0 }); } __name(gracefulRmRecursive, "gracefulRmRecursive"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { gracefulRename, gracefulRmRecursive }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var grapheme_std_exports = {}; __export(grapheme_std_exports, { count: () => count, getGraphemes: () => getGraphemes, hasAtMostGraphemes: () => hasAtMostGraphemes, isSingleGrapheme: () => isSingleGrapheme, truncateAndSize: () => truncateAndSize }); module.exports = __toCommonJS(grapheme_std_exports); var import_memoizee = __toESM(require("memoizee")); var import_iterables_std = require("./iterables.std.js"); const getSegmenter = (0, import_memoizee.default)(() => new Intl.Segmenter()); function getGraphemes(str) { const segments = getSegmenter().segment(str); return (0, import_iterables_std.map)(segments, (s) => s.segment); } __name(getGraphemes, "getGraphemes"); function count(str) { const segments = getSegmenter().segment(str); return (0, import_iterables_std.size)(segments); } __name(count, "count"); function truncateAndSize(str, toSize) { const segments = getSegmenter().segment(str); const originalSize = (0, import_iterables_std.size)(segments); if (toSize === void 0 || originalSize <= toSize) { return [str, originalSize]; } return [ (0, import_iterables_std.join)( (0, import_iterables_std.map)((0, import_iterables_std.take)(segments, toSize), (s) => s.segment), "" ), toSize ]; } __name(truncateAndSize, "truncateAndSize"); function isSingleGrapheme(str) { if (str === "") { return false; } const segments = getSegmenter().segment(str); return segments.containing(0).segment === str; } __name(isSingleGrapheme, "isSingleGrapheme"); function hasAtMostGraphemes(str, max) { if (max < 0) { return false; } let countSoFar = 0; for (const _ of getSegmenter().segment(str)) { countSoFar += 1; if (countSoFar > max) { return false; } } return true; } __name(hasAtMostGraphemes, "hasAtMostGraphemes"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { count, getGraphemes, hasAtMostGraphemes, isSingleGrapheme, truncateAndSize }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var graphemeAndLinkAwareSlice_std_exports = {}; __export(graphemeAndLinkAwareSlice_std_exports, { graphemeAndLinkAwareSlice: () => graphemeAndLinkAwareSlice }); module.exports = __toCommonJS(graphemeAndLinkAwareSlice_std_exports); var import_linkify_it = __toESM(require("linkify-it")); function graphemeAndLinkAwareSlice(str, length, buffer = 100) { if (str.length <= length + buffer) { return { text: str, hasReadMore: false }; } let text; for (const { index } of new Intl.Segmenter().segment(str)) { if (!text && index >= length) { text = str.slice(0, index); } if (text && index > length) { text = expandToIncludeEntireLink(str, text); return { text, hasReadMore: text.length < str.length }; } } return { text: str, hasReadMore: false }; } __name(graphemeAndLinkAwareSlice, "graphemeAndLinkAwareSlice"); const expandToIncludeEntireLink = /* @__PURE__ */ __name((original, truncated) => { const linksInText = new import_linkify_it.default().match(original); if (!linksInText) { return truncated; } const invalidTruncationRanges = linksInText.map( ({ index: startIndex, lastIndex }) => ({ startIndex, lastIndex }) ); const truncatedLink = invalidTruncationRanges.filter( ({ startIndex, lastIndex }) => startIndex < truncated.length && lastIndex > truncated.length ); if (truncatedLink.length === 0) { return truncated; } return original.slice(0, truncatedLink[0].lastIndex); }, "expandToIncludeEntireLink"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { graphemeAndLinkAwareSlice }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var groupMemberNameCollisions_std_exports = {}; __export(groupMemberNameCollisions_std_exports, { dehydrateCollisionsWithConversations: () => dehydrateCollisionsWithConversations, getCollisionsFromMemberships: () => getCollisionsFromMemberships, hasUnacknowledgedCollisions: () => hasUnacknowledgedCollisions, invertIdsByTitle: () => invertIdsByTitle }); module.exports = __toCommonJS(groupMemberNameCollisions_std_exports); var import_lodash = __toESM(require("lodash")); var import_iterables_std = require("./iterables.std.js"); var import_getOwn_std = require("./getOwn.std.js"); var import_isConversationNameKnown_std = require("./isConversationNameKnown.std.js"); var import_isInSystemContacts_std = require("./isInSystemContacts.std.js"); const { mapValues, pickBy } = import_lodash.default; const dehydrateCollisionsWithConversations = /* @__PURE__ */ __name((withConversations) => mapValues(withConversations, (conversations) => conversations.map((c) => c.id)), "dehydrateCollisionsWithConversations"); function getCollisionsFromMemberships(memberships) { const members = (0, import_iterables_std.map)(memberships, (membership) => membership.member); const candidateMembers = (0, import_iterables_std.filter)( members, (member) => !member.isMe && (0, import_isConversationNameKnown_std.isConversationNameKnown)(member) ); const groupedByTitle = (0, import_iterables_std.groupBy)(candidateMembers, (member) => member.title); return pickBy( groupedByTitle, (group) => group.length >= 2 && !group.every((person) => (0, import_isInSystemContacts_std.isInSystemContacts)(person)) ); } __name(getCollisionsFromMemberships, "getCollisionsFromMemberships"); const hasUnacknowledgedCollisions = /* @__PURE__ */ __name((previous, current) => Object.entries(current).some(([title, currentIds]) => { const previousIds = new Set((0, import_getOwn_std.getOwn)(previous, title) || []); return currentIds.some((currentId) => !previousIds.has(currentId)); }), "hasUnacknowledgedCollisions"); const invertIdsByTitle = /* @__PURE__ */ __name((idsByTitle) => { const result = /* @__PURE__ */ Object.create(null); Object.entries(idsByTitle).forEach(([title, ids]) => { ids.forEach((id) => { result[id] = title; }); }); return result; }, "invertIdsByTitle"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { dehydrateCollisionsWithConversations, getCollisionsFromMemberships, hasUnacknowledgedCollisions, invertIdsByTitle }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var groupWhile_std_exports = {}; __export(groupWhile_std_exports, { formatGroups: () => formatGroups, groupWhile: () => groupWhile }); module.exports = __toCommonJS(groupWhile_std_exports); function groupWhile(array, iteratee) { const groups = []; let cursor = 0; while (cursor < array.length) { const group = []; do { group.push(array[cursor]); cursor += 1; if (!iteratee(array[cursor], array[cursor - 1])) { break; } } while (cursor < array.length); groups.push(group); } return groups; } __name(groupWhile, "groupWhile"); function formatGroups(groups, rangeSeparator, groupSeparator, formatItem) { return groups.map((group) => { if (group.length === 0) { return ""; } const start = formatItem(group.at(0)); if (group.length === 1) { return start; } const end = formatItem(group.at(-1)); return `${start}${rangeSeparator}${end}`; }).join(groupSeparator); } __name(formatGroups, "formatGroups"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { formatGroups, groupWhile }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var hasAttachmentDownloads_std_exports = {}; __export(hasAttachmentDownloads_std_exports, { hasAttachmentDownloads: () => hasAttachmentDownloads }); module.exports = __toCommonJS(hasAttachmentDownloads_std_exports); var import_lodash = __toESM(require("lodash")); var import_MIME_std = require("../types/MIME.std.js"); const { partition } = import_lodash.default; function hasAttachmentDownloads(message) { const attachments = message.attachments || []; const [longMessageAttachments, normalAttachments] = partition( attachments, (attachment) => (0, import_MIME_std.isLongMessage)(attachment.contentType) ); if (longMessageAttachments.length > 0 || message.bodyAttachment) { return true; } const hasNormalAttachments = hasNormalAttachmentDownloads(normalAttachments); if (hasNormalAttachments) { return true; } const hasPreviews = hasPreviewDownloads(message.preview); if (hasPreviews) { return true; } const contacts = message.contact || []; const hasContacts = contacts.some((item) => { if (!item.avatar || !item.avatar.avatar) { return false; } if (item.avatar.avatar.path) { return false; } return true; }); if (hasContacts) { return true; } const { quote } = message; const quoteAttachments = quote && quote.attachments ? quote.attachments : []; const hasQuoteAttachments = quoteAttachments.some((item) => { if (!item.thumbnail) { return false; } if (item.thumbnail.path) { return false; } return true; }); if (hasQuoteAttachments) { return true; } const { sticker } = message; if (sticker) { return !sticker.data || sticker.data && !sticker.data.path; } const { editHistory } = message; if (editHistory) { const hasAttachmentsWithinEditHistory = editHistory.some( (edit) => hasNormalAttachmentDownloads(edit.attachments) || hasPreviewDownloads(edit.preview) ); if (hasAttachmentsWithinEditHistory) { return true; } } return false; } __name(hasAttachmentDownloads, "hasAttachmentDownloads"); function hasPreviewDownloads(previews) { return (previews || []).some((item) => { if (!item.image) { return false; } if (item.image.path) { return false; } return true; }); } __name(hasPreviewDownloads, "hasPreviewDownloads"); function hasNormalAttachmentDownloads(attachments) { return (attachments || []).some((attachment) => { if (!attachment) { return false; } if (attachment.path) { return false; } return true; }); } __name(hasNormalAttachmentDownloads, "hasNormalAttachmentDownloads"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { hasAttachmentDownloads }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var hasDraft_std_exports = {}; __export(hasDraft_std_exports, { hasDraft: () => hasDraft }); module.exports = __toCommonJS(hasDraft_std_exports); function hasDraft(attributes) { const draftAttachments = attributes.draftAttachments || []; return attributes.draft || attributes.quotedMessageId || draftAttachments.length > 0; } __name(hasDraft, "hasDraft"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { hasDraft }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var hasDraftAttachments_std_exports = {}; __export(hasDraftAttachments_std_exports, { hasDraftAttachments: () => hasDraftAttachments }); module.exports = __toCommonJS(hasDraftAttachments_std_exports); function hasDraftAttachments(draftAttachments, options) { if (!draftAttachments) { return false; } if (options.includePending) { return draftAttachments.length > 0; } return draftAttachments.some((item) => !item.pending); } __name(hasDraftAttachments, "hasDraftAttachments"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { hasDraftAttachments }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var hslToRGB_std_exports = {}; __export(hslToRGB_std_exports, { hslToRGB: () => hslToRGB, hslToRGBInt: () => hslToRGBInt }); module.exports = __toCommonJS(hslToRGB_std_exports); function hslToRGB(h, s, l) { const a = s * Math.min(l, 1 - l); function f(n) { const k = (n + h / 30) % 12; return l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1); } __name(f, "f"); return { r: Math.round(255 * f(0)), g: Math.round(255 * f(8)), b: Math.round(255 * f(4)) }; } __name(hslToRGB, "hslToRGB"); function hslToRGBInt(hue, saturation, lightness) { const { r, g, b } = hslToRGB(hue, saturation, lightness); return (255 << 24 | r << 16 | g << 8 | b) >>> 0; } __name(hslToRGBInt, "hslToRGBInt"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { hslToRGB, hslToRGBInt }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var inspectProtobufs_std_exports = {}; __export(inspectProtobufs_std_exports, { inspectUnknownFieldTags: () => inspectUnknownFieldTags }); module.exports = __toCommonJS(inspectProtobufs_std_exports); var import_protobufjs = __toESM(require("protobufjs")); const { Reader } = import_protobufjs.default; function inspectUnknownFieldTags(message) { return message.$unknownFields?.map((field) => { return new Reader(field).uint32() >>> 3; }) ?? []; } __name(inspectUnknownFieldTags, "inspectUnknownFieldTags"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { inspectUnknownFieldTags }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var isAbortError_std_exports = {}; __export(isAbortError_std_exports, { isAbortError: () => isAbortError }); module.exports = __toCommonJS(isAbortError_std_exports); function isAbortError(error) { return error instanceof Error && "type" in error && error.type === "aborted" || error instanceof DOMException && error.name === "AbortError"; } __name(isAbortError, "isAbortError"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { isAbortError }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var isAciString_std_exports = {}; __export(isAciString_std_exports, { isAciString: () => isAciString }); module.exports = __toCommonJS(isAciString_std_exports); var import_isValidUuid_std = require("./isValidUuid.std.js"); function isAciString(value) { return (0, import_isValidUuid_std.isValidUuid)(value); } __name(isAciString, "isAciString"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { isAciString }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var isConversationMuted_std_exports = {}; __export(isConversationMuted_std_exports, { isConversationMuted: () => isConversationMuted }); module.exports = __toCommonJS(isConversationMuted_std_exports); const isConversationMuted = /* @__PURE__ */ __name(({ muteExpiresAt }) => Boolean(muteExpiresAt && Date.now() < muteExpiresAt), "isConversationMuted"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { isConversationMuted }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var isConversationNameKnown_std_exports = {}; __export(isConversationNameKnown_std_exports, { isConversationNameKnown: () => isConversationNameKnown }); module.exports = __toCommonJS(isConversationNameKnown_std_exports); var import_missingCaseError_std = require("./missingCaseError.std.js"); function isConversationNameKnown(conversation) { switch (conversation.type) { case "direct": return Boolean( conversation.name || conversation.profileName || conversation.e164 ); case "group": return Boolean(conversation.name); default: throw (0, import_missingCaseError_std.missingCaseError)(conversation.type); } } __name(isConversationNameKnown, "isConversationNameKnown"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { isConversationNameKnown }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var isConversationSMSOnly_std_exports = {}; __export(isConversationSMSOnly_std_exports, { isConversationSMSOnly: () => isConversationSMSOnly }); module.exports = __toCommonJS(isConversationSMSOnly_std_exports); function isConversationSMSOnly(conversation) { const { e164, serviceId, type } = conversation; if (type !== "direct" && type !== "private") { return false; } if (serviceId) { return false; } if (!e164) { return false; } return true; } __name(isConversationSMSOnly, "isConversationSMSOnly"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { isConversationSMSOnly }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var isConversationUnread_std_exports = {}; __export(isConversationUnread_std_exports, { isConversationUnread: () => isConversationUnread }); module.exports = __toCommonJS(isConversationUnread_std_exports); var import_lodash = __toESM(require("lodash")); const { isNumber } = import_lodash.default; const isConversationUnread = /* @__PURE__ */ __name(({ markedUnread, unreadCount }) => Boolean(markedUnread || isNumber(unreadCount) && unreadCount > 0), "isConversationUnread"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { isConversationUnread }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var isFileDangerous_std_exports = {}; __export(isFileDangerous_std_exports, { isFileDangerous: () => isFileDangerous }); module.exports = __toCommonJS(isFileDangerous_std_exports); const DANGEROUS_FILE_TYPES = /\.(ADE|ADP|APK|BAT|CAB|CHM|CMD|COM|CPL|DIAGCAB|DLL|DMG|EXE|HTA|INF|INS|ISP|JAR|JS|JSE|LIB|LNK|MDE|MHT|MSC|MSI|MSP|MST|NSH|PIF|PS1|PSC1|PSM1|PSRC|REG|SCR|SCT|SETTINGCONTENT-MS|SHB|SYS|VB|VBE|VBS|VXD|WSC|WSF|WSH)(\.|\s+)?$/i; function isFileDangerous(fileName) { return DANGEROUS_FILE_TYPES.test(fileName); } __name(isFileDangerous, "isFileDangerous"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { isFileDangerous }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var isGroupInStoryMode_std_exports = {}; __export(isGroupInStoryMode_std_exports, { isGroupInStoryMode: () => isGroupInStoryMode }); module.exports = __toCommonJS(isGroupInStoryMode_std_exports); var import_Stories_std = require("../types/Stories.std.js"); var import_assert_std = require("./assert.std.js"); function isGroupInStoryMode({ id, type, storySendMode }, conversationIdsWithStories) { if (type !== "group") { return false; } (0, import_assert_std.assertDev)( storySendMode !== void 0, "isGroupInStoryMode: groups must have storySendMode field" ); if (storySendMode === import_Stories_std.StorySendMode.IfActive) { return conversationIdsWithStories.has(id); } return storySendMode === import_Stories_std.StorySendMode.Always; } __name(isGroupInStoryMode, "isGroupInStoryMode"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { isGroupInStoryMode }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var isGroupOrAdhocCall_std_exports = {}; __export(isGroupOrAdhocCall_std_exports, { isGroupOrAdhocActiveCall: () => isGroupOrAdhocActiveCall, isGroupOrAdhocCallMode: () => isGroupOrAdhocCallMode, isGroupOrAdhocCallState: () => isGroupOrAdhocCallState }); module.exports = __toCommonJS(isGroupOrAdhocCall_std_exports); var import_CallDisposition_std = require("../types/CallDisposition.std.js"); function isGroupOrAdhocActiveCall(activeCall) { return Boolean(activeCall && isGroupOrAdhocCallMode(activeCall.callMode)); } __name(isGroupOrAdhocActiveCall, "isGroupOrAdhocActiveCall"); function isGroupOrAdhocCallMode(callMode) { return callMode === import_CallDisposition_std.CallMode.Group || callMode === import_CallDisposition_std.CallMode.Adhoc; } __name(isGroupOrAdhocCallMode, "isGroupOrAdhocCallMode"); function isGroupOrAdhocCallState(callState) { return Boolean( callState && (callState.callMode === import_CallDisposition_std.CallMode.Group || callState.callMode === import_CallDisposition_std.CallMode.Adhoc) ); } __name(isGroupOrAdhocCallState, "isGroupOrAdhocCallState"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { isGroupOrAdhocActiveCall, isGroupOrAdhocCallMode, isGroupOrAdhocCallState }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var isInSystemContacts_std_exports = {}; __export(isInSystemContacts_std_exports, { isInSystemContacts: () => isInSystemContacts }); module.exports = __toCommonJS(isInSystemContacts_std_exports); const isInSystemContacts = /* @__PURE__ */ __name(({ type, name, systemGivenName, systemFamilyName }) => ( // `direct` for redux, `private` for models and the database (type === "direct" || type === "private") && (typeof name === "string" || typeof systemGivenName === "string" || typeof systemFamilyName === "string") ), "isInSystemContacts"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { isInSystemContacts }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var isMessageUnread_std_exports = {}; __export(isMessageUnread_std_exports, { isMessageUnread: () => isMessageUnread }); module.exports = __toCommonJS(isMessageUnread_std_exports); var import_MessageReadStatus_std = require("../messages/MessageReadStatus.std.js"); const isMessageUnread = /* @__PURE__ */ __name((message) => message.readStatus === import_MessageReadStatus_std.ReadStatus.Unread, "isMessageUnread"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { isMessageUnread }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var isNormalNumber_std_exports = {}; __export(isNormalNumber_std_exports, { isNormalNumber: () => isNormalNumber }); module.exports = __toCommonJS(isNormalNumber_std_exports); function isNormalNumber(value) { return typeof value === "number" && !Number.isNaN(value) && Number.isFinite(value); } __name(isNormalNumber, "isNormalNumber"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { isNormalNumber }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var isNotNil_std_exports = {}; __export(isNotNil_std_exports, { isNotNil: () => isNotNil }); module.exports = __toCommonJS(isNotNil_std_exports); function isNotNil(value) { if (value == null) { return false; } return true; } __name(isNotNil, "isNotNil"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { isNotNil }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var isPathInside_node_exports = {}; __export(isPathInside_node_exports, { isPathInside: () => isPathInside }); module.exports = __toCommonJS(isPathInside_node_exports); var path = __toESM(require("node:path")); function isPathInside(childPath, parentPath) { const childPathResolved = path.resolve(childPath); let parentPathResolved = path.resolve(parentPath); if (!parentPathResolved.endsWith(path.sep)) { parentPathResolved += path.sep; } return childPathResolved !== parentPathResolved && childPathResolved.startsWith(parentPathResolved); } __name(isPathInside, "isPathInside"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { isPathInside }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var isRecord_std_exports = {}; __export(isRecord_std_exports, { isRecord: () => isRecord }); module.exports = __toCommonJS(isRecord_std_exports); const isRecord = /* @__PURE__ */ __name((value) => typeof value === "object" && !Array.isArray(value) && value != null, "isRecord"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { isRecord }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var isSafetyNumberNotAvailable_std_exports = {}; __export(isSafetyNumberNotAvailable_std_exports, { isSafetyNumberNotAvailable: () => isSafetyNumberNotAvailable }); module.exports = __toCommonJS(isSafetyNumberNotAvailable_std_exports); var import_isAciString_std = require("./isAciString.std.js"); const isSafetyNumberNotAvailable = /* @__PURE__ */ __name((contact) => { if (!contact) { return true; } return !(0, import_isAciString_std.isAciString)(contact.serviceId); }, "isSafetyNumberNotAvailable"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { isSafetyNumberNotAvailable }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var isSameAvatarData_std_exports = {}; __export(isSameAvatarData_std_exports, { isSameAvatarData: () => isSameAvatarData }); module.exports = __toCommonJS(isSameAvatarData_std_exports); function isSameAvatarData(a, b) { if (!a || !b) { return false; } if (a.buffer && b.buffer) { return a.buffer === b.buffer; } if (a.imagePath && b.imagePath) { return a.imagePath === b.imagePath; } return a.id === b.id; } __name(isSameAvatarData, "isSameAvatarData"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { isSameAvatarData }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var isShallowEqual_std_exports = {}; __export(isShallowEqual_std_exports, { isShallowEqual: () => isShallowEqual }); module.exports = __toCommonJS(isShallowEqual_std_exports); function isShallowEqual(a, b) { if (a === b) { return true; } if (typeof a !== typeof b) { return false; } if (a == null || b == null) { return false; } if (typeof a !== "object") { return false; } const keys = Object.keys(a); if (keys.length !== Object.keys(b).length) { return false; } for (const key of keys) { if (a[key] !== b[key]) { return false; } } return true; } __name(isShallowEqual, "isShallowEqual"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { isShallowEqual }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var isSorted_std_exports = {}; __export(isSorted_std_exports, { isSorted: () => isSorted }); module.exports = __toCommonJS(isSorted_std_exports); function isSorted(list) { let previousItem; for (const item of list) { if (previousItem !== void 0 && item < previousItem) { return false; } previousItem = item; } return true; } __name(isSorted, "isSorted"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { isSorted }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var isTooOldToModifyMessage_std_exports = {}; __export(isTooOldToModifyMessage_std_exports, { isTooOldToModifyMessage: () => isTooOldToModifyMessage }); module.exports = __toCommonJS(isTooOldToModifyMessage_std_exports); var import_index_std = require("./durations/index.std.js"); function isTooOldToModifyMessage(serverTimestamp, message) { const messageTimestamp = message.serverTimestamp || message.sent_at || 0; const delta = Math.abs(serverTimestamp - messageTimestamp); return delta > import_index_std.DAY * 2; } __name(isTooOldToModifyMessage, "isTooOldToModifyMessage"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { isTooOldToModifyMessage }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var isValidE164_std_exports = {}; __export(isValidE164_std_exports, { isValidE164: () => isValidE164 }); module.exports = __toCommonJS(isValidE164_std_exports); function isValidE164(value, mustStartWithPlus) { if (typeof value !== "string") { return false; } const regex = mustStartWithPlus ? /^\+[1-9]\d{1,14}$/ : /^\+?[1-9]\d{1,14}$/; return regex.test(value); } __name(isValidE164, "isValidE164"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { isValidE164 }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var isValidTapToView_std_exports = {}; __export(isValidTapToView_std_exports, { isValidTapToView: () => isValidTapToView }); module.exports = __toCommonJS(isValidTapToView_std_exports); var GoogleChrome = __toESM(require("./GoogleChrome.std.js")); function isValidTapToView(message) { const { body } = message; if (body) { return false; } const { attachments } = message; if (!attachments || attachments.length !== 1) { return false; } const firstAttachment = attachments[0]; if (!GoogleChrome.isImageTypeSupported(firstAttachment.contentType) && !GoogleChrome.isVideoTypeSupported(firstAttachment.contentType)) { return false; } const { quote, sticker, contact, preview } = message; if (quote || sticker || contact && contact.length > 0 || preview && preview.length > 0) { return false; } return true; } __name(isValidTapToView, "isValidTapToView"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { isValidTapToView }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var isValidUuid_std_exports = {}; __export(isValidUuid_std_exports, { isValidUuid: () => isValidUuid, isValidUuidV7: () => isValidUuidV7 }); module.exports = __toCommonJS(isValidUuid_std_exports); const UUID_REGEXP = /^[0-9A-F]{8}-[0-9A-F]{4}-[47][0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i; const isValidUuid = /* @__PURE__ */ __name((value) => { if (typeof value !== "string") { return false; } if (value === "00000000-0000-0000-0000-000000000000") { return true; } return UUID_REGEXP.test(value); }, "isValidUuid"); const UUID_V7_REGEXP = /^[0-9A-F]{8}-[0-9A-F]{4}-7[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i; const isValidUuidV7 = /* @__PURE__ */ __name((value) => { if (typeof value !== "string") { return false; } if (value === "00000000-0000-0000-0000-000000000000") { return true; } return UUID_V7_REGEXP.test(value); }, "isValidUuidV7"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { isValidUuid, isValidUuidV7 }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var isVideoGoodForStories_std_exports = {}; __export(isVideoGoodForStories_std_exports, { ReasonVideoNotGood: () => ReasonVideoNotGood, isVideoGoodForStories: () => isVideoGoodForStories }); module.exports = __toCommonJS(isVideoGoodForStories_std_exports); var import_mp4box = __toESM(require("mp4box")); var import_MIME_std = require("../types/MIME.std.js"); var import_AttachmentSize_std = require("../types/AttachmentSize.std.js"); var import_explodePromise_std = require("./explodePromise.std.js"); const MAX_VIDEO_DURATION_IN_SEC = 30; var ReasonVideoNotGood = /* @__PURE__ */ ((ReasonVideoNotGood2) => { ReasonVideoNotGood2["AllGoodNevermind"] = "AllGoodNevermind"; ReasonVideoNotGood2["CouldNotReadFile"] = "CouldNotReadFile"; ReasonVideoNotGood2["TooLong"] = "TooLong"; ReasonVideoNotGood2["TooBig"] = "TooBig"; ReasonVideoNotGood2["UnsupportedCodec"] = "UnsupportedCodec"; ReasonVideoNotGood2["UnsupportedContainer"] = "UnsupportedContainer"; return ReasonVideoNotGood2; })(ReasonVideoNotGood || {}); function createMp4ArrayBuffer(src) { const arrayBuffer = new ArrayBuffer(src.byteLength); new Uint8Array(arrayBuffer).set(new Uint8Array(src)); arrayBuffer.fileStart = 0; return arrayBuffer; } __name(createMp4ArrayBuffer, "createMp4ArrayBuffer"); async function isVideoGoodForStories(file, { maxAttachmentSizeInKb }) { if (!(0, import_MIME_std.isVideo)(file.type)) { return { reason: "AllGoodNevermind" /* AllGoodNevermind */ }; } if (file.type !== import_MIME_std.VIDEO_MP4) { return { reason: "UnsupportedContainer" /* UnsupportedContainer */ }; } let src; { const { promise: promise2, resolve: resolve2 } = (0, import_explodePromise_std.explodePromise)(); const reader = new FileReader(); reader.onload = () => { if (reader.result) { resolve2(reader.result); } else { resolve2(void 0); } }; reader.readAsArrayBuffer(file); const maybeSrc = await promise2; if (maybeSrc === void 0) { return { reason: "CouldNotReadFile" /* CouldNotReadFile */ }; } src = maybeSrc; } if (src.byteLength / import_AttachmentSize_std.KIBIBYTE > maxAttachmentSizeInKb) { return { reason: "TooBig" /* TooBig */, renderDetails: (0, import_AttachmentSize_std.getRenderDetailsForLimit)(maxAttachmentSizeInKb) }; } const arrayBuffer = createMp4ArrayBuffer(src); const { promise, resolve } = (0, import_explodePromise_std.explodePromise)(); const mp4 = import_mp4box.default.createFile(); mp4.onReady = (info) => { const seconds = info.duration / info.timescale; if (seconds > MAX_VIDEO_DURATION_IN_SEC) { resolve({ reason: "TooLong" /* TooLong */, maxDurationInSec: MAX_VIDEO_DURATION_IN_SEC }); return; } const codecs = /codecs="([\w,.]+)"/.exec(info.mime); if (!codecs || !codecs[1]) { resolve({ reason: "UnsupportedCodec" /* UnsupportedCodec */ }); return; } const isH264 = codecs[1].split(",").some((codec) => codec.startsWith("avc1")); if (!isH264) { resolve({ reason: "UnsupportedCodec" /* UnsupportedCodec */ }); return; } resolve({ reason: "AllGoodNevermind" /* AllGoodNevermind */ }); }; mp4.appendBuffer(arrayBuffer); try { return await promise; } finally { mp4.flush(); } } __name(isVideoGoodForStories, "isVideoGoodForStories"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { ReasonVideoNotGood, isVideoGoodForStories }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var isVoiceMessagePlayed_std_exports = {}; __export(isVoiceMessagePlayed_std_exports, { isVoiceMessagePlayed: () => isVoiceMessagePlayed }); module.exports = __toCommonJS(isVoiceMessagePlayed_std_exports); var import_helpers_std = require("../messages/helpers.std.js"); var import_MessageReadStatus_std = require("../messages/MessageReadStatus.std.js"); var import_MessageSendState_std = require("../messages/MessageSendState.std.js"); function isVoiceMessagePlayed(message, ourConversationId) { if (message.isErased) { return false; } if (message.errors != null && message.errors.length > 0) { return false; } if ((0, import_helpers_std.isIncoming)(message)) { return message.readStatus === import_MessageReadStatus_std.ReadStatus.Viewed; } if ((0, import_helpers_std.isOutgoing)(message)) { const { sendStateByConversationId = {} } = message; if ((0, import_MessageSendState_std.isMessageJustForMe)(sendStateByConversationId, ourConversationId)) { return (0, import_MessageSendState_std.isSent)( (0, import_MessageSendState_std.getHighestSuccessfulRecipientStatus)( sendStateByConversationId, void 0 ) ); } return (0, import_MessageSendState_std.isViewed)( (0, import_MessageSendState_std.getHighestSuccessfulRecipientStatus)( sendStateByConversationId, ourConversationId ) ); } return false; } __name(isVoiceMessagePlayed, "isVoiceMessagePlayed"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { isVoiceMessagePlayed }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var isWindowDragElement_std_exports = {}; __export(isWindowDragElement_std_exports, { isWindowDragElement: () => isWindowDragElement }); module.exports = __toCommonJS(isWindowDragElement_std_exports); function isWindowDragElement(el) { let currentEl = el; do { const appRegion = getComputedStyle(currentEl).getPropertyValue("-webkit-app-region"); switch (appRegion) { case "no-drag": return false; case "drag": return true; default: currentEl = currentEl.parentElement; break; } } while (currentEl); return false; } __name(isWindowDragElement, "isWindowDragElement"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { isWindowDragElement }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var iterables_std_exports = {}; __export(iterables_std_exports, { chunk: () => chunk, collect: () => collect, collectFirst: () => collectFirst, concat: () => concat, every: () => every, filter: () => filter, find: () => find, groupBy: () => groupBy, isEmpty: () => isEmpty, isIterable: () => isIterable, join: () => join, map: () => map, reduce: () => reduce, repeat: () => repeat, size: () => size, take: () => take, zipObject: () => zipObject }); module.exports = __toCommonJS(iterables_std_exports); var import_getOwn_std = require("./getOwn.std.js"); function isIterable(value) { return typeof value === "object" && value != null && Symbol.iterator in value || typeof value === "string"; } __name(isIterable, "isIterable"); function size(iterable) { if (typeof iterable === "string" || Array.isArray(iterable)) { return iterable.length; } if (iterable instanceof Set || iterable instanceof Map) { return iterable.size; } const iterator = iterable[Symbol.iterator](); let result = -1; for (let done = false; !done; result += 1) { done = Boolean(iterator.next().done); } return result; } __name(size, "size"); function concat(...iterables) { return new ConcatIterable(iterables); } __name(concat, "concat"); class ConcatIterable { constructor(iterables) { this.iterables = iterables; } static { __name(this, "ConcatIterable"); } *[Symbol.iterator]() { for (const iterable of this.iterables) { yield* iterable; } } } function every(iterable, predicate) { for (const value of iterable) { if (!predicate(value)) { return false; } } return true; } __name(every, "every"); function filter(iterable, predicate) { return new FilterIterable(iterable, predicate); } __name(filter, "filter"); class FilterIterable { constructor(iterable, predicate) { this.iterable = iterable; this.predicate = predicate; } static { __name(this, "FilterIterable"); } [Symbol.iterator]() { return new FilterIterator(this.iterable[Symbol.iterator](), this.predicate); } } class FilterIterator { constructor(iterator, predicate) { this.iterator = iterator; this.predicate = predicate; } static { __name(this, "FilterIterator"); } next() { while (true) { const nextIteration = this.iterator.next(); if (nextIteration.done || this.predicate(nextIteration.value)) { return nextIteration; } } } } function collect(iterable, fn) { return new CollectIterable(iterable, fn); } __name(collect, "collect"); function collectFirst(iterable, fn) { for (const v of collect(iterable, fn)) { return v; } return void 0; } __name(collectFirst, "collectFirst"); class CollectIterable { constructor(iterable, fn) { this.iterable = iterable; this.fn = fn; } static { __name(this, "CollectIterable"); } [Symbol.iterator]() { return new CollectIterator(this.iterable[Symbol.iterator](), this.fn); } } class CollectIterator { constructor(iterator, fn) { this.iterator = iterator; this.fn = fn; } static { __name(this, "CollectIterator"); } next() { while (true) { const nextIteration = this.iterator.next(); if (nextIteration.done) { return nextIteration; } const nextValue = this.fn(nextIteration.value); if (nextValue !== void 0) { return { done: false, value: nextValue }; } } } } function find(iterable, predicate) { for (const value of iterable) { if (predicate(value)) { return value; } } return void 0; } __name(find, "find"); function groupBy(iterable, fn) { const result = /* @__PURE__ */ Object.create(null); for (const value of iterable) { const key = fn(value); const existingGroup = (0, import_getOwn_std.getOwn)(result, key); if (existingGroup) { existingGroup.push(value); } else { result[key] = [value]; } } return result; } __name(groupBy, "groupBy"); const isEmpty = /* @__PURE__ */ __name((iterable) => Boolean(iterable[Symbol.iterator]().next().done), "isEmpty"); function join(iterable, separator) { let hasProcessedFirst = false; let result = ""; for (const value of iterable) { const stringifiedValue = value == null ? "" : String(value); if (hasProcessedFirst) { result += separator + stringifiedValue; } else { result = stringifiedValue; } hasProcessedFirst = true; } return result; } __name(join, "join"); function map(iterable, fn) { return new MapIterable(iterable, fn); } __name(map, "map"); class MapIterable { constructor(iterable, fn) { this.iterable = iterable; this.fn = fn; } static { __name(this, "MapIterable"); } [Symbol.iterator]() { return new MapIterator(this.iterable[Symbol.iterator](), this.fn); } } class MapIterator { constructor(iterator, fn) { this.iterator = iterator; this.fn = fn; } static { __name(this, "MapIterator"); } next() { const nextIteration = this.iterator.next(); if (nextIteration.done) { return nextIteration; } return { done: false, value: this.fn(nextIteration.value) }; } } function reduce(iterable, fn, accumulator) { let result = accumulator; for (const value of iterable) { result = fn(result, value); } return result; } __name(reduce, "reduce"); function repeat(value) { return new RepeatIterable(value); } __name(repeat, "repeat"); function* chunk(iterable, chunkSize) { let aChunk = []; for (const item of iterable) { aChunk.push(item); if (aChunk.length === chunkSize) { yield aChunk; aChunk = []; } } if (aChunk.length > 0) { yield aChunk; } } __name(chunk, "chunk"); class RepeatIterable { constructor(value) { this.value = value; } static { __name(this, "RepeatIterable"); } [Symbol.iterator]() { return new RepeatIterator(this.value); } } class RepeatIterator { static { __name(this, "RepeatIterator"); } #iteratorResult; constructor(value) { this.#iteratorResult = { done: false, value }; } next() { return this.#iteratorResult; } } function take(iterable, amount) { return new TakeIterable(iterable, amount); } __name(take, "take"); class TakeIterable { constructor(iterable, amount) { this.iterable = iterable; this.amount = amount; } static { __name(this, "TakeIterable"); } [Symbol.iterator]() { return new TakeIterator(this.iterable[Symbol.iterator](), this.amount); } } class TakeIterator { constructor(iterator, amount) { this.iterator = iterator; this.amount = amount; } static { __name(this, "TakeIterator"); } next() { const nextIteration = this.iterator.next(); if (nextIteration.done || this.amount === 0) { return { done: true, value: void 0 }; } this.amount -= 1; return nextIteration; } } function zipObject(props, values) { const result = {}; const propsIterator = props[Symbol.iterator](); const valuesIterator = values[Symbol.iterator](); while (true) { const propIteration = propsIterator.next(); if (propIteration.done) { break; } const valueIteration = valuesIterator.next(); if (valueIteration.done) { break; } result[propIteration.value] = valueIteration.value; } return result; } __name(zipObject, "zipObject"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { chunk, collect, collectFirst, concat, every, filter, find, groupBy, isEmpty, isIterable, join, map, reduce, repeat, size, take, zipObject }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var leftPaneWidth_std_exports = {}; __export(leftPaneWidth_std_exports, { MAX_WIDTH: () => MAX_WIDTH, MIN_FULL_WIDTH: () => MIN_FULL_WIDTH, MIN_WIDTH: () => MIN_WIDTH, SNAP_WIDTH: () => SNAP_WIDTH, getWidthFromPreferredWidth: () => getWidthFromPreferredWidth }); module.exports = __toCommonJS(leftPaneWidth_std_exports); var import_lodash = __toESM(require("lodash")); var import_isSorted_std = require("./isSorted.std.js"); var import_assert_std = require("./assert.std.js"); const { clamp } = import_lodash.default; const MIN_WIDTH = 97; const SNAP_WIDTH = 200; const MIN_FULL_WIDTH = 280; const MAX_WIDTH = 380; (0, import_assert_std.strictAssert)( (0, import_isSorted_std.isSorted)([MIN_WIDTH, SNAP_WIDTH, MIN_FULL_WIDTH, MAX_WIDTH]), "Expected widths to be in the right order" ); function getWidthFromPreferredWidth(preferredWidth, { requiresFullWidth }) { const clampedWidth = clamp(preferredWidth, MIN_WIDTH, MAX_WIDTH); if (requiresFullWidth || clampedWidth >= SNAP_WIDTH) { return Math.max(clampedWidth, MIN_FULL_WIDTH); } return MIN_WIDTH; } __name(getWidthFromPreferredWidth, "getWidthFromPreferredWidth"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { MAX_WIDTH, MIN_FULL_WIDTH, MIN_WIDTH, SNAP_WIDTH, getWidthFromPreferredWidth }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var libphonenumberInstance_std_exports = {}; __export(libphonenumberInstance_std_exports, { PhoneNumberFormat: () => PhoneNumberFormat, instance: () => instance, parseAndFormatPhoneNumber: () => parseAndFormatPhoneNumber }); module.exports = __toCommonJS(libphonenumberInstance_std_exports); var import_google_libphonenumber = __toESM(require("google-libphonenumber")); const instance = import_google_libphonenumber.default.PhoneNumberUtil.getInstance(); const { PhoneNumberFormat } = import_google_libphonenumber.default; function parseAndFormatPhoneNumber(str, regionCode, format = PhoneNumberFormat.E164) { let result; try { result = instance.parse(str, regionCode); } catch (err) { return void 0; } return { isValid: instance.isValidNumber(result), userInput: str, e164: instance.format(result, format) }; } __name(parseAndFormatPhoneNumber, "parseAndFormatPhoneNumber"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { PhoneNumberFormat, instance, parseAndFormatPhoneNumber }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var libphonenumberUtil_std_exports = {}; __export(libphonenumberUtil_std_exports, { getRegionCodeForNumber: () => getRegionCodeForNumber, parseNumber: () => parseNumber }); module.exports = __toCommonJS(libphonenumberUtil_std_exports); var import_libphonenumberInstance_std = require("./libphonenumberInstance.std.js"); const FALLBACK_REGION_CODE = "ZZ"; function getRegionCodeForNumber(number) { try { const parsedNumber = import_libphonenumberInstance_std.instance.parse(number); return import_libphonenumberInstance_std.instance.getRegionCodeForNumber(parsedNumber) || FALLBACK_REGION_CODE; } catch (e) { return FALLBACK_REGION_CODE; } } __name(getRegionCodeForNumber, "getRegionCodeForNumber"); function parseNumber(number, defaultRegionCode) { try { const parsedNumber = import_libphonenumberInstance_std.instance.parse(number, defaultRegionCode); const isValidNumber = import_libphonenumberInstance_std.instance.isValidNumber(parsedNumber); if (!isValidNumber) { return { error: new Error("Invalid phone number"), isValidNumber: false }; } return { isValidNumber: true, regionCode: import_libphonenumberInstance_std.instance.getRegionCodeForNumber(parsedNumber), countryCode: parsedNumber.getCountryCode()?.toString(), e164: import_libphonenumberInstance_std.instance.format(parsedNumber, import_libphonenumberInstance_std.PhoneNumberFormat.E164) }; } catch (error) { return { error, isValidNumber: false }; } } __name(parseNumber, "parseNumber"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getRegionCodeForNumber, parseNumber }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var lightSessionResetQueue_std_exports = {}; __export(lightSessionResetQueue_std_exports, { lightSessionResetQueue: () => lightSessionResetQueue }); module.exports = __toCommonJS(lightSessionResetQueue_std_exports); var import_p_queue = __toESM(require("p-queue")); const lightSessionResetQueue = new import_p_queue.default({ concurrency: 1 }); lightSessionResetQueue.pause(); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { lightSessionResetQueue }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var import_lodash = __toESM(require("lodash")); var import_node_path = require("node:path"); var import_util_node = require("./util.node.js"); const { fromPairs, groupBy, map } = import_lodash.default; const exceptionsPath = (0, import_node_path.join)(__dirname, "exceptions.json"); const exceptions = (0, import_util_node.loadJSON)(exceptionsPath); const byRule = groupBy(exceptions, "rule"); const byRuleThenByCategory = fromPairs( map(byRule, (list, ruleName) => { const byCategory = groupBy(list, "reasonCategory"); return [ ruleName, fromPairs( map(byCategory, (innerList, categoryName) => { return [categoryName, innerList.length]; }) ) ]; }) ); console.log(JSON.stringify(byRuleThenByCategory, null, " ")); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var license_comments_node_exports = {}; __export(license_comments_node_exports, { forEachRelevantFile: () => forEachRelevantFile, getExtension: () => getExtension, readFirstLines: () => readFirstLines }); module.exports = __toCommonJS(license_comments_node_exports); var import_node_assert = __toESM(require("node:assert")); var readline = __toESM(require("node:readline")); var path = __toESM(require("node:path")); var fs = __toESM(require("node:fs")); var import_node_util = require("node:util"); var childProcess = __toESM(require("node:child_process")); var import_p_map = __toESM(require("p-map")); var import_chalk = __toESM(require("chalk")); const exec = (0, import_node_util.promisify)(childProcess.exec); const rootPath = path.join(__dirname, "..", "..", ".."); const EXTENSIONS_TO_CHECK = /* @__PURE__ */ new Set([ ".eslintignore", ".gitattributes", ".gitignore", ".nvmrc", ".prettierignore", ".sh", ".snyk", ".yml", ".js", ".scss", ".ts", ".tsx", ".html", ".md", ".plist" ]); const FILES_TO_IGNORE = new Set( [ ".github/ISSUE_TEMPLATE/bug_report.md", ".github/PULL_REQUEST_TEMPLATE.md", ".smartling-source.sh", "packages/mute-state-change/dist/acknowledgments.md", "components/mp3lameencoder/lib/Mp3LameEncoder.js", "components/recorderjs/recorder.js", "components/recorderjs/recorderWorker.js", "components/webaudiorecorder/lib/WebAudioRecorder.js", "components/webaudiorecorder/lib/WebAudioRecorderMp3.js", "js/Mp3LameEncoder.min.js", "js/WebAudioRecorderMp3.js", "sticker-creator/src/util/protos.d.ts", "sticker-creator/src/util/protos.js" ].map( // This makes sure the files are correct on Windows. path.normalize ) ); function getExtension(file) { if (file.startsWith(".")) { return getExtension(`x.${file}`); } return path.extname(file); } __name(getExtension, "getExtension"); async function forEachRelevantFile(fn) { const gitFiles = (await exec("git ls-files", { cwd: rootPath, env: {} })).stdout.split(/\n/g).map((line) => line.trim()).filter(Boolean).map((file) => path.join(rootPath, file)); await (0, import_p_map.default)( gitFiles, async (file) => { const repoPath = path.relative(rootPath, file); if (FILES_TO_IGNORE.has(repoPath)) { return; } const extension = getExtension(file); if (!EXTENSIONS_TO_CHECK.has(extension)) { return; } await fn(file); }, // Without this, we may run into "too many open files" errors. { concurrency: 100 } ); } __name(forEachRelevantFile, "forEachRelevantFile"); function readFirstLines(file, count) { return new Promise((resolve) => { const lines = []; const lineReader = readline.createInterface({ input: fs.createReadStream(file) }); lineReader.on("line", (line) => { if (lines.length < count) { lines.push(line); } if (lines.length >= count) { lineReader.close(); } }); lineReader.on("close", () => { resolve(lines); }); }); } __name(readFirstLines, "readFirstLines"); async function getCommitFileWasAdded(file) { const logLine = (await new Promise((resolve, reject) => { let result = ""; const gitLog = childProcess.spawn( "git", [ // From: https://stackoverflow.com/questions/11533199/how-to-find-the-commit-in-which-a-given-file-was-added "log", "-1", // limit number of lines to return to 1 "--diff-filter=A", // select only files that are added (A) "--follow", // continue listing the history of a file beyond renames "--find-renames=40%", // consider a delete/add pair to be a rename if less than 40% of the file has changed (default 50%) "--format=%as %h", // display commit as date YYYY-MM-DD file ], { cwd: rootPath, env: { PATH: process.env.PATH } } ); gitLog.stdout?.on("data", (data) => { result += data.toString("utf8"); }); gitLog.on("close", (code) => { if (code === 0) { resolve(result); } else { reject(new Error(`git log failed with exit code ${code}`)); } }); })).trim(); const [dateString, commitHash] = logLine.split(" "); const commitYear = new Date(dateString).getFullYear(); (0, import_node_assert.default)(!Number.isNaN(commitYear), `Could not read commit year for ${file}`); return { commitYear, commitHash }; } __name(getCommitFileWasAdded, "getCommitFileWasAdded"); function indent(text) { return text.split("\n").map((line) => ` ${line}`).join("\n"); } __name(indent, "indent"); async function main() { const currentYear = (/* @__PURE__ */ new Date()).getFullYear(); const failures = []; await forEachRelevantFile(async (file) => { let lines; let firstLine; let secondLine; if (getExtension(file) === ".sh") { lines = await readFirstLines(file, 3); [, firstLine, secondLine] = lines; } else { lines = await readFirstLines(file, 2); [firstLine, secondLine] = lines; } const warnings = []; if (!/Copyright \d{4} Signal Messenger, LLC/.test(firstLine)) { const commit = await getCommitFileWasAdded(file); warnings.push( import_chalk.default.red("Missing/Incorrect copyright line"), indent( import_chalk.default.green( `Expected: "Copyright ${commit.commitYear} Signal Messenger, LLC"` ) ), indent(import_chalk.default.yellow(`Actual: "${firstLine}"`)), indent( import_chalk.default.italic.dim( `Tip: Looks like this file was added in ${commit.commitHash} in ${commit.commitYear}` ) ), indent( import_chalk.default.italic.dim( `Tip: You can also use the current year (${currentYear})` ) ) ); } else if (/\d{4}-\d{4}/.test(firstLine)) { warnings.push( import_chalk.default.red("Copyright should not include end year"), indent(import_chalk.default.yellow(`Actual: "${firstLine}"`)) ); } if (!secondLine?.includes("SPDX-License-Identifier: AGPL-3.0-only")) { warnings.push( import_chalk.default.red("Missing/incorrect license line"), indent( import_chalk.default.green('Expected: "SPDX-License-Identifier: AGPL-3.0-only"') ), indent(import_chalk.default.yellow(`Actual: "${secondLine}"`)) ); } if (warnings.length) { failures.push({ file, warnings }); } }); const failed = failures.length > 0; if (failed) { console.log(); console.log( import_chalk.default.magenta.bold( "Some files are missing/contain incorrect copyrights/licenses:" ) ); console.log(); for (const failure of failures) { console.log(import_chalk.default.bold(`${failure.file}:`)); console.log(indent(failure.warnings.join("\n"))); console.log(); } console.log(import_chalk.default.magenta.bold("`npm run lint-license-comments` failed")); console.log(); process.exit(1); } } __name(main, "main"); if (require.main === module) { main().catch((err) => { console.error(err); process.exit(1); }); } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { forEachRelevantFile, getExtension, readFirstLines }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var fs = __toESM(require("node:fs")); var import_node_path = require("node:path"); var import_normalize_path = __toESM(require("normalize-path")); var import_p_map = __toESM(require("p-map")); var import_fast_glob = __toESM(require("fast-glob")); var import_types_std = require("./types.std.js"); var import_util_node = require("./util.node.js"); const ALL_REASONS = import_types_std.REASONS.join("|"); const rulesPath = (0, import_node_path.join)(__dirname, "rules.json"); const exceptionsPath = (0, import_node_path.join)(__dirname, "exceptions.json"); const basePath = (0, import_node_path.join)(__dirname, "../../.."); const searchPattern = (0, import_normalize_path.default)((0, import_node_path.join)(basePath, "**/*.{js,ts,tsx}")); const THIRD_PARTY_PATHS = ["node_modules/", "js/", "components/"]; function pathStartsWithOneOf(filePath, pathPrefixes) { return pathPrefixes.some((pathPrefix) => { return filePath.startsWith(pathPrefix); }); } __name(pathStartsWithOneOf, "pathStartsWithOneOf"); const excludedFilesRegexp = RegExp( [ "^release/", "^preload.bundle.js(LICENSE.txt|map)?", "^bundles/", "^storybook-static/", // Non-distributed files "\\.d\\.ts$", ".+\\.stories\\.js", ".+\\.stories\\.tsx", // Compiled files "^ts/.+\\.js", // High-traffic files in our project "^app/.+(ts|js)", "^ts/models/messages.js", "^ts/models/messages.ts", "^ts/models/conversations.js", "^ts/models/conversations.ts", "^ts/views/conversation_view.js", "^ts/views/conversation_view.ts", "^ts/background.js", "^ts/background.ts", "^ts/Crypto.js", "^ts/Crypto.ts", "^ts/textsecure/MessageReceiver.js", "^ts/textsecure/MessageReceiver.ts", "^ts/ConversationController.js", "^ts/ConversationController.ts", "^ts/SignalProtocolStore.ts", "^ts/SignalProtocolStore.js", "^ts/textsecure/[^./]+.ts", "^ts/textsecure/[^./]+.js", // Generated files "^js/components.js", "^js/curve/", "^js/util_worker.js", "^libtextsecure/test/test.js", "^test/test.js", "^ts/workers/heicConverter.bundle.js", "^ts/sql/mainWorker.bundle.js", // Copied from dependency "^js/Mp3LameEncoder.min.js", // Test files "^libtextsecure/test/.+", "^test/.+", "^ts/test[^/]*/.+", // Github workflows "^.github/.+", // Installable local dependencies "^packages/.+", // Modules we trust "^node_modules/@react-aria/.+", "^node_modules/@react-stately/.+", "^node_modules/@signalapp/libsignal-client/.+", "^node_modules/core-js-pure/.+", "^node_modules/core-js/.+", "^node_modules/fbjs/.+", "^node_modules/lodash/.+", "^node_modules/react/.+", "^node_modules/react-aria-components/.+", "^node_modules/react-dom/.+", "^node_modules/react-icon-base/.+", "^node_modules/react-input-autosize/.+", "^node_modules/react-popper/.+", "^node_modules/react-redux/.+", "^node_modules/react-router/.+", "^node_modules/react-select/.+", "^node_modules/react-transition-group/.+", "^node_modules/react-virtualized/.+", "^node_modules/reactcss/.+", "^node_modules/snyk/.+", "^node_modules/snyk-resolve-deps/.+", "^node_modules/snyk-try-require/.+", "^node_modules/@snyk/.+", "^node_modules/use-sync-external-store/.+", // Submodules we trust "^node_modules/react-color/.+/(?:core-js|fbjs|lodash)/.+", // Modules used only in test/development scenarios "^node_modules/@babel/.+", "^node_modules/@chanzuckerberg/axe-storybook-testing/.+", "^node_modules/@humanwhocodes/config-array/.+", "^node_modules/@mixer/parallel-prettier/.+", "^node_modules/@eslint/.+", "^node_modules/@signalapp/mock-server/.+", "^node_modules/@signalapp/mute-state-change/node_modules/prettier/.+", "^node_modules/@svgr/.+", "^node_modules/@types/.+", "^node_modules/@webassemblyjs/.+", "^node_modules/@electron/.+", "^node_modules/ajv/.+", "^node_modules/ajv-keywords/.+", "^node_modules/amdefine/.+", "^node_modules/ansi-styles/.+", "^node_modules/ansi-colors/.+", "^node_modules/anymatch/.+", "^node_modules/app-builder-lib/.+", "^node_modules/asn1\\.js/.+", "^node_modules/autoprefixer/.+", "^node_modules/babel.+", "^node_modules/bluebird/.+", "^node_modules/body-parser/.+", "^node_modules/bower/.+", "^node_modules/braces/.+", "^node_modules/buble/.+", "^node_modules/builder-util-runtime/.+", "^node_modules/builder-util/.+", "^node_modules/catharsis/.+", "^node_modules/chai/.+", "^node_modules/chokidar/.+", "^node_modules/clean-css/.+", "^node_modules/cli-table2/.+", "^node_modules/cliui/.+", "^node_modules/codemirror/.+", "^node_modules/coffee-script/.+", "^node_modules/compression/.+", "^node_modules/cross-env/.+", "^node_modules/css-loader/.+", "^node_modules/css-modules-loader-core/.+", "^node_modules/css-selector-tokenizer/.+", "^node_modules/css-tree/.+", "^node_modules/csso/.+", "^node_modules/danger/.+", "^node_modules/default-gateway/.+", "^node_modules/degenerator/.+", "^node_modules/detect-port-alt/.+", "^node_modules/dmg-builder/.+", "^node_modules/electron-builder/.+", "^node_modules/electron-chromedriver/.+", "^node_modules/electron-icon-maker/.+", "^node_modules/electron-mocha/", "^node_modules/electron-osx-sign/.+", "^node_modules/electron-publish/.+", "^node_modules/emotion/.+", // Currently only used in storybook "^node_modules/es-abstract/.+", "^node_modules/es5-shim/.+", // Currently only used in storybook "^node_modules/es6-shim/.+", // Currently only used in storybook "^node_modules/esbuild/.+", "^node_modules/escodegen/.+", "^node_modules/eslint.+", "^node_modules/espree.+", "^node_modules/@typescript-eslint.+", "^node_modules/esprima/.+", "^node_modules/express/.+", "^node_modules/fast-glob/.+", "^node_modules/file-entry-cache/.+", "^node_modules/file-system-cache/.+", // Currently only used in storybook "^node_modules/finalhandler/.+", "^node_modules/flat-cache/.+", "^node_modules/foreground-chat/.+", "^node_modules/fsevents/.+", "^node_modules/gauge/.+", "^node_modules/global-agent/.+", "^node_modules/globby/.+", "^node_modules/globule/.+", "^node_modules/handle-thing/.+", "^node_modules/handlebars/.+", // Used by nyc#istanbul-reports "^node_modules/har-validator/.+", "^node_modules/highlight\\.js/.+", "^node_modules/hpack\\.js/.+", "^node_modules/http-proxy-middlewar/.+", "^node_modules/icss-utils/.+", "^node_modules/intl-tel-input/examples/.+", "^node_modules/istanbul.+", "^node_modules/jimp/.+", "^node_modules/jquery/.+", "^node_modules/jake/.+", "^node_modules/js-sdsl/.+", "^node_modules/jss-global/.+", "^node_modules/jss/.+", "^node_modules/liftup/.+", "^node_modules/livereload-js/.+", "^node_modules/lolex/.+", "^node_modules/log-symbols/.+", "^node_modules/magic-string/.+", "^node_modules/markdown-it/.+", "^node_modules/meow/.+", "^node_modules/minimatch/.+", "^node_modules/mocha/.+", "^node_modules/needle/.+", "^node_modules/nise/.+", "^node_modules/node-gyp/.+", "^node_modules/normalize-package-data/.+", "^node_modules/npm-run-all/.+", "^node_modules/nsp/.+", "^node_modules/nyc/.+", "^node_modules/optionator/.+", "^node_modules/plist/.+", "^node_modules/phantomjs-prebuilt/.+", "^node_modules/playwright/.+", "^node_modules/playwright-core/.+", "^node_modules/postcss.+", "^node_modules/preserve/.+", "^node_modules/prettier/.+", "^node_modules/prop-types/.+", "^node_modules/protobufjs/cli/.+", "^node_modules/ramda/.+", "^node_modules/rambda/.+", "^node_modules/react-devtools/.+", "^node_modules/react-devtools-core/.+", "^node_modules/react-dev-utils/.+", "^node_modules/react-docgen/.+", "^node_modules/react-error-overlay/.+", "^node_modules/read-config-file/.+", // Used by electron-builder "^node_modules/read-pkg/.+", // Used by npm-run-all "^node_modules/recast/.+", "^node_modules/rechoir/.+", "^node_modules/reduce-css-calc/.+", "^node_modules/requizzle/.+", "^node_modules/resolve/.+", "^node_modules/sass-graph/.+", "^node_modules/sass-loader/.+", "^node_modules/sass/.+", "^node_modules/schema-utils/.+", "^node_modules/scss-tokenizer/.+", "^node_modules/send/.+", "^node_modules/serve-index/.+", "^node_modules/sinon/.+", "^node_modules/snapdragon-util/.+", "^node_modules/snapdragon/.+", "^node_modules/sockjs-client/.+", "^node_modules/style-loader/.+", "^node_modules/svgo/.+", "^node_modules/terser/.+", "^node_modules/testcheck/.+", "^node_modules/text-encoding/.+", "^node_modules/tiny-lr/.+", // Used by grunt-contrib-watch "^node_modules/tinycolor2/.+", "^node_modules/to-ast/.+", "^node_modules/trough/.+", "^node_modules/ts-loader/.+", "^node_modules/ts-node/.+", "^node_modules/tweetnacl/.+", "^node_modules/typed-scss-modules/.+", "^node_modules/typescript/.+", "^node_modules/uglify-es/.+", "^node_modules/uglify-js/.+", "^node_modules/url-loader/.+", "^node_modules/use/.+", "^node_modules/vary/.+", "^node_modules/vm-browserify/.+", "^node_modules/webdriverio/.+", "^node_modules/webpack/.+", "^node_modules/xml-parse-from-string/.+", "^node_modules/xmlbuilder/.+", "^node_modules/xmldom/.+", "^node_modules/yargs-unparser/", "^node_modules/yargs/.+", "^node_modules/find-yarn-workspace-root/.+", "^node_modules/unzipper/node_modules/bluebird/.+", "^node_modules/update-notifier/.+", "^node_modules/windows-release/.+", // used by danger "^danger/node_modules/.+", "^node_modules/@octokit/.+", "^node_modules/test-exclude/.+", "^node_modules/micromark/.+", "^node_modules/micromark-extension-gfm-task-list-item/.+", "^node_modules/micromark-extension-gfm-autolink-literal/.+", "^node_modules/memfs-or-file-map-to-github-branch/.+", "^node_modules/mdast-util-to-markdown/.+", "^node_modules/mdast-util-from-markdown/.+", "^node_modules/lodash.once/.+", "^node_modules/gitlab/.+", "^node_modules/es6-promisify/.+", "^node_modules/endanger/.+", "^node_modules/cpy/.+", "^node_modules/buffer-equal-constant-time/.+", "^node_modules/universal-url/.+", "^node_modules/extglob/.+", // Used by Storybook "^node_modules/@emotion/.+", "^node_modules/@pmmmwh/react-refresh-webpack-plugin/.+", "^node_modules/@storybook/.+", "^node_modules/cosmiconfig/.+", "^node_modules/create-emotion/.+", "^node_modules/fork-ts-checker-webpack-plugin/.+", "^node_modules/gzip-size/.+", "^node_modules/markdown-to-jsx/.+", "^node_modules/mini-css-extract-plugin/.+", "^node_modules/polished.+", "^node_modules/prismjs/.+", "^node_modules/react-draggable/.+", "^node_modules/refractor/.+", "^node_modules/regexpu-core/.+", "^node_modules/shelljs/.+", "^node_modules/simplebar/.+", "^node_modules/store2/.+", "^node_modules/telejson/.+", "^node_modules/watchpack-chokidar2/.+", // Used by Webpack "^node_modules/css-select/.+", // Used by html-webpack-plugin "^node_modules/dotenv-webpack/.+", "^node_modules/follow-redirects/.+", // Used by webpack-dev-server "^node_modules/html-webpack-plugin/.+", "^node_modules/selfsigned/.+", // Used by webpack-dev-server "^node_modules/portfinder/.+", "^node_modules/renderkid/.+", // Used by html-webpack-plugin "^node_modules/spdy-transport/.+", // Used by webpack-dev-server "^node_modules/spdy/.+", // Used by webpack-dev-server "^node_modules/uglifyjs-webpack-plugin/.+", "^node_modules/v8-compile-cache/.+", // Used by webpack-cli "^node_modules/watchpack/.+", // Used by webpack "^node_modules/webpack-cli/.+", "^node_modules/webpack-dev-middleware/.+", "^node_modules/webpack-dev-server/.+", "^node_modules/webpack-hot-middleware/.+", "^node_modules/webpack-merge/.+", "^node_modules/webpack/.+", // Sticker Creator "^sticker-creator/.+" ].join("|") ); function setupRules(allRules) { allRules.forEach((rule, index) => { if (!rule.name) { throw new Error(`Rule at index ${index} is missing a name`); } if (!rule.expression) { throw new Error(`Rule '${rule.name}' is missing an expression`); } rule.regex = new RegExp(rule.expression, "g"); }); } __name(setupRules, "setupRules"); async function main(argv) { const shouldRemoveUnusedExceptions = argv.includes( "--remove-unused-exceptions" ); const now = /* @__PURE__ */ new Date(); const rules = (0, import_util_node.loadJSON)(rulesPath); setupRules(rules); const exceptions = (0, import_util_node.loadJSON)(exceptionsPath); let unusedExceptions = exceptions; const results = []; let scannedCount = 0; await (0, import_p_map.default)( await (0, import_fast_glob.default)(searchPattern, { onlyFiles: true }), async (file) => { const relativePath = (0, import_node_path.relative)(basePath, file).replace(/\\/g, "/"); const isFileExcluded = excludedFilesRegexp.test(relativePath); if (isFileExcluded) { return; } scannedCount += 1; const lines = (await fs.promises.readFile(file, import_util_node.ENCODING)).split(/\r?\n/); rules.forEach((rule) => { if (rule.excludeOurCode && !pathStartsWithOneOf(relativePath, THIRD_PARTY_PATHS)) { return; } const excludedModules = rule.excludedModules || []; if (pathStartsWithOneOf(relativePath, excludedModules)) { return; } lines.forEach((line) => { if (!rule.regex.test(line)) { return; } if (rule.expression) { rule.regex = new RegExp(rule.expression, "g"); } const matchedException = unusedExceptions.find( (exception) => exception.rule === rule.name && exception.path === relativePath && (line.length < 300 ? exception.line?.trim() === line.trim() : exception.line === void 0) ); if (matchedException) { unusedExceptions = unusedExceptions.filter( (exception) => exception !== matchedException ); } else { results.push({ rule: rule.name, path: relativePath, line: line.length < 300 ? line : void 0, reasonCategory: ALL_REASONS, updated: now.toJSON(), reasonDetail: "" }); } }); }); }, // Without this, we may run into "too many open files" errors. { concurrency: 100 } ); let unusedExceptionsLogMessage; if (shouldRemoveUnusedExceptions && unusedExceptions.length) { unusedExceptionsLogMessage = `${unusedExceptions.length} unused exceptions (automatically removed),`; const unusedExceptionsSet = new Set(unusedExceptions); const newExceptions = exceptions.filter( (exception) => !unusedExceptionsSet.has(exception) ); (0, import_util_node.writeExceptions)(exceptionsPath, newExceptions); unusedExceptions = []; } else { unusedExceptionsLogMessage = `${unusedExceptions.length} unused exceptions,`; } console.log( `${scannedCount} files scanned.`, `${results.length} questionable lines,`, unusedExceptionsLogMessage, `${exceptions.length} total exceptions.` ); if (results.length === 0 && unusedExceptions.length === 0) { process.exit(); } console.log(); console.log("Questionable lines:"); console.log(JSON.stringify((0, import_util_node.sortExceptions)(results), null, " ")); if (unusedExceptions.length) { console.log(); console.log( "Unused exceptions! Run with --remove-unused-exceptions to automatically remove them." ); console.log(JSON.stringify((0, import_util_node.sortExceptions)(unusedExceptions), null, " ")); } process.exit(1); } __name(main, "main"); main(process.argv).catch((err) => { console.error(err); process.exit(1); }); "use strict"; var import_node_path = require("node:path"); var import_util_node = require("./util.node.js"); const exceptionsPath = (0, import_node_path.join)(__dirname, "exceptions.json"); const exceptions = (0, import_util_node.loadJSON)(exceptionsPath); (0, import_util_node.writeExceptions)(exceptionsPath, exceptions); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var types_std_exports = {}; __export(types_std_exports, { REASONS: () => REASONS }); module.exports = __toCommonJS(types_std_exports); const REASONS = [ "falseMatch", "testCode", "exampleCode", "otherUtilityCode", "regexMatchedSafeCode", "notExercisedByOurApp", "ruleNeeded", "usageTrusted" ]; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { REASONS }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var util_node_exports = {}; __export(util_node_exports, { ENCODING: () => ENCODING, loadJSON: () => loadJSON, sortExceptions: () => sortExceptions, writeExceptions: () => writeExceptions }); module.exports = __toCommonJS(util_node_exports); var import_fs_extra = __toESM(require("fs-extra")); var import_lodash = __toESM(require("lodash")); const { readJsonSync, writeJsonSync } = import_fs_extra.default; const { orderBy } = import_lodash.default; const ENCODING = "utf8"; const loadJSON = /* @__PURE__ */ __name((path) => readJsonSync(path), "loadJSON"); const writeExceptions = /* @__PURE__ */ __name((path, exceptions) => writeJsonSync(path, sortExceptions(exceptions), { spaces: 2 }), "writeExceptions"); const sortExceptions = /* @__PURE__ */ __name((exceptions) => orderBy(exceptions, [ "path", "rule", "reasonCategory", "updated", "reasonDetail" ]), "sortExceptions"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { ENCODING, loadJSON, sortExceptions, writeExceptions }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var linuxPasswordStoreFlags_std_exports = {}; __export(linuxPasswordStoreFlags_std_exports, { LINUX_PASSWORD_STORE_FLAGS: () => LINUX_PASSWORD_STORE_FLAGS }); module.exports = __toCommonJS(linuxPasswordStoreFlags_std_exports); const LINUX_PASSWORD_STORE_FLAGS = { basic_text: "basic", gnome_libsecret: "gnome-libsecret", kwallet: "kwallet", kwallet5: "kwallet5", kwallet6: "kwallet6" }; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { LINUX_PASSWORD_STORE_FLAGS }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var loadImage_std_exports = {}; __export(loadImage_std_exports, { loadImage: () => loadImage }); module.exports = __toCommonJS(loadImage_std_exports); var import_explodePromise_std = require("./explodePromise.std.js"); async function loadImage(src) { const { promise, resolve, reject } = (0, import_explodePromise_std.explodePromise)(); const img = new Image(); img.addEventListener("load", () => resolve(), { once: true }); img.addEventListener( "error", () => reject(new Error("Image failed to load")), { once: true } ); img.src = src; await promise; return img; } __name(loadImage, "loadImage"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { loadImage }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var loadable_std_exports = {}; __export(loadable_std_exports, { LoadingState: () => LoadingState }); module.exports = __toCommonJS(loadable_std_exports); var LoadingState = /* @__PURE__ */ ((LoadingState2) => { LoadingState2[LoadingState2["Loading"] = 0] = "Loading"; LoadingState2[LoadingState2["Loaded"] = 1] = "Loaded"; LoadingState2[LoadingState2["LoadFailed"] = 2] = "LoadFailed"; return LoadingState2; })(LoadingState || {}); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { LoadingState }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var logPadSize_std_exports = {}; __export(logPadSize_std_exports, { logPadSize: () => logPadSize }); module.exports = __toCommonJS(logPadSize_std_exports); function logPadSize(size) { return Math.max( 541, Math.floor(1.05 ** Math.ceil(Math.log(size) / Math.log(1.05))) ); } __name(logPadSize, "logPadSize"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { logPadSize }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var logPadding_node_exports = {}; __export(logPadding_node_exports, { appendPaddingStream: () => appendPaddingStream }); module.exports = __toCommonJS(logPadding_node_exports); var import_node_stream = require("node:stream"); var import_logPadSize_std = require("./logPadSize.std.js"); const PADDING_CHUNK_SIZE = 64 * 1024; function* generatePadding(size) { const targetLength = (0, import_logPadSize_std.logPadSize)(size); const paddingSize = targetLength - size; const paddingChunks = Math.floor(paddingSize / PADDING_CHUNK_SIZE); const paddingChunk = new Uint8Array(PADDING_CHUNK_SIZE); for (let i = 0; i < paddingChunks; i += 1) { yield paddingChunk; } const paddingRemainder = new Uint8Array(paddingSize % PADDING_CHUNK_SIZE); if (paddingRemainder.byteLength > 0) { yield paddingRemainder; } } __name(generatePadding, "generatePadding"); function pushPadding(paddingIterator, readable) { while (true) { const result = paddingIterator.next(); if (result.done) { break; } const keepGoing = readable.push(result.value); if (!keepGoing) { return false; } } return true; } __name(pushPadding, "pushPadding"); function appendPaddingStream() { let onReadableDrained; let fileSize = 0; return new import_node_stream.Transform({ read(size) { if (onReadableDrained != null) { onReadableDrained(); } import_node_stream.Transform.prototype._read.call(this, size); }, transform(chunk, _encoding, callback) { fileSize += chunk.byteLength; callback(null, chunk); }, flush(callback) { const iterator = generatePadding(fileSize); onReadableDrained = /* @__PURE__ */ __name(() => { if (!pushPadding(iterator, this)) { return; } callback(); }, "onReadableDrained"); onReadableDrained(); } }); } __name(appendPaddingStream, "appendPaddingStream"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { appendPaddingStream }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var longAttachment_std_exports = {}; __export(longAttachment_std_exports, { MAX_BODY_ATTACHMENT_BYTE_LENGTH: () => MAX_BODY_ATTACHMENT_BYTE_LENGTH, MAX_MESSAGE_BODY_BYTE_LENGTH: () => MAX_MESSAGE_BODY_BYTE_LENGTH, isBodyTooLong: () => isBodyTooLong, trimBody: () => trimBody }); module.exports = __toCommonJS(longAttachment_std_exports); var import_unicodeSlice_std = require("./unicodeSlice.std.js"); const KIBIBYTE = 1024; const MAX_MESSAGE_BODY_BYTE_LENGTH = 2 * KIBIBYTE; const MAX_BODY_ATTACHMENT_BYTE_LENGTH = 64 * KIBIBYTE; function isBodyTooLong(body, length = MAX_MESSAGE_BODY_BYTE_LENGTH) { return Buffer.byteLength(body) > length; } __name(isBodyTooLong, "isBodyTooLong"); function trimBody(body, length = MAX_MESSAGE_BODY_BYTE_LENGTH) { const sliced = (0, import_unicodeSlice_std.unicodeSlice)(body, 0, length); if (sliced.length > 0) { return sliced; } return "\uFFFE"; } __name(trimBody, "trimBody"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { MAX_BODY_ATTACHMENT_BYTE_LENGTH, MAX_MESSAGE_BODY_BYTE_LENGTH, isBodyTooLong, trimBody }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var makeLookup_std_exports = {}; __export(makeLookup_std_exports, { makeLookup: () => makeLookup }); module.exports = __toCommonJS(makeLookup_std_exports); function makeLookup(items, key) { const result = {}; for (const item of items) { if (item != null && item[key] !== void 0) { result[String(item[key])] = item; } } return result; } __name(makeLookup, "makeLookup"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { makeLookup }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var mapEmplace_std_exports = {}; __export(mapEmplace_std_exports, { mapEmplace: () => mapEmplace }); module.exports = __toCommonJS(mapEmplace_std_exports); function mapEmplace(map, key, options) { if (map.has(key)) { let value = map.get(key); if (options.update != null) { value = options.update(value, key, map); map.set(key, value); } return value; } if (options.insert != null) { const value = options.insert(key, map); map.set(key, value); return value; } throw new Error("Key was not present in map, and insert() was not provided"); } __name(mapEmplace, "mapEmplace"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { mapEmplace }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var mapObjectWithSpec_std_exports = {}; __export(mapObjectWithSpec_std_exports, { mapObjectWithSpec: () => mapObjectWithSpec }); module.exports = __toCommonJS(mapObjectWithSpec_std_exports); var import_lodash = __toESM(require("lodash")); const { cloneDeep, get, set } = import_lodash.default; function mapObjectWithSpec(spec, data, map, target = cloneDeep(data)) { if (!data) { return target; } if (typeof spec === "string") { const value = get(data, spec); if (value) { set(target, spec, map(value)); } return target; } if ("isMap" in spec) { for (const key of Object.keys(data)) { target[key] = mapObjectWithSpec( spec.valueSpec, data[key], map, target[key] ); } return target; } if ("key" in spec) { target[spec.key] = mapObjectWithSpec( spec.valueSpec, data[spec.key], map, target[spec.key] ); return target; } for (const key of spec) { mapObjectWithSpec(key, data, map, target); } return target; } __name(mapObjectWithSpec, "mapObjectWithSpec"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { mapObjectWithSpec }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var mapUtil_std_exports = {}; __export(mapUtil_std_exports, { groupBy: () => groupBy, isEqual: () => isEqual }); module.exports = __toCommonJS(mapUtil_std_exports); var import_iterables_std = require("./iterables.std.js"); const groupBy = /* @__PURE__ */ __name((iterable, fn) => (0, import_iterables_std.reduce)( iterable, (result, value) => { const key = fn(value); const existingGroup = result.get(key); if (existingGroup) { existingGroup.push(value); } else { result.set(key, [value]); } return result; }, /* @__PURE__ */ new Map() ), "groupBy"); const isEqual = /* @__PURE__ */ __name((left, right) => { if (left.size !== right.size) { return false; } for (const [key, value] of left) { if (!right.has(key)) { return false; } if (right.get(key) !== value) { return false; } } return true; }, "isEqual"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { groupBy, isEqual }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var messageFilePaths_std_exports = {}; __export(messageFilePaths_std_exports, { getFilePathsReferencedByAttachment: () => getFilePathsReferencedByAttachment, getFilePathsReferencedByMessage: () => getFilePathsReferencedByMessage }); module.exports = __toCommonJS(messageFilePaths_std_exports); function getFilePathsReferencedByAttachment(attachment) { const externalAttachments = /* @__PURE__ */ new Set(); const externalDownloads = /* @__PURE__ */ new Set(); if (attachment.copied) { return { externalAttachments, externalDownloads }; } const { path, thumbnail, screenshot, thumbnailFromBackup, downloadPath } = attachment; if (path) { externalAttachments.add(path); } if (downloadPath) { externalDownloads.add(downloadPath); } if (thumbnail && thumbnail.path) { externalAttachments.add(thumbnail.path); } if (screenshot && screenshot.path) { externalAttachments.add(screenshot.path); } if (thumbnailFromBackup && thumbnailFromBackup.path) { externalAttachments.add(thumbnailFromBackup.path); } return { externalAttachments, externalDownloads }; } __name(getFilePathsReferencedByAttachment, "getFilePathsReferencedByAttachment"); function getFilePathsForVersionOfMessage(rootOrEditHistoryMessage) { const externalAttachments = /* @__PURE__ */ new Set(); const externalDownloads = /* @__PURE__ */ new Set(); function addFilePathsReferencedByAttachment(attachment) { const result = getFilePathsReferencedByAttachment(attachment); result.externalAttachments.forEach((path) => externalAttachments.add(path)); result.externalDownloads.forEach((path) => externalDownloads.add(path)); } __name(addFilePathsReferencedByAttachment, "addFilePathsReferencedByAttachment"); const { attachments, bodyAttachment, contact, quote, preview, sticker } = rootOrEditHistoryMessage; attachments?.forEach(addFilePathsReferencedByAttachment); if (bodyAttachment) { addFilePathsReferencedByAttachment(bodyAttachment); } if (quote?.attachments) { quote.attachments.forEach((attachment) => { if (attachment.thumbnail) { addFilePathsReferencedByAttachment(attachment.thumbnail); } }); } if (contact) { contact.forEach((item) => { if (item.avatar?.avatar) { addFilePathsReferencedByAttachment(item.avatar.avatar); } }); } if (preview) { preview.forEach((item) => { if (item.image) { addFilePathsReferencedByAttachment(item.image); } }); } if (sticker?.data) { addFilePathsReferencedByAttachment(sticker.data); } return { externalAttachments, externalDownloads }; } __name(getFilePathsForVersionOfMessage, "getFilePathsForVersionOfMessage"); function getFilePathsReferencedByMessage(message) { const externalAttachments = /* @__PURE__ */ new Set(); const externalDownloads = /* @__PURE__ */ new Set(); [message, ...message.editHistory ?? []].forEach((version) => { const result = getFilePathsForVersionOfMessage(version); result.externalAttachments.forEach((path) => externalAttachments.add(path)); result.externalDownloads.forEach((path) => externalDownloads.add(path)); }); return { externalAttachments: [...externalAttachments], externalDownloads: [...externalDownloads] }; } __name(getFilePathsReferencedByMessage, "getFilePathsReferencedByMessage"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getFilePathsReferencedByAttachment, getFilePathsReferencedByMessage }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var migrateColor_node_exports = {}; __export(migrateColor_node_exports, { getCustomColorData: () => getCustomColorData, migrateColor: () => migrateColor }); module.exports = __toCommonJS(migrateColor_node_exports); var import_Colors_std = require("../types/Colors.std.js"); var import_Crypto_node = require("../Crypto.node.js"); const NEW_COLOR_NAMES = new Set(import_Colors_std.AvatarColors); function migrateColor(color, options) { if (color && NEW_COLOR_NAMES.has(color)) { return color; } return (0, import_Crypto_node.generateAvatarColor)(options); } __name(migrateColor, "migrateColor"); function getCustomColorData(conversation) { if (conversation.conversationColor !== "custom") { return { customColor: void 0, customColorId: void 0 }; } return { customColor: conversation.customColor, customColorId: conversation.customColorId }; } __name(getCustomColorData, "getCustomColorData"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getCustomColorData, migrateColor }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var missingCaseError_std_exports = {}; __export(missingCaseError_std_exports, { missingCaseError: () => missingCaseError }); module.exports = __toCommonJS(missingCaseError_std_exports); var import_reallyJsonStringify_std = require("./reallyJsonStringify.std.js"); const missingCaseError = /* @__PURE__ */ __name((x) => new TypeError(`Unhandled case: ${(0, import_reallyJsonStringify_std.reallyJsonStringify)(x)}`), "missingCaseError"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { missingCaseError }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var normalizeAci_std_exports = {}; __export(normalizeAci_std_exports, { normalizeAci: () => normalizeAci }); module.exports = __toCommonJS(normalizeAci_std_exports); var import_log_std = require("../logging/log.std.js"); var import_isAciString_std = require("./isAciString.std.js"); var import_assert_std = require("./assert.std.js"); const log = (0, import_log_std.createLogger)("normalizeAci"); function normalizeAci(rawAci, context, logger = log) { if (rawAci == null) { return void 0; } const result = rawAci.toLowerCase(); (0, import_assert_std.strictAssert)( !result.startsWith("pni:"), `ACI should not start with 'PNI:' in ${context}` ); if (!(0, import_isAciString_std.isAciString)(result)) { logger.warn( `Normalizing invalid aci: ${rawAci} to ${result} in context "${context}"` ); return result; } return result; } __name(normalizeAci, "normalizeAci"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { normalizeAci }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var normalizeDeviceName_std_exports = {}; __export(normalizeDeviceName_std_exports, { normalizeDeviceName: () => normalizeDeviceName }); module.exports = __toCommonJS(normalizeDeviceName_std_exports); function normalizeDeviceName(rawDeviceName) { return rawDeviceName.trim().replace(/\0/g, ""); } __name(normalizeDeviceName, "normalizeDeviceName"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { normalizeDeviceName }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var nsis_std_exports = {}; __export(nsis_std_exports, { LCID: () => LCID, REQUIRED_LANGUAGES: () => REQUIRED_LANGUAGES }); module.exports = __toCommonJS(nsis_std_exports); const REQUIRED_LANGUAGES = [ "en_US", "de_DE", "fr_FR", "es_ES", "zh_CN", "zh_TW", "ja_JP", "ko_KR", "it_IT", "nl_NL", "da_DK", "sv_SE", "nb_NO", "fi_FI", "ru_RU", "pt_PT", "pt_BR", "pl_PL", "uk_UA", "cs_CZ", "sk_SK", "hu_HU", "ar_SA", "tr_TR", "th_TH", "vi_VN" ]; const LCID = { af_ZA: 1078, am_ET: 1118, ar_AE: 14337, ar_BH: 15361, ar_DZ: 5121, ar_EG: 3073, ar_IQ: 2049, ar_JO: 11265, ar_KW: 13313, ar_LB: 12289, ar_LY: 4097, ar_MA: 6145, ar_OM: 8193, ar_QA: 16385, ar_SA: 1025, ar_SY: 10241, ar_TN: 7169, ar_YE: 9217, arn_CL: 1146, as_IN: 1101, az_AZ: 2092, ba_RU: 1133, be_BY: 1059, bg_BG: 1026, bn_IN: 1093, bo_BT: 2129, bo_CN: 1105, br_FR: 1150, bs_BA: 8218, ca_ES: 1027, co_FR: 1155, cs_CZ: 1029, cy_GB: 1106, da_DK: 1030, de_AT: 3079, de_CH: 2055, de_DE: 1031, de_LI: 5127, de_LU: 4103, div_MV: 1125, dsb_DE: 2094, el_GR: 1032, en_AU: 3081, en_BZ: 10249, en_CA: 4105, en_CB: 9225, en_GB: 2057, en_IE: 6153, en_IN: 18441, en_JA: 8201, en_MY: 17417, en_NZ: 5129, en_PH: 13321, en_TT: 11273, en_US: 1033, en_ZA: 7177, en_ZW: 12297, es_AR: 11274, es_BO: 16394, es_CL: 13322, es_CO: 9226, es_CR: 5130, es_DO: 7178, es_EC: 12298, es_ES: 3082, es_GT: 4106, es_HN: 18442, es_MX: 2058, es_NI: 19466, es_PA: 6154, es_PE: 10250, es_PR: 20490, es_PY: 15370, es_SV: 17418, es_UR: 14346, es_US: 21514, es_VE: 8202, et_EE: 1061, eu_ES: 1069, fa_IR: 1065, fi_FI: 1035, fil_PH: 1124, fo_FO: 1080, fr_BE: 2060, fr_CA: 3084, fr_CH: 4108, fr_FR: 1036, fr_LU: 5132, fr_MC: 6156, fy_NL: 1122, ga_IE: 2108, gbz_AF: 1164, gl_ES: 1110, gsw_FR: 1156, gu_IN: 1095, ha_NG: 1128, he_IL: 1037, hi_IN: 1081, hr_BA: 4122, hr_HR: 1050, hu_HU: 1038, hy_AM: 1067, id_ID: 1057, ii_CN: 1144, is_IS: 1039, it_CH: 2064, it_IT: 1040, iu_CA: 2141, ja_JP: 1041, ka_GE: 1079, kh_KH: 1107, kk_KZ: 1087, kl_GL: 1135, kn_IN: 1099, ko_KR: 1042, kok_IN: 1111, ky_KG: 1088, lb_LU: 1134, lo_LA: 1108, lt_LT: 1063, lv_LV: 1062, mi_NZ: 1153, mk_MK: 1071, ml_IN: 1100, mn_CN: 2128, mn_MN: 1104, moh_CA: 1148, mr_IN: 1102, ms_BN: 2110, ms_MY: 1086, mt_MT: 1082, my_MM: 1109, nb_NO: 1044, ne_NP: 1121, nl_BE: 2067, nl_NL: 1043, nn_NO: 2068, ns_ZA: 1132, oc_FR: 1154, or_IN: 1096, pa_IN: 1094, pl_PL: 1045, ps_AF: 1123, pt_BR: 1046, pt_PT: 2070, qut_GT: 1158, quz_BO: 1131, quz_EC: 2155, quz_PE: 3179, rm_CH: 1047, ro_RO: 1048, ru_RU: 1049, rw_RW: 1159, sa_IN: 1103, sah_RU: 1157, se_FI: 3131, se_NO: 1083, se_SE: 2107, si_LK: 1115, sk_SK: 1051, sl_SI: 1060, sma_NO: 6203, sma_SE: 7227, smj_NO: 4155, smj_SE: 5179, smn_FI: 9275, sms_FI: 8251, sq_AL: 1052, sr_BA: 7194, sr_SP: 3098, sv_FI: 2077, sv_SE: 1053, sw_KE: 1089, syr_SY: 1114, ta_IN: 1097, te_IN: 1098, tg_TJ: 1064, th_TH: 1054, tk_TM: 1090, tmz_DZ: 2143, tn_ZA: 1074, tr_TR: 1055, tt_RU: 1092, ug_CN: 1152, uk_UA: 1058, ur_IN: 2080, ur_PK: 1056, uz_UZ: 2115, vi_VN: 1066, wen_DE: 1070, wo_SN: 1160, xh_ZA: 1076, yo_NG: 1130, zh_CHS: 4, zh_CHT: 31748, zh_CN: 2052, zh_HK: 3076, zh_MO: 5124, zh_SG: 4100, zh_TW: 1028, zu_ZA: 1077 }; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { LCID, REQUIRED_LANGUAGES }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var numbers_std_exports = {}; __export(numbers_std_exports, { roundFractionForProgressBar: () => roundFractionForProgressBar, safeParseBigint: () => safeParseBigint, safeParseInteger: () => safeParseInteger, safeParseNumber: () => safeParseNumber }); module.exports = __toCommonJS(numbers_std_exports); var import_assert_std = require("./assert.std.js"); function safeParseNumber(value) { if (typeof value === "number") { return value; } (0, import_assert_std.strictAssert)(typeof value === "string", "Expected string or number"); const trimmed = value.trim(); if (trimmed === "") { return null; } const parsed = Number(value); if (!Number.isFinite(parsed)) { return null; } if (parsed < Number.MIN_SAFE_INTEGER || parsed > Number.MAX_SAFE_INTEGER) { return null; } return parsed; } __name(safeParseNumber, "safeParseNumber"); function safeParseInteger(value, trunc = false) { const parsed = safeParseNumber(value); if (parsed == null) { return null; } if (trunc) { return Math.trunc(parsed); } if (!Number.isInteger(parsed)) { return null; } return parsed; } __name(safeParseInteger, "safeParseInteger"); function safeParseBigint(value) { if (typeof value === "bigint") { return value; } if (typeof value === "number") { if (!Number.isInteger(value)) { return null; } return BigInt(value); } (0, import_assert_std.strictAssert)(typeof value === "string", "Expected string, number, or bigint"); const trimmed = value.trim(); if (trimmed === "") { return null; } return BigInt(value); } __name(safeParseBigint, "safeParseBigint"); function roundFractionForProgressBar(fractionComplete) { if (fractionComplete <= 0) { return 0; } if (fractionComplete >= 1) { return 1; } if (fractionComplete <= 0.01) { return 0.01; } if (fractionComplete >= 0.99) { return 0.99; } return Math.round(fractionComplete * 100) / 100; } __name(roundFractionForProgressBar, "roundFractionForProgressBar"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { roundFractionForProgressBar, safeParseBigint, safeParseInteger, safeParseNumber }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var objectMap_std_exports = {}; __export(objectMap_std_exports, { objectMap: () => objectMap }); module.exports = __toCommonJS(objectMap_std_exports); function objectMap(obj, f) { const keys = Object.keys(obj); return keys.map((key) => f(key, obj[key])); } __name(objectMap, "objectMap"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { objectMap }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var osMain_node_exports = {}; __export(osMain_node_exports, { default: () => osMain_node_default }); module.exports = __toCommonJS(osMain_node_exports); var import_node_os = __toESM(require("node:os")); var import_fs_extra = __toESM(require("fs-extra")); var import_shared_std = require("./shared.std.js"); const { readFileSync } = import_fs_extra.default; function getLinuxName() { if (import_node_os.default.platform() !== "linux") { return void 0; } const etcOsRelease = readFileSync("/etc/os-release", "utf-8"); const match = etcOsRelease.match(/^PRETTY_NAME=(.+?)$/m); if (!match) { return void 0; } const name = match[1]; if (isAppImage()) { return `${name} (AppImage)`; } return name; } __name(getLinuxName, "getLinuxName"); function isAppImage() { return process.platform === "linux" && process.env.APPIMAGE != null; } __name(isAppImage, "isAppImage"); function isFlatpak() { if (process.env.container === "flatpak") { return true; } const linuxName = getLinuxName(); if (linuxName && linuxName.toLowerCase().includes("flatpak")) { return true; } return false; } __name(isFlatpak, "isFlatpak"); function isWaylandEnabled() { return Boolean(process.env.WAYLAND_DISPLAY); } __name(isWaylandEnabled, "isWaylandEnabled"); function isLinuxUsingKDE() { return import_node_os.default.platform() === "linux" && process.env.XDG_CURRENT_DESKTOP === "KDE"; } __name(isLinuxUsingKDE, "isLinuxUsingKDE"); const OS = { ...(0, import_shared_std.getOSFunctions)(import_node_os.default.release()), getLinuxName, isAppImage, isFlatpak, isLinuxUsingKDE, isWaylandEnabled }; var osMain_node_default = OS; "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var promptOSAuthMain_main_exports = {}; __export(promptOSAuthMain_main_exports, { promptOSAuth: () => promptOSAuth }); module.exports = __toCommonJS(promptOSAuthMain_main_exports); var import_electron = require("electron"); var import_node_child_process = require("node:child_process"); var import_windows_ucv = require("@signalapp/windows-ucv"); var import_log_std = require("../../logging/log.std.js"); var import_osMain_node = __toESM(require("./osMain.node.js")); var import_missingCaseError_std = require("../missingCaseError.std.js"); const log = (0, import_log_std.createLogger)("promptOSAuthMain"); async function promptOSAuth({ reason, localeString }) { if (import_osMain_node.default.isWindows()) { return promptOSAuthWindows(localeString ?? ""); } if (import_osMain_node.default.isMacOS()) { return promptOSAuthMacOS(localeString ?? ""); } if (import_osMain_node.default.isLinux()) { return promptOSAuthLinux(reason); } return "unsupported"; } __name(promptOSAuth, "promptOSAuth"); async function promptOSAuthMacOS(text) { try { await import_electron.systemPreferences.promptTouchID(text); return "success"; } catch { return "unauthorized"; } } __name(promptOSAuthMacOS, "promptOSAuthMacOS"); async function promptOSAuthWindows(text) { const availability = await (0, import_windows_ucv.checkAvailability)(); log.info(`Windows UCV availability=${availability}`); if (availability !== "available") { return "unauthorized-no-windows-ucv"; } const result = await (0, import_windows_ucv.requestVerification)(text); if (result === "verified") { return "success"; } return "unauthorized"; } __name(promptOSAuthWindows, "promptOSAuthWindows"); async function promptOSAuthLinux(reason) { const isAvailable = await isPromptOSAuthAvailableLinux(); if (!isAvailable) { return "unsupported"; } let command; if (reason === "enable-backups") { command = "pkcheck -u --process $$ --action-id org.signalapp.enable-backups"; } else if (reason === "view-aep") { command = "pkcheck -u --process $$ --action-id org.signalapp.view-aep"; } else if (reason === "plaintext-export") { command = "pkcheck -u --process $$ --action-id org.signalapp.plaintext-export"; } else { throw (0, import_missingCaseError_std.missingCaseError)(reason); } return new Promise((resolve) => { (0, import_node_child_process.exec)(command).on("exit", (code) => { if (code === 0) { resolve("success"); } else if (code === 3) { resolve("unauthorized"); } else { log.warn(`promptOSAuthLinux: Got code ${code} from call to pkcheck`); resolve("error"); } }); }); } __name(promptOSAuthLinux, "promptOSAuthLinux"); async function isPromptOSAuthAvailableLinux() { return new Promise((resolve, _reject) => { (0, import_node_child_process.exec)("command -v pkcheck").on("exit", (code) => { resolve(code === 0); }); }); } __name(isPromptOSAuthAvailableLinux, "isPromptOSAuthAvailableLinux"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { promptOSAuth }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var shared_std_exports = {}; __export(shared_std_exports, { getOSFunctions: () => getOSFunctions }); module.exports = __toCommonJS(shared_std_exports); var import_semver = __toESM(require("semver")); function createIsPlatform(platform, osRelease) { return (minVersion) => { if (process.platform !== platform) { return false; } if (minVersion === void 0) { return true; } return import_semver.default.gte(osRelease, minVersion); }; } __name(createIsPlatform, "createIsPlatform"); function getOSFunctions(osRelease) { const isMacOS = createIsPlatform("darwin", osRelease); const isLinux = createIsPlatform("linux", osRelease); const isWindows = createIsPlatform("win32", osRelease); const isLinuxAppImage = /* @__PURE__ */ __name(() => { return process.platform === "linux" && process.env.APPIMAGE != null; }, "isLinuxAppImage"); const getName = /* @__PURE__ */ __name(() => { if (isMacOS()) { return "macOS"; } if (isWindows()) { return "Windows"; } return "Linux"; }, "getName"); const getClassName = /* @__PURE__ */ __name(() => { if (isMacOS()) { return "os-macos"; } if (isWindows()) { return "os-windows"; } return "os-linux"; }, "getClassName"); return { getClassName, getName, isLinux, isLinuxAppImage, isMacOS, isWindows }; } __name(getOSFunctions, "getOSFunctions"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getOSFunctions }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name2 in all) __defProp(target, name2, { get: all[name2], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var packageJson_node_exports = {}; __export(packageJson_node_exports, { build: () => build, default: () => packageJson_node_default, name: () => name, productName: () => productName, version: () => version }); module.exports = __toCommonJS(packageJson_node_exports); var import_node_fs = require("node:fs"); var import_node_path = require("node:path"); const PACKAGE_JSON_PATH = (0, import_node_path.join)(__dirname, "..", "..", "package.json"); const json = JSON.parse((0, import_node_fs.readFileSync)(PACKAGE_JSON_PATH, "utf8")); var packageJson_node_default = json; const { name } = json; const { version } = json; const { productName } = json; const { build } = json; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { build, name, productName, version }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var parseIntOrThrow_std_exports = {}; __export(parseIntOrThrow_std_exports, { parseIntOrThrow: () => parseIntOrThrow }); module.exports = __toCommonJS(parseIntOrThrow_std_exports); function parseIntOrThrow(value, message) { let result; switch (typeof value) { case "number": result = value; break; case "string": result = parseInt(value, 10); break; default: result = NaN; break; } if (!Number.isInteger(result)) { throw new Error(message); } return result; } __name(parseIntOrThrow, "parseIntOrThrow"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { parseIntOrThrow }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var parseIntWithFallback_std_exports = {}; __export(parseIntWithFallback_std_exports, { parseIntWithFallback: () => parseIntWithFallback }); module.exports = __toCommonJS(parseIntWithFallback_std_exports); var import_parseIntOrThrow_std = require("./parseIntOrThrow.std.js"); function parseIntWithFallback(value, fallback) { try { return (0, import_parseIntOrThrow_std.parseIntOrThrow)(value, "Failed to parse"); } catch (err) { return fallback; } } __name(parseIntWithFallback, "parseIntWithFallback"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { parseIntWithFallback }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var parseRetryAfter_std_exports = {}; __export(parseRetryAfter_std_exports, { parseRetryAfter: () => parseRetryAfter, parseRetryAfterWithDefault: () => parseRetryAfterWithDefault }); module.exports = __toCommonJS(parseRetryAfter_std_exports); var import_index_std = require("./durations/index.std.js"); var import_isNormalNumber_std = require("./isNormalNumber.std.js"); const DEFAULT_RETRY_AFTER = import_index_std.MINUTE; const MINIMAL_RETRY_AFTER = import_index_std.SECOND; function parseRetryAfterWithDefault(value, defaultValue = DEFAULT_RETRY_AFTER) { const retryAfter = parseRetryAfter(value); if (retryAfter === void 0) { return defaultValue; } return Math.max(retryAfter, MINIMAL_RETRY_AFTER); } __name(parseRetryAfterWithDefault, "parseRetryAfterWithDefault"); function parseRetryAfter(value) { if (typeof value !== "string") { return void 0; } const retryAfter = parseInt(value, 10); if (!(0, import_isNormalNumber_std.isNormalNumber)(retryAfter) || retryAfter.toString() !== value) { return void 0; } return retryAfter * import_index_std.SECOND; } __name(parseRetryAfter, "parseRetryAfter"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { parseRetryAfter, parseRetryAfterWithDefault }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var pemToDer_std_exports = {}; __export(pemToDer_std_exports, { pemToDer: () => pemToDer }); module.exports = __toCommonJS(pemToDer_std_exports); var Bytes = __toESM(require("../Bytes.std.js")); function pemToDer(pem) { const pemContent = pem.replace(/-----BEGIN [^-]+-----/, "").replace(/-----END [^-]+-----/, "").replace(/\s+/g, ""); const derBuffer = Bytes.fromBase64(pemContent); return derBuffer; } __name(pemToDer, "pemToDer"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { pemToDer }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var phoneNumberDiscoverability_std_exports = {}; __export(phoneNumberDiscoverability_std_exports, { PhoneNumberDiscoverability: () => PhoneNumberDiscoverability, parsePhoneNumberDiscoverability: () => parsePhoneNumberDiscoverability }); module.exports = __toCommonJS(phoneNumberDiscoverability_std_exports); var import_enum_std = require("./enum.std.js"); var PhoneNumberDiscoverability = /* @__PURE__ */ ((PhoneNumberDiscoverability2) => { PhoneNumberDiscoverability2["Discoverable"] = "Discoverable"; PhoneNumberDiscoverability2["NotDiscoverable"] = "NotDiscoverable"; return PhoneNumberDiscoverability2; })(PhoneNumberDiscoverability || {}); const parsePhoneNumberDiscoverability = (0, import_enum_std.makeEnumParser)( PhoneNumberDiscoverability, "Discoverable" /* Discoverable */ ); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { PhoneNumberDiscoverability, parsePhoneNumberDiscoverability }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var pinnedMessages_std_exports = {}; __export(pinnedMessages_std_exports, { getPinnedMessageExpiresAt: () => getPinnedMessageExpiresAt }); module.exports = __toCommonJS(pinnedMessages_std_exports); var import_duration_in_seconds_std = require("./durations/duration-in-seconds.std.js"); function getPinnedMessageExpiresAt(receivedAtTimestamp, pinDuration) { if (pinDuration == null) { return null; } const pinDurationMs = import_duration_in_seconds_std.DurationInSeconds.toMillis(pinDuration); return receivedAtTimestamp + pinDurationMs; } __name(getPinnedMessageExpiresAt, "getPinnedMessageExpiresAt"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getPinnedMessageExpiresAt }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var popperUtil_std_exports = {}; __export(popperUtil_std_exports, { offsetDistanceModifier: () => offsetDistanceModifier, sameWidthModifier: () => sameWidthModifier }); module.exports = __toCommonJS(popperUtil_std_exports); const offsetDistanceModifier = /* @__PURE__ */ __name((distance) => ({ name: "offset", options: { offset: [void 0, distance] } }), "offsetDistanceModifier"); const sameWidthModifier = { name: "sameWidth", enabled: true, phase: "write", fn({ state }) { state.elements.popper.style.width = `${state.rects.reference.width}px`; } }; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { offsetDistanceModifier, sameWidthModifier }); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var prependStream_node_exports = {}; __export(prependStream_node_exports, { prependStream: () => prependStream }); module.exports = __toCommonJS(prependStream_node_exports); var import_node_stream = require("node:stream"); function prependStream(data) { return new import_node_stream.Transform({ construct(callback) { this.push(data); callback(); }, transform(chunk, _encoding, callback) { callback(null, chunk); } }); } __name(prependStream, "prependStream"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { prependStream }); "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var privacy_node_exports = {}; __export(privacy_node_exports, { APP_ROOT_PATH: () => APP_ROOT_PATH, _pathToRegExp: () => _pathToRegExp, _redactPath: () => _redactPath, addSensitivePath: () => addSensitivePath, redactAll: () => redactAll, redactAttachmentUrl: () => redactAttachmentUrl, redactAttachmentUrlKeys: () => redactAttachmentUrlKeys, redactCallLinkRoomIds: () => redactCallLinkRoomIds, redactCallLinkRootKeys: () => redactCallLinkRootKeys, redactCardNumbers: () => redactCardNumbers, redactCdnKey: () => redactCdnKey, redactExtendedStorageID: () => redactExtendedStorageID, redactGenericText: () => redactGenericText, redactGroupIds: () => redactGroupIds, redactPhoneNumbers: () => redactPhoneNumbers, redactStorageID: () => redactStorageID, redactUuids: () => redactUuids }); module.exports = __toCommonJS(privacy_node_exports); var import_node_path = __toESM(require("node:path")); var import_fp = __toESM(require("lodash/fp.js")); var import_lodash = __toESM(require("lodash")); const APP_ROOT_PATH = import_node_path.default.join(__dirname, "..", ".."); const { escapeRegExp, isString, isRegExp } = import_lodash.default; const { compose } = import_fp.default; const PHONE_NUMBER_PATTERN = /\+\d{7,12}(\d{3})/g; const UUID_OR_STORY_ID_PATTERN = /[0-9A-F]{8}-[0-9A-F]{4}-[0-8][0-9A-F]{3}-[089AB][0-9A-F]{3}-[0-9A-F]{9}([0-9A-F]{3})/gi; const GROUP_ID_PATTERN = /(group\()([^)]+)(\))/g; const GROUP_V2_ID_PATTERN = /(groupv2\()([^=)]+)(=?=?\))/g; const CALL_LINK_ROOM_ID_PATTERN = /[0-9A-F]{61}([0-9A-F]{3})/gi; const CALL_LINK_ROOT_KEY_PATTERN = /([A-Z]{4})-[A-Z]{4}-[A-Z]{4}-[A-Z]{4}-[A-Z]{4}-[A-Z]{4}-[A-Z]{4}-[A-Z]{4}/gi; const ATTACHMENT_URL_KEY_PATTERN = /(attachment:\/\/[^\s]+key=)([^\s]+)/gi; const REDACTION_PLACEHOLDER = "[REDACTED]"; const CARD_NUMBER_OR_STACK_TRACE_PATTERN = /0x[0-9a-f]{16}|\d\d(\d[-]?){11,16}\d/g; const SAFE_STACK_TRACE_PATTERN = /^0x[0-9a-f]{16}$/; function redactStorageID(storageID, version, conversation) { const convoId = conversation ? ` ${conversation?.idForLogging()}` : ""; return `${version ?? "?"}:${storageID.substring(0, 3)}${convoId}`; } __name(redactStorageID, "redactStorageID"); function redactExtendedStorageID({ storageID, storageVersion }) { return redactStorageID(storageID, storageVersion); } __name(redactExtendedStorageID, "redactExtendedStorageID"); const _redactPath = /* @__PURE__ */ __name((filePath) => { if (!isString(filePath)) { throw new TypeError("'filePath' must be a string"); } const filePathPattern = _pathToRegExp(filePath); return (text) => { if (!isString(text)) { throw new TypeError("'text' must be a string"); } if (!isRegExp(filePathPattern)) { return text; } return text.replace(filePathPattern, REDACTION_PLACEHOLDER); }; }, "_redactPath"); const _pathToRegExp = /* @__PURE__ */ __name((filePath) => { try { return new RegExp( // Any possible prefix that we want to include `(${escapeRegExp("file:///")})?${// The rest of the file path filePath.split(/\/|\\/).map((part) => { const urlEncodedPart = encodeURI(part); if (urlEncodedPart === part) { return escapeRegExp(part); } return `(${escapeRegExp(part)}|${escapeRegExp(urlEncodedPart)})`; }).join( `(${[ // Posix (Linux, macOS, etc.) import_node_path.default.posix.sep, // Windows import_node_path.default.win32.sep, // Windows (URI encoded) encodeURI(import_node_path.default.win32.sep) ].map((sep) => escapeRegExp(sep)).map((sep) => `${sep}+`).join("|")})` )}`, "g" ); } catch (error) { return void 0; } }, "_pathToRegExp"); const redactCardNumbers = /* @__PURE__ */ __name((text) => { if (!isString(text)) { throw new TypeError("'text' must be a string"); } return text.replace(CARD_NUMBER_OR_STACK_TRACE_PATTERN, (match) => { if (SAFE_STACK_TRACE_PATTERN.test(match)) { return match; } return "[REDACTED]"; }); }, "redactCardNumbers"); const redactPhoneNumbers = /* @__PURE__ */ __name((text) => { if (!isString(text)) { throw new TypeError("'text' must be a string"); } return text.replace(PHONE_NUMBER_PATTERN, `+${REDACTION_PLACEHOLDER}$1`); }, "redactPhoneNumbers"); const redactUuids = /* @__PURE__ */ __name((text) => { if (!isString(text)) { throw new TypeError("'text' must be a string"); } return text.replace(UUID_OR_STORY_ID_PATTERN, `${REDACTION_PLACEHOLDER}$1`); }, "redactUuids"); const redactGroupIds = /* @__PURE__ */ __name((text) => { if (!isString(text)) { throw new TypeError("'text' must be a string"); } return text.replace( GROUP_ID_PATTERN, (_, before, id, after) => `${before}${REDACTION_PLACEHOLDER}${removeNewlines(id).slice( -3 )}${after}` ).replace( GROUP_V2_ID_PATTERN, (_, before, id, after) => `${before}${REDACTION_PLACEHOLDER}${removeNewlines(id).slice( -3 )}${after}` ); }, "redactGroupIds"); const redactCallLinkRoomIds = /* @__PURE__ */ __name((text) => { if (!isString(text)) { throw new TypeError("'text' must be a string"); } return text.replace(CALL_LINK_ROOM_ID_PATTERN, `${REDACTION_PLACEHOLDER}$1`); }, "redactCallLinkRoomIds"); const redactCallLinkRootKeys = /* @__PURE__ */ __name((text) => { if (!isString(text)) { throw new TypeError("'text' must be a string"); } return text.replace(CALL_LINK_ROOT_KEY_PATTERN, `${REDACTION_PLACEHOLDER}$1`); }, "redactCallLinkRootKeys"); const redactAttachmentUrlKeys = /* @__PURE__ */ __name((text) => { if (!isString(text)) { throw new TypeError("'text' must be a string"); } return text.replace(ATTACHMENT_URL_KEY_PATTERN, `$1${REDACTION_PLACEHOLDER}`); }, "redactAttachmentUrlKeys"); const redactCdnKey = /* @__PURE__ */ __name((cdnKey) => { return `${REDACTION_PLACEHOLDER}${cdnKey.slice(-3)}`; }, "redactCdnKey"); const redactGenericText = /* @__PURE__ */ __name((text) => { return `${REDACTION_PLACEHOLDER}${text.slice(-3)}`; }, "redactGenericText"); const redactAttachmentUrl = /* @__PURE__ */ __name((urlString) => { try { const url = new URL(urlString); url.search = ""; return url.toString(); } catch { return REDACTION_PLACEHOLDER; } }, "redactAttachmentUrl"); const createRedactSensitivePaths = /* @__PURE__ */ __name((paths) => { return compose(paths.map((filePath) => _redactPath(filePath))); }, "createRedactSensitivePaths"); const sensitivePaths = []; let redactSensitivePaths = /* @__PURE__ */ __name((text) => text, "redactSensitivePaths"); const addSensitivePath = /* @__PURE__ */ __name((filePath) => { sensitivePaths.push(filePath); redactSensitivePaths = createRedactSensitivePaths(sensitivePaths); }, "addSensitivePath"); addSensitivePath(APP_RO